com.jme3.terrain.geomipmap
Class LODGeomap

java.lang.Object
  extended by com.jme3.terrain.GeoMap
      extended by com.jme3.terrain.geomipmap.LODGeomap
All Implemented Interfaces:
Savable

public class LODGeomap
extends GeoMap

Produces the mesh for the TerrainPatch. This LOD algorithm generates a single triangle strip by first building the center of the mesh, minus one outer edge around it. Then it builds the edges in counter-clockwise order, starting at the bottom right and working up, then left across the top, then down across the left, then right across the bottom. It needs to know what its neighbour's LOD's are so it can stitch the edges. It creates degenerate polygons in order to keep the winding order of the polygons and to move the strip to a new position while still maintaining the continuity of the overall mesh. These degenerates are removed quickly by the video card.


Nested Class Summary
 class LODGeomap.VerboseIntBuffer
          Keeps a count of the number of indexes, good for debugging
 
Field Summary
 
Fields inherited from class com.jme3.terrain.GeoMap
hdata, height, maxval, width
 
Constructor Summary
LODGeomap()
           
LODGeomap(int size, float[] heightMap)
           
LODGeomap(int size, java.nio.FloatBuffer heightMap)
          Deprecated. 
 
Method Summary
static Vector3f calculateTangent(Vector3f[] v, Vector2f[] t, Vector3f tangent, Vector3f binormal)
           
 Mesh createMesh(Vector3f scale, Vector2f tcScale, Vector2f tcOffset, float offsetAmount, int totalSize, boolean center)
           
 Mesh createMesh(Vector3f scale, Vector2f tcScale, Vector2f tcOffset, float offsetAmount, int totalSize, boolean center, int lod, boolean rightLod, boolean topLod, boolean leftLod, boolean bottomLod)
           
protected  int findClosestHeightIndex(int x, int z)
           
protected  Triangle[] getGridTrianglesAtPoint(float x, float z)
          Get the two triangles that make up the grid section at the specified point.
protected  Triangle[] getGridTrianglesAtPoint(float x, float z, Vector3f scale, Vector3f translation)
          Get the two triangles that make up the grid section at the specified point, translated to world coordinates.
protected  float getHeight(int x, int z, float xm, float zm)
          Get the two triangles that make up the grid section at the specified point.
protected  Triangle getTriangleAtPoint(float x, float z)
          Get the triangle that the point is on.
protected  Triangle getTriangleAtPoint(float x, float z, Vector3f scale, Vector3f translation)
          Get a representation of the underlying triangle at the given point, translated to world coordinates.
 Vector2f getUV(int x, int y, Vector2f store, Vector2f offset, float offsetAmount, int totalSize)
           
 void read(JmeImporter im)
           
 void write(JmeExporter ex)
           
 java.nio.IntBuffer writeIndexArrayLodDiff(java.nio.IntBuffer store, int lod, boolean rightLod, boolean topLod, boolean leftLod, boolean bottomLod)
          Create the LOD index array that will seam its edges with its neighbour's LOD.
 java.nio.IntBuffer writeIndexArrayLodVariable(java.nio.IntBuffer store, int lod, int rightLod, int topLod, int leftLod, int bottomLod)
           
 java.nio.FloatBuffer writeNormalArray(java.nio.FloatBuffer store, Vector3f scale)
          Creates a normal array from the normal data in this Geomap
 java.nio.FloatBuffer[] writeTangentArray(java.nio.FloatBuffer normalBuffer, java.nio.FloatBuffer tangentStore, java.nio.FloatBuffer binormalStore, java.nio.FloatBuffer textureBuffer, Vector3f scale)
           
 java.nio.FloatBuffer writeTexCoordArray(java.nio.FloatBuffer store, Vector2f offset, Vector2f scale, float offsetAmount, int totalSize)
           
 
Methods inherited from class com.jme3.terrain.GeoMap
createMesh, getHeight, getHeightArray, getHeightData, getMaximumValue, getUV, getUV, getValue, getValue, getWidth, isLoaded, writeIndexArray, writeTexCoordArray, writeVertexArray
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

LODGeomap

public LODGeomap()

LODGeomap

@Deprecated
public LODGeomap(int size,
                            java.nio.FloatBuffer heightMap)
Deprecated. 


LODGeomap

public LODGeomap(int size,
                 float[] heightMap)
Method Detail

createMesh

public Mesh createMesh(Vector3f scale,
                       Vector2f tcScale,
                       Vector2f tcOffset,
                       float offsetAmount,
                       int totalSize,
                       boolean center)

createMesh

