@@ -25,20 +25,33 @@ public Mesh3D() {
2525 vertices = new ArrayList <Vector3f >();
2626 faces = new ArrayList <Face3D >();
2727 }
28-
28+
2929 public void apply (IMeshModifier modifier ) {
3030 modifier .modify (this );
3131 }
3232
33- public void updateFaceNormals () {
34- for (Face3D face : faces ) {
35- face .normal = calculateFaceNormal (face );
33+ public Vector3f calculateFaceNormal (Face3D face ) {
34+ Vector3f faceNormal = new Vector3f ();
35+ for (int i = 0 ; i < face .indices .length ; i ++) {
36+ Vector3f currentVertex = vertices .get (face .indices [i ]);
37+ Vector3f nextVertex = vertices
38+ .get (face .indices [(i + 1 ) % face .indices .length ]);
39+ float x = (currentVertex .getY () - nextVertex .getY ())
40+ * (currentVertex .getZ () + nextVertex .getZ ());
41+ float y = (currentVertex .getZ () - nextVertex .getZ ())
42+ * (currentVertex .getX () + nextVertex .getX ());
43+ float z = (currentVertex .getX () - nextVertex .getX ())
44+ * (currentVertex .getY () + nextVertex .getY ());
45+ faceNormal .addLocal (x , y , z );
3646 }
47+ return faceNormal .normalize ();
3748 }
3849
3950 public Mesh3D rotateX (float angle ) {
40- Matrix3f m = new Matrix3f (1 , 0 , 0 , 0 , Mathf .cos (angle ),
41- -Mathf .sin (angle ), 0 , Mathf .sin (angle ), Mathf .cos (angle ));
51+ Matrix3f m = new Matrix3f (
52+ 1 , 0 , 0 , 0 , Mathf .cos (angle ), -Mathf .sin (angle ), 0 ,
53+ Mathf .sin (angle ), Mathf .cos (angle )
54+ );
4255
4356 for (Vector3f v : vertices ) {
4457 Vector3f v0 = v .mult (m );
@@ -49,8 +62,10 @@ public Mesh3D rotateX(float angle) {
4962 }
5063
5164 public Mesh3D rotateY (float angle ) {
52- Matrix3f m = new Matrix3f (Mathf .cos (angle ), 0 , Mathf .sin (angle ), 0 , 1 ,
53- 0 , -Mathf .sin (angle ), 0 , Mathf .cos (angle ));
65+ Matrix3f m = new Matrix3f (
66+ Mathf .cos (angle ), 0 , Mathf .sin (angle ), 0 , 1 , 0 ,
67+ -Mathf .sin (angle ), 0 , Mathf .cos (angle )
68+ );
5469
5570 for (Vector3f v : vertices ) {
5671 Vector3f v0 = v .mult (m );
@@ -61,8 +76,10 @@ public Mesh3D rotateY(float angle) {
6176 }
6277
6378 public Mesh3D rotateZ (float angle ) {
64- Matrix3f m = new Matrix3f (Mathf .cos (angle ), -Mathf .sin (angle ), 0 ,
65- Mathf .sin (angle ), Mathf .cos (angle ), 0 , 0 , 0 , 1 );
79+ Matrix3f m = new Matrix3f (
80+ Mathf .cos (angle ), -Mathf .sin (angle ), 0 , Mathf .sin (angle ),
81+ Mathf .cos (angle ), 0 , 0 , 0 , 1
82+ );
6683
6784 for (Vector3f v : vertices ) {
6885 Vector3f v0 = v .mult (m );
@@ -107,31 +124,6 @@ public Mesh3D translate(Vector3f t) {
107124 return this ;
108125 }
109126
110- public Vector3f calculateFaceNormal (Face3D face ) {
111- Vector3f faceNormal = new Vector3f ();
112- for (int i = 0 ; i < face .indices .length ; i ++) {
113- Vector3f currentVertex = vertices .get (face .indices [i ]);
114- Vector3f nextVertex = vertices
115- .get (face .indices [(i + 1 ) % face .indices .length ]);
116- float x = (currentVertex .getY () - nextVertex .getY ())
117- * (currentVertex .getZ () + nextVertex .getZ ());
118- float y = (currentVertex .getZ () - nextVertex .getZ ())
119- * (currentVertex .getX () + nextVertex .getX ());
120- float z = (currentVertex .getX () - nextVertex .getX ())
121- * (currentVertex .getY () + nextVertex .getY ());
122- faceNormal .addLocal (x , y , z );
123- }
124- return faceNormal .normalize ();
125- }
126-
127- public Vector3f calculateFaceCenter (Face3D face ) {
128- Vector3f center = new Vector3f ();
129- for (int i = 0 ; i < face .indices .length ; i ++) {
130- center .addLocal (vertices .get (face .indices [i ]));
131- }
132- return center .divideLocal (face .indices .length );
133- }
134-
135127 public Bounds3 calculateBounds () {
136128 if (vertices .isEmpty ())
137129 return new Bounds3 ();
@@ -167,35 +159,6 @@ public Mesh3D copy() {
167159 return copy ;
168160 }
169161
170- public Mesh3D scaledCopy (Vector3f scale ) {
171- Mesh3D copy = new Mesh3D ();
172- List <Vector3f > vertices = copy .vertices ;
173- List <Face3D > faces = copy .faces ;
174-
175- for (Vector3f v : this .vertices )
176- vertices .add (new Vector3f (v ).multLocal (scale ));
177-
178- for (Face3D f : this .faces )
179- faces .add (new Face3D (f ));
180-
181- return copy ;
182- }
183-
184- public Mesh3D append (Mesh3D ... meshes ) {
185- Mesh3D result = new Mesh3D ();
186-
187- result = appendUtil (meshes );
188- result = appendUtil (this , result );
189-
190- vertices .clear ();
191- vertices .addAll (result .vertices );
192-
193- faces .clear ();
194- faces .addAll (result .faces );
195-
196- return this ;
197- }
198-
199162 private Mesh3D appendUtil (Mesh3D ... meshes ) {
200163 // FIXME copy vertices and faces
201164 int n = 0 ;
@@ -228,13 +191,27 @@ public void removeDoubles() {
228191 new RemoveDoubleVerticesModifier ().modify (this );
229192 }
230193
231- public Collection <Face3D > getSelection (String tag ) {
232- ArrayList <Face3D > result = new ArrayList <Face3D >();
233- for (Face3D face : faces ) {
234- if (face .tag .equals (tag ))
235- result .add (face );
194+ public Vector3f calculateFaceCenter (Face3D face ) {
195+ Vector3f center = new Vector3f ();
196+ for (int i = 0 ; i < face .indices .length ; i ++) {
197+ center .addLocal (vertices .get (face .indices [i ]));
236198 }
237- return result ;
199+ return center .divideLocal (face .indices .length );
200+ }
201+
202+ public Mesh3D append (Mesh3D ... meshes ) {
203+ Mesh3D result = new Mesh3D ();
204+
205+ result = appendUtil (meshes );
206+ result = appendUtil (this , result );
207+
208+ vertices .clear ();
209+ vertices .addAll (result .vertices );
210+
211+ faces .clear ();
212+ faces .addAll (result .faces );
213+
214+ return this ;
238215 }
239216
240217 public void clearFaces () {
0 commit comments