* Minor warning fix in BoundingBox, BIHTree

* Fix BoundingSphere, calculation was bugged due to TempVars sharing 
 * Add BoundingSphere vs. Triangle collision
 * Delete Natives class from core as it was moved to desktop previously 
 * Parser classes now use whitespace instead of " " for splitting
 * Bone.getAttachmentsNode() no longer public due to misuse in user code

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9151 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
Sha..rd 13 years ago
parent 8c0e5ad541
commit 4721c944a2
  1. 2
      engine/src/core-plugins/com/jme3/texture/plugins/HDRLoader.java
  2. 2
      engine/src/core/com/jme3/animation/Bone.java
  3. 2
      engine/src/core/com/jme3/bounding/BoundingBox.java
  4. 33
      engine/src/core/com/jme3/bounding/BoundingSphere.java
  5. 13
      engine/src/core/com/jme3/collision/bih/BIHTree.java
  6. 306
      engine/src/core/com/jme3/system/Natives.java
  7. 6
      engine/src/ogre/com/jme3/scene/plugins/ogre/MaterialLoader.java
  8. 2
      engine/src/ogre/com/jme3/scene/plugins/ogre/MeshLoader.java

@ -237,7 +237,7 @@ public class HDRLoader implements AssetLoader {
continue; // comment or empty statement continue; // comment or empty statement
} else if (ln.startsWith("+") || ln.startsWith("-")){ } else if (ln.startsWith("+") || ln.startsWith("-")){
// + or - mark image resolution and start of data // + or - mark image resolution and start of data
String[] resData = ln.split(" "); String[] resData = ln.split("\\s");
if (resData.length != 4){ if (resData.length != 4){
throw new IOException("Invalid resolution string in HDR file"); throw new IOException("Invalid resolution string in HDR file");
} }

@ -485,7 +485,7 @@ public final class Bone implements Savable {
* Attach models and effects to this node to make * Attach models and effects to this node to make
* them follow this bone's motions. * them follow this bone's motions.
*/ */
public Node getAttachmentsNode() { Node getAttachmentsNode() {
if (attachNode == null) { if (attachNode == null) {
attachNode = new Node(name + "_attachnode"); attachNode = new Node(name + "_attachnode");
attachNode.setUserData("AttachedBone", this); attachNode.setUserData("AttachedBone", this);

@ -180,7 +180,7 @@ public class BoundingBox extends BoundingVolume {
vars.release(); vars.release();
} }
public static final void checkMinMax(Vector3f min, Vector3f max, Vector3f point) { public static void checkMinMax(Vector3f min, Vector3f max, Vector3f point) {
if (point.x < min.x) { if (point.x < min.x) {
min.x = point.x; min.x = point.x;
} }

@ -207,12 +207,12 @@ public class BoundingSphere extends BoundingVolume {
* in <code>points</code>. * in <code>points</code>.
*/ */
private void recurseMini(FloatBuffer points, int p, int b, int ap) { private void recurseMini(FloatBuffer points, int p, int b, int ap) {
TempVars vars = TempVars.get(); //TempVars vars = TempVars.get();
Vector3f tempA = vars.vect1; Vector3f tempA = new Vector3f(); //vars.vect1;
Vector3f tempB = vars.vect2; Vector3f tempB = new Vector3f(); //vars.vect2;
Vector3f tempC = vars.vect3; Vector3f tempC = new Vector3f(); //vars.vect3;
Vector3f tempD = vars.vect4; Vector3f tempD = new Vector3f(); //vars.vect4;
switch (b) { switch (b) {
case 0: case 0:
@ -240,7 +240,7 @@ public class BoundingSphere extends BoundingVolume {
BufferUtils.populateFromBuffer(tempC, points, ap - 3); BufferUtils.populateFromBuffer(tempC, points, ap - 3);
BufferUtils.populateFromBuffer(tempD, points, ap - 4); BufferUtils.populateFromBuffer(tempD, points, ap - 4);
setSphere(tempA, tempB, tempC, tempD); setSphere(tempA, tempB, tempC, tempD);
vars.release(); //vars.release();
return; return;
} }
for (int i = 0; i < p; i++) { for (int i = 0; i < p; i++) {
@ -253,10 +253,9 @@ public class BoundingSphere extends BoundingVolume {
BufferUtils.setInBuffer(tempB, points, j - 1 + ap); BufferUtils.setInBuffer(tempB, points, j - 1 + ap);
} }
recurseMini(points, i, b + 1, ap + 1); recurseMini(points, i, b + 1, ap + 1);
} }
} }
vars.release(); //vars.release();
} }
/** /**
@ -744,7 +743,7 @@ public class BoundingSphere extends BoundingVolume {
* *
* @see com.jme.bounding.BoundingVolume#intersectsWhere(com.jme.math.Ray) * @see com.jme.bounding.BoundingVolume#intersectsWhere(com.jme.math.Ray)
*/ */
public int collideWithRay(Ray ray, CollisionResults results) { private int collideWithRay(Ray ray, CollisionResults results) {
TempVars vars = TempVars.get(); TempVars vars = TempVars.get();
Vector3f diff = vars.vect1.set(ray.getOrigin()).subtractLocal( Vector3f diff = vars.vect1.set(ray.getOrigin()).subtractLocal(
@ -797,6 +796,22 @@ public class BoundingSphere extends BoundingVolume {
if (other instanceof Ray) { if (other instanceof Ray) {
Ray ray = (Ray) other; Ray ray = (Ray) other;
return collideWithRay(ray, results); return collideWithRay(ray, results);
} else if (other instanceof Triangle){
Triangle t = (Triangle) other;
float r2 = radius * radius;
float d1 = center.distanceSquared(t.get1());
float d2 = center.distanceSquared(t.get2());
float d3 = center.distanceSquared(t.get3());
if (d1 <= r2 || d2 <= r2 || d3 <= r2) {
CollisionResult r = new CollisionResult();
r.setDistance(FastMath.sqrt(Math.min(Math.min(d1, d2), d3)) - radius);
results.addCollision(r);
return 1;
}
return 0;
} else { } else {
throw new UnsupportedCollisionException(); throw new UnsupportedCollisionException();
} }

@ -67,15 +67,16 @@ public class BIHTree implements CollisionData {
private int numTris; private int numTris;
private float[] pointData; private float[] pointData;
private int[] triIndices; private int[] triIndices;
private transient CollisionResults boundResults = new CollisionResults(); private transient CollisionResults boundResults = new CollisionResults();
private transient float[] bihSwapTmp; private transient float[] bihSwapTmp;
private static final TriangleAxisComparator[] comparators = new TriangleAxisComparator[3];
static { private static final TriangleAxisComparator[] comparators = new TriangleAxisComparator[]
comparators[0] = new TriangleAxisComparator(0); {
comparators[1] = new TriangleAxisComparator(1); new TriangleAxisComparator(0),
comparators[2] = new TriangleAxisComparator(2); new TriangleAxisComparator(1),
} new TriangleAxisComparator(2)
};
private void initTriList(FloatBuffer vb, IndexBuffer ib) { private void initTriList(FloatBuffer vb, IndexBuffer ib) {
pointData = new float[numTris * 3 * 3]; pointData = new float[numTris * 3 * 3];

@ -1,306 +0,0 @@
/*
* Copyright (c) 2009-2010 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.system;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Helper class for extracting the natives (dll, so) from the jars.
* This class should only be used internally.
*/
public final class Natives {
private static final Logger logger = Logger.getLogger(Natives.class.getName());
private static final byte[] buf = new byte[1024];
private static File extractionDirOverride = null;
private static File extractionDir = null;
public static void setExtractionDir(String name) {
extractionDirOverride = new File(name).getAbsoluteFile();
}
public static File getExtractionDir() {
if (extractionDirOverride != null) {
return extractionDirOverride;
}
if (extractionDir == null) {
File workingFolder = new File("").getAbsoluteFile();
if (!workingFolder.canWrite()) {
setStorageExtractionDir();
} else {
try {
File file = new File(workingFolder.getAbsolutePath() + File.separator + ".jmetestwrite");
file.createNewFile();
file.delete();
extractionDir = workingFolder;
} catch (Exception e) {
setStorageExtractionDir();
}
}
}
return extractionDir;
}
private static void setStorageExtractionDir() {
logger.log(Level.WARNING, "Working directory is not writable. Using home directory instead.");
extractionDir = new File(JmeSystem.getStorageFolder(),
"natives_" + Integer.toHexString(computeNativesHash()));
if (!extractionDir.exists()) {
extractionDir.mkdir();
}
}
private static int computeNativesHash() {
try {
String classpath = System.getProperty("java.class.path");
URL url = Thread.currentThread().getContextClassLoader().getResource("com/jme3/system/Natives.class");
StringBuilder sb = new StringBuilder(url.toString());
if (sb.indexOf("jar:") == 0) {
sb.delete(0, 4);
sb.delete(sb.indexOf("!"), sb.length());
sb.delete(sb.lastIndexOf("/") + 1, sb.length());
}
try {
url = new URL(sb.toString());
} catch (MalformedURLException ex) {
throw new UnsupportedOperationException(ex);
}
URLConnection conn = url.openConnection();
int hash = classpath.hashCode() ^ (int) conn.getLastModified();
return hash;
} catch (IOException ex) {
throw new UnsupportedOperationException(ex);
}
}
public static void extractNativeLib(String sysName, String name) throws IOException {
extractNativeLib(sysName, name, false, true);
}
public static void extractNativeLib(String sysName, String name, boolean load) throws IOException {
extractNativeLib(sysName, name, load, true);
}
public static void extractNativeLib(String sysName, String name, boolean load, boolean warning) throws IOException {
String fullname = System.mapLibraryName(name);
String path = "native/" + sysName + "/" + fullname;
URL url = Thread.currentThread().getContextClassLoader().getResource(path);
if (url == null) {
if (!warning) {
logger.log(Level.WARNING, "Cannot locate native library: {0}/{1}",
new String[]{sysName, fullname});
}
return;
}
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
File targetFile = new File(getExtractionDir(), fullname);
OutputStream out = null;
try {
if (targetFile.exists()) {
// OK, compare last modified date of this file to
// file in jar
long targetLastModified = targetFile.lastModified();
long sourceLastModified = conn.getLastModified();
// Allow ~1 second range for OSes that only support low precision
if (targetLastModified + 1000 > sourceLastModified) {
logger.log(Level.FINE, "Not copying library {0}. Latest already extracted.", fullname);
return;
}
}
out = new FileOutputStream(targetFile);
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
in = null;
out.close();
out = null;
// NOTE: On OSes that support "Date Created" property,
// this will cause the last modified date to be lower than
// date created which makes no sense
targetFile.setLastModified(conn.getLastModified());
} catch (FileNotFoundException ex) {
if (ex.getMessage().contains("used by another process")) {
return;
}
throw ex;
} finally {
if (load) {
System.load(targetFile.getAbsolutePath());
}
if(in != null){
in.close();
}
if(out != null){
out.close();
}
}
logger.log(Level.FINE, "Copied {0} to {1}", new Object[]{fullname, targetFile});
}
protected static boolean isUsingNativeBullet() {
try {
Class clazz = Class.forName("com.jme3.bullet.util.NativeMeshUtil");
return clazz != null;
} catch (ClassNotFoundException ex) {
return false;
}
}
public static void extractNativeLibs(Platform platform, AppSettings settings) throws IOException {
String renderer = settings.getRenderer();
String audioRenderer = settings.getAudioRenderer();
boolean needLWJGL = false;
boolean needOAL = false;
boolean needJInput = false;
boolean needNativeBullet = isUsingNativeBullet();
if (renderer != null) {
if (renderer.startsWith("LWJGL")) {
needLWJGL = true;
}
}
if (audioRenderer != null) {
if (audioRenderer.equals("LWJGL")) {
needLWJGL = true;
needOAL = true;
}
}
needJInput = settings.useJoysticks();
String libraryPath = getExtractionDir().toString();
if (needLWJGL) {
logger.log(Level.INFO, "Extraction Directory: {0}", getExtractionDir().toString());
// LWJGL supports this feature where
// it can load libraries from this path.
System.setProperty("org.lwjgl.librarypath", libraryPath);
}
if (needJInput) {
// AND Luckily enough JInput supports the same feature.
System.setProperty("net.java.games.input.librarypath", libraryPath);
}
switch (platform) {
case Windows64:
if (needLWJGL) {
extractNativeLib("windows", "lwjgl64");
}
if (needOAL) {
extractNativeLib("windows", "OpenAL64");
}
if (needJInput) {
extractNativeLib("windows", "jinput-dx8_64");
extractNativeLib("windows", "jinput-raw_64");
}
if (needNativeBullet) {
extractNativeLib("windows", "bulletjme64", true, false);
}
break;
case Windows32:
if (needLWJGL) {
extractNativeLib("windows", "lwjgl");
}
if (needOAL) {
extractNativeLib("windows", "OpenAL32");
}
if (needJInput) {
extractNativeLib("windows", "jinput-dx8");
extractNativeLib("windows", "jinput-raw");
}
if (needNativeBullet) {
extractNativeLib("windows", "bulletjme", true, false);
}
break;
case Linux64:
if (needLWJGL) {
extractNativeLib("linux", "lwjgl64");
}
if (needJInput) {
extractNativeLib("linux", "jinput-linux64");
}
if (needOAL) {
extractNativeLib("linux", "openal64");
}
if (needNativeBullet) {
extractNativeLib("linux", "bulletjme64", true, false);
}
break;
case Linux32:
if (needLWJGL) {
extractNativeLib("linux", "lwjgl");
}
if (needJInput) {
extractNativeLib("linux", "jinput-linux");
}
if (needOAL) {
extractNativeLib("linux", "openal");
}
if (needNativeBullet) {
extractNativeLib("linux", "bulletjme", true, false);
}
break;
case MacOSX_PPC32:
case MacOSX32:
case MacOSX_PPC64:
case MacOSX64:
if (needLWJGL) {
extractNativeLib("macosx", "lwjgl");
}
// if (needOAL)
// extractNativeLib("macosx", "openal");
if (needJInput) {
extractNativeLib("macosx", "jinput-osx");
}
if (needNativeBullet) {
extractNativeLib("macosx", "bulletjme", true, false);
}
break;
}
}
}

@ -73,7 +73,7 @@ public class MaterialLoader implements AssetLoader {
private int texUnit = 0; private int texUnit = 0;
private ColorRGBA readColor(String content){ private ColorRGBA readColor(String content){
String[] split = content.split(" "); String[] split = content.split("\\s");
ColorRGBA color = new ColorRGBA(); ColorRGBA color = new ColorRGBA();
color.r = Float.parseFloat(split[0]); color.r = Float.parseFloat(split[0]);
@ -228,7 +228,7 @@ public class MaterialLoader implements AssetLoader {
}else if (keyword.equals("emissive")){ }else if (keyword.equals("emissive")){
emissive = readColor(split[1]); emissive = readColor(split[1]);
}else if (keyword.equals("specular")){ }else if (keyword.equals("specular")){
String[] subsplit = split[1].split(" "); String[] subsplit = split[1].split("\\s");
specular = new ColorRGBA(); specular = new ColorRGBA();
specular.r = Float.parseFloat(subsplit[0]); specular.r = Float.parseFloat(subsplit[0]);
specular.g = Float.parseFloat(subsplit[1]); specular.g = Float.parseFloat(subsplit[1]);
@ -304,7 +304,7 @@ public class MaterialLoader implements AssetLoader {
if (statement.getLine().startsWith("technique")){ if (statement.getLine().startsWith("technique")){
readTechnique(statement); readTechnique(statement);
}else if (statement.getLine().startsWith("receive_shadows")){ }else if (statement.getLine().startsWith("receive_shadows")){
String isOn = statement.getLine().split(" ")[1]; String isOn = statement.getLine().split("\\s")[1];
if (isOn != null && isOn.equals("true")){ if (isOn != null && isOn.equals("true")){
} }
} }

@ -493,7 +493,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
private void pushColor(Attributes attribs) throws SAXException { private void pushColor(Attributes attribs) throws SAXException {
FloatBuffer buf = (FloatBuffer) mesh.getBuffer(Type.Color).getData(); FloatBuffer buf = (FloatBuffer) mesh.getBuffer(Type.Color).getData();
String value = parseString(attribs.getValue("value")); String value = parseString(attribs.getValue("value"));
String[] vals = value.split(" "); String[] vals = value.split("\\s");
if (vals.length != 3 && vals.length != 4) { if (vals.length != 3 && vals.length != 4) {
throw new SAXException("Color value must contain 3 or 4 components"); throw new SAXException("Color value must contain 3 or 4 components");
} }

Loading…
Cancel
Save