TriangleMesh triangleMesh = new TriangleMesh(VertexFormat.POINT_NORMAL_TEXCOORD); triangleMesh.getPoints().addAll(convertToFloatArray(vertices)); triangleMesh.getTexCoords().addAll(convertToFloatArray(texturePoints)); triangleMesh.getFaces().addAll(indices); triangleMesh.getFaceSmoothingGroups().addAll(new int[indices.length / triangleMesh.getFaceElementSize()]); triangleMesh.getNormals().addAll(convertToFloatArray(normals));
int numPoints = tMesh.getPoints().size() / tMesh.getPointElementSize(); int numTexCoords = tMesh.getTexCoords().size() / tMesh.getTexCoordElementSize(); int numFaces = tMesh.getFaces().size() / tMesh.getFaceElementSize(); if (numPoints == 0 || numPoints * tMesh.getPointElementSize() != tMesh.getPoints().size()) { throw new AssertionError("Points array size is not correct: " + tMesh.getPoints().size()); if (numTexCoords == 0 || numTexCoords * tMesh.getTexCoordElementSize() != tMesh.getTexCoords().size()) { throw new AssertionError("TexCoords array size is not correct: " + tMesh.getPoints().size()); if (numFaces == 0 || numFaces * tMesh.getFaceElementSize() != tMesh.getFaces().size()) { throw new AssertionError("Faces array size is not correct: " + tMesh.getPoints().size()); if (numFaces != tMesh.getFaceSmoothingGroups().size() && tMesh.getFaceSmoothingGroups().size() > 0) { throw new AssertionError("FaceSmoothingGroups array size is not correct: " + tMesh.getPoints().size() + ", numFaces = " + numFaces); ObservableIntegerArray faces = tMesh.getFaces(); for (int i = 0; i < faces.size(); i += 2) { int pIndex = faces.get(i);
/** * Calculates smoothing groups for data formatted in TriangleMesh style * @param flatFaces An array of faces, where each triangle face is represented by 6 (vertex and uv) indices * @param flatFaceNormals An array of face normals, where each triangle face is represented by 3 normal indices * @param normals The array of normals * @return An array of smooth groups, where the length of the array is the number of faces */ public static int[] calcSmoothGroups(TriangleMesh mesh, int[] flatFaces, int[] flatFaceNormals, float[] normals) { int faceElementSize = mesh.getFaceElementSize(); int[][] faces = new int[flatFaces.length/faceElementSize][faceElementSize]; for (int f = 0; f < faces.length; f++) { for (int e = 0; e < faceElementSize; e++) { faces[f][e] = flatFaces[f * faceElementSize + e]; } } int pointElementSize = mesh.getPointElementSize(); int[][] faceNormals = new int[flatFaceNormals.length/pointElementSize][pointElementSize]; for (int f = 0; f < faceNormals.length; f++) { for (int e = 0; e < pointElementSize; e++) { faceNormals[f][e] = flatFaceNormals[f * pointElementSize + e]; } } SmoothingGroups smoothGroups = new SmoothingGroups(faces, faceNormals, normals); return smoothGroups.calcSmoothGroups(); } }
@Override public void run() { Platform.runLater(()->{ synchronized (lockSingles) { boolean firstPoint = meshSingles.getPoints().size() == 0; meshSingles.getPoints().setAll(pointSingles.data, 0, pointSingles.size); meshSingles.getFaces().setAll(facesSingles.data, 0, facesSingles.size); if (firstPoint) { meshSingles.getTexCoords().setAll(texCoords); final MeshView meshView = new MeshView(meshSingles); meshView.setMaterial(new PhongMaterial(Color.RED)); meshView.setDepthTest(DepthTest.ENABLE); meshView.setDrawMode(DrawMode.FILL); meshView.setCullFace(CullFace.BACK); world.getChildren().addAll(meshView); } timerSingles = null; taskSingles = null; } }); } };
TriangleMesh mesh = new TriangleMesh(); mesh.getPoints().setAll(points); mesh.getTexCoords().setAll(texCoords); mesh.getFaces().setAll(faces);
for (MeshView meshView : meshViews) { TriangleMesh mesh = (TriangleMesh) meshView.getMesh(); ObservableIntegerArray faces = mesh.getFaces(); ObservableIntegerArray faceSmoothingGroups = mesh.getFaceSmoothingGroups(); ObservableFloatArray points = mesh.getPoints(); newFaces.clear(); newFaces.ensureCapacity(faces.size()); newFaceSmoothingGroups.clear(); newFaceSmoothingGroups.ensureCapacity(faceSmoothingGroups.size()); int pointElementSize = mesh.getPointElementSize(); int faceElementSize = mesh.getFaceElementSize(); for (int i = 0; i < faces.size(); i += faceElementSize) { total++;
ObservableFloatArray texcoords = mesh.getTexCoords(); int texcoordElementSize = mesh.getTexCoordElementSize(); int os = texcoords.size() / texcoordElementSize; texcoords.trimToSize(); ObservableIntegerArray faces = mesh.getFaces(); for (int i = 1; i < faces.size(); i += 2) { faces.set(i, reindex.get(faces.get(i))); check += mesh.getTexCoords().size() / texcoordElementSize;
ObservableFloatArray points = mesh.getPoints(); int pointElementSize = mesh.getPointElementSize(); int os = points.size() / pointElementSize; points.trimToSize(); ObservableIntegerArray faces = mesh.getFaces(); for (int i = 0; i < faces.size(); i += 2) { faces.set(i, reindex.get(faces.get(i))); check += mesh.getPoints().size() / pointElementSize;
private void updateMesh() { PolygonMesh pmesh = getMesh(); if (pmesh == null || pmesh.faces == null) { triangleMesh = new TriangleMesh(); meshView.setMesh(triangleMesh); return; final int pointElementSize = triangleMesh.getPointElementSize(); final int faceElementSize = triangleMesh.getFaceElementSize(); final boolean isWireframe = getDrawMode() == DrawMode.LINE; if (DEBUG) System.out.println("UPDATE MESH -- "+(isWireframe?"WIREFRAME":"SOLID")); triangleMesh = new TriangleMesh(); pointsDirty = pointsSizeDirty = texCoordsDirty = facesDirty = true; // to fill in the new triangle mesh triangleMesh.getFaces().setAll(facesArray); triangleMesh.getFaceSmoothingGroups().clear(); triangleMesh.getTexCoords().setAll(0,0); triangleMesh.getPoints().setAll(pointsArray); triangleMesh = new TriangleMesh(); pointsDirty = pointsSizeDirty = texCoordsDirty = facesDirty = true; // to fill in the new triangle mesh triangleMesh.getFaces().setAll(facesArray); triangleMesh.getFaceSmoothingGroups().setAll(smoothingGroupsArray); triangleMesh.getTexCoords().setAll(pmesh.getTexCoords());
TriangleMesh mesh = new TriangleMesh(); mesh.getPoints().addAll( (float) firstVertex.pos.x(), (float) firstVertex.pos.y(), (float) firstVertex.pos.z()); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) secondVertex.pos.x(), (float) secondVertex.pos.y(), (float) secondVertex.pos.z()); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) thirdVertex.pos.x(), (float) thirdVertex.pos.y(), mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getFaces().addAll(
TriangleMesh mesh = new TriangleMesh(); mesh.getPoints().setAll(newVertexes.toFloatArray()); mesh.getTexCoords().setAll(newUVs.toFloatArray()); mesh.getFaces().setAll(((IntegerArrayList) faces.subList(facesStart, faces.size())).toIntArray()); int[] newFaceNormals = ((IntegerArrayList) faceNormals.subList(facesNormalStart, faceNormals.size())).toIntArray(); int[] smGroups = SmoothingGroups.calcSmoothGroups(mesh, newFaces, newFaceNormals, newNormals.toFloatArray()); mesh.getFaceSmoothingGroups().setAll(smGroups); } else { mesh.getFaceSmoothingGroups().setAll(((IntegerArrayList) smoothingGroups.subList(smoothingGroupsStart, smoothingGroups.size())).toIntArray()); "Added mesh '" + key + "' of " + mesh.getPoints().size() / mesh.getPointElementSize() + " vertexes, " + mesh.getTexCoords().size() / mesh.getTexCoordElementSize() + " uvs, " + mesh.getFaces().size() / mesh.getFaceElementSize() + " faces, " + mesh.getFaceSmoothingGroups().size() + " smoothing groups."); log("material diffuse color = " + ((PhongMaterial) material).getDiffuseColor()); log("material diffuse map = " + ((PhongMaterial) material).getDiffuseMap());
TriangleMesh triangleMesh = new TriangleMesh(VertexFormat.POINT_NORMAL_TEXCOORD); triangleMesh.getPoints().addAll(convertToFloatArray(vertices)); triangleMesh.getTexCoords().addAll(convertToFloatArray(texturePoints)); triangleMesh.getFaces().addAll(indices); triangleMesh.getFaceSmoothingGroups().addAll(new int[indices.length / triangleMesh.getFaceElementSize()]); triangleMesh.getNormals().addAll(convertToFloatArray(normals));
TriangleMesh mesh = new TriangleMesh(); mesh.getPoints().addAll( (float) firstVertex.getLocation().x, (float) firstVertex.getLocation().y, (float) firstVertex.getLocation().z); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) secondVertex.getLocation().x, (float) secondVertex.getLocation().y, (float) secondVertex.getLocation().z); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) thirdVertex.getLocation().x, (float) thirdVertex.getLocation().y, (float) thirdVertex.getLocation().z); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getFaces().addAll(