From aa4b8d19e77c29ab8311da7157979b60d0475643 Mon Sep 17 00:00:00 2001 From: "nor..67" Date: Sun, 20 Nov 2011 12:02:16 +0000 Subject: [PATCH] - create HeightFieldCollisionShapes in CollisionShapeFactory CompoundShape generation as well git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8736 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../bullet/util/CollisionShapeFactory.java | 23 ++++++++++++++- .../bullet/util/CollisionShapeFactory.java | 28 ++++++++++++++++--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/engine/src/bullet/com/jme3/bullet/util/CollisionShapeFactory.java b/engine/src/bullet/com/jme3/bullet/util/CollisionShapeFactory.java index f89d554a2..cc15bd508 100644 --- a/engine/src/bullet/com/jme3/bullet/util/CollisionShapeFactory.java +++ b/engine/src/bullet/com/jme3/bullet/util/CollisionShapeFactory.java @@ -89,13 +89,24 @@ public class CollisionShapeFactory { private static CompoundCollisionShape createCompoundShape(Node realRootNode, Node rootNode, CompoundCollisionShape shape, boolean meshAccurate, boolean dynamic) { for (Spatial spatial : rootNode.getChildren()) { - if (spatial instanceof Node) { + if (spatial instanceof TerrainQuad) { + Boolean bool = spatial.getUserData(UserData.JME_PHYSICSIGNORE); + if (bool != null && bool.booleanValue()) { + continue; // go to the next child in the loop + } + TerrainQuad terrain = (TerrainQuad) spatial; + Transform trans = getTransform(spatial, realRootNode); + shape.addChildShape(new HeightfieldCollisionShape(terrain.getHeightMap(), terrain.getLocalScale()), + trans.getTranslation(), + trans.getRotation().toRotationMatrix()); + } else if (spatial instanceof Node) { createCompoundShape(realRootNode, (Node) spatial, shape, meshAccurate, dynamic); } else if (spatial instanceof Geometry) { Boolean bool = spatial.getUserData(UserData.JME_PHYSICSIGNORE); if (bool != null && bool.booleanValue()) { continue; // go to the next child in the loop } + if (meshAccurate) { CollisionShape childShape = dynamic ? createSingleDynamicMeshShape((Geometry) spatial, realRootNode) @@ -112,6 +123,16 @@ public class CollisionShapeFactory { trans.getTranslation(), trans.getRotation().toRotationMatrix()); } + } else if (spatial instanceof TerrainPatch) { + Boolean bool = spatial.getUserData(UserData.JME_PHYSICSIGNORE); + if (bool != null && bool.booleanValue()) { + continue; // go to the next child in the loop + } + TerrainPatch terrain = (TerrainPatch) spatial; + Transform trans = getTransform(spatial, realRootNode); + shape.addChildShape(new HeightfieldCollisionShape(terrain.getHeightmap(), terrain.getLocalScale()), + trans.getTranslation(), + trans.getRotation().toRotationMatrix()); } } return shape; diff --git a/engine/src/jbullet/com/jme3/bullet/util/CollisionShapeFactory.java b/engine/src/jbullet/com/jme3/bullet/util/CollisionShapeFactory.java index a71e51301..cc15bd508 100644 --- a/engine/src/jbullet/com/jme3/bullet/util/CollisionShapeFactory.java +++ b/engine/src/jbullet/com/jme3/bullet/util/CollisionShapeFactory.java @@ -89,14 +89,24 @@ public class CollisionShapeFactory { private static CompoundCollisionShape createCompoundShape(Node realRootNode, Node rootNode, CompoundCollisionShape shape, boolean meshAccurate, boolean dynamic) { for (Spatial spatial : rootNode.getChildren()) { - if (spatial instanceof Node) { + if (spatial instanceof TerrainQuad) { + Boolean bool = spatial.getUserData(UserData.JME_PHYSICSIGNORE); + if (bool != null && bool.booleanValue()) { + continue; // go to the next child in the loop + } + TerrainQuad terrain = (TerrainQuad) spatial; + Transform trans = getTransform(spatial, realRootNode); + shape.addChildShape(new HeightfieldCollisionShape(terrain.getHeightMap(), terrain.getLocalScale()), + trans.getTranslation(), + trans.getRotation().toRotationMatrix()); + } else if (spatial instanceof Node) { createCompoundShape(realRootNode, (Node) spatial, shape, meshAccurate, dynamic); } else if (spatial instanceof Geometry) { Boolean bool = spatial.getUserData(UserData.JME_PHYSICSIGNORE); - if (bool != null && bool.booleanValue()){ + if (bool != null && bool.booleanValue()) { continue; // go to the next child in the loop } - + if (meshAccurate) { CollisionShape childShape = dynamic ? createSingleDynamicMeshShape((Geometry) spatial, realRootNode) @@ -113,6 +123,16 @@ public class CollisionShapeFactory { trans.getTranslation(), trans.getRotation().toRotationMatrix()); } + } else if (spatial instanceof TerrainPatch) { + Boolean bool = spatial.getUserData(UserData.JME_PHYSICSIGNORE); + if (bool != null && bool.booleanValue()) { + continue; // go to the next child in the loop + } + TerrainPatch terrain = (TerrainPatch) spatial; + Transform trans = getTransform(spatial, realRootNode); + shape.addChildShape(new HeightfieldCollisionShape(terrain.getHeightmap(), terrain.getLocalScale()), + trans.getTranslation(), + trans.getRotation().toRotationMatrix()); } } return shape; @@ -235,7 +255,7 @@ public class CollisionShapeFactory { return null; } } - + /** * This method moves each child shape of a compound shape by the given vector * @param vector