📄 geometrybyreferenceniobuffer.java
字号:
panel.setBorder(new TitledBorder("Geometry Type")); String values[] = {"Array", "Strip", "Indexed", "IndexedStrip"}; geomType = new JComboBox(values); geomType.setLightWeightPopupEnabled(false); geomType.addActionListener(this); geomType.setSelectedIndex(0); panel.add(new JLabel("Geometry Type")); panel.add(geomType); return panel; } JPanel createUpdatePanel() { JPanel panel = new JPanel(); panel.setBorder(new TitledBorder("Other Attributes")); 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 GeometryByReferenceNIOBuffer() { } 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.setColorRefBuffer(null); geo.setCoordRefBuffer(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); } } if (setVertex) { geo = (GeometryArray) shape.getGeometry(); if (geo instanceof IndexedGeometryArray) geo.setCoordRefBuffer(indexedFloatBufferCoord); else geo.setCoordRefBuffer(floatBufferCoord); } if (setColor) { geo = (GeometryArray) shape.getGeometry(); if (geo instanceof IndexedGeometryArray) geo.setColorRefBuffer(indexedFloatBufferColor); else geo.setColorRefBuffer(floatBufferColor); } } public static void main(String[] args) { Frame frame = new MainFrame(new GeometryByReferenceNIOBuffer(), 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| TriangleArray.USE_NIO_BUFFER); tetra.setCoordRefBuffer(floatBufferCoord); tetra.setColorRefBuffer(floatBufferColor); } else if (type == 2) { tetra = new TriangleStripArray(12, TriangleStripArray.COORDINATES| TriangleStripArray.COLOR_3| TriangleStripArray.BY_REFERENCE| TriangleStripArray.USE_NIO_BUFFER, stripVertexCounts); tetra.setCoordRefBuffer(floatBufferCoord); tetra.setColorRefBuffer(floatBufferColor); } else if (type == 3) { // Indexed Geometry tetra = new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES| IndexedTriangleArray.COLOR_3| IndexedTriangleArray.BY_REFERENCE| IndexedTriangleArray.USE_NIO_BUFFER, //IndexedTriangleStripArray.USE_COORD_INDEX_ONLY, 12); tetra.setCoordRefBuffer(indexedFloatBufferCoord); tetra.setColorRefBuffer(indexedFloatBufferColor); ((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| IndexedTriangleStripArray.USE_NIO_BUFFER| IndexedTriangleStripArray.USE_COORD_INDEX_ONLY, 12, stripVertexCounts); tetra.setCoordRefBuffer(indexedFloatBufferCoord); tetra.setColorRefBuffer(indexedFloatBufferColor); ((IndexedTriangleStripArray)tetra).setCoordinateIndices(0, indices); /* // Do not set color indices in UCIO mode ((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; float val1; 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; FloatBuffer indexedCoord = (FloatBuffer)indexedFloatBufferCoord.getBuffer(); indexedCoord.rewind(); FloatBuffer coord = (FloatBuffer)floatBufferCoord.getBuffer(); coord.rewind(); if (vertexIndex == 0) { // Do Indexed geometry for (i = 0; i < indexedCoord.limit(); i+=3) { val1 = indexedCoord.get(i); indexedCoord.put(i, val1 + val); } // Do non-indexed float geometry for (i = 0; i < coord.limit(); i+=3) { val1 = coord.get(i); coord.put(i, val1 + val); } } } else if (updateIndex == 2) { // colors colorCount++; if ((colorCount & 1) == 1) val = 0.4f; else val = -0.4f; FloatBuffer indexedColors = (FloatBuffer)indexedFloatBufferColor.getBuffer(); indexedColors.rewind(); FloatBuffer colors = (FloatBuffer)floatBufferColor.getBuffer(); colors.rewind(); if (colorIndex == 0) { // Do Indexed geometry for (i = 0; i < indexedColors.limit(); i+=3) { indexedColors.put(i, indexedColors.get(i) + val); } // Do non-indexed float geometry for (i = 0; i < colors.limit(); i+=3) { colors.put(i, colors.get(i) + val); } } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -