📄 geometrybyreferencetest.java
字号:
String updateComp[] = { "None","Geometry", "Color"}; transparency = new JCheckBox("EnableTransparency", false); transparency.addActionListener(this); panel.add(transparency); updates = new JComboBox(updateComp); updates.setLightWeightPopupEnabled(false); updates.addActionListener(this); updates.setSelectedIndex(0); panel.add(new JLabel("UpdateData")); panel.add(updates); return panel; } public GeometryByReferenceTest() { } public void init() { Container contentPane = getContentPane(); Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); contentPane.add("Center", c); BranchGroup scene = createSceneGraph(); // SimpleUniverse is a Convenience Utility class u = new SimpleUniverse(c); // add mouse behaviors to the viewingPlatform ViewingPlatform viewingPlatform = u.getViewingPlatform(); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. viewingPlatform.setNominalViewingTransform(); u.addBranchGraph(scene); // add Orbit behavior to the ViewingPlatform OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); orbit.setSchedulingBounds(bounds); viewingPlatform.setViewPlatformBehavior(orbit); // Create GUI JPanel p = new JPanel(); BoxLayout boxlayout = new BoxLayout(p, BoxLayout.Y_AXIS); p.add(createGeometryByReferencePanel()); p.add(createUpdatePanel()); p.setLayout(boxlayout); contentPane.add("South", p); } public void destroy() { u.cleanup(); } public void actionPerformed(ActionEvent e) { Object target = e.getSource(); GeometryArray geo; boolean setColor = false, setVertex = false; if (target == geomType) { geo = geoArrays[geomType.getSelectedIndex()]; // Set everything to null, and set it later .. geo.setColorRefFloat(null); geo.setColorRef3f(null); geo.setCoordRefFloat(null); geo.setCoordRef3f(null); shape.setGeometry(geoArrays[geomType.getSelectedIndex()]); setColor = true; setVertex= true; } else if (target == transparency) { if (transparency.isSelected()) { transp.setTransparencyMode(TransparencyAttributes.BLENDED); } else { transp.setTransparencyMode(TransparencyAttributes.NONE); } } else if (target == updates) { updateIndex = updates.getSelectedIndex(); if (updateIndex == 1) { System.out.println("Doing coordinate update"); ((GeometryArray)(shape.getGeometry())).updateData(this); } else if (updateIndex == 2) { System.out.println("Doing color update"); ((GeometryArray)(shape.getGeometry())).updateData(this); } } else if (target == vertexType) { geo = ((GeometryArray)shape.getGeometry()); if (vertexIndex == 0) { geo.setCoordRefFloat(null); } else if (vertexIndex == 1) { geo.setCoordRef3f(null); } vertexIndex = vertexType.getSelectedIndex(); setVertex = true; } else if (target == colorType) { geo = (GeometryArray) shape.getGeometry(); if (colorIndex == 0) { geo.setColorRefFloat(null); } else if (colorIndex == 1) { geo.setColorRef3f(null); } colorIndex = colorType.getSelectedIndex(); setColor = true; } if (setVertex) { geo = (GeometryArray) shape.getGeometry(); if (vertexIndex == 0) { if (geo instanceof IndexedGeometryArray) geo.setCoordRefFloat(indexedFloatVerts); else geo.setCoordRefFloat(floatVerts); } else if (vertexIndex == 1) { if (geo instanceof IndexedGeometryArray) geo.setCoordRef3f(indexedP3fVerts); else geo.setCoordRef3f(p3fVerts); } } if (setColor) { geo = (GeometryArray) shape.getGeometry(); if (colorIndex == 0) { if (geo instanceof IndexedGeometryArray) geo.setColorRefFloat(indexedFloatClrs); else geo.setColorRefFloat(floatClrs); } else if (colorIndex == 1) { if (geo instanceof IndexedGeometryArray) geo.setColorRef3f(indexedC3fClrs); else geo.setColorRef3f(c3fClrs); } } } public static void main(String[] args) { Frame frame = new MainFrame(new GeometryByReferenceTest(), 800, 800); } public GeometryArray createGeometry (int type) { GeometryArray tetra = null; if (type == 1) { tetra =new TriangleArray(12, TriangleArray.COORDINATES| TriangleArray.COLOR_3| TriangleArray.BY_REFERENCE); tetra.setCoordRefFloat(floatVerts); tetra.setColorRefFloat(floatClrs); } else if (type == 2) { tetra = new TriangleStripArray(12, TriangleStripArray.COORDINATES| TriangleStripArray.COLOR_3| TriangleStripArray.BY_REFERENCE, stripVertexCounts); tetra.setCoordRefFloat(floatVerts); tetra.setColorRefFloat(floatClrs); } else if (type == 3) { // Indexed Geometry tetra = new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES| IndexedTriangleArray.COLOR_3| IndexedTriangleArray.BY_REFERENCE, 12); tetra.setCoordRefFloat(indexedFloatVerts); tetra.setColorRefFloat(indexedFloatClrs); ((IndexedTriangleArray)tetra).setCoordinateIndices(0, indices); ((IndexedTriangleArray)tetra).setColorIndices(0, indices); } else if (type == 4) { // Indexed strip geometry tetra = new IndexedTriangleStripArray(4, IndexedTriangleStripArray.COORDINATES| IndexedTriangleStripArray.COLOR_3| IndexedTriangleStripArray.BY_REFERENCE, 12, stripVertexCounts); tetra.setCoordRefFloat(indexedFloatVerts); tetra.setColorRefFloat(indexedFloatClrs); ((IndexedTriangleStripArray)tetra).setCoordinateIndices(0, indices); ((IndexedTriangleStripArray)tetra).setColorIndices(0, indices); } if (tetra != null) tetra.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE); return tetra; } public void updateData(Geometry geometry) { int i; float val; if (updateIndex == 1) { // geometry // Translate the geometry by a small amount in x vertexCount++; if ((vertexCount &1) == 1) val = 0.2f; else val = -0.2f; if (vertexIndex == 0) { // Do Indexed geometry for (i = 0; i < indexedFloatVerts.length; i+=3) { indexedFloatVerts[i] += val; } // Do non-indexed float geometry for (i = 0; i < floatVerts.length; i+=3) { floatVerts[i] += val; } } else { // If p3f do each point only once for (i = 0; i < indexedP3fVerts.length; i++) { indexedP3fVerts[i].x += val; } } } else if (updateIndex == 2) { // colors colorCount++; if ((colorCount & 1) == 1) val = 0.4f; else val = -0.4f; if (colorIndex == 0) { // Do Indexed geometry for (i = 0; i < indexedFloatClrs.length; i+=3) { indexedFloatClrs[i] += val; } // Do non-indexed float geometry for (i = 0; i < floatClrs.length; i+=3) { floatClrs[i] += val; } } else { // If c3f do each point only once for (i = 0; i < indexedC3fClrs.length; i++) { indexedC3fClrs[i].x += val; } } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -