diff --git a/engine/src/core/com/jme3/scene/control/LodControl.java b/engine/src/core/com/jme3/scene/control/LodControl.java index 9bb5fd5b3..ca9a8919b 100644 --- a/engine/src/core/com/jme3/scene/control/LodControl.java +++ b/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 - * on the screen the spatial is taking up. The more pixels covered, the more detailed - * the spatial should be. - * It calculates the area of the screen that the spatial covers by using its bounding box. - * When initializing, it will ask the spatial for how many triangles it has for each LOD. - * It then uses that, along with the trisPerPixel value to determine what LOD it should be at. - * It requires the camera to do this. - * The controlRender method is called each frame and will update the spatial's LOD - * if the camera has moved by a specified amount. + * on the screen the spatial is taking up. The more pixels covered, the more + * detailed the spatial should be. It calculates the area of the screen that the + * spatial covers by using its bounding box. When initializing, it will ask the + * spatial for how many triangles it has for each LOD. It then uses that, along + * with the trisPerPixel value to determine what LOD it should be at. It + * requires the camera to do this. The controlRender method is called each frame + * and will update the spatial's LOD if the camera has moved by a specified + * amount. */ public class LodControl extends AbstractControl implements Cloneable { @@ -66,27 +66,28 @@ public class LodControl extends AbstractControl implements Cloneable { private int[] numTris; /** - * Creates a new LodControl. + * Creates a new + * LodControl. */ - public LodControl(){ + public LodControl() { } /** * Returns the distance tolerance for changing LOD. - * + * * @return the distance tolerance for changing LOD. - * - * @see #setDistTolerance(float) + * + * @see #setDistTolerance(float) */ public float getDistTolerance() { return distTolerance; } /** - * Specifies the distance tolerance for changing the LOD level on the geometry. - * The LOD level will only get changed if the geometry has moved this - * distance beyond the current LOD level. - * + * Specifies the distance tolerance for changing the LOD level on the + * geometry. The LOD level will only get changed if the geometry has moved + * this distance beyond the current LOD level. + * * @param distTolerance distance tolerance for changing LOD */ public void setDistTolerance(float distTolerance) { @@ -95,21 +96,21 @@ public class LodControl extends AbstractControl implements Cloneable { /** * Returns the triangles per pixel value. - * + * * @return the triangles per pixel value. - * - * @see #setTrisPerPixel(float) + * + * @see #setTrisPerPixel(float) */ public float getTrisPerPixel() { return trisPerPixel; } /** - * Sets the triangles per pixel value. - * The LodControl will use this value as an error metric - * to determine which LOD level to use based on the geometry's - * area on the screen. - * + * Sets the triangles per pixel value. The + * LodControl will use this value as an error metric to + * determine which LOD level to use based on the geometry's area on the + * screen. + * * @param trisPerPixel triangles per pixel */ public void setTrisPerPixel(float trisPerPixel) { @@ -117,19 +118,22 @@ public class LodControl extends AbstractControl implements Cloneable { } @Override - public void setSpatial(Spatial spatial){ - if (!(spatial instanceof Geometry)) + public void setSpatial(Spatial spatial) { + if (!(spatial instanceof Geometry)) { throw new IllegalArgumentException("LodControl can only be attached to Geometry!"); + } super.setSpatial(spatial); Geometry geom = (Geometry) spatial; Mesh mesh = geom.getMesh(); numLevels = mesh.getNumLodLevels(); 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); + } } + @Override public Control cloneForSpatial(Spatial spatial) { try { LodControl clone = (LodControl) super.clone(); @@ -146,7 +150,7 @@ public class LodControl extends AbstractControl implements Cloneable { protected void controlUpdate(float tpf) { } - protected void controlRender(RenderManager rm, ViewPort vp){ + protected void controlRender(RenderManager rm, ViewPort vp) { BoundingVolume bv = spatial.getWorldBound(); Camera cam = vp.getCamera(); @@ -155,21 +159,21 @@ public class LodControl extends AbstractControl implements Cloneable { float newDistance = bv.distanceTo(vp.getCamera().getLocation()) / ratio; 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. - 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. - 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. - else{ + } else { lastDistance = newDistance; // estimate area of polygon via bounding volume float area = AreaUtils.calcScreenArea(bv, lastDistance, cam.getWidth()); float trisToDraw = area * trisPerPixel; level = numLevels - 1; - for (int i = numLevels; --i >= 0;){ - if (trisToDraw - numTris[i] < 0){ + for (int i = numLevels; --i >= 0;) { + if (trisToDraw - numTris[i] < 0) { break; } level = i; @@ -181,7 +185,7 @@ public class LodControl extends AbstractControl implements Cloneable { } @Override - public void write(JmeExporter ex) throws IOException{ + public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule oc = ex.getCapsule(this); oc.write(trisPerPixel, "trisPerPixel", 1f); @@ -191,7 +195,7 @@ public class LodControl extends AbstractControl implements Cloneable { } @Override - public void read(JmeImporter im) throws IOException{ + public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule ic = im.getCapsule(this); trisPerPixel = ic.readFloat("trisPerPixel", 1f); @@ -199,5 +203,4 @@ public class LodControl extends AbstractControl implements Cloneable { numLevels = ic.readInt("numLevels", 0); numTris = ic.readIntArray("numTris", null); } - }