@Override public void run() { generate(m, true, false); } }));
public static Mesh genTbnLines(Mesh mesh, float scale) { if (mesh.getBuffer(Type.Tangent) == null) { return genNormalLines(mesh, scale); } else { return genTangentLines(mesh, scale); } }
@Override public void visit(Geometry g){ Mesh m = g.getMesh(); Material mat = g.getMaterial(); // if (mat.getParam("DiffuseMap") != null){ // mat.setTexture("DiffuseMap", null); // } TangentBinormalGenerator.generate(m); Geometry debug = new Geometry( "debug tangents geom", TangentBinormalGenerator.genTbnLines(g.getMesh(), 0.2f) ); debug.setMaterial(debugMat); debug.setCullHint(Spatial.CullHint.Never); debug.setLocalTransform(g.getWorldTransform()); debugTangents.attachChild(debug); } });
switch (mesh.getMode()) { case Triangles: vertices = processTriangles(mesh, index, v, t, splitMirrored); if(splitMirrored){ splitVertices(mesh, vertices, splitMirrored); vertices = processTriangleStrip(mesh, index, v, t); break; case TriangleFan: vertices = processTriangleFan(mesh, index, v, t); break; default: processTriangleData(mesh, vertices, approxTangents,splitMirrored);
List<VertexData> vertices = initVertexData(vertexBuffer.limit() / 3); TriangleData triData = processTriangle(index, v, t); if(splitMirrored){ triData.setIndex(index);
FloatBuffer textureBuffer = (FloatBuffer) mesh.getBuffer(Type.TexCoord).getData(); List<VertexData> vertices = initVertexData(vertexBuffer.limit() / 3); BufferUtils.populateFromBuffer(t[2], textureBuffer, index[2]); boolean isDegenerate = isDegenerateTriangle(v[0], v[1], v[2]); TriangleData triData = processTriangle(index, v, t);
TangentBinormalGenerator.generate(root); System.out.println("Serial " + (System.currentTimeMillis() - start)); TangentBinormalGenerator.generateParallel(root, executor); System.out.println("Parallel " + (System.currentTimeMillis() - start));
@Override public void visit(Geometry g) { Mesh m = g.getMesh(); Geometry debug = new Geometry( "debug tangents geom", TangentBinormalGenerator.genNormalLines(m, 0.1f) ); debug.setMaterial(debugMat); debug.setCullHint(Spatial.CullHint.Never); debug.setLocalTransform(g.getWorldTransform()); debugTangents.attachChild(debug); } });
private void createDebugTangents(Geometry geom) { Geometry debug = new Geometry( "Debug " + geom.getName(), TangentBinormalGenerator.genTbnLines(geom.getMesh(), 0.8f) ); Material debugMat = assetManager.loadMaterial("Common/Materials/VertexColor.j3m"); debug.setMaterial(debugMat); debug.setCullHint(Spatial.CullHint.Never); debug.getLocalTranslation().set(geom.getWorldTranslation()); debugNode.attachChild(debug); } }
public static void generate(Mesh mesh, boolean approxTangents) { int[] index = new int[3]; Vector3f[] v = new Vector3f[3]; Vector2f[] t = new Vector2f[3]; for (int i = 0; i < 3; i++) { v[i] = new Vector3f(); t[i] = new Vector2f(); } if (mesh.getBuffer(Type.Normal) == null){ throw new IllegalArgumentException("The given mesh has no normal data!"); } VertexData[] vertices; switch (mesh.getMode()) { case Triangles: vertices = processTriangles(mesh, index, v, t); break; case TriangleStrip: vertices = processTriangleStrip(mesh, index, v, t); break; case TriangleFan: vertices = processTriangleFan(mesh, index, v, t); break; default: throw new UnsupportedOperationException( mesh.getMode() + " is not supported."); } processTriangleData(mesh, vertices, approxTangents); }
FloatBuffer textureBuffer = (FloatBuffer) mesh.getBuffer(Type.TexCoord).getData(); List<VertexData> vertices = initVertexData(vertexBuffer.limit() / 3); BufferUtils.populateFromBuffer(t[2], textureBuffer, index[2]); boolean isDegenerate = isDegenerateTriangle(v[0], v[1], v[2]); TriangleData triData = processTriangle(index, v, t);
FloatBuffer textureBuffer = (FloatBuffer) mesh.getBuffer(Type.TexCoord).getData(); List<VertexData> vertices = initVertexData(vertexBuffer.limit() / 3); populateFromBuffer(t[2], textureBuffer, index[2]); TriangleData triData = processTriangle(index, v, t); vertices.get(index[0]).triangles.add(triData); vertices.get(index[1]).triangles.add(triData);
@Override public void visit(Spatial spatial) { if (spatial instanceof Geometry) { Geometry g = (Geometry) spatial; Mesh normalMesh = TangentBinormalGenerator.genNormalLines(g.getMesh(), 0.1f); Geometry normalGeometry = new Geometry(g.getName() + "Normal", normalMesh); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat.setColor("Color", ColorRGBA.Red); normalGeometry.setMaterial(mat); nodeNormals.attachChild(normalGeometry); } } });
public void generateDebugTangents(Material mat) { for (int x = children.size(); --x >= 0;) { Spatial child = children.get(x); if (child instanceof TerrainQuad) { ((TerrainQuad)child).generateDebugTangents(mat); } else if (child instanceof TerrainPatch) { Geometry debug = new Geometry( "Debug " + name, TangentBinormalGenerator.genTbnLines( ((TerrainPatch)child).getMesh(), 0.8f)); attachChild(debug); debug.setLocalTranslation(child.getLocalTranslation()); debug.setCullHint(CullHint.Never); debug.setMaterial(mat); } } }
public static void generate(Mesh mesh) { generate(mesh, true, false); }
switch (mesh.getMode()) { case Triangles: vertices = processTriangles(mesh, index, v, t, splitMirrored); if(splitMirrored){ splitVertices(mesh, vertices, splitMirrored); vertices = processTriangleStrip(mesh, index, v, t); break; case TriangleFan: vertices = processTriangleFan(mesh, index, v, t); break; default: processTriangleData(mesh, vertices, approxTangents,splitMirrored);
private void addMesh(String name, Mesh mesh, Vector3f translation) { TangentBinormalGenerator.generate(mesh); Geometry testGeom = new Geometry(name, mesh); Material mat = assetManager.loadMaterial("Textures/BumpMapTest/Tangent.j3m"); testGeom.setMaterial(mat); testGeom.getLocalTranslation().set(translation); rootNode.attachChild(testGeom); Geometry debug = new Geometry( "Debug " + name, TangentBinormalGenerator.genTbnLines(mesh, 0.08f) ); Material debugMat = assetManager.loadMaterial("Common/Materials/VertexColor.j3m"); debug.setMaterial(debugMat); debug.setCullHint(Spatial.CullHint.Never); debug.getLocalTranslation().set(translation); rootNode.attachChild(debug); }
FloatBuffer textureBuffer = (FloatBuffer) mesh.getBuffer(Type.TexCoord).getData(); VertexData[] vertices = initVertexData(vertexBuffer.capacity() / 3); BufferUtils.populateFromBuffer(t[2], textureBuffer, index[2]); boolean isDegenerate = isDegenerateTriangle(v[0], v[1], v[2]); TriangleData triData = processTriangle(index, v, t);
List<VertexData> vertices = initVertexData(vertexBuffer.limit() / 3); TriangleData triData = processTriangle(index, v, t); if(splitMirrored){ triData.setIndex(index);
public static Mesh genTbnLines(Mesh mesh, float scale) { if (mesh.getBuffer(Type.Tangent) == null) { return genNormalLines(mesh, scale); } else { return genTangentLines(mesh, scale); } }