]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/g3d/shape/Mesh.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / shape / Mesh.java
1 package org.simantics.g3d.shape;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\r
5 \r
6 import javax.vecmath.Quat4d;\r
7 import javax.vecmath.Vector3d;\r
8 \r
9 import org.simantics.g3d.math.MathTools;\r
10 \r
11 public class Mesh {\r
12         private List<Vector3d> vertices;\r
13         private List<Vector3d> normals;\r
14         private List<Color4d> colors;\r
15         private List<Integer> indices;\r
16         \r
17         \r
18         public Mesh(List<Vector3d> vertices, List<Vector3d> normals,\r
19                         List<Color4d> colors, List<Integer> indices) {\r
20                 this.vertices = vertices;\r
21                 this.normals = normals;\r
22                 this.colors = colors;\r
23                 this.indices = indices;\r
24         }\r
25         \r
26         public Mesh(List<Vector3d> vertices, List<Vector3d> normals, List<Integer> indices) {\r
27                 this.vertices = vertices;\r
28                 this.normals = normals;\r
29                 this.indices = indices;\r
30         }\r
31         \r
32         public Mesh(List<Vector3d> vertices, List<Integer> indices) {\r
33                 this.vertices = vertices;\r
34                 this.indices = indices;\r
35         }\r
36 \r
37         public List<Vector3d> getVertices() {\r
38                 return vertices;\r
39         }\r
40         \r
41         public List<Vector3d> getNormals() {\r
42                 return normals;\r
43         }\r
44         \r
45         public List<Integer> getIndices() {\r
46                 return indices;\r
47         }\r
48         \r
49         public List<Color4d> getColors() {\r
50                 return colors;\r
51         }\r
52         \r
53         public void createNormals() {\r
54                 normals = new ArrayList<Vector3d>(vertices.size());\r
55                 for (int i = 0; i < vertices.size(); i++) {\r
56                         normals.add(new Vector3d());\r
57                 }\r
58         Vector3d v1 = new Vector3d();\r
59         Vector3d v2 = new Vector3d();\r
60         Vector3d v3 = new Vector3d();\r
61         Vector3d t1 = new Vector3d();\r
62         Vector3d t2 = new Vector3d();\r
63         Vector3d n = new Vector3d();\r
64         for (int i = 0; i < indices.size(); i+=3) {\r
65             v1.set(vertices.get(i));\r
66             v2.set(vertices.get(i+1));\r
67             v3.set(vertices.get(i+2));\r
68             t1.sub(v3,v1);\r
69             t2.sub(v2,v1);\r
70             n.cross(t2, t1);\r
71             normals.get(i).add(n);\r
72             normals.get(i+1).add(n);\r
73             normals.get(i+2).add(n);\r
74         }\r
75         for (int i = 0; i < normals.size(); i++) {\r
76                 normals.get(i).normalize();\r
77         }\r
78     }\r
79         \r
80         public void translate(Vector3d v) {\r
81                 for (int i = 0; i < vertices.size(); i++) {\r
82                         vertices.get(i).add(v);\r
83                 }\r
84         }\r
85         \r
86         public void rotate(Quat4d q) {\r
87                 Vector3d t = new Vector3d();\r
88                 for (int i = 0; i < vertices.size(); i++) {\r
89                         MathTools.rotate(q, vertices.get(i), t);\r
90                         vertices.get(i).set(t);\r
91                 }\r
92                 \r
93                 if (normals != null) {\r
94                         for (int i = 0; i < normals.size(); i++) {\r
95                                 MathTools.rotate(q, normals.get(i), t);\r
96                                 t.normalize();\r
97                                 normals.get(i).set(t);\r
98                         }       \r
99                 }\r
100         }\r
101         \r
102         public void setColor(Color4d color) {\r
103                 colors = new ArrayList<Color4d>(vertices.size());\r
104                 for (int i = 0; i < vertices.size(); i++) {\r
105                         colors.add(color);\r
106                 }\r
107         }\r
108         \r
109         public void add(Mesh mesh) {\r
110                 int vindex = vertices.size();\r
111                 int triIndex = indices.size();\r
112                 vertices.addAll(mesh.getVertices());\r
113                 indices.addAll(mesh.indices);\r
114                 for (int i = triIndex; i < indices.size(); i++) {\r
115                         indices.set(i, indices.get(i)+vindex);\r
116                 }\r
117                 if (normals != null) {\r
118                         boolean hasNormals = true;\r
119                         if (mesh.getNormals() == null) {\r
120                                 mesh.createNormals();\r
121                                 hasNormals = false;\r
122                         }\r
123                         normals.addAll(mesh.getNormals());\r
124                         if (!hasNormals)\r
125                                 mesh.normals = null;\r
126                 }\r
127                 if (colors != null) {\r
128                         if (mesh.getColors() != null) {\r
129                                 colors.addAll(mesh.getColors());\r
130                         } else {\r
131                                 for (int i = 0; i < mesh.getVertices().size(); i++) {\r
132                                         colors.add(new Color4d(1,1,1,0));\r
133                                 }\r
134                         }\r
135                 }\r
136         }\r
137 }\r