GeometryBatchFactory now properly handles batching geometries with different numbe rof lod levels.
Thanks to Rickard git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10784 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
3800db318c
commit
00354e426d
@ -13,6 +13,7 @@ import com.jme3.scene.mesh.IndexBuffer;
|
|||||||
import com.jme3.util.BufferUtils;
|
import com.jme3.util.BufferUtils;
|
||||||
import java.nio.Buffer;
|
import java.nio.Buffer;
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
import java.nio.ShortBuffer;
|
import java.nio.ShortBuffer;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@ -112,7 +113,7 @@ public class GeometryBatchFactory {
|
|||||||
switch (geom.getMesh().getMode()) {
|
switch (geom.getMesh().getMode()) {
|
||||||
case Points:
|
case Points:
|
||||||
listMode = Mode.Points;
|
listMode = Mode.Points;
|
||||||
components = 1;
|
components = 0;
|
||||||
break;
|
break;
|
||||||
case LineLoop:
|
case LineLoop:
|
||||||
case LineStrip:
|
case LineStrip:
|
||||||
@ -245,51 +246,56 @@ public class GeometryBatchFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sizes of the final LOD index buffers for each level.
|
// Sizes of the final LOD index buffers for each level.
|
||||||
int[] lodSizes = new int[lodLevels];
|
int[] lodSize = null;
|
||||||
for (Geometry g : geometries) {
|
for (Geometry g : geometries) {
|
||||||
|
if (lodLevels == 0) {
|
||||||
|
lodLevels = g.getMesh().getNumLodLevels();
|
||||||
|
}
|
||||||
|
if (lodSize == null) {
|
||||||
|
lodSize = new int[lodLevels];
|
||||||
|
}
|
||||||
for (int i = 0; i < lodLevels; i++) {
|
for (int i = 0; i < lodLevels; i++) {
|
||||||
lodSizes[i] += g.getMesh().getLodLevel(i).getData().limit();
|
lodSize[i] += g.getMesh().getLodLevel(i).getData().limit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// final LOD buffers for each LOD level.
|
// final LOD buffers for each LOD level.
|
||||||
IndexBuffer[] lods = new IndexBuffer[lodLevels];
|
int[][] lodData = new int[lodLevels][];
|
||||||
|
for (int i = 0; i < lodLevels; i++) {
|
||||||
|
lodData[i] = new int[lodSize[i]];
|
||||||
|
}
|
||||||
|
VertexBuffer[] lods = new VertexBuffer[lodLevels];
|
||||||
int bufferPos[] = new int[lodLevels];
|
int bufferPos[] = new int[lodLevels];
|
||||||
int numOfVertices = 0;
|
int numOfVertices = 0;
|
||||||
int curGeom = 0;
|
|
||||||
|
|
||||||
// int components = compsForBuf[bufType];
|
|
||||||
// for (int tri = 0; tri < geomTriCount; tri++) {
|
|
||||||
// for (int comp = 0; comp < components; comp++) {
|
|
||||||
// int idx = inIdx.get(tri * components + comp) + globalVertIndex;
|
|
||||||
// outIdx.put((globalTriIndex + tri) * components + comp, idx);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
for (int lodLevel = 0; lodLevel < lodLevels; lodLevel++) {
|
int[] indexPos = new int[lodLevels];
|
||||||
|
for (Geometry g : geometries) {
|
||||||
|
numOfVertices = g.getVertexCount();
|
||||||
|
for (int i = 0; i < lodLevels; i++) {
|
||||||
|
boolean isShortBuffer = g.getMesh().getLodLevel(i).getFormat() == VertexBuffer.Format.UnsignedShort;
|
||||||
|
if(isShortBuffer){
|
||||||
|
ShortBuffer buffer = (ShortBuffer) g.getMesh().getLodLevel(i).getDataReadOnly();
|
||||||
|
for (int j = 0; j < buffer.limit(); j++) {
|
||||||
|
lodData[i][bufferPos[i]] = (buffer.get()& 0xffff) + indexPos[i];
|
||||||
|
bufferPos[i]++;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
IntBuffer buffer = (IntBuffer) g.getMesh().getLodLevel(i).getDataReadOnly();
|
||||||
|
for (int j = 0; j < buffer.limit(); j++) {
|
||||||
|
lodData[i][bufferPos[i]] = buffer.get() + indexPos[i];
|
||||||
|
bufferPos[i]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
indexPos[i] += numOfVertices;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < lodLevels; i++) {
|
||||||
// for (Geometry g : geometries) {
|
lods[i] = new VertexBuffer(Type.Index);
|
||||||
// if (numOfVertices == 0) {
|
lods[i].setupData(Usage.Dynamic, 1, Format.UnsignedInt, BufferUtils.createIntBuffer(lodData[i]));
|
||||||
// numOfVertices = g.getVertexCount();
|
}
|
||||||
// }
|
outMesh.setLodLevels(lods);
|
||||||
// for (int i = 0; i < lodLevels; i++) {
|
|
||||||
// IndexBuffer buffer = IndexBuffer.wrapIndexBuffer(g.getMesh().getLodLevel(i).getData());
|
|
||||||
// //System.out.println("buffer: " + buffer.capacity() + " limit: " + lodSize[i] + " " + index);
|
|
||||||
// for (int j = 0; j < buffer.size(); j++) {
|
|
||||||
// lodData[i][bufferPos[i] + j] = buffer.get(j) + numOfVertices * curGeom;
|
|
||||||
// //bufferPos[i]++;
|
|
||||||
// }
|
|
||||||
// bufferPos[i] += buffer.size();
|
|
||||||
// }
|
|
||||||
// curGeom++;
|
|
||||||
// }
|
|
||||||
// for (int i = 0; i < lodLevels; i++) {
|
|
||||||
// lods[i] = new VertexBuffer(Type.Index);
|
|
||||||
// lods[i].setupData(Usage.Dynamic, 1, Format.UnsignedInt, BufferUtils.createIntBuffer(lodData[i]));
|
|
||||||
// }
|
|
||||||
// outMesh.setLodLevels(lods);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Geometry> makeBatches(Collection<Geometry> geometries) {
|
public static List<Geometry> makeBatches(Collection<Geometry> geometries) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user