mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/terrain/GenesShape.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: GenesShape.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.3 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 20:33:21 $
2 26 Feb 07 jari 9  * $Author: braistedj $
2 26 Feb 07 jari 10  * $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 51     // 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 }