git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7846 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
a24becee32
commit
80ac165e67
@ -1,141 +1,140 @@ |
||||
/* |
||||
* 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.light; |
||||
|
||||
import com.jme3.bounding.BoundingVolume; |
||||
import com.jme3.export.JmeExporter; |
||||
import com.jme3.export.JmeImporter; |
||||
import com.jme3.export.InputCapsule; |
||||
import com.jme3.export.OutputCapsule; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Spatial; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* Represents a point light. |
||||
* A point light emits light from a given position into all directions in space. |
||||
* E.g a lamp or a bright effect. Point light positions are in world space. |
||||
* <p> |
||||
* In addition to a position, point lights also have a radius which |
||||
* can be used to attenuate the influence of the light depending on the |
||||
* distance between the light and the effected object. |
||||
* |
||||
*/ |
||||
public class PointLight extends Light { |
||||
|
||||
protected Vector3f position = new Vector3f(); |
||||
protected float radius = 0; |
||||
|
||||
@Override |
||||
public void computeLastDistance(Spatial owner) { |
||||
if (owner.getWorldBound() != null){ |
||||
BoundingVolume bv = owner.getWorldBound(); |
||||
lastDistance = bv.distanceSquaredTo(position); |
||||
System.out.println(lastDistance + ", " + owner); |
||||
}else{ |
||||
lastDistance = owner.getWorldTranslation().distanceSquared(position); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Returns the world space position of the light. |
||||
* |
||||
* @return the world space position of the light. |
||||
* |
||||
* @see PointLight#setPosition(com.jme3.math.Vector3f) |
||||
*/ |
||||
public Vector3f getPosition() { |
||||
return position; |
||||
} |
||||
|
||||
/** |
||||
* Set the world space position of the light. |
||||
* |
||||
* @param position the world space position of the light. |
||||
*/ |
||||
public void setPosition(Vector3f position){ |
||||
this.position.set(position); |
||||
} |
||||
|
||||
/** |
||||
* Returns the radius of the light influence. A radius of 0 means |
||||
* the light has no attenuation. |
||||
* |
||||
* @return the radius of the light |
||||
*/ |
||||
public float getRadius(){ |
||||
return radius; |
||||
} |
||||
|
||||
/** |
||||
* Set the radius of the light influence. |
||||
* <p> |
||||
* Setting a non-zero radius indicates the light should use attenuation. |
||||
* If a pixel's distance to this light's position |
||||
* is greater than the light's radius, then the pixel will not be |
||||
* effected by this light, if the distance is less than the radius, then |
||||
* the magnitude of the influence is equal to distance / radius. |
||||
* |
||||
* @param radius the radius of the light influence. |
||||
* |
||||
* @throws IllegalArgumentException If radius is negative |
||||
*/ |
||||
public void setRadius(float radius){ |
||||
if (radius < 0) { |
||||
throw new IllegalArgumentException("Light radius cannot be negative"); |
||||
} |
||||
this.radius = radius; |
||||
} |
||||
|
||||
@Override |
||||
public Light.Type getType() { |
||||
return Light.Type.Point; |
||||
} |
||||
|
||||
@Override |
||||
public void write(JmeExporter ex) throws IOException { |
||||
super.write(ex); |
||||
OutputCapsule oc = ex.getCapsule(this); |
||||
oc.write(position, "position", null); |
||||
oc.write(radius, "radius", 0f); |
||||
} |
||||
|
||||
@Override |
||||
public void read(JmeImporter im) throws IOException { |
||||
super.read(im); |
||||
InputCapsule ic = im.getCapsule(this); |
||||
position = (Vector3f) ic.readSavable("position", null); |
||||
radius = ic.readFloat("radius", 0f); |
||||
} |
||||
|
||||
} |
||||
/* |
||||
* 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.light; |
||||
|
||||
import com.jme3.bounding.BoundingVolume; |
||||
import com.jme3.export.JmeExporter; |
||||
import com.jme3.export.JmeImporter; |
||||
import com.jme3.export.InputCapsule; |
||||
import com.jme3.export.OutputCapsule; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Spatial; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* Represents a point light. |
||||
* A point light emits light from a given position into all directions in space. |
||||
* E.g a lamp or a bright effect. Point light positions are in world space. |
||||
* <p> |
||||
* In addition to a position, point lights also have a radius which |
||||
* can be used to attenuate the influence of the light depending on the |
||||
* distance between the light and the effected object. |
||||
* |
||||
*/ |
||||
public class PointLight extends Light { |
||||
|
||||
protected Vector3f position = new Vector3f(); |
||||
protected float radius = 0; |
||||
|
||||
@Override |
||||
public void computeLastDistance(Spatial owner) { |
||||
if (owner.getWorldBound() != null){ |
||||
BoundingVolume bv = owner.getWorldBound(); |
||||
lastDistance = bv.distanceSquaredTo(position); |
||||
}else{ |
||||
lastDistance = owner.getWorldTranslation().distanceSquared(position); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Returns the world space position of the light. |
||||
* |
||||
* @return the world space position of the light. |
||||
* |
||||
* @see PointLight#setPosition(com.jme3.math.Vector3f) |
||||
*/ |
||||
public Vector3f getPosition() { |
||||
return position; |
||||
} |
||||
|
||||
/** |
||||
* Set the world space position of the light. |
||||
* |
||||
* @param position the world space position of the light. |
||||
*/ |
||||
public void setPosition(Vector3f position){ |
||||
this.position.set(position); |
||||
} |
||||
|
||||
/** |
||||
* Returns the radius of the light influence. A radius of 0 means |
||||
* the light has no attenuation. |
||||
* |
||||
* @return the radius of the light |
||||
*/ |
||||
public float getRadius(){ |
||||
return radius; |
||||
} |
||||
|
||||
/** |
||||
* Set the radius of the light influence. |
||||
* <p> |
||||
* Setting a non-zero radius indicates the light should use attenuation. |
||||
* If a pixel's distance to this light's position |
||||
* is greater than the light's radius, then the pixel will not be |
||||
* effected by this light, if the distance is less than the radius, then |
||||
* the magnitude of the influence is equal to distance / radius. |
||||
* |
||||
* @param radius the radius of the light influence. |
||||
* |
||||
* @throws IllegalArgumentException If radius is negative |
||||
*/ |
||||
public void setRadius(float radius){ |
||||
if (radius < 0) { |
||||
throw new IllegalArgumentException("Light radius cannot be negative"); |
||||
} |
||||
this.radius = radius; |
||||
} |
||||
|
||||
@Override |
||||
public Light.Type getType() { |
||||
return Light.Type.Point; |
||||
} |
||||
|
||||
@Override |
||||
public void write(JmeExporter ex) throws IOException { |
||||
super.write(ex); |
||||
OutputCapsule oc = ex.getCapsule(this); |
||||
oc.write(position, "position", null); |
||||
oc.write(radius, "radius", 0f); |
||||
} |
||||
|
||||
@Override |
||||
public void read(JmeImporter im) throws IOException { |
||||
super.read(im); |
||||
InputCapsule ic = im.getCapsule(this); |
||||
position = (Vector3f) ic.readSavable("position", null); |
||||
radius = ic.readFloat("radius", 0f); |
||||
} |
||||
|
||||
} |
||||
|
@ -1,238 +1,221 @@ |
||||
/* |
||||
* 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.util; |
||||
|
||||
import com.jme3.collision.bih.BIHNode.BIHStackData; |
||||
import com.jme3.math.Eigen3f; |
||||
import com.jme3.math.Matrix4f; |
||||
import com.jme3.math.Matrix3f; |
||||
import com.jme3.math.Plane; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Triangle; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Spatial; |
||||
import java.nio.FloatBuffer; |
||||
import java.nio.IntBuffer; |
||||
import java.util.ArrayList; |
||||
|
||||
/** |
||||
* Temporary variables assigned to each thread. Engine classes may access |
||||
* these temp variables with TempVars.get(), all retrieved TempVars |
||||
* instances must be returned via TempVars.release(). |
||||
* This returns an available instance of the TempVar class ensuring this |
||||
* particular instance is never used elsewhere in the mean time. |
||||
*/ |
||||
public class TempVars { |
||||
|
||||
/** |
||||
* Allow X instances of TempVars in a single thread. |
||||
*/ |
||||
private static final int STACK_SIZE = 5; |
||||
|
||||
/** |
||||
* <code>TempVarsStack</code> contains a stack of TempVars. |
||||
* Every time TempVars.get() is called, a new entry is added to the stack, |
||||
* and the index incremented. |
||||
* When TempVars.release() is called, the entry is checked against |
||||
* the current instance and then the index is decremented. |
||||
*/ |
||||
private static class TempVarsStack { |
||||
int index = 0; |
||||
TempVars[] tempVars = new TempVars[STACK_SIZE]; |
||||
} |
||||
|
||||
/** |
||||
* ThreadLocal to store a TempVarsStack for each thread. |
||||
* This ensures each thread has a single TempVarsStack that is |
||||
* used only in method calls in that thread. |
||||
*/ |
||||
private static final ThreadLocal<TempVarsStack> varsLocal = new ThreadLocal<TempVarsStack>() { |
||||
@Override |
||||
public TempVarsStack initialValue() { |
||||
return new TempVarsStack(); |
||||
} |
||||
}; |
||||
|
||||
private static final ThreadLocal<TempVars> tempVars = new ThreadLocal<TempVars>(){ |
||||
@Override |
||||
public TempVars initialValue() { |
||||
return new TempVars(); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* This instance of TempVars has been retrieved but not released yet. |
||||
*/ |
||||
private boolean isUsed = false; |
||||
|
||||
private TempVars() { |
||||
} |
||||
|
||||
public static TempVars get(){ |
||||
return tempVars.get(); |
||||
} |
||||
|
||||
public void release(){ |
||||
} |
||||
|
||||
/** |
||||
* Acquire an instance of the TempVar class. |
||||
* You have to release the instance after use by calling the |
||||
* release() method. |
||||
* If more than STACK_SIZE (currently 5) instances are requested |
||||
* in a single thread then an ArrayIndexOutOfBoundsException will be thrown. |
||||
* |
||||
* @return A TempVar instance |
||||
*/ |
||||
/* |
||||
public static TempVars get() { |
||||
TempVarsStack stack = varsLocal.get(); |
||||
|
||||
TempVars instance = stack.tempVars[stack.index]; |
||||
|
||||
if (instance == null){ |
||||
// Create new
|
||||
instance = new TempVars(); |
||||
|
||||
// Put it in there
|
||||
stack.tempVars[stack.index] = instance; |
||||
} |
||||
|
||||
stack.index++; |
||||
|
||||
instance.isUsed = true; |
||||
|
||||
return instance; |
||||
} |
||||
*/ |
||||
|
||||
/** |
||||
* Releases this instance of TempVars. |
||||
* Once released, the contents of the TempVars are undefined. |
||||
* The TempVars must be released in the opposite order that they are retrieved, |
||||
* e.g. Acquiring vars1, then acquiring vars2, vars2 MUST be released |
||||
* first otherwise an exception will be thrown. |
||||
*/ |
||||
/* |
||||
public void release() { |
||||
if (!isUsed){ |
||||
throw new IllegalStateException("This instance of TempVars was already released!"); |
||||
} |
||||
|
||||
isUsed = false; |
||||
|
||||
TempVarsStack stack = varsLocal.get(); |
||||
|
||||
// Return it to the stack
|
||||
stack.index--; |
||||
|
||||
// Check if it is actually there
|
||||
if (stack.tempVars[stack.index] != this){ |
||||
throw new IllegalStateException("An instance of TempVars has not been released in a called method!"); |
||||
} |
||||
}*/ |
||||
|
||||
/** |
||||
* For interfacing with OpenGL in Renderer. |
||||
*/ |
||||
public final IntBuffer intBuffer1 = BufferUtils.createIntBuffer(1); |
||||
public final IntBuffer intBuffer16 = BufferUtils.createIntBuffer(16); |
||||
public final FloatBuffer floatBuffer16 = BufferUtils.createFloatBuffer(16); |
||||
/** |
||||
* Skinning buffers |
||||
*/ |
||||
public final float[] skinPositions = new float[512 * 3]; |
||||
public final float[] skinNormals = new float[512 * 3]; |
||||
/** |
||||
* Fetching triangle from mesh |
||||
*/ |
||||
public final Triangle triangle = new Triangle(); |
||||
/** |
||||
* General vectors. |
||||
*/ |
||||
public final Vector3f vect1 = new Vector3f(); |
||||
public final Vector3f vect2 = new Vector3f(); |
||||
public final Vector3f vect3 = new Vector3f(); |
||||
public final Vector3f vect4 = new Vector3f(); |
||||
public final Vector3f vect5 = new Vector3f(); |
||||
public final Vector3f vect6 = new Vector3f(); |
||||
public final Vector3f vect7 = new Vector3f(); |
||||
//seems the maximum number of vector used is 7 in com.jme3.bounding.java
|
||||
public final Vector3f vect8 = new Vector3f(); |
||||
public final Vector3f vect9 = new Vector3f(); |
||||
public final Vector3f vect10 = new Vector3f(); |
||||
public final Vector3f[] tri = {new Vector3f(), |
||||
new Vector3f(), |
||||
new Vector3f()}; |
||||
/** |
||||
* 2D vector |
||||
*/ |
||||
public final Vector2f vect2d = new Vector2f(); |
||||
public final Vector2f vect2d2 = new Vector2f(); |
||||
/** |
||||
* General matrices. |
||||
*/ |
||||
public final Matrix3f tempMat3 = new Matrix3f(); |
||||
public final Matrix4f tempMat4 = new Matrix4f(); |
||||
/** |
||||
* General quaternions. |
||||
*/ |
||||
public final Quaternion quat1 = new Quaternion(); |
||||
public final Quaternion quat2 = new Quaternion(); |
||||
/** |
||||
* Eigen |
||||
*/ |
||||
public final Eigen3f eigen = new Eigen3f(); |
||||
/** |
||||
* Plane |
||||
*/ |
||||
public final Plane plane = new Plane(); |
||||
/** |
||||
* BoundingBox ray collision |
||||
*/ |
||||
public final float[] fWdU = new float[3]; |
||||
public final float[] fAWdU = new float[3]; |
||||
public final float[] fDdU = new float[3]; |
||||
public final float[] fADdU = new float[3]; |
||||
public final float[] fAWxDdU = new float[3]; |
||||
/** |
||||
* Maximum tree depth .. 32 levels?? |
||||
*/ |
||||
public final Spatial[] spatialStack = new Spatial[32]; |
||||
public final float[] matrixWrite = new float[16]; |
||||
/** |
||||
* BIHTree |
||||
*/ |
||||
public final float[] bihSwapTmp = new float[9]; |
||||
public final ArrayList<BIHStackData> bihStack = new ArrayList<BIHStackData>(); |
||||
} |
||||
/* |
||||
* 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.util; |
||||
|
||||
import com.jme3.collision.bih.BIHNode.BIHStackData; |
||||
import com.jme3.math.Eigen3f; |
||||
import com.jme3.math.Matrix4f; |
||||
import com.jme3.math.Matrix3f; |
||||
import com.jme3.math.Plane; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Triangle; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Spatial; |
||||
import java.nio.FloatBuffer; |
||||
import java.nio.IntBuffer; |
||||
import java.util.ArrayList; |
||||
|
||||
/** |
||||
* Temporary variables assigned to each thread. Engine classes may access |
||||
* these temp variables with TempVars.get(), all retrieved TempVars |
||||
* instances must be returned via TempVars.release(). |
||||
* This returns an available instance of the TempVar class ensuring this |
||||
* particular instance is never used elsewhere in the mean time. |
||||
*/ |
||||
public class TempVars { |
||||
|
||||
/** |
||||
* Allow X instances of TempVars in a single thread. |
||||
*/ |
||||
private static final int STACK_SIZE = 5; |
||||
|
||||
/** |
||||
* <code>TempVarsStack</code> contains a stack of TempVars. |
||||
* Every time TempVars.get() is called, a new entry is added to the stack, |
||||
* and the index incremented. |
||||
* When TempVars.release() is called, the entry is checked against |
||||
* the current instance and then the index is decremented. |
||||
*/ |
||||
private static class TempVarsStack { |
||||
int index = 0; |
||||
TempVars[] tempVars = new TempVars[STACK_SIZE]; |
||||
} |
||||
|
||||
/** |
||||
* ThreadLocal to store a TempVarsStack for each thread. |
||||
* This ensures each thread has a single TempVarsStack that is |
||||
* used only in method calls in that thread. |
||||
*/ |
||||
private static final ThreadLocal<TempVarsStack> varsLocal = new ThreadLocal<TempVarsStack>() { |
||||
@Override |
||||
public TempVarsStack initialValue() { |
||||
return new TempVarsStack(); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* This instance of TempVars has been retrieved but not released yet. |
||||
*/ |
||||
private boolean isUsed = false; |
||||
|
||||
private TempVars() { |
||||
} |
||||
|
||||
/** |
||||
* Acquire an instance of the TempVar class. |
||||
* You have to release the instance after use by calling the |
||||
* release() method. |
||||
* If more than STACK_SIZE (currently 5) instances are requested |
||||
* in a single thread then an ArrayIndexOutOfBoundsException will be thrown. |
||||
* |
||||
* @return A TempVar instance |
||||
*/ |
||||
public static TempVars get() { |
||||
TempVarsStack stack = varsLocal.get(); |
||||
|
||||
TempVars instance = stack.tempVars[stack.index]; |
||||
|
||||
if (instance == null){ |
||||
// Create new
|
||||
instance = new TempVars(); |
||||
|
||||
// Put it in there
|
||||
stack.tempVars[stack.index] = instance; |
||||
} |
||||
|
||||
stack.index++; |
||||
|
||||
instance.isUsed = true; |
||||
|
||||
return instance; |
||||
} |
||||
|
||||
/** |
||||
* Releases this instance of TempVars. |
||||
* Once released, the contents of the TempVars are undefined. |
||||
* The TempVars must be released in the opposite order that they are retrieved, |
||||
* e.g. Acquiring vars1, then acquiring vars2, vars2 MUST be released |
||||
* first otherwise an exception will be thrown. |
||||
*/ |
||||
public void release() { |
||||
if (!isUsed){ |
||||
throw new IllegalStateException("This instance of TempVars was already released!"); |
||||
} |
||||
|
||||
isUsed = false; |
||||
|
||||
TempVarsStack stack = varsLocal.get(); |
||||
|
||||
// Return it to the stack
|
||||
stack.index--; |
||||
|
||||
// Check if it is actually there
|
||||
if (stack.tempVars[stack.index] != this){ |
||||
throw new IllegalStateException("An instance of TempVars has not been released in a called method!"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* For interfacing with OpenGL in Renderer. |
||||
*/ |
||||
public final IntBuffer intBuffer1 = BufferUtils.createIntBuffer(1); |
||||
public final IntBuffer intBuffer16 = BufferUtils.createIntBuffer(16); |
||||
public final FloatBuffer floatBuffer16 = BufferUtils.createFloatBuffer(16); |
||||
/** |
||||
* Skinning buffers |
||||
*/ |
||||
public final float[] skinPositions = new float[512 * 3]; |
||||
public final float[] skinNormals = new float[512 * 3]; |
||||
/** |
||||
* Fetching triangle from mesh |
||||
*/ |
||||
public final Triangle triangle = new Triangle(); |
||||
/** |
||||
* General vectors. |
||||
*/ |
||||
public final Vector3f vect1 = new Vector3f(); |
||||
public final Vector3f vect2 = new Vector3f(); |
||||
public final Vector3f vect3 = new Vector3f(); |
||||
public final Vector3f vect4 = new Vector3f(); |
||||
public final Vector3f vect5 = new Vector3f(); |
||||
public final Vector3f vect6 = new Vector3f(); |
||||
public final Vector3f vect7 = new Vector3f(); |
||||
//seems the maximum number of vector used is 7 in com.jme3.bounding.java
|
||||
public final Vector3f vect8 = new Vector3f(); |
||||
public final Vector3f vect9 = new Vector3f(); |
||||
public final Vector3f vect10 = new Vector3f(); |
||||
public final Vector3f[] tri = {new Vector3f(), |
||||
new Vector3f(), |
||||
new Vector3f()}; |
||||
/** |
||||
* 2D vector |
||||
*/ |
||||
public final Vector2f vect2d = new Vector2f(); |
||||
public final Vector2f vect2d2 = new Vector2f(); |
||||
/** |
||||
* General matrices. |
||||
*/ |
||||
public final Matrix3f tempMat3 = new Matrix3f(); |
||||
public final Matrix4f tempMat4 = new Matrix4f(); |
||||
/** |
||||
* General quaternions. |
||||
*/ |
||||
public final Quaternion quat1 = new Quaternion(); |
||||
public final Quaternion quat2 = new Quaternion(); |
||||
/** |
||||
* Eigen |
||||
*/ |
||||
public final Eigen3f eigen = new Eigen3f(); |
||||
/** |
||||
* Plane |
||||
*/ |
||||
public final Plane plane = new Plane(); |
||||
/** |
||||
* BoundingBox ray collision |
||||
*/ |
||||
public final float[] fWdU = new float[3]; |
||||
public final float[] fAWdU = new float[3]; |
||||
public final float[] fDdU = new float[3]; |
||||
public final float[] fADdU = new float[3]; |
||||
public final float[] fAWxDdU = new float[3]; |
||||
/** |
||||
* Maximum tree depth .. 32 levels?? |
||||
*/ |
||||
public final Spatial[] spatialStack = new Spatial[32]; |
||||
public final float[] matrixWrite = new float[16]; |
||||
/** |
||||
* BIHTree |
||||
*/ |
||||
public final float[] bihSwapTmp = new float[9]; |
||||
public final ArrayList<BIHStackData> bihStack = new ArrayList<BIHStackData>(); |
||||
} |
||||
|
Loading…
Reference in new issue