Hi Michael,
I try your test program, it throws exception at
java.lang.IllegalStateException: GeometryArray: must be in USE_NIO_BUFFER mode to
use this method
at javax.media.j3d.GeometryArray.getCoordRefBuffer(GeometryArray.java:4142)
at
net.monoid.j3d.animation.models.md3.MD3MeshDeformer.updateData(MD3MeshDeformer.java:81)
at
javax.media.j3d.GeometryArrayRetained.updateData(GeometryArrayRetained.java:5305)
at javax.media.j3d.GeometryArray.updateData(GeometryArray.java:677)
at
net.monoid.j3d.animation.models.md3.MD3MeshDeformer.setFrame(MD3MeshDeformer.java:53)
at net.monoid.j3d.animation.models.md3.MD3Model.setFrame(MD3Model.java:261)
at net.monoid.j3d.animation.models.md3.q3a.Q3AModel.linkAll(Q3AModel.java:107)
at net.monoid.j3d.animation.models.md3.q3a.Q3AModelIO.load(Q3AModelIO.java:83)
at
net.monoid.j3d.animation.models.md3.q3a.Q3AModelFactory.createModel(Q3AModelFactory.java:36)
at
net.monoid.j3d.animation.player.SceneController.addModel(SceneController.java:44)
at net.monoid.j3d.animation.player.PlayerIO.parseScriptLine(PlayerIO.java:98)
at net.monoid.j3d.animation.player.PlayerIO.readScriptFile(PlayerIO.java:64)
at
net.monoid.j3d.animation.player.SceneController.playScript(SceneController.java:39)
at app.App2.createSceneGraph(App2.java:242)
at app.App2.<init>(App2.java:109)
at Main.main(Main.java:7)
when trying to updateData()
That's why nothing is shown.It may because other GeometryArray pass in
is not construct using NIO_BUFFER. If I comment out the call I see
the model shown correctly on the screen (but not move since updateData
is comment out).
Please fix the application.
Thanks.
- Kelvin
----------------
Java 3D Team
Sun Microsystems Inc.
>Delivered-To: [EMAIL PROTECTED]
>MIME-Version: 1.0
>Content-Transfer-Encoding: 8BIT
>X-Sender: [EMAIL PROTECTED]
>Date: Tue, 27 Nov 2001 01:29:39 +0100
>From: Michael Nischt <[EMAIL PROTECTED]>
>Subject: [JAVA3D] J3DBuffers - how to use them correctly ? - part 2
>To: [EMAIL PROTECTED]
>
>again :o(
>
>I changed my code parts for using J3DBuffer's, but again I got a problem.
>I have compared my code with the 'GeometryByReferenceNIOBuffer' Example and I
>can't figure out any differences in principle..
>
>code bellow works fine with useBuffers false, but setting it to true nothing is
>rendered.. i played it bit with the code and noticed that
>geomArray.getCoordRefBuffer() returns a null-reference.. but before setting
>J3DBuffer everything is fine..
>
>any ideas what I have done wrong ?
>(also removed USE_COORD_INDEX_ONLY and set all indices, but didn't change
>anything..)
>
>greetings
> -Michael Nischt
>
>CODE:
>------------------------------------
> boolean useBuffers = false;
> if(useBuffers)
> vertexFormat = GeometryArray.BY_REFERENCE |
>GeometryArray.USE_NIO_BUFFER | GeometryArray.USE_COORD_INDEX_ONLY |
>GeometryArray.COORDINATES | GeometryArray.NORMALS |
>GeometryArray.TEXTURE_COORDINATE_2;
> else
> vertexFormat = GeometryArray.BY_REFERENCE |
>GeometryArray.USE_COORD_INDEX_ONLY | GeometryArray.COORDINATES |
>GeometryArray.NORMALS | GeometryArray.TEXTURE_COORDINATE_2;
> IndexedTriangleArray geomArray = new IndexedTriangleArray(numVertices,
>vertexFormat, texCoordSetCount, texCoordSetMap , numIndices);
>
> geomArray.setCapability(GeometryArray.ALLOW_REF_DATA_READ);
> geomArray.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
>
> float[] coords = mesh.getCoords(0);
> float[] normals = mesh.getNormals(0);
>
> ByteOrder order = ByteOrder.nativeOrder();
>
> if(useBuffers) {
>
> FloatBuffer coordBuffer = ByteBuffer.allocateDirect(coords.length *
>4).order(order).asFloatBuffer();
> FloatBuffer normalBuffer = ByteBuffer.allocateDirect(normals.length
>* 4).order(order).asFloatBuffer();
>
> coordBuffer.put(coords, 0, coords.length);
> normalBuffer.put(normals, 0, normals.length);
>
>
> geomArray.setColorRefBuffer(new J3DBuffer(coordBuffer));
> geomArray.setNormalRefBuffer(new J3DBuffer(normalBuffer));
> }
> else {
> geomArray.setCoordRefFloat(coords);
> geomArray.setNormalRefFloat(normals);
> }
>
> geomArray.setCoordinateIndices(0, mesh.getIndices());
> //geomArray.setNormalIndices(0, mesh.getIndices());
>
> TextureUnitState[] texUnits = new TextureUnitState[texCoordSetCount];
>
> Appearance ap = new Appearance();
> ap.setMaterial(DEFAULT_MATERIAL);
> ap.setPolygonAttributes(DEFAULT_POLYGON_ATTRIBUTES);
> ap.setTextureUnitState(texUnits);
>
>
> for(int i=0; i<texCoordSetCount; i++) {
> float[] texCoords = mesh.getTexCoords();
> if(useBuffers) {
> FloatBuffer texCoordBuffer =
>ByteBuffer.allocateDirect(texCoords.length * 4).order(order).asFloatBuffer();
> texCoordBuffer.put(texCoords, 0, texCoords.length);
> geomArray.setTexCoordRefBuffer(i, new
>J3DBuffer(texCoordBuffer));
> }
> else
> geomArray.setTexCoordRefFloat(i, texCoords);
>
>
> //geomArray.setTextureCoordinateIndices(i, 0, mesh.getIndices());
> TextureUnitState texUnit = new TextureUnitState();
> texUnit.setTexture(mesh.getTexture(i));
> ap.setTextureUnitState(i, texUnit);
> }
>
>
> shape.setAppearance(ap);
> shape.setGeometry(geomArray);
>
> this.getNode().addChild(shape);
>------------------------------------
>
>===========================================================================
>To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>of the message "signoff JAVA3D-INTEREST". For general help, send email to
>[EMAIL PROTECTED] and include in the body of the message "help".
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".