Package com.jme3.terrain.geomipmap
Class LODGeomap
java.lang.Object
com.jme3.terrain.GeoMap
com.jme3.terrain.geomipmap.LODGeomap
- All Implemented Interfaces:
Savable
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 LODs 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
Modifier and TypeClassDescriptionclass
Keeps a count of the number of indexes, good for debugging -
Field Summary
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic Vector3f
calculateTangent
(Vector3f[] v, Vector2f[] t, Vector3f tangent, Vector3f binormal) createMesh
(Vector3f scale, Vector2f tcScale, Vector2f tcOffset, float offsetAmount, int totalSize, boolean center) 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.void
read
(JmeImporter im) void
write
(JmeExporter ex) writeIndexArrayLodDiff
(int lod, boolean rightLod, boolean topLod, boolean leftLod, boolean bottomLod, int totalSize) Create the LOD index array that will seam its edges with its neighbour's LOD.writeIndexArrayLodVariable
(int lod, int rightLod, int topLod, int leftLod, int bottomLod, int totalSize) writeNormalArray
(FloatBuffer store, Vector3f scale) Creates a normal array from the normal data in this GeomapwriteTangentArray
(FloatBuffer normalBuffer, FloatBuffer tangentStore, FloatBuffer binormalStore, FloatBuffer textureBuffer, Vector3f scale) writeTexCoordArray
(FloatBuffer store, Vector2f offset, Vector2f scale, float offsetAmount, int totalSize) Methods inherited from class com.jme3.terrain.GeoMap
createMesh, getHeight, getHeightArray, getMaximumValue, getUV, getUV, getValue, getValue, getWidth, isLoaded, writeIndexArray, writeTexCoordArray, writeVertexArray
-
Constructor Details
-
LODGeomap
public LODGeomap() -
LODGeomap
public LODGeomap(int size, float[] heightMap)
-
-
Method Details
-
createMesh
-
createMesh
-
writeTexCoordArray
public FloatBuffer writeTexCoordArray(FloatBuffer store, Vector2f offset, Vector2f scale, float offsetAmount, int totalSize) -
getUV
-
writeIndexArrayLodDiff
public IndexBuffer writeIndexArrayLodDiff(int lod, boolean rightLod, boolean topLod, boolean leftLod, boolean bottomLod, int totalSize) 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:
lod
- level of detail of the meshrightLod
- LOD of the right neighbourtopLod
- LOD of the top neighbourleftLod
- LOD of the left neighbourbottomLod
- LOD of the bottom neighbour- Returns:
- the LOD-ified index buffer
-
writeIndexArrayLodVariable
public IndexBuffer writeIndexArrayLodVariable(int lod, int rightLod, int topLod, int leftLod, int bottomLod, int totalSize) -
writeTangentArray
public FloatBuffer[] writeTangentArray(FloatBuffer normalBuffer, FloatBuffer tangentStore, FloatBuffer binormalStore, FloatBuffer textureBuffer, Vector3f scale) -
calculateTangent
public static Vector3f calculateTangent(Vector3f[] v, Vector2f[] t, Vector3f tangent, Vector3f binormal) - Parameters:
v
- Takes 3 vertices: root, right, bottomt
- Takes 3 tex coords: root, right, bottomtangent
- that will store the result- Returns:
- the tangent store
-
writeNormalArray
Description copied from class:GeoMap
Creates a normal array from the normal data in this Geomap- Overrides:
writeNormalArray
in classGeoMap
- Parameters:
store
- A preallocated FloatBuffer where to store the data (optional), size must be >= getWidth()*getHeight()*3- Returns:
- store, or a new FloatBuffer if store is null
-
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
Get a representation of the underlying triangle at the given point, translated to world coordinates.- Parameters:
x
- local x coordinatez
- 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 coordinatez
- local z coordinatescale
-translation
-- Returns:
- two triangles in world space not local space
-
getGridTrianglesAtPoint
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 coordinatez
- local z coordinate- Returns:
- a new array or null
-
getTriangleAtPoint
Get the triangle that the point is on.- Parameters:
x
- coordinate in local space to the geomapz
- coordinate in local space to the geomap- Returns:
- triangle in local space to the geomap
-
findClosestHeightIndex
protected int findClosestHeightIndex(int x, int z) -
write
- Specified by:
write
in interfaceSavable
- Overrides:
write
in classGeoMap
- Throws:
IOException
-
read
- Specified by:
read
in interfaceSavable
- Overrides:
read
in classGeoMap
- Throws:
IOException
-