Merge pull request #426 from InShadow/cleanup-batch-node
Batch node improvements
This commit is contained in:
		
						commit
						013fd08bd2
					
				| @ -31,14 +31,6 @@ | ||||
|  */ | ||||
| package com.jme3.scene; | ||||
| 
 | ||||
| import com.jme3.export.*; | ||||
| import com.jme3.material.Material; | ||||
| import com.jme3.math.Matrix4f; | ||||
| import com.jme3.math.Vector3f; | ||||
| import com.jme3.scene.mesh.IndexBuffer; | ||||
| import com.jme3.util.SafeArrayList; | ||||
| import com.jme3.util.TempVars; | ||||
| import java.io.IOException; | ||||
| import java.nio.Buffer; | ||||
| import java.nio.FloatBuffer; | ||||
| import java.util.ArrayList; | ||||
| @ -48,13 +40,22 @@ import java.util.Map; | ||||
| import java.util.logging.Level; | ||||
| import java.util.logging.Logger; | ||||
| 
 | ||||
| import com.jme3.collision.Collidable; | ||||
| import com.jme3.collision.CollisionResults; | ||||
| import com.jme3.material.Material; | ||||
| import com.jme3.math.Matrix4f; | ||||
| import com.jme3.math.Vector3f; | ||||
| import com.jme3.scene.mesh.IndexBuffer; | ||||
| import com.jme3.util.SafeArrayList; | ||||
| import com.jme3.util.TempVars; | ||||
| 
 | ||||