public Mesh createMesh(Vector3f scale,
                       Vector2f tcScale,
                       Vector2f tcOffset,
                       float offsetAmount,
                       int totalSize,
                       boolean center,
                       int lod,
                       boolean rightLod,
                       boolean topLod,
                       boolean leftLod,
                       boolean bottomLod)

writeTexCoordArray

public java.nio.FloatBuffer writeTexCoordArray(java.nio.FloatBuffer store,
                                               Vector2f offset,
                                               Vector2f scale,
                                               float offsetAmount,
                                               int totalSize)

getUV

public Vector2f getUV(int x,
                      int y,
                      Vector2f store,
                      Vector2f offset,
                      float offsetAmount,
                      int totalSize)

writeIndexArrayLodDiff

public java.nio.IntBuffer writeIndexArrayLodDiff(java.nio.IntBuffer store,
                                                 int lod,
                                                 boolean rightLod,
                                                 boolean topLod,
                                                 boolean leftLod,
                                                 boolean bottomLod)
Create the LOD index array that will seam its edges with its neighbour's LOD. This is a scary method!!! It will break your mind.

Parameters:
store - to store the index buffer
lod - level of detail of the mesh
rightLod - LOD of the right neighbour
topLod - LOD of the top neighbour
leftLod - LOD of the left neighbour
bottomLod - LOD of the bottom neighbour
Returns:
the LOD-ified index buffer

writeIndexArrayLodVariable

public java.nio.IntBuffer writeIndexArrayLodVariable(java.nio.IntBuffer store,
                                                     int lod,
                                                     int rightLod,
                                                     int topLod,
                                                     int leftLod,
                                                     int bottomLod)

writeTangentArray

public java.nio.FloatBuffer[] writeTangentArray(java.nio.FloatBuffer normalBuffer,
                                                java.nio.FloatBuffer tangentStore,
                                                java.nio.FloatBuffer binormalStore,
                                                java.nio.FloatBuffer textureBuffer,
                                                Vector3f scale)

calculateTangent

public static Vector3f calculateTangent(Vector3f[] v,
                                        Vector2f[] t,
                                        Vector3f tangent,
                                        Vector3f binormal)
Parameters:
v - Takes 3 vertices: root, right, bottom
t - Takes 3 tex coords: root, right, bottom
tangent - that will store the result
Returns:
the tangent store

writeNormalArray

public java.nio.FloatBuffer writeNormalArray(java.nio.FloatBuffer store,
                                             Vector3f scale)
Description copied from class: GeoMap
Creates a normal array from the normal data in this Geomap

Overrides:
writeNormalArray in class GeoMap
Parameters:
store - A preallocated FloatBuffer where to store the data (optional), size must be >= getWidth()*getHeight()*3

getHeight

protected float getHeight(int x,
                          int z,
                          float xm,
                          float zm)
Get the two triangles that make up the grid section at the specified point. For every grid space there are two triangles oriented like this: *----* |a / | | / b| *----* The corners of the mesh have differently oriented triangles. The two corners that we have to special-case are the top left and bottom right corners. They are oriented inversely: *----* | \ b| |a \ | *----*


getTriangleAtPoint

protected Triangle getTriangleAtPoint(float x,
                                      float z,
                                      Vector3f scale,
                                      Vector3f translation)
Get a representation of the underlying triangle at the given point, translated to world coordinates.

Parameters:
x - local x coordinate
z - local z coordinate
Returns:
a triangle in world space not local space

getGridTrianglesAtPoint

protected Triangle[] getGridTrianglesAtPoint(float x,
                                             float z,
                                             Vector3f scale,
                                             Vector3f translation)
Get the two triangles that make up the grid section at the specified point, translated to world coordinates.

Parameters:
x - local x coordinate
z - local z coordinate
scale -
translation -
Returns:
two triangles in world space not local space

getGridTrianglesAtPoint

protected Triangle[] getGridTrianglesAtPoint(float x,
                                             float z)
Get the two triangles that make up the grid section at the specified point. For every grid space there are two triangles oriented like this: *----* |a / | | / b| *----* The corners of the mesh have differently oriented triangles. The two corners that we have to special-case are the top left and bottom right corners. They are oriented inversely: *----* | \ b| |a \ | *----*

Parameters:
x - local x coordinate
z - local z coordinate
scale -
translation -
Returns:

getTriangleAtPoint

protected Triangle getTriangleAtPoint(float x,
                                      float z)
Get the triangle that the point is on.

Parameters:
x - coordinate in local space to the geomap
z - coordinate in local space to the geomap
Returns:
triangle in local space to the geomap

findClosestHeightIndex

protected int findClosestHeightIndex(int x,
                                     int z)

write

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

read

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