com.jme3.terrain.geomipmap
Class TerrainPatch

java.lang.Object
  extended by com.jme3.scene.Spatial
      extended by com.jme3.scene.Geometry
          extended by com.jme3.terrain.geomipmap.TerrainPatch
All Implemented Interfaces:
CloneableSmartAsset, Collidable, Savable, java.lang.Cloneable

public class TerrainPatch
extends Geometry

A terrain patch is a leaf in the terrain quad tree. It has a mesh that can change levels of detail (LOD) whenever the view point, or camera, changes. The actual terrain mesh is created by the LODGeomap class. That uses a geo-mipmapping algorithm to change the index buffer of the mesh. The mesh is a triangle strip. In wireframe mode you might notice some strange lines, these are degenerate triangles generated by the geoMipMap algorithm and can be ignored. The video card removes them at almost no cost. Each patch needs to know its neighbour's LOD so it can seam its edges with them, in case the neighbour has a different LOD. If this doesn't happen, you will see gaps. The LOD value is most detailed at zero. It gets less detailed the higher the LOD value until you reach maxLod, which is a mathematical limit on the number of times the 'size' of the patch can be divided by two. However there is a -1 to that for now until I add in a custom index buffer calculation for that max level, the current algorithm does not go that far. You can supply a LodThresholdCalculator for use in determining when the LOD should change. It's API will no doubt change in the near future. Right now it defaults to just changing LOD every two patch sizes. So if a patch has a size of 65, then the LOD changes every 130 units away.


Nested Class Summary
 
Nested classes/interfaces inherited from class com.jme3.scene.Spatial
Spatial.BatchHint, Spatial.CullHint
 
Field Summary
protected  TerrainPatch bottomNeighbour
           
protected  LODGeomap geomap
           
protected  TerrainPatch leftNeighbour
           
protected  int lod
           
protected  int lodBottom
           
protected  float[] lodEntropy
           
protected  int lodLeft
           
protected  int lodRight
           
protected  int lodTop
           
protected  Vector2f offset
           
protected  float offsetAmount
           
protected  int previousLod
           
protected  short quadrant
           
protected  TerrainPatch rightNeighbour
           
protected  boolean searchedForNeighboursAlready
           
protected  int size
           
protected  Vector3f stepScale
           
protected  TerrainPatch topNeighbour
           
protected  int totalSize
           
protected  Vector3f worldScaleCached
           
protected  Vector3f worldTranslationCached
           
 
Fields inherited from class com.jme3.scene.Geometry
batchNode, cachedOffsetMat, cachedWorldMat, ignoreTransform, lodLevel, material, mesh, prevBatchTransforms, SAVABLE_VERSION, startIndex
 
Fields inherited from class com.jme3.scene.Spatial
batchHint, controls, cullHint, frustrumIntersects, key, localLights, localTransform, name, parent, queueBucket, queueDistance, refreshFlags, RF_BOUND, RF_LIGHTLIST, RF_TRANSFORM, shadowMode, userData, worldBound, worldLights, worldTransform
 
Constructor Summary
TerrainPatch()
           
TerrainPatch(java.lang.String name)
           
TerrainPatch(java.lang.String name, int size)
           
TerrainPatch(java.lang.String name, int size, Vector3f stepScale, float[] heightMap, Vector3f origin)
          Constructor instantiates a new TerrainPatch object.
TerrainPatch(java.lang.String name, int size, Vector3f stepScale, float[] heightMap, Vector3f origin, int totalSize, Vector2f offset, float offsetAmount)
          Constructor instantiates a new TerrainPatch object.
 
Method Summary
protected  void averageNormalsTangents(Vector3f topPoint, Vector3f rootPoint, Vector3f leftPoint, Vector3f bottomPoint, Vector3f rightPoint, Vector3f normal, Vector3f tangent, Vector3f binormal)
           