| /** | ||||
|  * BatchNode holds geometries that are a batched version of all the geometries that are in its sub scenegraph. | ||||
|  * There is one geometry per different material in the sub tree. | ||||
|  * The geometries are directly attached to the node in the scene graph. | ||||
|  * Usage is like any other node except you have to call the {@link #batch()} method once all the geometries have been attached to the sub scene graph and their material set | ||||
|  * (see todo more automagic for further enhancements) | ||||
|  * All the geometries that have been batched are set to {@link CullHint#Always} to not render them. | ||||
|  * All the geometries that have been batched are set to not be rendered - {@link CullHint} is left intact. | ||||
|  * The sub geometries can be transformed as usual, their transforms are used to update the mesh of the geometryBatch. | ||||
|  * Sub geoms can be removed but it may be slower than the normal spatial removing | ||||
|  * Sub geoms can be added after the batch() method has been called but won't be batched and will just be rendered as normal geometries. | ||||
| @ -72,7 +73,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|      */ | ||||
|     protected SafeArrayList<Batch> batches = new SafeArrayList<Batch>(Batch.class); | ||||
|     /** | ||||
|      * a map storing he batches by geometry to quickly acces the batch when updating | ||||
|      * a map for storing the batches by geometry to quickly access the batch when updating | ||||
|      */ | ||||
|     protected Map<Geometry, Batch> batchesByGeom = new HashMap<Geometry, Batch>(); | ||||
|     /** | ||||
| @ -118,7 +119,6 @@ public class BatchNode extends GeometryGroupNode { | ||||
|     public void onGeoemtryUnassociated(Geometry geom) { | ||||
|         setNeedsFullRebatch(true); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     protected Matrix4f getTransformMatrix(Geometry g){ | ||||
|         return g.cachedWorldMat; | ||||
| @ -166,7 +166,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|      */ | ||||
|     public void batch() { | ||||
|         doBatch(); | ||||
|         //we set the batch geometries to ignore transforms to avoid transforms of parent nodes to be applied twice         | ||||
|         //we set the batch geometries to ignore transforms to avoid transforms of parent nodes to be applied twice | ||||
|         for (Batch batch : batches.getArray()) { | ||||
|             batch.geometry.setIgnoreTransform(true); | ||||
|             batch.geometry.setUserData(UserData.JME_PHYSICSIGNORE, true); | ||||
| @ -174,10 +174,10 @@ public class BatchNode extends GeometryGroupNode { | ||||
|     } | ||||
| 
 | ||||
|     protected void doBatch() { | ||||
|         Map<Material, List<Geometry>> matMap = new HashMap<Material, List<Geometry>>();     | ||||
|         Map<Material, List<Geometry>> matMap = new HashMap<Material, List<Geometry>>(); | ||||
|         int nbGeoms = 0; | ||||
| 
 | ||||
|         gatherGeomerties(matMap, this, needsFullRebatch); | ||||
|         gatherGeometries(matMap, this, needsFullRebatch); | ||||
|         if (needsFullRebatch) { | ||||
|             for (Batch batch : batches.getArray()) { | ||||
|                 batch.geometry.removeFromParent(); | ||||
| @ -221,7 +221,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
| 
 | ||||
|             batch.geometry.setMesh(m); | ||||
|             batch.geometry.getMesh().updateCounts(); | ||||
|             batch.geometry.updateModelBound();             | ||||
|             batch.geometry.updateModelBound(); | ||||
|             batches.add(batch); | ||||
|         } | ||||
|         if (batches.size() > 0) { | ||||
| @ -271,7 +271,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|     } | ||||
|      | ||||
|      | ||||
|     private void gatherGeomerties(Map<Material, List<Geometry>> map, Spatial n, boolean rebatch) { | ||||
|     private void gatherGeometries(Map<Material, List<Geometry>> map, Spatial n, boolean rebatch) { | ||||
| 
 | ||||
|         if (n instanceof Geometry) { | ||||
| 
 | ||||
| @ -304,7 +304,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|                 if (child instanceof BatchNode) { | ||||
|                     continue; | ||||
|                 } | ||||
|                 gatherGeomerties(map, child, rebatch); | ||||
|                 gatherGeometries(map, child, rebatch); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -319,7 +319,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     private boolean isBatch(Spatial s) { | ||||
|     public final boolean isBatch(Spatial s) { | ||||
|         for (Batch batch : batches.getArray()) { | ||||
|             if (batch.geometry == s) { | ||||
|                 return true; | ||||
| @ -336,9 +336,6 @@ public class BatchNode extends GeometryGroupNode { | ||||
|      */ | ||||
|     @Override | ||||
|     public void setMaterial(Material material) { | ||||
| //        for (Batch batch : batches.values()) { | ||||
| //            batch.geometry.setMaterial(material); | ||||
| //        } | ||||
|         throw new UnsupportedOperationException("Unsupported for now, please set the material on the geoms before batching"); | ||||
|     } | ||||
| 
 | ||||
| @ -356,74 +353,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|             Batch b = batches.iterator().next(); | ||||
|             return b.geometry.getMaterial(); | ||||
|         } | ||||
|         return null;//material; | ||||
|     } | ||||
| 
 | ||||
| //    /** | ||||
| //     * Sets the material to the a specific batch of this BatchNode | ||||
| //     *  | ||||
| //     *  | ||||
| //     * @param material the material to use for this geometry | ||||
| //     */    | ||||
| //    public void setMaterial(Material material,int batchIndex) { | ||||
| //        if (!batches.isEmpty()) { | ||||
| //             | ||||
| //        } | ||||
| //         | ||||
| //    } | ||||
| // | ||||
| //    /** | ||||
| //     * Returns the material that is used for the first batch of this BatchNode | ||||
| //     *  | ||||
| //     * use getMaterial(Material material,int batchIndex) to get a material from a specific batch | ||||
| //     *  | ||||
| //     * @return the material that is used for the first batch of this BatchNode | ||||
| //     *  | ||||
| //     * @see #setMaterial(com.jme3.material.Material)  | ||||
| //     */ | ||||
| //    public Material getMaterial(int batchIndex) { | ||||
| //        if (!batches.isEmpty()) { | ||||
| //            Batch b = batches.get(batches.keySet().iterator().next()); | ||||
| //            return b.geometry.getMaterial(); | ||||
| //        } | ||||
| //        return null;//material; | ||||
| //    } | ||||
|     @Override | ||||
|     public void write(JmeExporter ex) throws IOException { | ||||
|         super.write(ex); | ||||
|         OutputCapsule oc = ex.getCapsule(this); | ||||
| // | ||||
| //        if (material != null) { | ||||
| //            oc.write(material.getAssetName(), "materialName", null); | ||||
| //        } | ||||
| //        oc.write(material, "material", null); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void read(JmeImporter im) throws IOException { | ||||
|         super.read(im); | ||||
|         InputCapsule ic = im.getCapsule(this); | ||||
| 
 | ||||
| 
 | ||||
| //        material = null; | ||||
| //        String matName = ic.readString("materialName", null); | ||||
| //        if (matName != null) { | ||||
| //            // Material name is set, | ||||
| //            // Attempt to load material via J3M | ||||
| //            try { | ||||
| //                material = im.getAssetManager().loadMaterial(matName); | ||||
| //            } catch (AssetNotFoundException ex) { | ||||
| //                // Cannot find J3M file. | ||||
| //                logger.log(Level.FINE, "Could not load J3M file {0} for Geometry.", | ||||
| //                        matName); | ||||
| //            } | ||||
| //        } | ||||
| //        // If material is NULL, try to load it from the geometry | ||||
| //        if (material == null) { | ||||
| //            material = (Material) ic.readSavable("material", null); | ||||
| //        } | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -494,7 +424,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|             if (mode != null && mode != listMode) { | ||||
|                 throw new UnsupportedOperationException("Cannot combine different" | ||||
|                         + " primitive types: " + mode + " != " + listMode); | ||||
|             }             | ||||
|             } | ||||
|             mode = listMode; | ||||
|             if (mode == Mesh.Mode.Lines) { | ||||
|                 if (lineWidth != 1f && listLineWidth != lineWidth) { | ||||
| @ -510,8 +440,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|         outMesh.setMode(mode); | ||||
|         outMesh.setLineWidth(lineWidth); | ||||
|         if (totalVerts >= 65536) { | ||||
|             // make sure we create an UnsignedInt buffer so | ||||
|             // we can fit all of the meshes | ||||
|             // make sure we create an UnsignedInt buffer so we can fit all of the meshes | ||||
|             formatForBuf[VertexBuffer.Type.Index.ordinal()] = VertexBuffer.Format.UnsignedInt; | ||||
|         } else { | ||||
|             formatForBuf[VertexBuffer.Type.Index.ordinal()] = VertexBuffer.Format.UnsignedShort; | ||||
| @ -733,7 +662,6 @@ public class BatchNode extends GeometryGroupNode { | ||||
|     } | ||||
| 
 | ||||
|     protected class Batch { | ||||
| 
 | ||||
|         /** | ||||
|          * update the batchesByGeom map for this batch with the given List of geometries | ||||
|          * @param list  | ||||
| @ -745,7 +673,7 @@ public class BatchNode extends GeometryGroupNode { | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         Geometry geometry;         | ||||
|         Geometry geometry; | ||||
|     } | ||||
| 
 | ||||
|     protected void setNeedsFullRebatch(boolean needsFullRebatch) { | ||||
| @ -771,4 +699,15 @@ public class BatchNode extends GeometryGroupNode { | ||||
|         } | ||||
|         return clone; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public int collideWith(Collidable other, CollisionResults results) { | ||||
|         int total = 0; | ||||
|         for (Spatial child : children.getArray()){ | ||||
|             if (!isBatch(child)) { | ||||
|                 total += child.collideWith(other, results); | ||||
|             } | ||||
|         } | ||||
|         return total; | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user