From cf389fc84ccf9484177e0838e51820655817f550 Mon Sep 17 00:00:00 2001 From: "rem..om" Date: Sat, 8 Feb 2014 14:00:51 +0000 Subject: [PATCH] Merged changes r11023,r11022,r11028,r11029 to graddle restructure git-svn-id: https://jmonkeyengine.googlecode.com/svn/branches/gradle-restructure@11030 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../main/java/com/jme3/shadow/ShadowUtil.java | 58 +++++++++++-------- .../src/main/java/com/jme3/util/TempVars.java | 6 ++ 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java b/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java index eb6e3812b..0795b990b 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java +++ b/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java @@ -44,7 +44,6 @@ import com.jme3.scene.Geometry; import com.jme3.util.TempVars; import static java.lang.Math.max; import static java.lang.Math.min; -import java.util.ArrayList; import java.util.List; /** @@ -172,14 +171,16 @@ public class ShadowUtil { */ public static BoundingBox computeUnionBound(GeometryList list, Transform transform) { BoundingBox bbox = new BoundingBox(); + TempVars tempv = TempVars.get(); for (int i = 0; i < list.size(); i++) { BoundingVolume vol = list.get(i).getWorldBound(); - BoundingVolume newVol = vol.transform(transform); + BoundingVolume newVol = vol.transform(transform, tempv.bbox); //Nehon : prevent NaN and infinity values to screw the final bounding box if (!Float.isNaN(newVol.getCenter().x) && !Float.isInfinite(newVol.getCenter().x)) { bbox.mergeLocal(newVol); } } + tempv.release(); return bbox; } @@ -191,15 +192,16 @@ public class ShadowUtil { */ public static BoundingBox computeUnionBound(GeometryList list, Matrix4f mat) { BoundingBox bbox = new BoundingBox(); - BoundingVolume store = null; + TempVars tempv = TempVars.get(); for (int i = 0; i < list.size(); i++) { BoundingVolume vol = list.get(i).getWorldBound(); - store = vol.clone().transform(mat, null); + BoundingVolume store = vol.transform(mat, tempv.bbox); //Nehon : prevent NaN and infinity values to screw the final bounding box if (!Float.isNaN(store.getCenter().x) && !Float.isInfinite(store.getCenter().x)) { bbox.mergeLocal(store); } } + tempv.release(); return bbox; } @@ -356,7 +358,7 @@ public class ShadowUtil { Vector3f[] points, GeometryList splitOccluders, float shadowMapSize) { - + boolean ortho = shadowCam.isParallelProjection(); shadowCam.setProjectionMatrix(null); @@ -370,24 +372,33 @@ public class ShadowUtil { BoundingBox splitBB = computeBoundForPoints(points, viewProjMatrix); - ArrayList visRecvList = new ArrayList(); + TempVars vars = TempVars.get(); + + BoundingBox casterBB = new BoundingBox(); + BoundingBox receiverBB = new BoundingBox(); + + int casterCount = 0, receiverCount = 0; + for (int i = 0; i < receivers.size(); i++) { // convert bounding box to light's viewproj space Geometry receiver = receivers.get(i); BoundingVolume bv = receiver.getWorldBound(); - BoundingVolume recvBox = bv.transform(viewProjMatrix, null); + BoundingVolume recvBox = bv.transform(viewProjMatrix, vars.bbox); if (splitBB.intersects(recvBox)) { - visRecvList.add(recvBox); + //Nehon : prevent NaN and infinity values to screw the final bounding box + if (!Float.isNaN(recvBox.getCenter().x) && !Float.isInfinite(recvBox.getCenter().x)) { + receiverBB.mergeLocal(recvBox); + receiverCount++; + } } } - ArrayList visOccList = new ArrayList(); for (int i = 0; i < occluders.size(); i++) { // convert bounding box to light's viewproj space Geometry occluder = occluders.get(i); BoundingVolume bv = occluder.getWorldBound(); - BoundingVolume occBox = bv.transform(viewProjMatrix, null); + BoundingVolume occBox = bv.transform(viewProjMatrix, vars.bbox); boolean intersects = splitBB.intersects(occBox); if (!intersects && occBox instanceof BoundingBox) { @@ -401,36 +412,37 @@ public class ShadowUtil { occBB.setZExtent(occBB.getZExtent() + 50); occBB.setCenter(occBB.getCenter().addLocal(0, 0, 25)); if (splitBB.intersects(occBB)) { - // To prevent extending the depth range too much - // We return the bound to its former shape - // Before adding it - occBB.setZExtent(occBB.getZExtent() - 50); - occBB.setCenter(occBB.getCenter().subtractLocal(0, 0, 25)); - visOccList.add(occBox); + //Nehon : prevent NaN and infinity values to screw the final bounding box + if (!Float.isNaN(occBox.getCenter().x) && !Float.isInfinite(occBox.getCenter().x)) { + // To prevent extending the depth range too much + // We return the bound to its former shape + // Before adding it + occBB.setZExtent(occBB.getZExtent() - 50); + occBB.setCenter(occBB.getCenter().subtractLocal(0, 0, 25)); + casterBB.mergeLocal(occBox); + casterCount++; + } if (splitOccluders != null) { splitOccluders.add(occluder); } + } } else if (intersects) { - visOccList.add(occBox); + casterBB.mergeLocal(occBox); + casterCount++; if (splitOccluders != null) { splitOccluders.add(occluder); } } } - BoundingBox casterBB = computeUnionBound(visOccList); - BoundingBox receiverBB = computeUnionBound(visRecvList); - //Nehon 08/18/2010 this is to avoid shadow bleeding when the ground is set to only receive shadows - if (visOccList.size() != visRecvList.size()) { + if (casterCount != receiverCount) { casterBB.setXExtent(casterBB.getXExtent() + 2.0f); casterBB.setYExtent(casterBB.getYExtent() + 2.0f); casterBB.setZExtent(casterBB.getZExtent() + 2.0f); } - TempVars vars = TempVars.get(); - Vector3f casterMin = casterBB.getMin(vars.vect1); Vector3f casterMax = casterBB.getMax(vars.vect2); diff --git a/jme3-core/src/main/java/com/jme3/util/TempVars.java b/jme3-core/src/main/java/com/jme3/util/TempVars.java index 3f0f7596d..f41d617ba 100644 --- a/jme3-core/src/main/java/com/jme3/util/TempVars.java +++ b/jme3-core/src/main/java/com/jme3/util/TempVars.java @@ -31,6 +31,8 @@ */ package com.jme3.util; +import com.jme3.bounding.BoundingBox; +import com.jme3.bounding.BoundingVolume; import com.jme3.collision.bih.BIHNode.BIHStackData; import com.jme3.math.*; import com.jme3.scene.Spatial; @@ -143,6 +145,10 @@ public class TempVars { public final IntBuffer intBuffer1 = BufferUtils.createIntBuffer(1); public final IntBuffer intBuffer16 = BufferUtils.createIntBuffer(16); public final FloatBuffer floatBuffer16 = BufferUtils.createFloatBuffer(16); + /** + * BoundingVolumes (for shadows etc.) + */ + public final BoundingBox bbox = new BoundingBox(); /** * Skinning buffers */