62
62
import javax.media.j3d.Link;
63
63
import javax.media.j3d.Material;
64
64
import javax.media.j3d.Node;
65
import javax.media.j3d.PolygonAttributes;
65
66
import javax.media.j3d.QuadArray;
66
67
import javax.media.j3d.RenderingAttributes;
67
68
import javax.media.j3d.Shape3D;
595
596
String appearanceName = null;
596
597
TexCoordGeneration texCoordGeneration = null;
598
int cullFace = PolygonAttributes.CULL_BACK;
599
boolean backFaceNormalFlip = false;
597
600
if (appearance != null) {
601
PolygonAttributes polygonAttributes = appearance.getPolygonAttributes();
602
if (polygonAttributes != null) {
603
cullFace = polygonAttributes.getCullFace();
604
backFaceNormalFlip = polygonAttributes.getBackFaceNormalFlip();
598
606
texCoordGeneration = appearance.getTexCoordGeneration();
599
607
appearanceName = "shader" + uuid;
600
608
boolean mirror = shapeName != null
607
615
String objectNameBase = "object" + uuid + "-" + i;
608
616
// Always ignore normals on walls
609
617
String [] objectsName = exportNodeGeometry(shape.getGeometry(i), parentTransformations, texCoordGeneration,
618
cullFace, backFaceNormalFlip, objectNameBase);
611
619
if (objectsName != null) {
612
620
for (String objectName : objectsName) {
613
621
if (appearanceName != null) {
627
635
private String [] exportNodeGeometry(Geometry geometry,
628
636
Transform3D parentTransformations,
629
637
TexCoordGeneration texCoordGeneration,
639
boolean backFaceNormalFlip,
630
640
String objectNameBase) {
631
641
if (geometry instanceof GeometryArray) {
632
642
GeometryArray geometryArray = (GeometryArray)geometry;
722
732
for (int index = 0, i = vertexSize - 6, n = geometryArray.getVertexCount();
723
733
index < n; index++, i += vertexSize) {
724
734
Vector3f normal = new Vector3f(vertexData [i], vertexData [i + 1], vertexData [i + 2]);
725
exportNormal(parentTransformations, normal, index, normals);
735
exportNormal(parentTransformations, normal, index, normals, backFaceNormalFlip);
728
738
// Export texture coordinates
754
764
float [] normalCoordinates = geometryArray.getNormalRefFloat();
755
765
for (int index = 0, i = 0, n = geometryArray.getVertexCount(); index < n; index++, i += 3) {
756
766
Vector3f normal = new Vector3f(normalCoordinates [i], normalCoordinates [i + 1], normalCoordinates [i + 2]);
757
exportNormal(parentTransformations, normal, index, normals);
767
exportNormal(parentTransformations, normal, index, normals, backFaceNormalFlip);
760
770
// Export texture coordinates
786
796
for (int index = 0, n = geometryArray.getVertexCount(); index < n; index++) {
787
797
Vector3f normal = new Vector3f();
788
798
geometryArray.getNormal(index, normal);
789
exportNormal(parentTransformations, normal, index, normals);
799
exportNormal(parentTransformations, normal, index, normals, backFaceNormalFlip);
792
802
// Export texture coordinates
828
838
IndexedTriangleArray triangleArray = (IndexedTriangleArray)geometryArray;
829
839
for (int i = 0, n = triangleArray.getIndexCount(), triangleIndex = 0; i < n; i += 3) {
830
840
triangleIndex = exportIndexedTriangle(triangleArray, i, i + 1, i + 2,
831
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles);
841
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles, cullFace);
833
843
} else if (geometryArray instanceof IndexedQuadArray) {
834
844
IndexedQuadArray quadArray = (IndexedQuadArray)geometryArray;
835
845
for (int i = 0, n = quadArray.getIndexCount(), triangleIndex = 0; i < n; i += 4) {
836
846
triangleIndex = exportIndexedTriangle(quadArray, i, i + 1, i + 2,
837
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles);
847
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles, cullFace);
838
848
triangleIndex = exportIndexedTriangle(quadArray, i, i + 2, i + 3,
839
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles);
849
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles, cullFace);
841
851
} else if (geometryArray instanceof IndexedLineStripArray) {
842
852
IndexedLineStripArray lineStripArray = (IndexedLineStripArray)geometryArray;
854
864
i < n; i++, j++) {
855
865
if (j % 2 == 0) {
856
866
triangleIndex = exportIndexedTriangle(triangleStripArray, i, i + 1, i + 2,
857
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles);
867
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles, cullFace);
858
868
} else { // Vertices of odd triangles are in reverse order
859
869
triangleIndex = exportIndexedTriangle(triangleStripArray, i, i + 2, i + 1,
860
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles);
870
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles, cullFace);
863
873
initialIndex += stripVertexCount [strip];
868
878
for (int i = initialIndex, n = initialIndex + stripVertexCount [strip] - 2;
870
880
triangleIndex = exportIndexedTriangle(triangleFanArray, initialIndex, i + 1, i + 2,
871
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles);
881
verticesIndices, normalsIndices, uvsIndices, triangleIndex, vertices, exportedTriangles, cullFace);
873
883
initialIndex += stripVertexCount [strip];
922
932
TriangleArray triangleArray = (TriangleArray)geometryArray;
923
933
for (int i = 0, n = triangleArray.getVertexCount(), triangleIndex = 0; i < n; i += 3) {
924
934
triangleIndex = exportTriangle(triangleArray, i, i + 1, i + 2,
925
verticesIndices, triangleIndex, vertices, exportedTriangles);
935
verticesIndices, triangleIndex, vertices, exportedTriangles, cullFace);
927
937
} else if (geometryArray instanceof QuadArray) {
928
938
QuadArray quadArray = (QuadArray)geometryArray;
929
939
for (int i = 0, n = quadArray.getVertexCount(), triangleIndex = 0; i < n; i += 4) {
930
940
triangleIndex = exportTriangle(quadArray, i, i + 1, i + 2,
931
verticesIndices, triangleIndex, vertices, exportedTriangles);
941
verticesIndices, triangleIndex, vertices, exportedTriangles, cullFace);
932
942
triangleIndex = exportTriangle(quadArray, i + 2, i + 3, i,
933
verticesIndices, triangleIndex, vertices, exportedTriangles);
943
verticesIndices, triangleIndex, vertices, exportedTriangles, cullFace);
935
945
} else if (geometryArray instanceof LineStripArray) {
936
946
LineStripArray lineStripArray = (LineStripArray)geometryArray;
948
958
i < n; i++, j++) {
949
959
if (j % 2 == 0) {
950
960
triangleIndex = exportTriangle(triangleStripArray, i, i + 1, i + 2,
951
verticesIndices, triangleIndex, vertices, exportedTriangles);
961
verticesIndices, triangleIndex, vertices, exportedTriangles, cullFace);
952
962
} else { // Vertices of odd triangles are in reverse order
953
963
triangleIndex = exportTriangle(triangleStripArray, i, i + 2, i + 1,
954
verticesIndices, triangleIndex, vertices, exportedTriangles);
964
verticesIndices, triangleIndex, vertices, exportedTriangles, cullFace);
957
967
initialIndex += stripVertexCount [strip];
962
972
for (int i = initialIndex, n = initialIndex + stripVertexCount [strip] - 2;
964
974
triangleIndex = exportTriangle(triangleFanArray, initialIndex, i + 1, i + 2, verticesIndices,
965
triangleIndex, vertices, exportedTriangles);
975
triangleIndex, vertices, exportedTriangles, cullFace);
967
977
initialIndex += stripVertexCount [strip];
1090
1100
private void exportNormal(Transform3D transformationToParent,
1091
1101
Vector3f normal, int index,
1103
boolean backFaceNormalFlip) {
1104
if (backFaceNormalFlip) {
1093
1107
transformationToParent.transform(normal);
1094
1108
int i = index * 3;
1095
1109
normals [i++] = normal.x;
1126
1140
int [] verticesIndices, int [] normalsIndices, int [] textureCoordinatesIndices,
1128
1142
float [] vertices,
1129
Set<Triangle> exportedTriangles) {
1143
Set<Triangle> exportedTriangles,
1145
if (cullFace == PolygonAttributes.CULL_FRONT) {
1146
// Reverse vertex order
1147
int tmp = vertexIndex1;
1148
vertexIndex1 = vertexIndex3;
1130
1152
int coordinateIndex1 = geometryArray.getCoordinateIndex(vertexIndex1);
1131
1153
int coordinateIndex2 = geometryArray.getCoordinateIndex(vertexIndex2);
1132
1154
int coordinateIndex3 = geometryArray.getCoordinateIndex(vertexIndex3);
1168
1190
int vertexIndex1, int vertexIndex2, int vertexIndex3,
1169
1191
int [] verticesIndices, int index,
1170
1192
float [] vertices,
1171
Set<Triangle> exportedTriangles) {
1193
Set<Triangle> exportedTriangles,
1195
if (cullFace == PolygonAttributes.CULL_FRONT) {
1196
// Reverse vertex order
1197
int tmp = vertexIndex1;
1198
vertexIndex1 = vertexIndex3;
1172
1202
Triangle exportedTriangle = new Triangle(vertices, vertexIndex1, vertexIndex2, vertexIndex3);
1173
1203
if (!exportedTriangles.contains(exportedTriangle)) {
1174
1204
exportedTriangles.add(exportedTriangle);