2 |
26 Feb 07 |
jari |
1 |
/* |
2 |
26 Feb 07 |
jari |
Copyright @ 1999-2003, The Institute for Genomic Research (TIGR). |
2 |
26 Feb 07 |
jari |
All rights reserved. |
2 |
26 Feb 07 |
jari |
4 |
*/ |
2 |
26 Feb 07 |
jari |
5 |
/* |
2 |
26 Feb 07 |
jari |
* $RCSfile: GenesShape.java,v $ |
2 |
26 Feb 07 |
jari |
* $Revision: 1.3 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2005/03/10 20:33:21 $ |
2 |
26 Feb 07 |
jari |
* $Author: braistedj $ |
2 |
26 Feb 07 |
jari |
* $State: Exp $ |
2 |
26 Feb 07 |
jari |
11 |
*/ |
2 |
26 Feb 07 |
jari |
12 |
package org.tigr.microarray.mev.cluster.gui.impl.terrain; |
2 |
26 Feb 07 |
jari |
13 |
|
2 |
26 Feb 07 |
jari |
14 |
import java.awt.Color; |
2 |
26 Feb 07 |
jari |
15 |
|
2 |
26 Feb 07 |
jari |
16 |
import javax.media.j3d.Appearance; |
2 |
26 Feb 07 |
jari |
17 |
import javax.media.j3d.Geometry; |
2 |
26 Feb 07 |
jari |
18 |
import javax.media.j3d.GeometryArray; |
2 |
26 Feb 07 |
jari |
19 |
import javax.media.j3d.GeometryUpdater; |
2 |
26 Feb 07 |
jari |
20 |
import javax.media.j3d.LineArray; |
2 |
26 Feb 07 |
jari |
21 |
import javax.media.j3d.Material; |
2 |
26 Feb 07 |
jari |
22 |
import javax.media.j3d.PointArray; |
2 |
26 Feb 07 |
jari |
23 |
import javax.media.j3d.PointAttributes; |
2 |
26 Feb 07 |
jari |
24 |
import javax.media.j3d.QuadArray; |
2 |
26 Feb 07 |
jari |
25 |
import javax.media.j3d.Shape3D; |
2 |
26 Feb 07 |
jari |
26 |
import javax.media.j3d.TriangleStripArray; |
2 |
26 Feb 07 |
jari |
27 |
import javax.vecmath.Color3f; |
2 |
26 Feb 07 |
jari |
28 |
import javax.vecmath.Point2f; |
2 |
26 Feb 07 |
jari |
29 |
|
2 |
26 Feb 07 |
jari |
30 |
import org.tigr.microarray.mev.cluster.gui.impl.util.IntArray; |
2 |
26 Feb 07 |
jari |
31 |
|
2 |
26 Feb 07 |
jari |
32 |
import com.sun.j3d.utils.geometry.Primitive; |
2 |
26 Feb 07 |
jari |
33 |
import com.sun.j3d.utils.geometry.Sphere; |
2 |
26 Feb 07 |
jari |
34 |
|
2 |
26 Feb 07 |
jari |
35 |
public class GenesShape extends Shape3D implements GeometryUpdater { |
2 |
26 Feb 07 |
jari |
36 |
|
2 |
26 Feb 07 |
jari |
37 |
public static final int POINTS = 0; |
2 |
26 Feb 07 |
jari |
38 |
public static final int CUBES = 1; |
2 |
26 Feb 07 |
jari |
39 |
public static final int SPHERES = 2; |
2 |
26 Feb 07 |
jari |
40 |
|
2 |
26 Feb 07 |
jari |
41 |
private int type = POINTS; |
2 |
26 Feb 07 |
jari |
42 |
private float size = 0.005f; |
2 |
26 Feb 07 |
jari |
43 |
private float[] coords; // reference to this shape geometry coordinaties |
2 |
26 Feb 07 |
jari |
44 |
private float[] colors; // reference to this shape vertices colors |
2 |
26 Feb 07 |
jari |
45 |
private float[] normals; // reference to this shape vertices normals |
2 |
26 Feb 07 |
jari |
46 |
|
2 |
26 Feb 07 |
jari |
47 |
private float[][] locations; |
2 |
26 Feb 07 |
jari |
48 |
private IntArray shapeIndices; |
2 |
26 Feb 07 |
jari |
49 |
private Point2f start = new Point2f(); |
2 |
26 Feb 07 |
jari |
50 |
private Point2f end = new Point2f(); |
2 |
26 Feb 07 |
jari |
// temporary members to handle updating callback |
2 |
26 Feb 07 |
jari |
52 |
private int[] colorIndices; |
2 |
26 Feb 07 |
jari |
53 |
private Color3f[] colors_c3f; |
2 |
26 Feb 07 |
jari |
54 |
|
2 |
26 Feb 07 |
jari |
55 |
public GenesShape(int type, float[][] locations, Point2f start, Point2f end) { |
2 |
26 Feb 07 |
jari |
56 |
this.type = type; |
2 |
26 Feb 07 |
jari |
57 |
this.locations = locations; |
2 |
26 Feb 07 |
jari |
58 |
this.start.set(start); |
2 |
26 Feb 07 |
jari |
59 |
this.end.set(end); |
2 |
26 Feb 07 |
jari |
60 |
setCapability(ENABLE_PICK_REPORTING); |
2 |
26 Feb 07 |
jari |
61 |
setCapability(ALLOW_GEOMETRY_READ); |
2 |
26 Feb 07 |
jari |
62 |
setCapability(ALLOW_GEOMETRY_WRITE); |
2 |
26 Feb 07 |
jari |
63 |
this.shapeIndices = getShapeIndices(); |
2 |
26 Feb 07 |
jari |
64 |
initBuffers(); |
2 |
26 Feb 07 |
jari |
65 |
initData(); |
2 |
26 Feb 07 |
jari |
66 |
setGeometry(createGeometry()); |
2 |
26 Feb 07 |
jari |
67 |
setAppearance(createAppearance()); |
2 |
26 Feb 07 |
jari |
68 |
setBoundsAutoCompute(false); |
2 |
26 Feb 07 |
jari |
69 |
} |
2 |
26 Feb 07 |
jari |
70 |
|
2 |
26 Feb 07 |
jari |
71 |
public void setType(int type) { |
2 |
26 Feb 07 |
jari |
72 |
this.type = type; |
2 |
26 Feb 07 |
jari |
73 |
initBuffers(); |
2 |
26 Feb 07 |
jari |
74 |
initData(); |
2 |
26 Feb 07 |
jari |
75 |
setGeometry(createGeometry()); |
2 |
26 Feb 07 |
jari |
76 |
} |
2 |
26 Feb 07 |
jari |
77 |
|
2 |
26 Feb 07 |
jari |
78 |
public void setZoom(Point2f start, Point2f end) { |
2 |
26 Feb 07 |
jari |
79 |
this.start.set(start); |
2 |
26 Feb 07 |
jari |
80 |
this.end.set(end); |
2 |
26 Feb 07 |
jari |
81 |
this.shapeIndices = getShapeIndices(); |
2 |
26 Feb 07 |
jari |
82 |
initBuffers(); |
2 |
26 Feb 07 |
jari |
83 |
initData(); |
2 |
26 Feb 07 |
jari |
84 |
setGeometry(createGeometry()); |
2 |
26 Feb 07 |
jari |
85 |
} |
2 |
26 Feb 07 |
jari |
86 |
|
2 |
26 Feb 07 |
jari |
87 |
public void updateColors(int[] colorIndices, Color[] colors) { |
2 |
26 Feb 07 |
jari |
88 |
this.colorIndices = colorIndices; |
2 |
26 Feb 07 |
jari |
89 |
this.colors_c3f = new Color3f[colors.length]; |
2 |
26 Feb 07 |
jari |
90 |
for (int i=0; i<this.colors_c3f.length; i++) |
2 |
26 Feb 07 |
jari |
91 |
this.colors_c3f[i] = new Color3f(colors[i]); |
2 |
26 Feb 07 |
jari |
92 |
((GeometryArray)getGeometry()).updateData(this); |
2 |
26 Feb 07 |
jari |
93 |
} |
2 |
26 Feb 07 |
jari |
94 |
|
2 |
26 Feb 07 |
jari |
95 |
public int getShapeIndex(int vertexIndex) { |
2 |
26 Feb 07 |
jari |
96 |
if (vertexIndex < 0 || vertexIndex >= this.coords.length/3) |
2 |
26 Feb 07 |
jari |
97 |
return -1; |
2 |
26 Feb 07 |
jari |
98 |
switch (this.type) { |
2 |
26 Feb 07 |
jari |
99 |
case POINTS: |
2 |
26 Feb 07 |
jari |
100 |
return this.shapeIndices.get(vertexIndex); |
2 |
26 Feb 07 |
jari |
101 |
case CUBES: |
2 |
26 Feb 07 |
jari |
102 |
return this.shapeIndices.get(3*vertexIndex/cubeverts.length); |
2 |
26 Feb 07 |
jari |
103 |
case SPHERES: |
2 |
26 Feb 07 |
jari |
104 |
return this.shapeIndices.get(3*vertexIndex/sphereverts.length); |
2 |
26 Feb 07 |
jari |
105 |
} |
2 |
26 Feb 07 |
jari |
106 |
return -1; |
2 |
26 Feb 07 |
jari |
107 |
} |
2 |
26 Feb 07 |
jari |
108 |
|
2 |
26 Feb 07 |
jari |
109 |
private void initBuffers() { |
2 |
26 Feb 07 |
jari |
110 |
int size = this.shapeIndices.getSize()*getVerticesNumber(this.type)*3; |
2 |
26 Feb 07 |
jari |
111 |
this.coords = new float[size]; |
2 |
26 Feb 07 |
jari |
112 |
this.colors = new float[size]; |
2 |
26 Feb 07 |
jari |
113 |
this.normals = new float[size]; |
2 |
26 Feb 07 |
jari |
114 |
} |
2 |
26 Feb 07 |
jari |
115 |
|
2 |
26 Feb 07 |
jari |
116 |
private Geometry createGeometry() { |
2 |
26 Feb 07 |
jari |
117 |
GeometryArray geometry = null; |
2 |
26 Feb 07 |
jari |
118 |
if (this.shapeIndices.getSize() < 1) { |
2 |
26 Feb 07 |
jari |
119 |
geometry = createEmptyGeometry(); |
2 |
26 Feb 07 |
jari |
120 |
return geometry; |
2 |
26 Feb 07 |
jari |
121 |
} else |
2 |
26 Feb 07 |
jari |
122 |
switch (this.type) { |
2 |
26 Feb 07 |
jari |
123 |
case POINTS: |
2 |
26 Feb 07 |
jari |
124 |
geometry = createPointsGeometry(); |
2 |
26 Feb 07 |
jari |
125 |
break; |
2 |
26 Feb 07 |
jari |
126 |
case CUBES: |
2 |
26 Feb 07 |
jari |
127 |
geometry = createCubesGeometry(); |
2 |
26 Feb 07 |
jari |
128 |
break; |
2 |
26 Feb 07 |
jari |
129 |
case SPHERES: |
2 |
26 Feb 07 |
jari |
130 |
geometry = createSpheresGeometry(); |
2 |
26 Feb 07 |
jari |
131 |
break; |
2 |
26 Feb 07 |
jari |
132 |
} |
2 |
26 Feb 07 |
jari |
133 |
setCapabilities(geometry); |
2 |
26 Feb 07 |
jari |
134 |
geometry.setCoordRefFloat(this.coords); |
2 |
26 Feb 07 |
jari |
135 |
geometry.setColorRefFloat(this.colors); |
2 |
26 Feb 07 |
jari |
136 |
geometry.setNormalRefFloat(this.normals); |
2 |
26 Feb 07 |
jari |
137 |
return geometry; |
2 |
26 Feb 07 |
jari |
138 |
} |
2 |
26 Feb 07 |
jari |
139 |
|
2 |
26 Feb 07 |
jari |
140 |
private void setCapabilities(Geometry geometry) { |
2 |
26 Feb 07 |
jari |
141 |
geometry.setCapability(GeometryArray.ALLOW_INTERSECT); |
2 |
26 Feb 07 |
jari |
142 |
geometry.setCapability(GeometryArray.ALLOW_COUNT_READ); |
2 |
26 Feb 07 |
jari |
143 |
geometry.setCapability(GeometryArray.ALLOW_FORMAT_READ); |
2 |
26 Feb 07 |
jari |
144 |
geometry.setCapability(GeometryArray.ALLOW_REF_DATA_READ); |
2 |
26 Feb 07 |
jari |
145 |
geometry.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE); |
2 |
26 Feb 07 |
jari |
146 |
} |
2 |
26 Feb 07 |
jari |
147 |
|
2 |
26 Feb 07 |
jari |
148 |
private Appearance createAppearance() { |
2 |
26 Feb 07 |
jari |
149 |
Appearance appearance = new Appearance(); |
2 |
26 Feb 07 |
jari |
150 |
appearance.setMaterial(new Material()); |
2 |
26 Feb 07 |
jari |
151 |
appearance.setPointAttributes(new PointAttributes(this.size*1000f, true)); |
2 |
26 Feb 07 |
jari |
152 |
return appearance; |
2 |
26 Feb 07 |
jari |
153 |
} |
2 |
26 Feb 07 |
jari |
154 |
|
2 |
26 Feb 07 |
jari |
155 |
private void initData() { |
2 |
26 Feb 07 |
jari |
156 |
initCoords(); |
2 |
26 Feb 07 |
jari |
157 |
initColors(); |
2 |
26 Feb 07 |
jari |
158 |
initNormals(); |
2 |
26 Feb 07 |
jari |
159 |
} |
2 |
26 Feb 07 |
jari |
160 |
|
2 |
26 Feb 07 |
jari |
161 |
private void initCoords() { |
2 |
26 Feb 07 |
jari |
162 |
int shapeIndex = 0; |
2 |
26 Feb 07 |
jari |
163 |
float x, y; |
2 |
26 Feb 07 |
jari |
164 |
float scale = Math.max(end.x-start.x, end.y-start.y); |
2 |
26 Feb 07 |
jari |
165 |
for (int i=0; i<locations.length; i++) { |
2 |
26 Feb 07 |
jari |
166 |
x = locations[i][0]; |
2 |
26 Feb 07 |
jari |
167 |
y = locations[i][1]; |
2 |
26 Feb 07 |
jari |
168 |
if (x>=start.x && x<=start.x+scale && y>=start.y && y<=start.y+scale) |
2 |
26 Feb 07 |
jari |
169 |
setCoords(shapeIndex++, (x-start.x)/scale, 0, (y-start.y)/scale); |
2 |
26 Feb 07 |
jari |
170 |
} |
2 |
26 Feb 07 |
jari |
171 |
} |
2 |
26 Feb 07 |
jari |
172 |
|
2 |
26 Feb 07 |
jari |
173 |
private void setCoords(int shapeIndex, float x, float y, float z) { |
2 |
26 Feb 07 |
jari |
174 |
switch (this.type) { |
2 |
26 Feb 07 |
jari |
175 |
case POINTS: |
2 |
26 Feb 07 |
jari |
176 |
setPointCoords(shapeIndex, x, y, z); |
2 |
26 Feb 07 |
jari |
177 |
break; |
2 |
26 Feb 07 |
jari |
178 |
case CUBES: |
2 |
26 Feb 07 |
jari |
179 |
setCubeCoords(shapeIndex, x, y, z); |
2 |
26 Feb 07 |
jari |
180 |
break; |
2 |
26 Feb 07 |
jari |
181 |
case SPHERES: |
2 |
26 Feb 07 |
jari |
182 |
setSphereCoords(shapeIndex, x, y, z); |
2 |
26 Feb 07 |
jari |
183 |
break; |
2 |
26 Feb 07 |
jari |
184 |
} |
2 |
26 Feb 07 |
jari |
185 |
} |
2 |
26 Feb 07 |
jari |
186 |
|
2 |
26 Feb 07 |
jari |
187 |
private void setPointCoords(int shapeIndex, float x, float y, float z) { |
2 |
26 Feb 07 |
jari |
188 |
int pos = shapeIndex*3; |
2 |
26 Feb 07 |
jari |
189 |
this.coords[pos++] = x; |
2 |
26 Feb 07 |
jari |
190 |
this.coords[pos++] = y; |
2 |
26 Feb 07 |
jari |
191 |
this.coords[pos++] = z; |
2 |
26 Feb 07 |
jari |
192 |
} |
2 |
26 Feb 07 |
jari |
193 |
|
2 |
26 Feb 07 |
jari |
194 |
private void setCubeCoords(int shapeIndex, float x, float y, float z) { |
2 |
26 Feb 07 |
jari |
195 |
int pos = shapeIndex*cubeverts.length; |
2 |
26 Feb 07 |
jari |
196 |
for (int i=0; i<cubeverts.length; i+=3) { |
2 |
26 Feb 07 |
jari |
197 |
this.coords[pos++] = cubeverts[i+0]*this.size + x; |
2 |
26 Feb 07 |
jari |
198 |
this.coords[pos++] = cubeverts[i+1]*this.size + y; |
2 |
26 Feb 07 |
jari |
199 |
this.coords[pos++] = cubeverts[i+2]*this.size + z; |
2 |
26 Feb 07 |
jari |
200 |
} |
2 |
26 Feb 07 |
jari |
201 |
} |
2 |
26 Feb 07 |
jari |
202 |
|
2 |
26 Feb 07 |
jari |
203 |
private void setSphereCoords(int shapeIndex, float x, float y, float z) { |
2 |
26 Feb 07 |
jari |
204 |
int pos = shapeIndex*sphereverts.length; |
2 |
26 Feb 07 |
jari |
205 |
for (int i=0; i<sphereverts.length; i+=3) { |
2 |
26 Feb 07 |
jari |
206 |
this.coords[pos++] = sphereverts[i+0]*this.size + x; |
2 |
26 Feb 07 |
jari |
207 |
this.coords[pos++] = sphereverts[i+1]*this.size + y; |
2 |
26 Feb 07 |
jari |
208 |
this.coords[pos++] = sphereverts[i+2]*this.size + z; |
2 |
26 Feb 07 |
jari |
209 |
} |
2 |
26 Feb 07 |
jari |
210 |
} |
2 |
26 Feb 07 |
jari |
211 |
|
2 |
26 Feb 07 |
jari |
212 |
private void initColors() { |
2 |
26 Feb 07 |
jari |
213 |
for (int i=0; i<this.colors.length; i++) |
2 |
26 Feb 07 |
jari |
214 |
this.colors[i] = 0.6f; |
2 |
26 Feb 07 |
jari |
215 |
if (this.colors_c3f == null || this.colorIndices == null) |
2 |
26 Feb 07 |
jari |
216 |
return; |
2 |
26 Feb 07 |
jari |
217 |
int colorIndex; |
2 |
26 Feb 07 |
jari |
218 |
for (int i=0; i<this.shapeIndices.getSize(); i++) { |
2 |
26 Feb 07 |
jari |
219 |
colorIndex = this.colorIndices[this.shapeIndices.get(i)]; |
2 |
26 Feb 07 |
jari |
220 |
if (colorIndex >= 0) |
2 |
26 Feb 07 |
jari |
221 |
setShapeColor(i, this.colors_c3f[colorIndex]); |
2 |
26 Feb 07 |
jari |
222 |
} |
2 |
26 Feb 07 |
jari |
223 |
} |
2 |
26 Feb 07 |
jari |
224 |
|
2 |
26 Feb 07 |
jari |
225 |
private void setShapeColor(int shapeIndex, Color3f color) { |
2 |
26 Feb 07 |
jari |
226 |
int vertexNumber = getVerticesNumber(this.type); |
2 |
26 Feb 07 |
jari |
227 |
int pos = vertexNumber*3*shapeIndex; |
2 |
26 Feb 07 |
jari |
228 |
for (int i=0; i<vertexNumber; i++) { |
2 |
26 Feb 07 |
jari |
229 |
this.colors[pos++] = color.x; |
2 |
26 Feb 07 |
jari |
230 |
this.colors[pos++] = color.y; |
2 |
26 Feb 07 |
jari |
231 |
this.colors[pos++] = color.z; |
2 |
26 Feb 07 |
jari |
232 |
} |
2 |
26 Feb 07 |
jari |
233 |
} |
2 |
26 Feb 07 |
jari |
234 |
|
2 |
26 Feb 07 |
jari |
235 |
private void initNormals() { |
2 |
26 Feb 07 |
jari |
236 |
switch (this.type) { |
2 |
26 Feb 07 |
jari |
237 |
case POINTS: |
2 |
26 Feb 07 |
jari |
238 |
initPointsNormals(); |
2 |
26 Feb 07 |
jari |
239 |
break; |
2 |
26 Feb 07 |
jari |
240 |
case CUBES: |
2 |
26 Feb 07 |
jari |
241 |
initCubesNormals(); |
2 |
26 Feb 07 |
jari |
242 |
break; |
2 |
26 Feb 07 |
jari |
243 |
case SPHERES: |
2 |
26 Feb 07 |
jari |
244 |
initSpheresNormals(); |
2 |
26 Feb 07 |
jari |
245 |
break; |
2 |
26 Feb 07 |
jari |
246 |
} |
2 |
26 Feb 07 |
jari |
247 |
} |
2 |
26 Feb 07 |
jari |
248 |
|
2 |
26 Feb 07 |
jari |
249 |
private void initPointsNormals() { |
2 |
26 Feb 07 |
jari |
250 |
for (int i=0; i<this.normals.length; i+=3) { |
2 |
26 Feb 07 |
jari |
251 |
this.normals[i+0] = 0f; |
2 |
26 Feb 07 |
jari |
252 |
this.normals[i+1] = 0f; |
2 |
26 Feb 07 |
jari |
253 |
this.normals[i+2] = 1f; |
2 |
26 Feb 07 |
jari |
254 |
} |
2 |
26 Feb 07 |
jari |
255 |
} |
2 |
26 Feb 07 |
jari |
256 |
|
2 |
26 Feb 07 |
jari |
257 |
private void initCubesNormals() { |
2 |
26 Feb 07 |
jari |
258 |
for (int i=0; i<this.normals.length; i+=cubenormals.length) |
2 |
26 Feb 07 |
jari |
259 |
for (int j=0; j<cubenormals.length; j++) |
2 |
26 Feb 07 |
jari |
260 |
this.normals[i+j] = cubenormals[j]; |
2 |
26 Feb 07 |
jari |
261 |
} |
2 |
26 Feb 07 |
jari |
262 |
|
2 |
26 Feb 07 |
jari |
263 |
private void initSpheresNormals() { |
2 |
26 Feb 07 |
jari |
264 |
for (int i=0; i<this.normals.length; i+=spherenormals.length) |
2 |
26 Feb 07 |
jari |
265 |
for (int j=0; j<spherenormals.length; j++) |
2 |
26 Feb 07 |
jari |
266 |
this.normals[i+j] = spherenormals[j]; |
2 |
26 Feb 07 |
jari |
267 |
} |
2 |
26 Feb 07 |
jari |
268 |
|
2 |
26 Feb 07 |
jari |
269 |
private GeometryArray createEmptyGeometry() { |
2 |
26 Feb 07 |
jari |
270 |
GeometryArray geometry = new LineArray(2, GeometryArray.COORDINATES); |
2 |
26 Feb 07 |
jari |
271 |
geometry.setCoordinates(0, new float[] {0,0,0,0,0,0}); |
2 |
26 Feb 07 |
jari |
272 |
geometry.setCapability(GeometryArray.ALLOW_COUNT_READ); |
2 |
26 Feb 07 |
jari |
273 |
geometry.setCapability(GeometryArray.ALLOW_FORMAT_READ); |
2 |
26 Feb 07 |
jari |
274 |
geometry.setCapability(GeometryArray.ALLOW_COORDINATE_READ); |
2 |
26 Feb 07 |
jari |
275 |
return geometry; |
2 |
26 Feb 07 |
jari |
276 |
} |
2 |
26 Feb 07 |
jari |
277 |
|
2 |
26 Feb 07 |
jari |
278 |
private GeometryArray createPointsGeometry() { |
2 |
26 Feb 07 |
jari |
279 |
PointArray geometry = new PointArray(this.coords.length/3, |
2 |
26 Feb 07 |
jari |
280 |
GeometryArray.COORDINATES | |
2 |
26 Feb 07 |
jari |
281 |
GeometryArray.COLOR_3 | |
2 |
26 Feb 07 |
jari |
282 |
GeometryArray.NORMALS | |
2 |
26 Feb 07 |
jari |
283 |
GeometryArray.BY_REFERENCE |
2 |
26 Feb 07 |
jari |
284 |
); |
2 |
26 Feb 07 |
jari |
285 |
return geometry; |
2 |
26 Feb 07 |
jari |
286 |
} |
2 |
26 Feb 07 |
jari |
287 |
|
2 |
26 Feb 07 |
jari |
288 |
private GeometryArray createCubesGeometry() { |
2 |
26 Feb 07 |
jari |
289 |
GeometryArray geometry = new QuadArray(this.coords.length/3, |
2 |
26 Feb 07 |
jari |
290 |
GeometryArray.COORDINATES | |
2 |
26 Feb 07 |
jari |
291 |
GeometryArray.COLOR_3 | |
2 |
26 Feb 07 |
jari |
292 |
GeometryArray.NORMALS | |
2 |
26 Feb 07 |
jari |
293 |
GeometryArray.BY_REFERENCE |
2 |
26 Feb 07 |
jari |
294 |
); |
2 |
26 Feb 07 |
jari |
295 |
return geometry; |
2 |
26 Feb 07 |
jari |
296 |
} |
2 |
26 Feb 07 |
jari |
297 |
|
2 |
26 Feb 07 |
jari |
298 |
private GeometryArray createSpheresGeometry() { |
2 |
26 Feb 07 |
jari |
299 |
int[] stripVertexCounts = new int[spherestrips.length*this.shapeIndices.getSize()]; |
2 |
26 Feb 07 |
jari |
300 |
for (int i=0; i<stripVertexCounts.length; i+=spherestrips.length) |
2 |
26 Feb 07 |
jari |
301 |
for (int j=0; j<spherestrips.length; j++) |
2 |
26 Feb 07 |
jari |
302 |
stripVertexCounts[i+j] = spherestrips[j]; |
2 |
26 Feb 07 |
jari |
303 |
GeometryArray geometry = new TriangleStripArray(this.coords.length/3, |
2 |
26 Feb 07 |
jari |
304 |
GeometryArray.COORDINATES | |
2 |
26 Feb 07 |
jari |
305 |
GeometryArray.COLOR_3 | |
2 |
26 Feb 07 |
jari |
306 |
GeometryArray.NORMALS | |
2 |
26 Feb 07 |
jari |
307 |
GeometryArray.BY_REFERENCE, |
2 |
26 Feb 07 |
jari |
308 |
stripVertexCounts |
2 |
26 Feb 07 |
jari |
309 |
); |
2 |
26 Feb 07 |
jari |
310 |
return geometry; |
2 |
26 Feb 07 |
jari |
311 |
} |
2 |
26 Feb 07 |
jari |
312 |
|
2 |
26 Feb 07 |
jari |
313 |
private IntArray getShapeIndices() { |
2 |
26 Feb 07 |
jari |
314 |
IntArray indices = new IntArray(); |
2 |
26 Feb 07 |
jari |
315 |
float x, y; |
2 |
26 Feb 07 |
jari |
316 |
float scale = Math.max(this.end.x-this.start.x, this.end.y-this.start.y); |
2 |
26 Feb 07 |
jari |
317 |
for (int i=0; i<this.locations.length; i++) { |
2 |
26 Feb 07 |
jari |
318 |
x = this.locations[i][0]; |
2 |
26 Feb 07 |
jari |
319 |
y = this.locations[i][1]; |
2 |
26 Feb 07 |
jari |
320 |
if (x>=this.start.x && x<=this.start.x+scale && |
2 |
26 Feb 07 |
jari |
321 |
y>=this.start.y && y<=this.start.y+scale) |
2 |
26 Feb 07 |
jari |
322 |
indices.add(i); |
2 |
26 Feb 07 |
jari |
323 |
} |
2 |
26 Feb 07 |
jari |
324 |
return indices; |
2 |
26 Feb 07 |
jari |
325 |
} |
2 |
26 Feb 07 |
jari |
326 |
|
2 |
26 Feb 07 |
jari |
327 |
public void updateData(Geometry geometry) { |
2 |
26 Feb 07 |
jari |
328 |
initColors(); |
2 |
26 Feb 07 |
jari |
329 |
} |
2 |
26 Feb 07 |
jari |
330 |
|
2 |
26 Feb 07 |
jari |
331 |
private static int getVerticesNumber(int shapeType) { |
2 |
26 Feb 07 |
jari |
332 |
switch (shapeType) { |
2 |
26 Feb 07 |
jari |
333 |
case POINTS: |
2 |
26 Feb 07 |
jari |
334 |
return 1; |
2 |
26 Feb 07 |
jari |
335 |
case CUBES: |
2 |
26 Feb 07 |
jari |
336 |
return cubeverts.length/3; |
2 |
26 Feb 07 |
jari |
337 |
case SPHERES: |
2 |
26 Feb 07 |
jari |
338 |
return sphereverts.length/3; |
2 |
26 Feb 07 |
jari |
339 |
} |
2 |
26 Feb 07 |
jari |
340 |
return 0; |
2 |
26 Feb 07 |
jari |
341 |
} |
2 |
26 Feb 07 |
jari |
342 |
|
2 |
26 Feb 07 |
jari |
343 |
private static final float cubeverts[] = { |
2 |
26 Feb 07 |
jari |
344 |
1f, -1f, 1f, 1f, 1f, 1f, -1f, 1f, 1f, -1f, -1f, 1f, // front |
2 |
26 Feb 07 |
jari |
345 |
-1f, -1f, -1f, -1f, 1f, -1f, 1f, 1f, -1f, 1f, -1f, -1f, // back |
2 |
26 Feb 07 |
jari |
346 |
1f, -1f, -1f, 1f, 1f, -1f, 1f, 1f, 1f, 1f, -1f, 1f, // right |
2 |
26 Feb 07 |
jari |
347 |
-1f, -1f, 1f, -1f, 1f, 1f, -1f, 1f, -1f, -1f, -1f, -1f, // left |
2 |
26 Feb 07 |
jari |
348 |
1f, 1f, 1f, 1f, 1f, -1f, -1f, 1f, -1f, -1f, 1f, 1f, // upper |
2 |
26 Feb 07 |
jari |
349 |
-1f, -1f, 1f, -1f, -1f, -1f, 1f, -1f, -1f, 1f, -1f, 1f // bottom |
2 |
26 Feb 07 |
jari |
350 |
}; |
2 |
26 Feb 07 |
jari |
351 |
|
2 |
26 Feb 07 |
jari |
352 |
private static final float cubenormals[] = { |
2 |
26 Feb 07 |
jari |
353 |
0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // front |
2 |
26 Feb 07 |
jari |
354 |
0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, // back |
2 |
26 Feb 07 |
jari |
355 |
1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // right |
2 |
26 Feb 07 |
jari |
356 |
-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // left |
2 |
26 Feb 07 |
jari |
357 |
0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // upper |
2 |
26 Feb 07 |
jari |
358 |
0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0 // bottom |
2 |
26 Feb 07 |
jari |
359 |
}; |
2 |
26 Feb 07 |
jari |
360 |
|
2 |
26 Feb 07 |
jari |
361 |
private static final float sphereverts[]; |
2 |
26 Feb 07 |
jari |
362 |
private static final float spherenormals[]; |
2 |
26 Feb 07 |
jari |
363 |
private static final int spherestrips[]; |
2 |
26 Feb 07 |
jari |
364 |
|
2 |
26 Feb 07 |
jari |
365 |
static { |
2 |
26 Feb 07 |
jari |
366 |
Sphere sphere = new Sphere(1f, Primitive.GENERATE_NORMALS, 9); |
2 |
26 Feb 07 |
jari |
367 |
TriangleStripArray geometry = (TriangleStripArray)sphere.getShape().getGeometry(); |
2 |
26 Feb 07 |
jari |
368 |
int count = geometry.getVertexCount(); |
2 |
26 Feb 07 |
jari |
369 |
sphereverts = new float[count*3]; |
2 |
26 Feb 07 |
jari |
370 |
spherenormals = new float[count*3]; |
2 |
26 Feb 07 |
jari |
371 |
spherestrips = new int[geometry.getNumStrips()]; |
2 |
26 Feb 07 |
jari |
372 |
geometry.getCoordinates(0, sphereverts); |
2 |
26 Feb 07 |
jari |
373 |
geometry.getNormals(0, spherenormals); |
2 |
26 Feb 07 |
jari |
374 |
geometry.getStripVertexCounts(spherestrips); |
2 |
26 Feb 07 |
jari |
375 |
} |
2 |
26 Feb 07 |
jari |
376 |
} |