Formated LodControl before fixing a cloning issue

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10739 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
rem..om 12 years ago
parent a33c7394e3
commit b61192d71e
  1. 63
      engine/src/core/com/jme3/scene/control/LodControl.java

@ -47,14 +47,14 @@ import java.io.IOException;
/** /**
* Determines what Level of Detail a spatial should be, based on how many pixels * Determines what Level of Detail a spatial should be, based on how many pixels
* on the screen the spatial is taking up. The more pixels covered, the more detailed * on the screen the spatial is taking up. The more pixels covered, the more
* the spatial should be. * detailed the spatial should be. It calculates the area of the screen that the
* It calculates the area of the screen that the spatial covers by using its bounding box. * spatial covers by using its bounding box. When initializing, it will ask the
* When initializing, it will ask the spatial for how many triangles it has for each LOD. * spatial for how many triangles it has for each LOD. It then uses that, along
* It then uses that, along with the trisPerPixel value to determine what LOD it should be at. * with the trisPerPixel value to determine what LOD it should be at. It
* It requires the camera to do this. * requires the camera to do this. The controlRender method is called each frame
* The controlRender method is called each frame and will update the spatial's LOD * and will update the spatial's LOD if the camera has moved by a specified
* if the camera has moved by a specified amount. * amount.
*/ */
public class LodControl extends AbstractControl implements Cloneable { public class LodControl extends AbstractControl implements Cloneable {
@ -66,9 +66,10 @@ public class LodControl extends AbstractControl implements Cloneable {
private int[] numTris; private int[] numTris;
/** /**
* Creates a new <code>LodControl</code>. * Creates a new
* <code>LodControl</code>.
*/ */
public LodControl(){ public LodControl() {
} }
/** /**
@ -83,9 +84,9 @@ public class LodControl extends AbstractControl implements Cloneable {
} }
/** /**
* Specifies the distance tolerance for changing the LOD level on the geometry. * Specifies the distance tolerance for changing the LOD level on the
* The LOD level will only get changed if the geometry has moved this * geometry. The LOD level will only get changed if the geometry has moved
* distance beyond the current LOD level. * this distance beyond the current LOD level.
* *
* @param distTolerance distance tolerance for changing LOD * @param distTolerance distance tolerance for changing LOD
*/ */
@ -105,10 +106,10 @@ public class LodControl extends AbstractControl implements Cloneable {
} }
/** /**
* Sets the triangles per pixel value. * Sets the triangles per pixel value. The
* The <code>LodControl</code> will use this value as an error metric * <code>LodControl</code> will use this value as an error metric to
* to determine which LOD level to use based on the geometry's * determine which LOD level to use based on the geometry's area on the
* area on the screen. * screen.
* *
* @param trisPerPixel triangles per pixel * @param trisPerPixel triangles per pixel
*/ */
@ -117,19 +118,22 @@ public class LodControl extends AbstractControl implements Cloneable {
} }
@Override @Override
public void setSpatial(Spatial spatial){ public void setSpatial(Spatial spatial) {
if (!(spatial instanceof Geometry)) if (!(spatial instanceof Geometry)) {
throw new IllegalArgumentException("LodControl can only be attached to Geometry!"); throw new IllegalArgumentException("LodControl can only be attached to Geometry!");
}
super.setSpatial(spatial); super.setSpatial(spatial);
Geometry geom = (Geometry) spatial; Geometry geom = (Geometry) spatial;
Mesh mesh = geom.getMesh(); Mesh mesh = geom.getMesh();
numLevels = mesh.getNumLodLevels(); numLevels = mesh.getNumLodLevels();
numTris = new int[numLevels]; numTris = new int[numLevels];
for (int i = numLevels - 1; i >= 0; i--) for (int i = numLevels - 1; i >= 0; i--) {
numTris[i] = mesh.getTriangleCount(i); numTris[i] = mesh.getTriangleCount(i);
}
} }
@Override
public Control cloneForSpatial(Spatial spatial) { public Control cloneForSpatial(Spatial spatial) {
try { try {
LodControl clone = (LodControl) super.clone(); LodControl clone = (LodControl) super.clone();
@ -146,7 +150,7 @@ public class LodControl extends AbstractControl implements Cloneable {
protected void controlUpdate(float tpf) { protected void controlUpdate(float tpf) {
} }
protected void controlRender(RenderManager rm, ViewPort vp){ protected void controlRender(RenderManager rm, ViewPort vp) {
BoundingVolume bv = spatial.getWorldBound(); BoundingVolume bv = spatial.getWorldBound();
Camera cam = vp.getCamera(); Camera cam = vp.getCamera();
@ -155,21 +159,21 @@ public class LodControl extends AbstractControl implements Cloneable {
float newDistance = bv.distanceTo(vp.getCamera().getLocation()) / ratio; float newDistance = bv.distanceTo(vp.getCamera().getLocation()) / ratio;
int level; int level;
if (Math.abs(newDistance - lastDistance) <= distTolerance) if (Math.abs(newDistance - lastDistance) <= distTolerance) {
level = lastLevel; // we haven't moved relative to the model, send the old measurement back. level = lastLevel; // we haven't moved relative to the model, send the old measurement back.
else if (lastDistance > newDistance && lastLevel == 0) } else if (lastDistance > newDistance && lastLevel == 0) {
level = lastLevel; // we're already at the lowest setting and we just got closer to the model, no need to keep trying. level = lastLevel; // we're already at the lowest setting and we just got closer to the model, no need to keep trying.
else if (lastDistance < newDistance && lastLevel == numLevels - 1) } else if (lastDistance < newDistance && lastLevel == numLevels - 1) {
level = lastLevel; // we're already at the highest setting and we just got further from the model, no need to keep trying. level = lastLevel; // we're already at the highest setting and we just got further from the model, no need to keep trying.
else{ } else {
lastDistance = newDistance; lastDistance = newDistance;
// estimate area of polygon via bounding volume // estimate area of polygon via bounding volume
float area = AreaUtils.calcScreenArea(bv, lastDistance, cam.getWidth()); float area = AreaUtils.calcScreenArea(bv, lastDistance, cam.getWidth());
float trisToDraw = area * trisPerPixel; float trisToDraw = area * trisPerPixel;
level = numLevels - 1; level = numLevels - 1;
for (int i = numLevels; --i >= 0;){ for (int i = numLevels; --i >= 0;) {
if (trisToDraw - numTris[i] < 0){ if (trisToDraw - numTris[i] < 0) {
break; break;
} }
level = i; level = i;
@ -181,7 +185,7 @@ public class LodControl extends AbstractControl implements Cloneable {
} }
@Override @Override
public void write(JmeExporter ex) throws IOException{ public void write(JmeExporter ex) throws IOException {
super.write(ex); super.write(ex);
OutputCapsule oc = ex.getCapsule(this); OutputCapsule oc = ex.getCapsule(this);
oc.write(trisPerPixel, "trisPerPixel", 1f); oc.write(trisPerPixel, "trisPerPixel", 1f);
@ -191,7 +195,7 @@ public class LodControl extends AbstractControl implements Cloneable {
} }
@Override @Override
public void read(JmeImporter im) throws IOException{ public void read(JmeImporter im) throws IOException {
super.read(im); super.read(im);
InputCapsule ic = im.getCapsule(this); InputCapsule ic = im.getCapsule(this);
trisPerPixel = ic.readFloat("trisPerPixel", 1f); trisPerPixel = ic.readFloat("trisPerPixel", 1f);
@ -199,5 +203,4 @@ public class LodControl extends AbstractControl implements Cloneable {
numLevels = ic.readInt("numLevels", 0); numLevels = ic.readInt("numLevels", 0);
numTris = ic.readIntArray("numTris", null); numTris = ic.readIntArray("numTris", null);
} }
} }

Loading…
Cancel
Save