📄 geometrybyreferenceniobuffer.java
字号:
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);
((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 + -