protected  void cacheTerrainTransforms()
          Caches the transforms (except rotation) so the LOD calculator, which runs on a separate thread, can access them safely.
 TerrainPatch clone()
          This version of clone is a shallow clone, in other words, the same mesh is referenced as the original geometry.
 int collideWith(Collidable other, CollisionResults results)
          Check collision with another Collidable.
protected  void ensurePositiveVolumeBBox()
           
protected  void fixNormalEdges(TerrainPatch right, TerrainPatch bottom, TerrainPatch top, TerrainPatch left, TerrainPatch bottomRight, TerrainPatch bottomLeft, TerrainPatch topRight, TerrainPatch topLeft)
          Matches the normals along the edge of the patch with the neighbours.
 void generateLodEntropies()
          This calculation is slow, so don't use it often.
 Triangle[] getGridTriangles(float x, float z)
          Get the triangles at the specified grid point.
protected  float getHeight(int x, int z, float xm, float zm)
           
 java.nio.FloatBuffer getHeightmap()
          Deprecated. 
 float[] getHeightMap()
           
 float getHeightmapHeight(float x, float z)
           
 int getLod()
           
protected  int getLodBottom()
           
 float[] getLodEntropies()
           
protected  int getLodLeft()
           
protected  int getLodRight()
           
protected  int getLodTop()
           
 int getMaxLod()
          The maximum lod supported by this terrain patch.
protected  Vector3f getMeshNormal(int x, int z)
           
 Vector2f getOffset()
          Returns the current offset amount.
 float getOffsetAmount()
          Returns the offset amount this terrain patch uses for textures.
 int getPreviousLod()
           
 short getQuadrant()
           
 int getSize()
          Returns the size of this terrain patch.
 Vector3f getStepScale()
          Returns the step scale that stretches the height map.
 Vector2f getTex(float x, float z, Vector2f store)
           
 int getTotalSize()
          Returns the total size of the terrain.
 Triangle getTriangle(float x, float z)
          Get the triangle of this geometry at the specified local coordinate.
 Vector3f getWorldScaleCached()
           
 Vector3f getWorldTranslationCached()
           
 void lockMesh()
          Locks the mesh (sets it static) to improve performance.
 void read(JmeImporter im)
           
protected  void reIndexGeometry(java.util.HashMap<java.lang.String,UpdatedTerrainPatch> updated, boolean useVariableLod)
           
protected  void setHeight(java.util.List<TerrainQuad.LocationHeight> locationHeights, boolean overrideHeight)
           
 void setLod(int lod)
           
protected  void setLodBottom(int lodBottom)
           
protected  void setLodLeft(int lodLeft)
           
protected  void setLodRight(int lodRight)
           
protected  void setLodTop(int lodTop)
           
 void setOffset(Vector2f offset)
          Sets the value for the current offset amount to use when building texture coordinates.
 void setOffsetAmount(float offsetAmount)
          Sets the offset of this terrain texture map.
 void setPreviousLod(int previousLod)
           
 void setQuadrant(short quadrant)
           
 void setSize(int size)
          Sets the size of this terrain patch.
 void setStepScale(Vector3f stepScale)
          Sets the step scale of this terrain patch's height map.
 void setTotalSize(int totalSize)
          Sets the total size of the terrain .
 void unlockMesh()
          Unlocks the mesh (sets it dynamic) to make it editable.
protected  void updateNormals()
          recalculate all of the normal vectors in this terrain patch
protected  Vector3f worldCoordinateToLocal(Vector3f loc)
           
 void write(JmeExporter ex)
           
 
Methods inherited from class com.jme3.scene.Geometry
batch, breadthFirstTraversal, clone, computeOffsetTransform, computeWorldMatrix, deepClone, depthFirstTraversal, getLodLevel, getMaterial, getMesh, getModelBound, getTriangleCount, getVertexCount, getWorldMatrix, isBatched, isIgnoreTransform, removeFromParent, setIgnoreTransform, setLodLevel, setMaterial, setMesh, setModelBound, setParent, unBatch, updateModelBound, updateWorldBound, updateWorldTransforms
 
Methods inherited from class com.jme3.scene.Spatial
addControl, addLight, breadthFirstTraversal, center, checkCulling, getBatchHint, getControl, getControl, getCullHint, getKey, getLastFrustumIntersection, getLocalBatchHint, getLocalCullHint, getLocalLightList, getLocalQueueBucket, getLocalRotation, getLocalScale, getLocalShadowMode, getLocalToWorldMatrix, getLocalTransform, getLocalTranslation, getName, getNumControls, getParent, getQueueBucket, getShadowMode, getUserData, getUserDataKeys, getWorldBound, getWorldLightList, getWorldRotation, getWorldScale, getWorldTransform, getWorldTranslation, hasAncestor, localToWorld, lookAt, matches, move, move, removeControl, removeControl, removeLight, rotate, rotate, rotateUpTo, runControlRender, scale, scale, setBatchHint, setBoundRefresh, setCullHint, setKey, setLastFrustumIntersection, setLightListRefresh, setLocalRotation, setLocalRotation, setLocalScale, setLocalScale, setLocalScale, setLocalTransform, setLocalTranslation, setLocalTranslation, setName, setQueueBucket, setShadowMode, setTransformRefresh, setUserData, toString, updateGeometricState, updateLogicalState, updateWorldLightList, worldToLocal
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

geomap

protected LODGeomap geomap

lod

protected int lod

previousLod

protected int previousLod

lodLeft

protected int lodLeft

lodTop

protected int lodTop

lodRight

protected int lodRight

lodBottom

protected int lodBottom

size

protected int size

totalSize

protected int totalSize

quadrant

protected short quadrant

stepScale

protected Vector3f stepScale

offset

protected Vector2f offset

offsetAmount

protected float offsetAmount

leftNeighbour

protected TerrainPatch leftNeighbour

topNeighbour

protected TerrainPatch topNeighbour

rightNeighbour

protected TerrainPatch rightNeighbour

bottomNeighbour

protected TerrainPatch bottomNeighbour

searchedForNeighboursAlready

protected boolean searchedForNeighboursAlready

worldTranslationCached

protected Vector3f worldTranslationCached

worldScaleCached

protected Vector3f worldScaleCached

lodEntropy

protected float[] lodEntropy
Constructor Detail

TerrainPatch

public TerrainPatch()

TerrainPatch

public TerrainPatch(java.lang.String name)

TerrainPatch

public TerrainPatch(java.lang.String name,
                    int size)

TerrainPatch

public TerrainPatch(java.lang.String name,
                    int size,
                    Vector3f stepScale,
                    float[] heightMap,
                    Vector3f origin)
Constructor instantiates a new TerrainPatch object. The parameters and heightmap data are then processed to generate a TriMesh object for rendering.

Parameters:
name - the name of the terrain patch.
size - the size of the heightmap.
stepScale - the scale for the axes.
heightMap - the height data.
origin - the origin offset of the patch.

TerrainPatch

public TerrainPatch(java.lang.String name,
                    int size,
                    Vector3f stepScale,
                    float[] heightMap,
                    Vector3f origin,
                    int totalSize,
                    Vector2f offset,
                    float offsetAmount)
Constructor instantiates a new TerrainPatch object. The parameters and heightmap data are then processed to generate a TriMesh object for renderering.

Parameters:
name - the name of the terrain patch.
size - the size of the patch.
stepScale - the scale for the axes.
heightMap - the height data.
origin - the origin offset of the patch.
totalSize - the total size of the terrain. (Higher if the patch is part of a TerrainQuad tree.
offset - the offset for texture coordinates.
offsetAmount - the total offset amount. Used for texture coordinates.
Method Detail

generateLodEntropies

public void generateLodEntropies()
This calculation is slow, so don't use it often.


getLodEntropies

public float[] getLodEntropies()

getHeightmap

@Deprecated
public java.nio.FloatBuffer getHeightmap()
Deprecated. 


getHeightMap

public float[] getHeightMap()

getMaxLod

public int getMaxLod()
The maximum lod supported by this terrain patch. If the patch size is 32 then the returned value would be log2(32)-2 = 3 You can then use that value, 3, to see how many times you can divide 32 by 2 before the terrain gets too un-detailed (can't stitch it any further).

Returns:
the maximum LOD

reIndexGeometry

protected void reIndexGeometry(java.util.HashMap<java.lang.String,UpdatedTerrainPatch> updated,
                               boolean useVariableLod)

getTex

public Vector2f getTex(float x,
                       float z,
                       Vector2f store)

getHeightmapHeight

public float getHeightmapHeight(float x,
                                float z)

getTriangle

public Triangle getTriangle(float x,
                            float z)
Get the triangle of this geometry at the specified local coordinate.

Parameters:
x - local to the terrain patch
z - local to the terrain patch
Returns:
the triangle in world coordinates, or null if the point does intersect this patch on the XZ axis

getGridTriangles

public Triangle[] getGridTriangles(float x,
                                   float z)
Get the triangles at the specified grid point. Probably only 2 triangles

Parameters:
x - local to the terrain patch
z - local to the terrain patch
Returns:
the triangles in world coordinates, or null if the point does intersect this patch on the XZ axis

setHeight

protected void setHeight(java.util.List<TerrainQuad.LocationHeight> locationHeights,
                         boolean overrideHeight)

updateNormals

protected void updateNormals()
recalculate all of the normal vectors in this terrain patch


fixNormalEdges

protected void fixNormalEdges(TerrainPatch right,
                              TerrainPatch bottom,
                              TerrainPatch top,
                              TerrainPatch left,
                              TerrainPatch bottomRight,
                              TerrainPatch bottomLeft,
                              TerrainPatch topRight,
                              TerrainPatch topLeft)
Matches the normals along the edge of the patch with the neighbours. Computes the normals for the right, bottom, left, and top edges of the patch, and saves those normals in the neighbour's edges too. Takes 4 points (if has neighbour on that side) for each point on the edge of the patch: * | *---x---* | * It works across the right side of the patch, from the top down to the bottom. Then it works on the bottom side of the patch, from the left to the right.


averageNormalsTangents

protected void averageNormalsTangents(Vector3f topPoint,
                                      Vector3f rootPoint,
                                      Vector3f leftPoint,
                                      Vector3f bottomPoint,
                                      Vector3f rightPoint,
                                      Vector3f normal,
                                      Vector3f tangent,
                                      Vector3f binormal)

getMeshNormal

protected Vector3f getMeshNormal(int x,
                                 int z)

getHeight

protected float getHeight(int x,
                          int z,
                          float xm,
                          float zm)

lockMesh

public void lockMesh()
Locks the mesh (sets it static) to improve performance. But it it not editable then. Set unlock to make it editable.


unlockMesh

public void unlockMesh()
Unlocks the mesh (sets it dynamic) to make it editable. It will be editable but performance will be reduced. Call lockMesh to improve performance.


getOffsetAmount

public float getOffsetAmount()
Returns the offset amount this terrain patch uses for textures.

Returns:
The current offset amount.

getStepScale

public Vector3f getStepScale()
Returns the step scale that stretches the height map.

Returns:
The current step scale.

getTotalSize

public int getTotalSize()
Returns the total size of the terrain.

Returns:
The terrain's total size.

getSize

public int getSize()
Returns the size of this terrain patch.

Returns:
The current patch size.

getOffset

public Vector2f getOffset()
Returns the current offset amount. This is used when building texture coordinates.

Returns:
The current offset amount.

setOffset

public void setOffset(Vector2f offset)
Sets the value for the current offset amount to use when building texture coordinates. Note that this does NOT rebuild the terrain at all. This is mostly used for outside constructors of terrain patches.

Parameters:
offset - The new texture offset.

setSize

public void setSize(int size)
Sets the size of this terrain patch. Note that this does NOT rebuild the terrain at all. This is mostly used for outside constructors of terrain patches.

Parameters:
size - The new size.

setTotalSize

public void setTotalSize(int totalSize)
Sets the total size of the terrain . Note that this does NOT rebuild the terrain at all. This is mostly used for outside constructors of terrain patches.

Parameters:
totalSize - The new total size.

setStepScale

public void setStepScale(Vector3f stepScale)
Sets the step scale of this terrain patch's height map. Note that this does NOT rebuild the terrain at all. This is mostly used for outside constructors of terrain patches.

Parameters:
stepScale - The new step scale.

setOffsetAmount

public void setOffsetAmount(float offsetAmount)
Sets the offset of this terrain texture map. Note that this does NOT rebuild the terrain at all. This is mostly used for outside constructors of terrain patches.

Parameters:
offsetAmount - The new texture offset.

getQuadrant

public short getQuadrant()
Returns:
Returns the quadrant.

setQuadrant

public void setQuadrant(short quadrant)
Parameters:
quadrant - The quadrant to set.

getLod

public int getLod()

setLod

public void setLod(int lod)

getPreviousLod

public int getPreviousLod()

setPreviousLod

public void setPreviousLod(int previousLod)

getLodLeft

protected int getLodLeft()

setLodLeft

protected void setLodLeft(int lodLeft)

getLodTop

protected int getLodTop()

setLodTop

protected void setLodTop(int lodTop)

getLodRight

protected int getLodRight()

setLodRight

protected void setLodRight(int lodRight)

getLodBottom

protected int getLodBottom()

setLodBottom

protected void setLodBottom(int lodBottom)

collideWith

public int collideWith(Collidable other,
                       CollisionResults results)
                throws UnsupportedCollisionException
Description copied from interface: Collidable
Check collision with another Collidable.

Specified by:
collideWith in interface Collidable
Overrides:
collideWith in class Geometry
Parameters:
other - The object to check collision against
results - Will contain the list of CollisionResults.
Returns:
how many collisions were found between this and other
Throws:
UnsupportedCollisionException

worldCoordinateToLocal

protected Vector3f worldCoordinateToLocal(Vector3f loc)

write

public void write(JmeExporter ex)
           throws java.io.IOException
Specified by:
write in interface Savable
Overrides:
write in class Geometry
Throws:
java.io.IOException

read

public void read(JmeImporter im)
          throws java.io.IOException
Specified by:
read in interface Savable
Overrides:
read in class Geometry
Throws:
java.io.IOException

clone

public TerrainPatch clone()
Description copied from class: Geometry
This version of clone is a shallow clone, in other words, the same mesh is referenced as the original geometry. Exception: if the mesh is marked as being a software animated mesh, (bind pose is set) then the positions and normals are deep copied.

Specified by:
clone in interface CloneableSmartAsset
Overrides:
clone in class Geometry
Returns:
A clone of this Spatial, the scene graph in its entirety is cloned and can be altered independently of the original scene graph. Note that meshes of geometries are not cloned explicitly, they are shared if static, or specially cloned if animated. All controls will be cloned using the Control.cloneForSpatial method on the clone.
See Also:
Mesh.cloneForAnim()

ensurePositiveVolumeBBox

protected void ensurePositiveVolumeBBox()

cacheTerrainTransforms

protected void cacheTerrainTransforms()
Caches the transforms (except rotation) so the LOD calculator, which runs on a separate thread, can access them safely.


getWorldScaleCached

public Vector3f getWorldScaleCached()

getWorldTranslationCached

public Vector3f getWorldTranslationCached()