diff options
Diffstat (limited to 'src/native/ogl/GeometryArrayRetained.c')
-rw-r--r-- | src/native/ogl/GeometryArrayRetained.c | 4162 |
1 files changed, 0 insertions, 4162 deletions
diff --git a/src/native/ogl/GeometryArrayRetained.c b/src/native/ogl/GeometryArrayRetained.c deleted file mode 100644 index b8e89be..0000000 --- a/src/native/ogl/GeometryArrayRetained.c +++ /dev/null @@ -1,4162 +0,0 @@ -/* - * $RCSfile$ - * - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - * $Revision$ - * $Date$ - * $State$ - */ - -#include <stdio.h> -#include <jni.h> - -#include "gldefs.h" - -#ifdef WIN32 -#include <wingdi.h> - -#endif /* WIN32 */ - -#ifdef DEBUG -/* Uncomment the following for VERBOSE debug messages */ -/* #define VERBOSE */ -#endif /* DEBUG */ - - -static float EPS = 0.0001f; - -#define INTERLEAVEDARRAYS_TEST() \ - useInterleavedArrays = 1; \ - switch (vformat) { \ - case GA_COORDINATES : \ - iaFormat = GL_V3F; break; \ - case (GA_COORDINATES | GA_NORMALS) : \ - iaFormat = GL_N3F_V3F; break; \ - case (GA_COORDINATES | GA_TEXTURE_COORDINATE_2) :\ - iaFormat = GL_T2F_V3F; break; \ - case (GA_COORDINATES | GA_NORMALS | GA_COLOR) : \ - case (GA_COORDINATES | GA_NORMALS | GA_COLOR | GA_WITH_ALPHA) :\ - iaFormat = GL_C4F_N3F_V3F; break; \ - case (GA_COORDINATES | GA_NORMALS | GA_TEXTURE_COORDINATE_2) :\ - iaFormat = GL_T2F_N3F_V3F; break; \ - case (GA_COORDINATES | GA_NORMALS | GA_COLOR | GA_TEXTURE_COORDINATE_2):\ - case (GA_COORDINATES | GA_NORMALS | GA_COLOR | GA_WITH_ALPHA | GA_TEXTURE_COORDINATE_2):\ - iaFormat = GL_T2F_C4F_N3F_V3F; break;\ - default: \ - useInterleavedArrays = 0; break; \ - } - - -static void enableTexCoordPointer(GraphicsContextPropertiesInfo *, int, int, - int, int, void *); -static void disableTexCoordPointer(GraphicsContextPropertiesInfo *, int); -static void clientActiveTextureUnit(GraphicsContextPropertiesInfo *, int); - - -static void -executeTexture(int texCoordSetMapLen, - int texSize, int bstride, int texCoordoff, - jint texCoordSetMapOffset[], - jint numActiveTexUnit, - float verts[], jlong ctxInfo) -{ - int i; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - int tus; /* texture unit state index */ - - for (i = 0; i < numActiveTexUnit; i++) { - - tus = i; - - /* - * it's possible that texture unit state index (tus) - * is greater than the texCoordSetMapOffsetLen, in this - * case, just disable TexCoordPointer. - */ - if ((tus < texCoordSetMapLen) && - (texCoordSetMapOffset[tus] != -1)) { - enableTexCoordPointer(ctxProperties, i, - texSize, GL_FLOAT, bstride, - &(verts[texCoordoff + texCoordSetMapOffset[tus]])); - - } else { - disableTexCoordPointer(ctxProperties, i); - } - } -} - -static void -resetTexture(jlong ctxInfo) -{ - int i; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - - /* Disable texture coordinate arrays for all texture units */ - for (i = 0; i < ctxProperties->maxTexCoordSets; i++) { - disableTexCoordPointer(ctxProperties, i); - } - /* Reset client active texture unit to 0 */ - clientActiveTextureUnit(ctxProperties, 0); -} - - -static void -resetVertexAttrs(jlong ctxInfo, int vertexAttrCount) -{ - int i; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - - /* Disable specified vertex attr arrays */ - for (i = 0; i < vertexAttrCount; i++) { - ctxProperties->disableVertexAttrArray(ctxProperties, i); - } -} - - -/* - * glLockArrays() is invoked only for indexed geometry, and the - * vertexCount is guarenteed to be >= 0. - */ -static void -lockArray(GraphicsContextPropertiesInfo *ctxProperties, - int vertexCount) { - - if (ctxProperties->compiled_vertex_array_ext) { - ctxProperties->glLockArraysEXT(0, vertexCount); - } -} - -static void -unlockArray(GraphicsContextPropertiesInfo *ctxProperties) -{ - if (ctxProperties->compiled_vertex_array_ext) { - ctxProperties->glUnlockArraysEXT(); - } -} - - -static void -executeGeometryArray( - JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMap, jint texCoordSetMapLen, - jintArray texUnitOffset, - jint numActiveTexUnit, - jint vertexAttrCount, jintArray vertexAttrSizes, - jfloatArray varray, jobject varrayBuffer, jfloatArray carray, - jint cDirty) -{ - jclass geo_class; - JNIEnv table; - - jfloat *verts, *startVertex, *clrs, *startClrs; - jint i; - jint bstride, cbstride; - jsize strip_len; - GLsizei *strips; - GLenum iaFormat; - int useInterleavedArrays; - int primType; - jint stride, coordoff, normoff, coloroff, texCoordoff; - int alphaNeedsUpdate = 0; /* used so we can get alpha data from */ - /* JNI before using it so we can use */ - /* GetPrimitiveArrayCritical */ - jfieldID strip_field; - jarray sarray; - - jint texSize, texStride, *texCoordSetMapOffset = NULL; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - - jarray start_array; - jfieldID start_field; - GLint *start; - int cstride = 0; - int vAttrStride = 0; - int vAttrOff; - jint *vAttrSizesPtr = NULL; - table = *env; - - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - /* This matches the code in GeometryArrayRetained.java */ - stride = coordoff = normoff = coloroff = texCoordoff = 0; - vAttrOff = 0; - if ((vformat & GA_COORDINATES) != 0) { - stride += 3; - } - if ((vformat & GA_NORMALS) != 0) { - stride += 3; - coordoff += 3; - } - if ((vformat & GA_COLOR) != 0) { - if ((vformat & GA_WITH_ALPHA) != 0 ) { - stride += 4; - normoff += 4; - coordoff += 4; - } - else { /* Handle the case of executeInterleaved 3f */ - stride += 3; - normoff += 3; - coordoff += 3; - } - } - if ((vformat & GA_TEXTURE_COORDINATE) != 0) { - if ((vformat & GA_TEXTURE_COORDINATE_2) != 0) { - texSize = 2; - texStride = 2 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - texSize = 3; - texStride = 3 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_4) != 0) { - texSize = 4; - texStride = 4 * texCoordSetCount; - } - stride += texStride; - normoff += texStride; - coloroff += texStride; - coordoff += texStride; - } - - if ((vformat & GA_VERTEX_ATTRIBUTES) != 0) { - if (vertexAttrSizes != NULL) { - vAttrSizesPtr = table->GetIntArrayElements(env, vertexAttrSizes, NULL); - } - for (i = 0; i < vertexAttrCount; i++) { - vAttrStride += vAttrSizesPtr[i]; - } - stride += vAttrStride; - normoff += vAttrStride; - coloroff += vAttrStride; - coordoff += vAttrStride; - texCoordoff += vAttrStride; - } - - bstride = stride*sizeof(float); - - /* - * Call other JNI functions before entering Critical region - * i.e., GetPrimitiveArrayCritical - */ - - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripVertexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - - - start_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripStartOffsetIndices", "[I"); - start_array = (jarray)(*(table->GetObjectField))(env, geo, - start_field); - } - - /* begin critical region */ - verts = NULL; - if(varray != NULL) { - verts = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, varray, NULL); - } - else if(varrayBuffer != NULL) { - verts = (jfloat *) (*(table->GetDirectBufferAddress))(env, varrayBuffer ); - } - if (verts == NULL) { - /* This should never happen */ - fprintf(stderr, "JAVA 3D ERROR : unable to get vertex pointer\n"); - if (vAttrSizesPtr != NULL) { - table->ReleaseIntArrayElements(env, vertexAttrSizes, vAttrSizesPtr, JNI_ABORT); - } - return; - } - - /* using byRef interleaved array and has a separate pointer, then .. */ - cstride = stride; - if (carray != NULL) { - clrs = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, carray, NULL); - cstride = 4; - - } - else { - clrs = &(verts[coloroff]); - } - - - cbstride = cstride * sizeof(float); - if (texCoordSetMapLen >0) { - texCoordSetMapOffset = (jint *) (*(table->GetPrimitiveArrayCritical))(env, texUnitOffset, NULL); - } - - /* Enable normalize for non-uniform scale (which rescale can't handle) */ - if (isNonUniformScale) { - glEnable(GL_NORMALIZE); - } - - - startVertex = verts + (stride * startVIndex); - startClrs = clrs + (cstride * startVIndex); - - /*** Handle non-indexed strip GeometryArray first *******/ - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - - strips = (GLsizei *) (*(table->GetPrimitiveArrayCritical))(env, sarray, - NULL); - - if ((ignoreVertexColors == JNI_TRUE) || (carray != NULL) || - ((vformat & GA_TEXTURE_COORDINATE) && ((texCoordSetMapLen > 1) || - (texCoordSetCount > 1)))) { - useInterleavedArrays = 0; - } else { - INTERLEAVEDARRAYS_TEST() - } - if (useInterleavedArrays) { - glInterleavedArrays(iaFormat, bstride, startVertex); - } else { - if (vformat & GA_NORMALS) { - glNormalPointer(GL_FLOAT, bstride, &(startVertex[normoff])); - } - if (ignoreVertexColors == JNI_FALSE && vformat & GA_COLOR) { - if (vformat & GA_WITH_ALPHA || (useAlpha == GL_TRUE)) { - glColorPointer(4, GL_FLOAT, cbstride, startClrs); - } else { - /* - for (i = 0; i < vcount; i++) { - fprintf(stderr, "r = %f, g = %f, b = %f\n", verts[i*bstride +coloroff], verts[i*bstride +coloroff+1],verts[i*bstride +coloroff+2]); - } - */ - glColorPointer(3, GL_FLOAT, cbstride, startClrs); - } - } - if (vformat & GA_COORDINATES) { - /* - for (i = 0; i < vcount; i++) { - fprintf(stderr, "x = %f, y = %f, z = %f\n", verts[i*bstride +coordoff], verts[i*bstride +coordoff+1],verts[i*bstride +coordoff+2]); - } - */ - glVertexPointer(3, GL_FLOAT, bstride, &(startVertex[coordoff])); - } - - if (vformat & GA_TEXTURE_COORDINATE) { - - executeTexture(texCoordSetMapLen, - texSize, bstride, texCoordoff, - texCoordSetMapOffset, - numActiveTexUnit, - startVertex, ctxInfo); - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - jfloat *vAttrPtr = &startVertex[vAttrOff]; - - for (i = 0; i < vertexAttrCount; i++) { - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, vAttrSizesPtr[i], - GL_FLOAT, bstride, vAttrPtr); - vAttrPtr += vAttrSizesPtr[i]; - } - } - } - - switch (geo_type) { - case GEO_TYPE_TRI_STRIP_SET : - primType = GL_TRIANGLE_STRIP; - break; - case GEO_TYPE_TRI_FAN_SET : - primType = GL_TRIANGLE_FAN; - break; - case GEO_TYPE_LINE_STRIP_SET : - primType = GL_LINE_STRIP; - break; - } - /* - fprintf(stderr, "strip_len = %d\n",strip_len); - for (i=0; i < strip_len;i++) { - fprintf(stderr, "strips[i] = %d\n",strips[i]); - } - */ - - - start = (GLint *)(*(table->GetPrimitiveArrayCritical))(env, - start_array, NULL); - - if (ctxProperties->multi_draw_arrays_ext || ctxProperties->multi_draw_arrays_sun) { - /* - * Only used in the "by_copy case, so its ok to - * to temporarily modify - */ - - ctxProperties->glMultiDrawArraysEXT(primType, start, strips, strip_len); - } else { - for (i=0; i < strip_len;i++) { - glDrawArrays(primType, start[i], strips[i]); - } - } - (*(table->ReleasePrimitiveArrayCritical))(env, start_array, start, - 0); - (*(table->ReleasePrimitiveArrayCritical))(env, sarray, strips, 0); - } - /******* Handle non-indexed non-striped GeometryArray now *****/ - else if ((geo_type == GEO_TYPE_QUAD_SET) || - (geo_type == GEO_TYPE_TRI_SET) || - (geo_type == GEO_TYPE_POINT_SET) || - (geo_type == GEO_TYPE_LINE_SET)) - { - - - if ((ignoreVertexColors == JNI_TRUE) || (carray != NULL) || - ((vformat & GA_TEXTURE_COORDINATE) && ((texCoordSetMapLen > 1) || - (texCoordSetCount > 1)))) { - useInterleavedArrays = 0; - } else { - INTERLEAVEDARRAYS_TEST() - } - - if (useInterleavedArrays) { - glInterleavedArrays(iaFormat, bstride, startVertex); - } else { - if (vformat & GA_NORMALS) { - glNormalPointer(GL_FLOAT, bstride, &(startVertex[normoff])); - } - if (ignoreVertexColors == JNI_FALSE && vformat & GA_COLOR) { - if (vformat & GA_WITH_ALPHA || (useAlpha == GL_TRUE)) { - - glColorPointer(4, GL_FLOAT, cbstride, startClrs); - } else { - glColorPointer(3, GL_FLOAT, cbstride, startClrs); - } - } - if (vformat & GA_COORDINATES) { - glVertexPointer(3, GL_FLOAT, bstride, &(startVertex[coordoff])); - } - - if (vformat & GA_TEXTURE_COORDINATE) { - - executeTexture(texCoordSetMapLen, - texSize, bstride, texCoordoff, - texCoordSetMapOffset, - numActiveTexUnit, - startVertex, ctxInfo); - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - jfloat *vAttrPtr = &startVertex[vAttrOff]; - - for (i = 0; i < vertexAttrCount; i++) { - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, vAttrSizesPtr[i], - GL_FLOAT, bstride, vAttrPtr); - vAttrPtr += vAttrSizesPtr[i]; - } - } - } - switch (geo_type){ - case GEO_TYPE_QUAD_SET : glDrawArrays(GL_QUADS, 0, vcount);break; - case GEO_TYPE_TRI_SET : glDrawArrays(GL_TRIANGLES, 0, vcount);break; - case GEO_TYPE_POINT_SET : glDrawArrays(GL_POINTS, 0, vcount);break; - case GEO_TYPE_LINE_SET: glDrawArrays(GL_LINES, 0, vcount);break; - } - } - /* clean up if we turned on normalize */ - - if (isNonUniformScale) { - glDisable(GL_NORMALIZE); - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - resetVertexAttrs(ctxInfo, vertexAttrCount); - } - - if (vformat & GA_TEXTURE_COORDINATE) { - resetTexture(ctxInfo); - } - - if (carray != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, carray, clrs, 0); - - if (texCoordSetMapLen > 0) - (*(table->ReleasePrimitiveArrayCritical))(env, texUnitOffset, - texCoordSetMapOffset, 0); - - if(varray != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, varray, verts, 0); - - if (vAttrSizesPtr != NULL) { - table->ReleaseIntArrayElements(env, vertexAttrSizes, vAttrSizesPtr, JNI_ABORT); - } -} - - -/* - * Class: javax_media_j3d_NativePipeline - * Method: execute - * Signature: (JLjavax/media/j3d/GeometryArrayRetained;IZZZZIIII[II[II[II[I[F[FII)V - */ -JNIEXPORT void JNICALL -Java_javax_media_j3d_NativePipeline_execute(JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMap, jint texCoordSetMapLen, - jintArray texUnitOffset, - jint numActiveTexUnit, - jint vertexAttrCount, jintArray vertexAttrSizes, - jfloatArray varray, jfloatArray carray, - jint cDirty) -{ - -#ifdef VERBOSE - fprintf(stderr, "GeometryArrayRetained.execute() -- calling executeGeometryArray\n"); -#endif /* VERBOSE */ - - /* call executeGeometryArray */ - executeGeometryArray(env, obj, ctxInfo, geo, geo_type, isNonUniformScale, useAlpha, - ignoreVertexColors, startVIndex, vcount, vformat, - texCoordSetCount, texCoordSetMap, texCoordSetMapLen, - texUnitOffset, numActiveTexUnit, - vertexAttrCount, vertexAttrSizes, - varray, NULL, carray, cDirty); - -} - -/* interleaved data with nio buffer as data format */ -JNIEXPORT void JNICALL -Java_javax_media_j3d_NativePipeline_executeInterleavedBuffer( - JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMap, jint texCoordSetMapLen, - jintArray texUnitOffset, - jint numActiveTexUnit, - jobject varray, jfloatArray carray, - jint cDirty) -{ - -#ifdef VERBOSE - fprintf(stderr, "GeometryArrayRetained.executeInterleavedBuffer() -- calling executeGeometryArray\n"); -#endif /* VERBOSE */ - - /* call executeGeometryArray */ - executeGeometryArray(env, obj, ctxInfo, geo, geo_type, isNonUniformScale, useAlpha, - ignoreVertexColors, startVIndex, vcount, vformat, - texCoordSetCount, texCoordSetMap, texCoordSetMapLen, - texUnitOffset, numActiveTexUnit, - 0, NULL, - NULL, varray, carray, cDirty); - -} - - -/* - * Class: javax_media_j3d_NativePipeline - * Method: buildGA - * Signature: (JLjavax/media/j3d/GeometryArrayRetained;IZZFZIIII[II[II[I[D[D[F)V - */ -JNIEXPORT - void JNICALL Java_javax_media_j3d_NativePipeline_buildGA(JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, - jint geo_type, - jboolean isNonUniformScale, jboolean updateAlpha, float alpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordSetMapLen, - jintArray texUnitOffset, - jint vertexAttrCount, jintArray vertexAttrSizes, - jdoubleArray xform, jdoubleArray nxform, - jfloatArray varray) -{ - jclass geo_class; - JNIEnv table; - jboolean useAlpha = JNI_FALSE; - - jfloat *verts; - jint i, j; - jint bstride; - jint texStride, *texCoordSetMapOffset; - int vAttrStride = 0; - int vAttrOff; - jint *vAttrSizesPtr = NULL; - GLsizei *strips; - jfloat vertex[3]; - jfloat normal[3]; - jfloat w, winv; - - jsize strip_len; - int primType; - jint stride, coordoff, normoff, coloroff, texCoordoff; - jfieldID strip_field; - jarray sarray; - jint initialOffset = 0; - jint saveVformat = 0; - float color[4]; - jdouble *xform_ptr = NULL; - jdouble *nxform_ptr = NULL; - - jint k; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - -#ifdef VERBOSE - fprintf(stderr, "GeometryArrayRetained.buildGA()\n"); -#endif /* VERBOSE */ - - table = *env; - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - /* This matches the code in GeometryArrayRetained.java */ - stride = coordoff = normoff = coloroff = texCoordoff = 0; - vAttrOff = 0; - if ((vformat & GA_COORDINATES) != 0) { - stride += 3; - } - if ((vformat & GA_NORMALS) != 0) { - stride += 3; - coordoff += 3; - } - - if ((vformat & GA_COLOR) != 0) { - if ((vformat & GA_BY_REFERENCE) != 0) { - if (vformat & GA_WITH_ALPHA) { - stride += 4; - normoff += 4; - coordoff += 4; - } - else { - stride += 3; - normoff += 3; - coordoff += 3; - } - } - else { - stride += 4; - normoff += 4; - coordoff += 4; - } - } - - if ((vformat & GA_TEXTURE_COORDINATE) != 0) { - if ((vformat & GA_TEXTURE_COORDINATE_2) != 0) { - texStride = 2 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - texStride = 3 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_4) != 0) { - texStride = 4 * texCoordSetCount; - } - stride += texStride; - normoff += texStride; - coloroff += texStride; - coordoff += texStride; - } - - if ((vformat & GA_VERTEX_ATTRIBUTES) != 0) { - if (vertexAttrSizes != NULL) { - vAttrSizesPtr = table->GetIntArrayElements(env, vertexAttrSizes, NULL); - } - for (i = 0; i < vertexAttrCount; i++) { - vAttrStride += vAttrSizesPtr[i]; - } - stride += vAttrStride; - normoff += vAttrStride; - coloroff += vAttrStride; - coordoff += vAttrStride; - texCoordoff += vAttrStride; - } - - bstride = stride*sizeof(float); - /* Start send down from the startVIndex */ - initialOffset = startVIndex * stride; - normoff += initialOffset; - coloroff += initialOffset; - coordoff += initialOffset; - texCoordoff += initialOffset; - vAttrOff += initialOffset; - - /* - * process alpha for geometryArray without alpha - */ - if (updateAlpha == JNI_TRUE && ignoreVertexColors == JNI_FALSE) { - useAlpha = JNI_TRUE; - } - - /* - * call other JNI functions before entering Critical region - * i.e., GetPrimitiveArrayCritical - */ - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripVertexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - } - - - /* begin critical region */ - verts = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, varray, NULL); - - if (texCoordSetMapLen >0) { - texCoordSetMapOffset = (jint *)(*(table->GetPrimitiveArrayCritical)) - (env, texUnitOffset, NULL); - } - - - /* get the static transform if exists */ - if (xform != NULL) { - xform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, xform, NULL); - } - - /* get the static normals transform if exists */ - if (nxform != NULL) { - nxform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, nxform, NULL); - } - - - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - - switch (geo_type) { - case GEO_TYPE_TRI_STRIP_SET : - primType = GL_TRIANGLE_STRIP; - break; - case GEO_TYPE_TRI_FAN_SET : - primType = GL_TRIANGLE_FAN; - break; - case GEO_TYPE_LINE_STRIP_SET : - primType = GL_LINE_STRIP; - break; - } - - - strips = (GLsizei *) (*(table->GetPrimitiveArrayCritical))(env, sarray, NULL); - saveVformat = vformat; - if (ignoreVertexColors == JNI_TRUE) { - vformat &= ~GA_COLOR; - } - for (i = 0; i < strip_len; i++) { - glBegin(primType); - for (j = 0; j < strips[i]; j++) { - if (vformat & GA_NORMALS) { - if (nxform_ptr != NULL) { - normal[0] = (float) (nxform_ptr[0] * verts[normoff] + - nxform_ptr[1] * verts[normoff+1] + - nxform_ptr[2] * verts[normoff+2]); - normal[1] = (float ) (nxform_ptr[4] * verts[normoff] + - nxform_ptr[5] * verts[normoff+1] + - nxform_ptr[6] * verts[normoff+2]); - normal[2] = (float) (nxform_ptr[8] * verts[normoff] + - nxform_ptr[9] * verts[normoff+1] + - nxform_ptr[10] * verts[normoff+2]); -/* -printf("orig: < %g %g %g > transformed: < %g %g %g >\n", - verts[normoff], verts[normoff+1], verts[normoff+2], - normal[0], normal[1], normal[2]); -*/ - glNormal3fv(normal); - } else { - glNormal3fv(&verts[normoff]); - } - } - if (vformat & GA_COLOR) { - if (useAlpha ) { - color[0] = verts[coloroff]; - color[1] = verts[coloroff+1]; - color[2] = verts[coloroff+2]; - color[3] = verts[coloroff+3] * alpha; - glColor4fv(&color[0]); - } - else { - if (vformat & GA_WITH_ALPHA) { /* alpha is present */ - glColor4fv(&verts[coloroff]); - } - else { - glColor3fv(&verts[coloroff]); - } - } - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - int vaIdx, vaOff; - - vaOff = vAttrOff; - for (vaIdx = 0; vaIdx < vertexAttrCount; vaIdx++) { -#ifdef VERBOSE - fprintf(stderr, "vertexAttrs[%d] = (", vaIdx); - for (k = 0; k < vAttrSizesPtr[vaIdx]; k++) { - fprintf(stderr, "%g, ", - verts[vaOff+k]); - } - fprintf(stderr, ")\n"); -#endif /* VERBOSE */ - switch (vAttrSizesPtr[vaIdx]) { - case 1: - ctxProperties->vertexAttr1fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - case 2: - ctxProperties->vertexAttr2fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - case 3: - ctxProperties->vertexAttr3fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - case 4: - ctxProperties->vertexAttr4fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - } - - vaOff += vAttrSizesPtr[vaIdx]; - } - } - - if (vformat & GA_TEXTURE_COORDINATE) { - - if (texCoordSetMapLen > 0) { - - if (ctxProperties->gl13) { - if (vformat & GA_TEXTURE_COORDINATE_2) { - for (k = 0; k < texCoordSetMapLen; k++) { - if (texCoordSetMapOffset[k] != -1) { - ctxProperties->glMultiTexCoord2fv( - GL_TEXTURE0 + k, - &verts[texCoordoff + - texCoordSetMapOffset[k]]); - } - } - } else if (vformat & GA_TEXTURE_COORDINATE_3) { - for (k = 0; k < texCoordSetMapLen; k++) { - if (texCoordSetMapOffset[k] != -1) { - ctxProperties->glMultiTexCoord3fv( - GL_TEXTURE0 + k, - &verts[texCoordoff + - texCoordSetMapOffset[k]]); - } - } - } else { - for (k = 0; k < texCoordSetMapLen; k++) { - if (texCoordSetMapOffset[k] != -1) { - ctxProperties->glMultiTexCoord4fv( - GL_TEXTURE0 + k, - &verts[texCoordoff + - texCoordSetMapOffset[k]]); - } - } - } - } - else { /* no multitexture */ - - if (texCoordSetMapOffset[0] != -1) { - if (vformat & GA_TEXTURE_COORDINATE_2) { - glTexCoord2fv(&verts[texCoordoff + - texCoordSetMapOffset[0]]); - } else if (vformat & GA_TEXTURE_COORDINATE_3) { - glTexCoord3fv(&verts[texCoordoff + - texCoordSetMapOffset[0]]); - } else { - glTexCoord4fv(&verts[texCoordoff + - texCoordSetMapOffset[0]]); - } - } - } /* no multitexture */ - } - /* - * texCoordSetMapLen can't be 0 if texture coordinates - * is to be specified - */ - } - if (vformat & GA_COORDINATES) { - if (xform_ptr != NULL) { - - /* - * transform the vertex data with the - * static transform - */ - w = (float ) (xform_ptr[12] * verts[coordoff] + - xform_ptr[13] * verts[coordoff+1] + - xform_ptr[14] * verts[coordoff+2] + - xform_ptr[15]); - winv = 1.0f/w; - vertex[0] = (float ) (xform_ptr[0] * verts[coordoff] + - xform_ptr[1] * verts[coordoff+1] + - xform_ptr[2] * verts[coordoff+2] + - xform_ptr[3]) * winv; - vertex[1] = (float) (xform_ptr[4] * verts[coordoff] + - xform_ptr[5] * verts[coordoff+1] + - xform_ptr[6] * verts[coordoff+2] + - xform_ptr[7]) * winv; - vertex[2] = (float) (xform_ptr[8] * verts[coordoff] + - xform_ptr[9] * verts[coordoff+1] + - xform_ptr[10] * verts[coordoff+2] + - xform_ptr[11]) * winv; -/* -printf("orig: < %g %g %g > transformed: < %g %g %g >\n", - verts[coordoff], verts[coordoff+1], verts[coordoff+2], - vertex[0], vertex[1], vertex[2]); -*/ - glVertex3fv(vertex); - } else { - glVertex3fv(&verts[coordoff]); - } - } - normoff += stride; - coloroff += stride; - coordoff += stride; - texCoordoff += stride; - vAttrOff += stride; - } - glEnd(); - } - /* Restore the vertex format */ - vformat = saveVformat; - (*(table->ReleasePrimitiveArrayCritical))(env, sarray, strips, - 0); - - } - else if ((geo_type == GEO_TYPE_QUAD_SET) || - (geo_type == GEO_TYPE_TRI_SET) || - (geo_type == GEO_TYPE_POINT_SET) || - (geo_type == GEO_TYPE_LINE_SET)) { - - switch (geo_type) { - case GEO_TYPE_QUAD_SET : - primType = GL_QUADS; - break; - case GEO_TYPE_TRI_SET : - primType = GL_TRIANGLES; - break; - case GEO_TYPE_POINT_SET : - primType = GL_POINTS; - break; - case GEO_TYPE_LINE_SET : - primType = GL_LINES; - break; - - } - - saveVformat = vformat; - if (ignoreVertexColors == JNI_TRUE) { - vformat &= ~GA_COLOR; - } - glBegin(primType); - for (j = 0; j < vcount; j++) { - if (vformat & GA_NORMALS) { - if (nxform_ptr != NULL) { - normal[0] = (float) (nxform_ptr[0] * verts[normoff] + - nxform_ptr[1] * verts[normoff+1] + - nxform_ptr[2] * verts[normoff+2]); - normal[1] = (float) (nxform_ptr[4] * verts[normoff] + - nxform_ptr[5] * verts[normoff+1] + - nxform_ptr[6] * verts[normoff+2]); - normal[2] = (float) (nxform_ptr[8] * verts[normoff] + - nxform_ptr[9] * verts[normoff+1] + - nxform_ptr[10] * verts[normoff+2]); -/* -printf("orig: < %g %g %g > transformed: < %g %g %g >\n", - verts[normoff], verts[normoff+1], verts[normoff+2], - normal[0], normal[1], normal[2]); -*/ - glNormal3fv(normal); - } else { - glNormal3fv(&verts[normoff]); - } - } - if (vformat & GA_COLOR) { - if (useAlpha ) { - if (vformat & GA_WITH_ALPHA) { - color[0] = verts[coloroff]; - color[1] = verts[coloroff+1]; - color[2] = verts[coloroff+2]; - color[3] = verts[coloroff+3] * alpha; - } - else { - color[0] = verts[coloroff]; - color[1] = verts[coloroff+1]; - color[2] = verts[coloroff+2]; - color[3] = alpha; - } - glColor4fv(&color[0]); - - } - else { - if (vformat & GA_WITH_ALPHA) { /* alpha is present */ - glColor4fv(&verts[coloroff]); - } - else { - glColor3fv(&verts[coloroff]); - } - } - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - int vaIdx, vaOff; - - vaOff = vAttrOff; - for (vaIdx = 0; vaIdx < vertexAttrCount; vaIdx++) { -#ifdef VERBOSE - fprintf(stderr, "vertexAttrs[%d] = (", vaIdx); - for (k = 0; k < vAttrSizesPtr[vaIdx]; k++) { - fprintf(stderr, "%g, ", - verts[vaOff+k]); - } - fprintf(stderr, ")\n"); -#endif /* VERBOSE */ - switch (vAttrSizesPtr[vaIdx]) { - case 1: - ctxProperties->vertexAttr1fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - case 2: - ctxProperties->vertexAttr2fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - case 3: - ctxProperties->vertexAttr3fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - case 4: - ctxProperties->vertexAttr4fv(ctxProperties, vaIdx, &verts[vaOff]); - break; - } - - vaOff += vAttrSizesPtr[vaIdx]; - } - } - - if (vformat & GA_TEXTURE_COORDINATE) { - - if (texCoordSetMapLen > 0) { - - if(ctxProperties->gl13) { - if (vformat & GA_TEXTURE_COORDINATE_2) { - for (k = 0; k < texCoordSetMapLen; k++) { - if (texCoordSetMapOffset[k] != -1) { - ctxProperties->glMultiTexCoord2fv( - GL_TEXTURE0 + k, - &verts[texCoordoff + - texCoordSetMapOffset[k]]); - } - } - } else if (vformat & GA_TEXTURE_COORDINATE_3) { - for (k = 0; k < texCoordSetMapLen; k++) { - if (texCoordSetMapOffset[k] != -1) { - ctxProperties->glMultiTexCoord3fv( - GL_TEXTURE0 + k, - &verts[texCoordoff + - texCoordSetMapOffset[k]]); - } - } - } else { - for (k = 0; k < texCoordSetMapLen; k++) { - if (texCoordSetMapOffset[k] != -1) { - ctxProperties->glMultiTexCoord4fv( - GL_TEXTURE0 + k, - &verts[texCoordoff + - texCoordSetMapOffset[k]]); - } - } - } - } - else { /* no multitexture */ - - if (texCoordSetMapOffset[0] != -1) { - if (vformat & GA_TEXTURE_COORDINATE_2) { - glTexCoord2fv(&verts[texCoordoff + - texCoordSetMapOffset[0]]); - } else if (vformat & GA_TEXTURE_COORDINATE_3) { - glTexCoord3fv(&verts[texCoordoff + - texCoordSetMapOffset[0]]); - } else { - glTexCoord4fv(&verts[texCoordoff + - texCoordSetMapOffset[0]]); - } - } - } /* no multitexture */ - } - - /* - * texCoordSetMapLen can't be 0 if texture coordinates - * is to be specified - */ - } - - if (vformat & GA_COORDINATES) { - if (xform_ptr != NULL) { - - /* - * transform the vertex data with the - * static transform - */ - w = (float) (xform_ptr[12] * verts[coordoff] + - xform_ptr[13] * verts[coordoff+1] + - xform_ptr[14] * verts[coordoff+2] + - xform_ptr[15]); - winv = 1.0f/w; - vertex[0] = (float) (xform_ptr[0] * verts[coordoff] + - xform_ptr[1] * verts[coordoff+1] + - xform_ptr[2] * verts[coordoff+2] + - xform_ptr[3]) * winv; - vertex[1] = (float) (xform_ptr[4] * verts[coordoff] + - xform_ptr[5] * verts[coordoff+1] + - xform_ptr[6] * verts[coordoff+2] + - xform_ptr[7]) * winv; - vertex[2] = (float) (xform_ptr[8] * verts[coordoff] + - xform_ptr[9] * verts[coordoff+1] + - xform_ptr[10] * verts[coordoff+2] + - xform_ptr[11]) * winv; -/* -printf("orig: < %g %g %g > transformed: < %g %g %g >\n", - verts[coordoff], verts[coordoff+1], verts[coordoff+2], - vertex[0], vertex[1], vertex[2]); -*/ - glVertex3fv(vertex); - } else { - glVertex3fv(&verts[coordoff]); - } - } - normoff += stride; - coloroff += stride; - coordoff += stride; - texCoordoff += stride; - vAttrOff += stride; - } - glEnd(); - } - /* Restore the vertex format */ - vformat = saveVformat; - - - (*(table->ReleasePrimitiveArrayCritical))(env, varray, verts, 0); - - if (texCoordSetMapLen > 0) - (*(table->ReleasePrimitiveArrayCritical))(env, texUnitOffset, - texCoordSetMapOffset, 0); - - if (xform_ptr != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, xform, xform_ptr, 0); - - if (nxform_ptr != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, nxform, nxform_ptr, 0); - - if (vAttrSizesPtr != NULL) { - table->ReleaseIntArrayElements(env, vertexAttrSizes, vAttrSizesPtr, JNI_ABORT); - } -} - -static void -enableTexCoordPointer( - GraphicsContextPropertiesInfo *ctxProperties, - int texUnit, - int texSize, - int texDataType, - int stride, - void *pointer) -{ - clientActiveTextureUnit(ctxProperties, texUnit); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(texSize, texDataType, stride, pointer); -} - -static void -disableTexCoordPointer( - GraphicsContextPropertiesInfo *ctxProperties, - int texUnit) -{ - clientActiveTextureUnit(ctxProperties, texUnit); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); -} - -static void -clientActiveTextureUnit( - GraphicsContextPropertiesInfo *ctxProperties, - int texUnit) -{ - if (ctxProperties->gl13) { - ctxProperties->glClientActiveTexture(texUnit + GL_TEXTURE0); - } -} - - -static void -executeGeometryArrayVA( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jfloat* fverts, - jdouble* dverts, - jint initialColorIndex, - jfloat* fclrs, - jbyte* bclrs, - jint initialNormalIndex, - jfloat* norms, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jintArray vertexAttrIndices, - jfloat ** vertexAttrPointer, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jintArray texindices, - jint texStride, - jfloat** texCoordPointer, - jint cdirty, - jarray sarray, - jsize strip_len, - jarray start_array) -{ - int primType; - JNIEnv table; - jint i; - GLsizei *strips; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - - GLint *start; - - jint coordoff, coloroff, normoff; - jint* initialVAttrIndices; - jint* vAttrSizes; - int texSet; - jint *texCoordSetMap; - jint* initialTexIndices; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean vattrDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_VATTR_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - table = *env; - -#ifdef VERBOSE - fprintf(stderr, "executeGeometryArrayVA()\n"); -#endif /* VERBOSE */ - - /* Enable normalize for non-uniform scale (which rescale can't handle) */ - if (isNonUniformScale) { - glEnable(GL_NORMALIZE); - } - - coordoff = 3 * initialCoordIndex; - /* Define the data pointers */ - if (floatCoordDefined) { - glVertexPointer(3, GL_FLOAT, 0, &(fverts[coordoff])); - } else if (doubleCoordDefined){ - glVertexPointer(3, GL_DOUBLE, 0, &(dverts[coordoff])); - } - - if (floatColorsDefined) { - if (vformat & GA_WITH_ALPHA) { - coloroff = 4 * initialColorIndex; - glColorPointer(4, GL_FLOAT, 0, &(fclrs[coloroff])); - } else { - coloroff = 3 * initialColorIndex; - glColorPointer(3, GL_FLOAT, 0, &(fclrs[coloroff])); - } - } else if (byteColorsDefined) { - if (vformat & GA_WITH_ALPHA) { - coloroff = 4 * initialColorIndex; - glColorPointer(4, GL_UNSIGNED_BYTE, 0, &(bclrs[coloroff])); - } else { - coloroff = 3 * initialColorIndex; - glColorPointer(3, GL_UNSIGNED_BYTE, 0, &(bclrs[coloroff])); - } - } - if (normalsDefined) { - normoff = 3 * initialNormalIndex; - glNormalPointer(GL_FLOAT, 0, &(norms[normoff])); - } - - if (vattrDefined) { - float *pVertexAttrs; - int sz, initIdx; - - vAttrSizes = (jint *) (*(table->GetPrimitiveArrayCritical))(env, vertexAttrSizes, NULL); - initialVAttrIndices = (jint *) (*(table->GetPrimitiveArrayCritical))(env, vertexAttrIndices, NULL); - - for (i = 0; i < vertexAttrCount; i++) { - pVertexAttrs = vertexAttrPointer[i]; - sz = vAttrSizes[i]; - initIdx = initialVAttrIndices[i]; - - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, sz, - GL_FLOAT, 0, - &pVertexAttrs[initIdx * sz]); - } - - (*(table->ReleasePrimitiveArrayCritical))(env, vertexAttrSizes, vAttrSizes, 0); - (*(table->ReleasePrimitiveArrayCritical))(env, vertexAttrIndices, initialVAttrIndices, 0); - } - - if (textureDefined) { - - int tus = 0; - float *ptexCoords; - - initialTexIndices = (jint *) (*(table->GetPrimitiveArrayCritical))(env,texindices, NULL); - - texCoordSetMap = (jint *) (*(table->GetPrimitiveArrayCritical))(env,tcoordsetmap, NULL); - for (i = 0; i < numActiveTexUnit; i++) { - if ((i < texCoordMapLength) && ( - ((texSet=texCoordSetMap[i]) != -1))) { - - ptexCoords = texCoordPointer[texSet]; - - enableTexCoordPointer(ctxProperties, i, texStride, - GL_FLOAT, 0, - &ptexCoords[texStride * initialTexIndices[texSet]]); - - } else { - disableTexCoordPointer(ctxProperties, i); - } - } - - /* Reset client active texture unit to 0 */ - clientActiveTextureUnit(ctxProperties, 0); - } - - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - strips = (GLint *) (*(table->GetPrimitiveArrayCritical))(env, sarray, - NULL); - - switch (geo_type) { - case GEO_TYPE_TRI_STRIP_SET : - primType = GL_TRIANGLE_STRIP; - break; - case GEO_TYPE_TRI_FAN_SET : - primType = GL_TRIANGLE_FAN; - break; - case GEO_TYPE_LINE_STRIP_SET : - primType = GL_LINE_STRIP; - break; - } - - start = (GLint *)(*(table->GetPrimitiveArrayCritical))(env, - start_array, NULL); - if (ctxProperties->multi_draw_arrays_ext || ctxProperties->multi_draw_arrays_sun) { - - /* - fprintf(stderr, "strip_len = %d \n",strip_len); - for (i=0; i < strip_len;i++) { - fprintf(stderr, "numVertices = %d\n",strips[i]); - fprintf(stderr, "start = %d \n",start[i]); - } - */ - ctxProperties->glMultiDrawArraysEXT(primType, start, strips, strip_len); - } else { - for (i=0; i < strip_len;i++) { - glDrawArrays(primType, start[i], strips[i]); - } - } - (*(table->ReleasePrimitiveArrayCritical))(env, start_array, start, - 0); - (*(table->ReleasePrimitiveArrayCritical))(env, sarray, strips, 0); - } - else { - switch (geo_type){ - case GEO_TYPE_QUAD_SET : glDrawArrays(GL_QUADS, 0, vcount);break; - case GEO_TYPE_TRI_SET : glDrawArrays(GL_TRIANGLES, 0, vcount);break; - case GEO_TYPE_POINT_SET : glDrawArrays(GL_POINTS, 0, vcount);break; - case GEO_TYPE_LINE_SET: glDrawArrays(GL_LINES, 0, vcount);break; - } - } - /* clean up if we turned on normalize */ - if (isNonUniformScale) { - glDisable(GL_NORMALIZE); - } - - - if (vattrDefined) { - resetVertexAttrs(ctxInfo, vertexAttrCount); - } - - if (textureDefined) { - resetTexture(ctxInfo); - - (*(table->ReleasePrimitiveArrayCritical))(env, tcoordsetmap, texCoordSetMap, 0); - (*(table->ReleasePrimitiveArrayCritical))(env, texindices, initialTexIndices, 0); - } -} - -/* execute geometry array with java array format */ -/* - * Class: javax_media_j3d_NativePipeline - * Method: executeVA - * Signature: (JLjavax/media/j3d/GeometryArrayRetained;IZZZIIII[F[DI[F[BI[FI[I[I[[FII[II[I[II[Ljava/lang/Object;I)V - */ -JNIEXPORT void JNICALL -Java_javax_media_j3d_NativePipeline_executeVA( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jfloatArray vfcoords, - jdoubleArray vdcoords, - jint initialColorIndex, - jfloatArray cfdata, - jbyteArray cbdata, - jint initialNormalIndex, - jfloatArray ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jintArray vertexAttrIndices, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jint cdirty) -{ - - jfieldID strip_field; - jarray sarray; - jsize strip_len; - jclass geo_class; - - jarray start_array; - jfieldID start_field; - - JNIEnv table = *env; - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jarray *vaobjs = NULL; - jfloat **vertexAttrPointer = NULL; - jfloat **texCoordPointer = NULL; - jarray *texobjs = NULL; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean vattrDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_VATTR_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - if (vattrDefined) { - vaobjs = (jarray *)malloc(vertexAttrCount * sizeof(jarray)); - vertexAttrPointer = (jfloat **)malloc(vertexAttrCount * sizeof(jfloat *)); - - for (i = 0; i < vertexAttrCount; i++) { - vaobjs[i] = (*(table->GetObjectArrayElement))(env, vertexAttrData, i); - } - } - - if (textureDefined) { - texobjs = (jarray*)malloc(texCoordMapLength * sizeof(jarray)); - texCoordPointer = (jfloat**)malloc(texCoordMapLength * sizeof(jfloat*)); - - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (*(table->GetObjectArrayElement))(env, texCoords, i); - } - } - - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripVertexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - - start_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripStartOffsetIndices", "[I"); - start_array = (jarray)(*(table->GetObjectField))(env, geo, - start_field); - } - - /* Get vertex attribute arrays */ - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - vertexAttrPointer[i] = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, vaobjs[i], NULL); - } - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)(*(table->GetPrimitiveArrayCritical))(env,texobjs[i], NULL); - else - texCoordPointer[i] = NULL; - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts= (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, vfcoords, NULL); - } else if (doubleCoordDefined) { - dverts= (jdouble *) (*(table->GetPrimitiveArrayCritical))(env, vdcoords, NULL); - } - - /* get color array */ - if (floatColorsDefined) { - fclrs = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, cfdata, NULL); - } else if (byteColorsDefined) { - bclrs = (jbyte *) (*(table->GetPrimitiveArrayCritical))(env, cbdata, NULL); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env,ndata, NULL); - } - -#ifdef VERBOSE - fprintf(stderr, "GeometryArrayRetained.executeVA() -- calling executeGeometryArrayVA\n"); -#endif /* VERBOSE */ - - executeGeometryArrayVA(env, obj, ctxInfo, geo, geo_type, - isNonUniformScale, ignoreVertexColors, - vcount, vformat, vdefined, initialCoordIndex, - fverts, dverts, initialColorIndex, - fclrs, bclrs, initialNormalIndex, - norms, - vertexAttrCount, vertexAttrSizes, - vertexAttrIndices, vertexAttrPointer, - texCoordMapLength, - tcoordsetmap,numActiveTexUnit, - texindices,texStride,texCoordPointer,cdirty, sarray, strip_len, start_array); - - - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - (*(table->ReleasePrimitiveArrayCritical))(env, vaobjs[i], vertexAttrPointer[i], 0); - } - } - - if (vaobjs != NULL) { - free(vaobjs); - } - if (vertexAttrPointer != NULL) { - free(vertexAttrPointer); - } - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texCoordPointer[i] != NULL) { - (*(table->ReleasePrimitiveArrayCritical))(env, texobjs[i], texCoordPointer[i], 0); - } - } - } - - if (texobjs != NULL) { - free(texobjs); - } - if (texCoordPointer != NULL) { - free(texCoordPointer); - } - - if (normalsDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, ndata, norms, 0); - } - - - if (floatColorsDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, cfdata, fclrs, 0); - } - else if (byteColorsDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, cbdata, bclrs, 0); - } - - - if (floatCoordDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, vfcoords, fverts, 0); - } - else if (doubleCoordDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, vdcoords, dverts, 0); - } -} - -/* execute geometry array with java array format */ -/* - * Class: javax_media_j3d_NativePipeline - * Method: executeVABuffer - * Signature: (JLjavax/media/j3d/GeometryArrayRetained;IZZZIIIILjava/lang/Object;ILjava/lang/Object;[F[BILjava/lang/Object;I[I[I[Ljava/lang/Object;II[II[I[II[Ljava/lang/Object;I)V - */ -JNIEXPORT void JNICALL Java_javax_media_j3d_NativePipeline_executeVABuffer( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jobject vcoords, - jint initialColorIndex, - jobject cdataBuffer, - jfloatArray cfdata, - jbyteArray cbdata, - jint initialNormalIndex, - jobject ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jintArray vertexAttrIndices, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jint cdirty) -{ - jfieldID strip_field; - jarray sarray; - jsize strip_len; - jclass geo_class; - - jarray start_array; - jfieldID start_field; - - JNIEnv table = *env; - jfloat *fverts = NULL; - jdouble *dverts = NULL ; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jarray *vaobjs = NULL; - jfloat **vertexAttrPointer = NULL; - jfloat **texCoordPointer = NULL; - jarray *texobjs = NULL; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean vattrDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_VATTR_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - if (vattrDefined) { - vaobjs = (jarray *)malloc(vertexAttrCount * sizeof(jarray)); - vertexAttrPointer = (jfloat **)malloc(vertexAttrCount * sizeof(jfloat *)); - - for (i = 0; i < vertexAttrCount; i++) { - vaobjs[i] = (*(table->GetObjectArrayElement))(env, vertexAttrData, i); - } - } - - if (textureDefined) { - texobjs = (jarray*)malloc(texCoordMapLength * sizeof(jarray)); - texCoordPointer = (jfloat**)malloc(texCoordMapLength * sizeof(jfloat*)); - - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (*(table->GetObjectArrayElement))(env, texCoords, i); - } - } - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripVertexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - - start_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripStartOffsetIndices", "[I"); - start_array = (jarray)(*(table->GetObjectField))(env, geo, - start_field); - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts= (jfloat *)(*(table->GetDirectBufferAddress))(env, vcoords ); - } else if (doubleCoordDefined) { - dverts= (jdouble *)(*(table->GetDirectBufferAddress))(env, vcoords ); - } - - if(fverts == NULL && dverts == NULL) { - return; - } - - - /* get color array */ - if (floatColorsDefined) { - if(cfdata != NULL) - fclrs = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, cfdata, NULL); - else - fclrs = (jfloat *)(*(table->GetDirectBufferAddress))(env, cdataBuffer); - } - else if (byteColorsDefined) { - if(cbdata != NULL) - bclrs = (jbyte *) (*(table->GetPrimitiveArrayCritical))(env, cbdata, NULL); - else - bclrs = (jbyte *)(*(table->GetDirectBufferAddress))(env, cdataBuffer); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *)(*(table->GetDirectBufferAddress))(env, ndata); - } - - /* get vertex attr arrays */ - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - vertexAttrPointer[i] = (jfloat *) (*(table->GetDirectBufferAddress))(env, vaobjs[i]); - } - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)(*(table->GetDirectBufferAddress))(env,texobjs[i]); - else - texCoordPointer[i] = NULL; - } - } - - -#ifdef VERBOSE - fprintf(stderr, "GeometryArrayRetained.executeVABuffer() -- calling executeGeometryArrayVA\n"); -#endif /* VERBOSE */ - - executeGeometryArrayVA(env, obj, ctxInfo, geo, geo_type, - isNonUniformScale, ignoreVertexColors, - vcount, vformat, vdefined, initialCoordIndex, - fverts, dverts, initialColorIndex, - fclrs, bclrs, initialNormalIndex, - norms, - vertexAttrCount, vertexAttrSizes, - vertexAttrIndices, vertexAttrPointer, - texCoordMapLength, - tcoordsetmap,numActiveTexUnit, - texindices,texStride,texCoordPointer,cdirty, sarray, strip_len, start_array); - - if (vaobjs != NULL) { - free(vaobjs); - } - if (vertexAttrPointer != NULL) { - free(vertexAttrPointer); - } - - if (texobjs != NULL) { - free(texobjs); - } - if (texCoordPointer != NULL) { - free(texCoordPointer); - } - - if(floatColorsDefined && cfdata != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, cfdata, fclrs, 0); - else if(byteColorsDefined && cbdata != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, cbdata, bclrs, 0); -} - - - -JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_disableGlobalAlpha( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint vformat, - jboolean useAlpha, - jboolean ignoreVertexColors) -{ - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - - if(ctxProperties->global_alpha_sun){ - if (ignoreVertexColors == JNI_FALSE && vformat & 0x04) { - if (useAlpha && ctxProperties->global_alpha_sun ) { - glDisable(GL_GLOBAL_ALPHA_SUN); - } - } - } -} - - -/* - * Class: javax_media_j3d_NativePipeline - * Method: setVertexFormat - * Signature: (JIZZI[I)V - */ -JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setVertexFormat( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint vformat, - jboolean useAlpha, - jboolean ignoreVertexColors) -{ - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - -#ifdef VERBOSE - fprintf(stderr, - "GeometryArrayRetained.setVertexFormat() : vformat = %d\n", - vformat); -#endif /* VERBOSE */ - - /* Enable and disable the appropriate pointers */ - if (vformat & GA_NORMALS) { - glEnableClientState(GL_NORMAL_ARRAY); - } - else { - glDisableClientState(GL_NORMAL_ARRAY); - } - if (ignoreVertexColors == JNI_FALSE && vformat & GA_COLOR) { - glEnableClientState(GL_COLOR_ARRAY); - } - else { - glDisableClientState(GL_COLOR_ARRAY); - - } - - if (ctxProperties->global_alpha_sun) { - if (useAlpha) { - glEnable(GL_GLOBAL_ALPHA_SUN); - } - else { - glDisable(GL_GLOBAL_ALPHA_SUN); - } - } - - if (vformat & GA_COORDINATES) { - glEnableClientState(GL_VERTEX_ARRAY); - } - else { - glDisableClientState(GL_VERTEX_ARRAY); - } -} - -static void -executeIndexedGeometryArray( - JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vertexCount, - jint vformat, - jint vertexAttrCount, jintArray vertexAttrSizes, - jint texCoordSetCount, - jintArray texCoordSetMap, jint texCoordSetMapLen, - jintArray texUnitOffset, - jint numActiveTexUnit, - jfloatArray varray, jobject varrayBuffer, jfloatArray carray, - jint cDirty, - jintArray indexCoord) -{ - jclass geo_class; - JNIEnv table; - - jfloat *verts,*clrs; - jint *indices; - jint i; - jint bstride, cbstride; - jsize strip_len; - GLsizei *countArray; - int offset; - GLenum iaFormat; - int useInterleavedArrays; - int primType; - jint stride, coordoff, normoff, coloroff, texCoordoff; - int alphaNeedsUpdate = 0; /* used so we can get alpha data from */ - /* JNI before using it so we can use */ - /* GetPrimitiveArrayCritical */ - jfieldID strip_field; - jarray sarray; - jint* tmpDrawElementsIndices[100]; - - jint** multiDrawElementsIndices = NULL; - jint allocated = 0; - - jint texSize, texStride, *texCoordSetMapOffset = NULL; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - - int cstride = 0; - int vAttrStride = 0; - int vAttrOff; - jint *vAttrSizesPtr = NULL; - - table = *env; - -#ifdef VERBOSE - fprintf(stderr, - "executeIndexedGeometryArray: vertexAttrCount = %d\n", - vertexAttrCount); -#endif /* VERBOSE */ - - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - /* This matches the code in GeometryArrayRetained.java */ - stride = coordoff = normoff = coloroff = texCoordoff = 0; - vAttrOff = 0; - if ((vformat & GA_COORDINATES) != 0) { - stride += 3; - } - if ((vformat & GA_NORMALS) != 0) { - stride += 3; - coordoff += 3; - } - if ((vformat & GA_COLOR) != 0) { - if ((vformat & GA_WITH_ALPHA) != 0 ) { - stride += 4; - normoff += 4; - coordoff += 4; - } - else { /* Handle the case of executeInterleaved 3f */ - stride += 3; - normoff += 3; - coordoff += 3; - } - } - if ((vformat & GA_TEXTURE_COORDINATE) != 0) { - if ((vformat & GA_TEXTURE_COORDINATE_2) != 0) { - texSize = 2; - texStride = 2 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - texSize = 3; - texStride = 3 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_4) != 0) { - texSize = 4; - texStride = 4 * texCoordSetCount; - } - stride += texStride; - normoff += texStride; - coloroff += texStride; - coordoff += texStride; - } - - if ((vformat & GA_VERTEX_ATTRIBUTES) != 0) { - if (vertexAttrSizes != NULL) { - vAttrSizesPtr = table->GetIntArrayElements(env, vertexAttrSizes, NULL); - } - for (i = 0; i < vertexAttrCount; i++) { - vAttrStride += vAttrSizesPtr[i]; - } - stride += vAttrStride; - normoff += vAttrStride; - coloroff += vAttrStride; - coordoff += vAttrStride; - texCoordoff += vAttrStride; - } - - bstride = stride*sizeof(float); - - /* - * call other JNI functions before entering Critical region - * i.e., GetPrimitiveArrayCritical - */ - - - if (geo_type == GEO_TYPE_INDEXED_TRI_STRIP_SET || - geo_type == GEO_TYPE_INDEXED_TRI_FAN_SET || - geo_type == GEO_TYPE_INDEXED_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripIndexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - - - } - - /* begin critical region */ - if(varray != NULL) - verts = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, varray, NULL); - else if(varrayBuffer != NULL) - verts = (jfloat *) (*(table->GetDirectBufferAddress))(env, varrayBuffer); - - indices = (jint *) (*(table->GetPrimitiveArrayCritical))(env, indexCoord, NULL); - - - /* using byRef interleaved array and has a separate pointer, then .. */ - cstride = stride; - if (carray != NULL) { - clrs = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, carray, NULL); - cstride = 4; - - } - else { - clrs = &(verts[coloroff]); - } - cbstride = cstride * sizeof(float); - if (texCoordSetMapLen >0) { - texCoordSetMapOffset = (jint *) (*(table->GetPrimitiveArrayCritical))(env, texUnitOffset, NULL); - } - - /* Enable normalize for non-uniform scale (which rescale can't handle) */ - if (isNonUniformScale) { - glEnable(GL_NORMALIZE); - } - - /*** Handle non-indexed strip GeometryArray first *******/ - if (geo_type == GEO_TYPE_INDEXED_TRI_STRIP_SET || - geo_type == GEO_TYPE_INDEXED_TRI_FAN_SET || - geo_type == GEO_TYPE_INDEXED_LINE_STRIP_SET) { - - - countArray = (GLsizei *) (*(table->GetPrimitiveArrayCritical))(env, sarray, - NULL); - - if ((ignoreVertexColors == JNI_TRUE) || (carray != NULL) || - ((vformat & GA_TEXTURE_COORDINATE) && ((texCoordSetMapLen > 1) || - (texCoordSetCount > 1)))) { - useInterleavedArrays = 0; - } else { - INTERLEAVEDARRAYS_TEST() - } - if (useInterleavedArrays) { - glInterleavedArrays(iaFormat, bstride, verts); - } else { - if (vformat & GA_NORMALS) { - glNormalPointer(GL_FLOAT, bstride, &(verts[normoff])); - } - if (ignoreVertexColors == JNI_FALSE && vformat & GA_COLOR) { - if (vformat & GA_WITH_ALPHA || (useAlpha == GL_TRUE)) { - glColorPointer(4, GL_FLOAT, cbstride, clrs); - } else { - /* - for (i = 0; i < 4; i++) { - fprintf(stderr, "r = %f, g = %f, b = %f\n", verts[i*stride +coloroff], verts[i*stride +coloroff+1],verts[i*stride +coloroff+2]); - } - */ - glColorPointer(3, GL_FLOAT, cbstride, clrs); - } - } - if (vformat & GA_COORDINATES) { - /* - for (i = 0; i < 4; i++) { - fprintf(stderr, "x = %f, y = %f, z = %f\n", verts[i*stride +coordoff], verts[i*stride +coordoff+1],verts[i*stride +coordoff+2]); - } - */ - glVertexPointer(3, GL_FLOAT, bstride, &(verts[coordoff])); - } - - if (vformat & GA_TEXTURE_COORDINATE) { - - /* XXXX: texCoordoff == 0 ???*/ - executeTexture(texCoordSetMapLen, - texSize, bstride, texCoordoff, - texCoordSetMapOffset, - numActiveTexUnit, - verts, ctxInfo); - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - jfloat *vAttrPtr = &verts[vAttrOff]; - - for (i = 0; i < vertexAttrCount; i++) { - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, vAttrSizesPtr[i], - GL_FLOAT, bstride, vAttrPtr); - vAttrPtr += vAttrSizesPtr[i]; - } - } - } - - switch (geo_type) { - case GEO_TYPE_INDEXED_TRI_STRIP_SET : - primType = GL_TRIANGLE_STRIP; - break; - case GEO_TYPE_INDEXED_TRI_FAN_SET : - primType = GL_TRIANGLE_FAN; - break; - case GEO_TYPE_INDEXED_LINE_STRIP_SET : - primType = GL_LINE_STRIP; - break; - } - /* - fprintf(stderr, "strip_len = %d\n",strip_len); - for (i=0; i < strip_len;i++) { - fprintf(stderr, "strips[i] = %d\n",strips[i]); - } - */ - - lockArray(ctxProperties, vertexCount); - - if (ctxProperties->multi_draw_arrays_ext || ctxProperties->multi_draw_arrays_sun) { - if (strip_len > 100) { - multiDrawElementsIndices = (jint**)malloc(strip_len * sizeof(int*)); - allocated = 1; - } - else { - multiDrawElementsIndices =(jint**) &tmpDrawElementsIndices; - } - - offset = initialIndexIndex; - for (i=0; i < strip_len;i++) { - multiDrawElementsIndices[i] = &indices[offset]; - offset += countArray[i]; - } - ctxProperties->glMultiDrawElementsEXT(primType, countArray, GL_UNSIGNED_INT,(const void **)multiDrawElementsIndices, strip_len); - - } else { - offset = initialIndexIndex; - for (i=0; i < strip_len;i++) { - - glDrawElements(primType, countArray[i], GL_UNSIGNED_INT, &indices[offset]); - offset += countArray[i]; - } - } - (*(table->ReleasePrimitiveArrayCritical))(env, sarray, countArray, 0); - if (allocated) { - free(multiDrawElementsIndices); - } - - } - /******* Handle non-indexed non-striped GeometryArray now *****/ - else if ((geo_type == GEO_TYPE_INDEXED_QUAD_SET) || - (geo_type == GEO_TYPE_INDEXED_TRI_SET) || - (geo_type == GEO_TYPE_INDEXED_POINT_SET) || - (geo_type == GEO_TYPE_INDEXED_LINE_SET)) - { - if ((ignoreVertexColors == JNI_TRUE) || (carray != NULL) || - ((vformat & GA_TEXTURE_COORDINATE) && ((texCoordSetMapLen > 1) || - (texCoordSetCount > 1)))) { - useInterleavedArrays = 0; - } else { - INTERLEAVEDARRAYS_TEST() - } - if (useInterleavedArrays) { - glInterleavedArrays(iaFormat, bstride, verts); - } else { - if (vformat & GA_NORMALS) { - glNormalPointer(GL_FLOAT, bstride, &(verts[normoff])); - } - if (ignoreVertexColors == JNI_FALSE && vformat & GA_COLOR) { - if (vformat & GA_WITH_ALPHA || (useAlpha == GL_TRUE)) { - - glColorPointer(4, GL_FLOAT, cbstride, clrs); - } else { - glColorPointer(3, GL_FLOAT, cbstride, clrs); - } - } - if (vformat & GA_COORDINATES) { - glVertexPointer(3, GL_FLOAT, bstride, &(verts[coordoff])); - } - - if (vformat & GA_TEXTURE_COORDINATE) { - - /* XXXX: texCoordoff == 0 ???*/ - executeTexture(texCoordSetMapLen, - texSize, bstride, texCoordoff, - texCoordSetMapOffset, - numActiveTexUnit, - verts, ctxInfo); - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - jfloat *vAttrPtr = &verts[vAttrOff]; - - for (i = 0; i < vertexAttrCount; i++) { - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, vAttrSizesPtr[i], - GL_FLOAT, bstride, vAttrPtr); - vAttrPtr += vAttrSizesPtr[i]; - } - } - } - - lockArray(ctxProperties, vertexCount); - - switch (geo_type){ - case GEO_TYPE_INDEXED_QUAD_SET : glDrawElements(GL_QUADS,indexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_TRI_SET : glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_POINT_SET : glDrawElements(GL_POINTS, indexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_LINE_SET: glDrawElements(GL_LINES, indexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - } - } - - unlockArray(ctxProperties); - - if (vformat & GA_VERTEX_ATTRIBUTES) { - resetVertexAttrs(ctxInfo, vertexAttrCount); - } - - if (vformat & GA_TEXTURE_COORDINATE) { - resetTexture(ctxInfo); - } - - /* clean up if we turned on normalize */ - - if (isNonUniformScale) { - glDisable(GL_NORMALIZE); - } - if(varray != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, varray, verts, 0); - - (*(table->ReleasePrimitiveArrayCritical))(env, indexCoord, indices, 0); - - if (carray != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, carray, clrs, 0); - - if (texCoordSetMapLen > 0) - (*(table->ReleasePrimitiveArrayCritical))(env, texUnitOffset, - texCoordSetMapOffset, 0); - - if (vAttrSizesPtr != NULL) { - table->ReleaseIntArrayElements(env, vertexAttrSizes, vAttrSizesPtr, JNI_ABORT); - } -} - -JNIEXPORT void JNICALL -Java_javax_media_j3d_NativePipeline_executeIndexedGeometry( - JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vertexCount, - jint vformat, - jint vertexAttrCount, jintArray vertexAttrSizes, - jint texCoordSetCount, - jintArray texCoordSetMap, jint texCoordSetMapLen, - jintArray texUnitOffset, - jint numActiveTexUnit, - jfloatArray varray, jfloatArray carray, - jint cDirty, - jintArray indexCoord) -{ - -#ifdef VERBOSE - fprintf(stderr, "IndexedGeometryArrayRetained.executeIndexedGeometry() -- calling executeIndexedGeometryArray\n"); -#endif /* VERBOSE */ - - executeIndexedGeometryArray(env, obj, ctxInfo, geo, geo_type, - isNonUniformScale, useAlpha, - ignoreVertexColors, - initialIndexIndex, - indexCount, - vertexCount, - vformat, - vertexAttrCount, vertexAttrSizes, - texCoordSetCount, - texCoordSetMap, texCoordSetMapLen, - texUnitOffset, - numActiveTexUnit, - varray, NULL, carray, - cDirty, - indexCoord); -} - -JNIEXPORT void JNICALL -Java_javax_media_j3d_NativePipeline_executeIndexedGeometryBuffer( - JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vertexCount, - jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMap, jint texCoordSetMapLen, - jintArray texUnitOffset, - jint numActiveTexUnit, - jobject varray, jfloatArray carray, - jint cDirty, - jintArray indexCoord) -{ - -#ifdef VERBOSE - fprintf(stderr, "IndexedGeometryArrayRetained.executeIndexedGeometryBuffer() -- calling executeIndexedGeometryArray\n"); -#endif /* VERBOSE */ - - executeIndexedGeometryArray(env, obj, ctxInfo, geo, geo_type, - isNonUniformScale, useAlpha, - ignoreVertexColors, - initialIndexIndex, - indexCount, - vertexCount, - vformat, - 0, NULL, - texCoordSetCount, - texCoordSetMap, texCoordSetMapLen, - texUnitOffset, - numActiveTexUnit, - NULL, varray, carray, - cDirty, - indexCoord); -} - - -static void -executeIndexedGeometryArrayVA( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint validIndexCount, - jint vertexCount, - jint vformat, - jint vdefined, - jfloat* fverts, - jdouble* dverts, - jfloat* fclrs, - jbyte* bclrs, - jfloat* norms, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jfloat ** vertexAttrPointer, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jint texStride, - jfloat** texCoordPointer, - jint cdirty, - jintArray indexCoord, - jarray sarray, - jsize strip_len) -{ - int primType; - JNIEnv table; - jint i; - jint* tmpDrawElementsIndices[100]; - jint** multiDrawElementsIndices = NULL; - jint allocated = 0; - jint *indices; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean vattrDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_VATTR_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - - int texSet; - jint *texCoordSetMap; - GLsizei *countArray; - jint* vAttrSizes; - jint offset = 0; - - table = *env; - -#ifdef VERBOSE - fprintf(stderr, - "executeIndexedGeometryArrayVA: vertexAttrCount = %d\n", - vertexAttrCount); -#endif /* VERBOSE */ - - /* Enable normalize for non-uniform scale (which rescale can't handle) */ - if (isNonUniformScale) { - glEnable(GL_NORMALIZE); - } - - /* Define the data pointers */ - if (floatCoordDefined) { - glVertexPointer(3, GL_FLOAT, 0, fverts); - } else if (doubleCoordDefined){ - glVertexPointer(3, GL_DOUBLE, 0, dverts); - } - if (floatColorsDefined) { - if (vformat & GA_WITH_ALPHA) { - glColorPointer(4, GL_FLOAT, 0, fclrs); - } else { - glColorPointer(3, GL_FLOAT, 0, fclrs); - } - } else if (byteColorsDefined) { - if (vformat & GA_WITH_ALPHA) { - glColorPointer(4, GL_UNSIGNED_BYTE, 0, bclrs); - } else { - glColorPointer(3, GL_UNSIGNED_BYTE, 0, bclrs); - } - } - if (normalsDefined) { - glNormalPointer(GL_FLOAT, 0, norms); - } - - if (vattrDefined) { - float *pVertexAttrs; - int sz; - - vAttrSizes = (jint *) (*(table->GetPrimitiveArrayCritical))(env, vertexAttrSizes, NULL); - - for (i = 0; i < vertexAttrCount; i++) { - pVertexAttrs = vertexAttrPointer[i]; - sz = vAttrSizes[i]; - - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, sz, - GL_FLOAT, 0, - pVertexAttrs); - } - - (*(table->ReleasePrimitiveArrayCritical))(env, vertexAttrSizes, vAttrSizes, 0); - } - - if (textureDefined) { - - int tus = 0; - float *ptexCoords; - - texCoordSetMap = (jint *) (*(table->GetPrimitiveArrayCritical))(env,tcoordsetmap, NULL); - for (i = 0; i < numActiveTexUnit; i++) { - if ((i < texCoordMapLength) && ( - ((texSet=texCoordSetMap[i]) != -1))) { - - ptexCoords = texCoordPointer[texSet]; - - enableTexCoordPointer(ctxProperties, i, texStride, - GL_FLOAT, 0, - ptexCoords); - - } else { - - disableTexCoordPointer(ctxProperties, i); - } - } - - /* Reset client active texture unit to 0 */ - clientActiveTextureUnit(ctxProperties, 0); - } - indices = (jint *) (*(table->GetPrimitiveArrayCritical))(env, indexCoord, NULL); - - lockArray(ctxProperties, vertexCount); - - if (geo_type == GEO_TYPE_INDEXED_TRI_STRIP_SET || - geo_type == GEO_TYPE_INDEXED_TRI_FAN_SET || - geo_type == GEO_TYPE_INDEXED_LINE_STRIP_SET) { - - countArray = (GLint *) (*(table->GetPrimitiveArrayCritical))(env, sarray, - NULL); - - switch (geo_type) { - case GEO_TYPE_INDEXED_TRI_STRIP_SET : - primType = GL_TRIANGLE_STRIP; - break; - case GEO_TYPE_INDEXED_TRI_FAN_SET : - primType = GL_TRIANGLE_FAN; - break; - case GEO_TYPE_INDEXED_LINE_STRIP_SET : - primType = GL_LINE_STRIP; - break; - } - - - - if (ctxProperties->multi_draw_arrays_ext || ctxProperties->multi_draw_arrays_sun) { - if (strip_len > 100) { - multiDrawElementsIndices = (jint**)malloc(strip_len * sizeof(int*)); - allocated = 1; - } - else { - multiDrawElementsIndices = (jint**)&tmpDrawElementsIndices; - } - - offset = initialIndexIndex; - for (i=0; i < strip_len;i++) { - multiDrawElementsIndices[i] = &indices[offset]; - offset += countArray[i]; - } - ctxProperties->glMultiDrawElementsEXT(primType, countArray, GL_UNSIGNED_INT,(const void **)multiDrawElementsIndices, strip_len); - - } else { - offset = initialIndexIndex; - for (i=0; i < strip_len;i++) { - glDrawElements(primType, countArray[i], GL_UNSIGNED_INT, &indices[offset]); - offset += countArray[i]; - } - } - - (*(table->ReleasePrimitiveArrayCritical))(env, sarray, countArray, 0); - if (allocated) { - free(multiDrawElementsIndices); - } - } - else { - switch (geo_type){ - case GEO_TYPE_INDEXED_QUAD_SET : glDrawElements(GL_QUADS,validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_TRI_SET : glDrawElements(GL_TRIANGLES, validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_POINT_SET : glDrawElements(GL_POINTS, validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_LINE_SET: glDrawElements(GL_LINES, validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - } - } - - unlockArray(ctxProperties); - - /* clean up if we turned on normalize */ - if (isNonUniformScale) { - glDisable(GL_NORMALIZE); - } - - (*(table->ReleasePrimitiveArrayCritical))(env, indexCoord, indices, 0); - - if (vattrDefined) { - resetVertexAttrs(ctxInfo, vertexAttrCount); - } - - if (textureDefined) { - resetTexture(ctxInfo); - - (*(table->ReleasePrimitiveArrayCritical))(env, tcoordsetmap, texCoordSetMap, 0); - } -} - - -JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeIndexedGeometryVA( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint validIndexCount, - jint vertexCount, - jint vformat, - jint vdefined, - jfloatArray vfcoords, - jdoubleArray vdcoords, - jfloatArray cfdata, - jbyteArray cbdata, - jfloatArray ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jint texStride, - jobjectArray texCoords, - jint cdirty, - jintArray indexCoord) -{ - jfieldID strip_field; - jarray sarray; - jsize strip_len; - JNIEnv table; - jint i; - jclass geo_class; - - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jarray *vaobjs = NULL; - jfloat **vertexAttrPointer = NULL; - jfloat **texCoordPointer = NULL; - jarray *texobjs = NULL; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean vattrDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_VATTR_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - table = *env; - - if (vattrDefined) { - vaobjs = (jarray *)malloc(vertexAttrCount * sizeof(jarray)); - vertexAttrPointer = (jfloat **)malloc(vertexAttrCount * sizeof(jfloat *)); - - for (i = 0; i < vertexAttrCount; i++) { - vaobjs[i] = (*(table->GetObjectArrayElement))(env, vertexAttrData, i); - } - } - - if (textureDefined) { - texobjs = (jarray*)malloc(texCoordMapLength * sizeof(jarray)); - texCoordPointer = (jfloat**)malloc(texCoordMapLength * sizeof(jfloat*)); - - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)(*(table->GetObjectArrayElement))(env, texCoords, i); - } - } - - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - if (geo_type == GEO_TYPE_INDEXED_TRI_STRIP_SET || - geo_type == GEO_TYPE_INDEXED_TRI_FAN_SET || - geo_type == GEO_TYPE_INDEXED_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripIndexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - - } - - /* Get vertex attribute arrays */ - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - vertexAttrPointer[i] = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, vaobjs[i], NULL); - } - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)(*(table->GetPrimitiveArrayCritical))(env,texobjs[i], NULL); - else - texCoordPointer[i] = NULL; - - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts= (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, vfcoords, NULL); - } else if (doubleCoordDefined) { - dverts= (jdouble *) (*(table->GetPrimitiveArrayCritical))(env, vdcoords, NULL); - } - - /* get color array */ - if (floatColorsDefined) { - fclrs = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, cfdata, NULL); - } else if (byteColorsDefined) { - bclrs = (jbyte *) (*(table->GetPrimitiveArrayCritical))(env, cbdata, NULL); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env,ndata, NULL); - } - -#ifdef VERBOSE - fprintf(stderr, "IndexedGeometryArrayRetained.executeIndexedGeometryVA() -- calling executeIndexedGeometryArrayVA\n"); -#endif /* VERBOSE */ - - executeIndexedGeometryArrayVA(env, - obj, - ctxInfo, - geo, - geo_type, - isNonUniformScale, - ignoreVertexColors, - initialIndexIndex, - validIndexCount, - vertexCount, - vformat, - vdefined, - fverts, - dverts, - fclrs, - bclrs, - norms, - vertexAttrCount, - vertexAttrSizes, - vertexAttrPointer, - texCoordMapLength, - tcoordsetmap, - numActiveTexUnit, - texStride, - texCoordPointer, - cdirty, - indexCoord, - sarray, - strip_len); - - if (floatCoordDefined) { - (*(table->ReleasePrimitiveArrayCritical))(env, vfcoords, fverts, 0); - } - else if (doubleCoordDefined) { - (*(table->ReleasePrimitiveArrayCritical))(env, vdcoords, dverts, 0); - } - - if (floatColorsDefined) { - (*(table->ReleasePrimitiveArrayCritical))(env, cfdata, fclrs, 0); - } - else if (byteColorsDefined) { - (*(table->ReleasePrimitiveArrayCritical))(env, cbdata, bclrs, 0); - } - - if (normalsDefined) { - (*(table->ReleasePrimitiveArrayCritical))(env, ndata, norms, 0); - } - - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - (*(table->ReleasePrimitiveArrayCritical))(env, vaobjs[i], vertexAttrPointer[i], 0); - } - } - - if (vaobjs != NULL) { - free(vaobjs); - } - if (vertexAttrPointer != NULL) { - free(vertexAttrPointer); - } - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texCoordPointer[i] != NULL) { - (*(table->ReleasePrimitiveArrayCritical))(env, texobjs[i], texCoordPointer[i], 0); - } - } - } - - if (texobjs != NULL) { - free(texobjs); - } - if (texCoordPointer != NULL) { - free(texCoordPointer); - } -} - -JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeIndexedGeometryVABuffer( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint validIndexCount, - jint vertexCount, - jint vformat, - jint vdefined, - jobject vcoords, - jobject cdataBuffer, - jfloatArray cfdata, - jbyteArray cbdata, - jobject ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jint texStride, - jobjectArray texCoords, - jint cdirty, - jintArray indexCoord) -{ - jfieldID strip_field; - jarray sarray; - jsize strip_len; - JNIEnv table; - jint i; - jclass geo_class; - - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jarray *vaobjs = NULL; - jfloat **vertexAttrPointer = NULL; - jfloat **texCoordPointer = NULL; - jarray *texobjs = NULL; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean vattrDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_VATTR_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - table = *env; - - if (vattrDefined) { - vaobjs = (jarray *)malloc(vertexAttrCount * sizeof(jarray)); - vertexAttrPointer = (jfloat **)malloc(vertexAttrCount * sizeof(jfloat *)); - - for (i = 0; i < vertexAttrCount; i++) { - vaobjs[i] = (*(table->GetObjectArrayElement))(env, vertexAttrData, i); - } - } - - if (textureDefined) { - texobjs = (jarray *)malloc(texCoordMapLength * sizeof(jarray)); - texCoordPointer = (jfloat **)malloc(texCoordMapLength * sizeof(jfloat *)); - - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)(*(table->GetObjectArrayElement))(env, texCoords, i); - } - } - - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - if (geo_type == GEO_TYPE_INDEXED_TRI_STRIP_SET || - geo_type == GEO_TYPE_INDEXED_TRI_FAN_SET || - geo_type == GEO_TYPE_INDEXED_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripIndexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - - } - - /* Get vertex attribute arrays */ - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - vertexAttrPointer[i] = (jfloat *) (*(table->GetDirectBufferAddress))(env, vaobjs[i]); - } - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)(*(table->GetDirectBufferAddress))(env,texobjs[i]); - else - texCoordPointer[i] = NULL; - - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts= (jfloat *)(*(table->GetDirectBufferAddress))(env, vcoords ); - } else if (doubleCoordDefined) { - dverts= (jdouble *)(*(table->GetDirectBufferAddress))(env, vcoords ); - } - - /* get color array */ - if (floatColorsDefined) { - if(cfdata != NULL) - fclrs = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, cfdata, NULL); - else - fclrs = (jfloat *)(*(table->GetDirectBufferAddress))(env, cdataBuffer); - } - else if (byteColorsDefined) { - if(cbdata != NULL) - bclrs = (jbyte *) (*(table->GetPrimitiveArrayCritical))(env, cbdata, NULL); - else - bclrs = (jbyte *)(*(table->GetDirectBufferAddress))(env, cdataBuffer); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *)(*(table->GetDirectBufferAddress))(env, ndata); - } - -#ifdef VERBOSE - fprintf(stderr, "IndexedGeometryArrayRetained.executeIndexedGeometryVABuffer() -- calling executeIndexedGeometryArrayVA\n"); -#endif /* VERBOSE */ - - executeIndexedGeometryArrayVA(env, - obj, - ctxInfo, - geo, - geo_type, - isNonUniformScale, - ignoreVertexColors, - initialIndexIndex, - validIndexCount, - vertexCount, - vformat, - vdefined, - fverts, - dverts, - fclrs, - bclrs, - norms, - vertexAttrCount, - vertexAttrSizes, - vertexAttrPointer, - texCoordMapLength, - tcoordsetmap, - numActiveTexUnit, - texStride, - texCoordPointer, - cdirty, - indexCoord, - sarray, - strip_len); - - if(floatColorsDefined && cfdata != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, cfdata, fclrs, 0); - else if(byteColorsDefined && cbdata != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, cbdata, bclrs, 0); - - if (vaobjs != NULL) { - free(vaobjs); - } - if (vertexAttrPointer != NULL) { - free(vertexAttrPointer); - } - - if (texobjs != NULL) { - free(texobjs); - } - if (texCoordPointer != NULL) { - free(texCoordPointer); - } -} - -JNIEXPORT void JNICALL -Java_javax_media_j3d_NativePipeline_buildIndexedGeometry( - JNIEnv *env, - jobject obj, jlong ctxInfo, jobject geo, - jint geo_type, - jboolean isNonUniformScale, jboolean updateAlpha, float alpha, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint validIndexCount, - jint vertexCount, - jint vformat, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordSetMapLen, - jintArray texUnitOffset, - jdoubleArray xform, jdoubleArray nxform, - jfloatArray varray, jintArray indexCoord) -{ - jclass geo_class; - JNIEnv table; - jboolean useAlpha = JNI_FALSE; - - jfloat *verts; - jint *indices; - jint i; - jint bstride; - jint texStride, *texCoordSetMapOffset, texSize; - GLsizei *countArray; - GLenum iaFormat; - int useInterleavedArrays; - jsize strip_len; - int primType; - jint stride, coordoff, normoff, coloroff, texCoordoff; - jfieldID strip_field; - jarray sarray; - jdouble *xform_ptr = NULL; - jdouble *nxform_ptr = NULL; - jfloat *tmpCoordArray = NULL, *tmpNormalArray = NULL; - jint* tmpDrawElementsIndices[100]; - - jint** multiDrawElementsIndices = NULL; - jint allocated = 0; - int offset = 0; - int vAttrStride = 0; - int vAttrOff; - jint *vAttrSizesPtr = NULL; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - -#ifdef VERBOSE - fprintf(stderr, "IndexedGeometryArrayRetained.buildIndexedGeometry()\n"); -#endif /* VERBOSE */ - - table = *env; - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - /* This matches the code in GeometryArrayRetained.java */ - stride = coordoff = normoff = coloroff = texCoordoff = 0; - vAttrOff = 0; - if ((vformat & GA_COORDINATES) != 0) { - glEnableClientState(GL_VERTEX_ARRAY); - stride += 3; - } - else { - glDisableClientState(GL_VERTEX_ARRAY); - } - - if ((vformat & GA_NORMALS) != 0) { - glEnableClientState(GL_NORMAL_ARRAY); - stride += 3; - coordoff += 3; - } - else { - glDisableClientState(GL_NORMAL_ARRAY); - } - - if ((vformat & GA_COLOR) != 0) { - glEnableClientState(GL_COLOR_ARRAY); - stride += 4; - normoff += 4; - coordoff += 4; - } - else { - glDisableClientState(GL_COLOR_ARRAY); - } - - if ((vformat & GA_TEXTURE_COORDINATE) != 0) { - if ((vformat & GA_TEXTURE_COORDINATE_2) != 0) { - texSize = 2; - texStride = 2 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - texSize = 3; - texStride = 3 * texCoordSetCount; - } else if ((vformat & GA_TEXTURE_COORDINATE_4) != 0) { - texSize = 4; - texStride = 4 * texCoordSetCount; - } - stride += texStride; - normoff += texStride; - coloroff += texStride; - coordoff += texStride; - } - - if ((vformat & GA_VERTEX_ATTRIBUTES) != 0) { - if (vertexAttrSizes != NULL) { - vAttrSizesPtr = table->GetIntArrayElements(env, vertexAttrSizes, NULL); - } - for (i = 0; i < vertexAttrCount; i++) { - vAttrStride += vAttrSizesPtr[i]; - } - stride += vAttrStride; - normoff += vAttrStride; - coloroff += vAttrStride; - coordoff += vAttrStride; - texCoordoff += vAttrStride; - } - - bstride = stride*sizeof(float); - - /* - * process alpha for geometryArray without alpha - */ - if (updateAlpha == JNI_TRUE && ignoreVertexColors == JNI_FALSE) { - useAlpha = JNI_TRUE; - } - - /* - * call other JNI functions before entering Critical region - * i.e., GetPrimitiveArrayCritical - */ - if (geo_type == GEO_TYPE_INDEXED_TRI_STRIP_SET || - geo_type == GEO_TYPE_INDEXED_TRI_FAN_SET || - geo_type == GEO_TYPE_INDEXED_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripIndexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - } - - - - /* begin critical region */ - verts = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, varray, NULL); - - indices = (jint *) (*(table->GetPrimitiveArrayCritical))(env, indexCoord, NULL); - - if (texCoordSetMapLen >0) { - texCoordSetMapOffset = (jint *)(*(table->GetPrimitiveArrayCritical)) - (env, texUnitOffset, NULL); - } - - - /* get the static transform if exists */ - if (xform != NULL) { - xform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, xform, NULL); - - } - - - /* get the static normals transform if exists */ - if (nxform != NULL) { - nxform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, nxform, NULL); - } - - - /* - * Check if normal is present and nxform_ptr id non-null, if yes, - * create a new normal array and apply the xform - */ - if ((vformat & GA_NORMALS) != 0 && (nxform_ptr != NULL)) { - /* create a temporary array for normals */ - tmpNormalArray = (jfloat*) malloc(vertexCount * sizeof(float) * 3); - for (i = 0; i < vertexCount*3; i+=3) { - tmpNormalArray[i] = (float) (nxform_ptr[0] * verts[normoff] + - nxform_ptr[1] * verts[normoff+1] + - nxform_ptr[2] * verts[normoff+2]); - tmpNormalArray[i+1] = (float) (nxform_ptr[4] * verts[normoff] + - nxform_ptr[5] * verts[normoff+1] + - nxform_ptr[6] * verts[normoff+2]); - tmpNormalArray[i+2] = (float) (nxform_ptr[8] * verts[normoff] + - nxform_ptr[9] * verts[normoff+1] + - nxform_ptr[10] * verts[normoff+2]); - normoff += stride; - } - } - - if ((vformat & GA_COORDINATES) != 0 && xform_ptr != NULL) { - /* create a temporary array for normals */ - tmpCoordArray = (jfloat*) malloc(vertexCount * sizeof(float) * 3); - for (i = 0; i < vertexCount*3; i+=3) { - tmpCoordArray[i] = (float) (xform_ptr[0] * verts[coordoff] + - xform_ptr[1] * verts[coordoff+1] + - xform_ptr[2] * verts[coordoff+2]); - tmpCoordArray[i+1] = (float) (xform_ptr[4] * verts[coordoff] + - xform_ptr[5] * verts[coordoff+1] + - xform_ptr[6] * verts[coordoff+2]); - tmpCoordArray[i+2] = (float) (xform_ptr[8] * verts[coordoff] + - xform_ptr[9] * verts[coordoff+1] + - xform_ptr[10] * verts[coordoff+2]); - coordoff += stride; - } - } - - - if (geo_type == GEO_TYPE_INDEXED_TRI_STRIP_SET || - geo_type == GEO_TYPE_INDEXED_TRI_FAN_SET || - geo_type == GEO_TYPE_INDEXED_LINE_STRIP_SET) { - - - switch (geo_type) { - case GEO_TYPE_INDEXED_TRI_STRIP_SET : - primType = GL_TRIANGLE_STRIP; - break; - case GEO_TYPE_INDEXED_TRI_FAN_SET : - primType = GL_TRIANGLE_FAN; - break; - case GEO_TYPE_INDEXED_LINE_STRIP_SET : - primType = GL_LINE_STRIP; - break; - } - - - countArray = (GLsizei *) (*(table->GetPrimitiveArrayCritical))(env, sarray, - NULL); - - if ((ignoreVertexColors == JNI_TRUE) || (xform_ptr != NULL) || - ((vformat & GA_TEXTURE_COORDINATE) && ((texCoordSetMapLen > 1) || - (texCoordSetCount > 1)))) { - useInterleavedArrays = 0; - } else { - INTERLEAVEDARRAYS_TEST() - } - - if (useInterleavedArrays) { - glInterleavedArrays(iaFormat, bstride, verts); - } else { - if (vformat & GA_NORMALS) { - if (nxform_ptr == NULL) { - glNormalPointer(GL_FLOAT, bstride, &(verts[normoff])); - } - else { - glNormalPointer(GL_FLOAT, 3 * sizeof(float), tmpNormalArray); - } - } - if (ignoreVertexColors == JNI_FALSE && vformat & GA_COLOR) { - if (vformat & GA_WITH_ALPHA || (useAlpha == GL_TRUE)) { - glColorPointer(4, GL_FLOAT, bstride, &(verts[coloroff])); - } else { - /* - for (i = 0; i < vcount; i++) { - fprintf(stderr, "r = %f, g = %f, b = %f\n", verts[i*bstride +coloroff], verts[i*bstride +coloroff+1],verts[i*bstride +coloroff+2]); - } - */ - glColorPointer(3, GL_FLOAT, bstride, &(verts[coloroff])); - } - } - if (vformat & GA_COORDINATES) { - if (xform_ptr == NULL) { - /* - for (i = 0; i < vcount; i++) { - fprintf(stderr, "x = %f, y = %f, z = %f\n", verts[i*bstride +coordoff], verts[i*bstride +coordoff+1],verts[i*bstride +coordoff+2]); - } - */ - glVertexPointer(3, GL_FLOAT, bstride, &(verts[coordoff])); - } - else { - glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), tmpCoordArray); - } - } - - if (vformat & GA_TEXTURE_COORDINATE) { - - executeTexture(texCoordSetMapLen, - texSize, bstride, texCoordoff, - texCoordSetMapOffset, - texCoordSetMapLen, - verts, ctxInfo); - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - jfloat *vAttrPtr = &verts[vAttrOff]; - - for (i = 0; i < vertexAttrCount; i++) { - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, vAttrSizesPtr[i], - GL_FLOAT, bstride, vAttrPtr); - vAttrPtr += vAttrSizesPtr[i]; - } - } - } - - switch (geo_type) { - case GEO_TYPE_INDEXED_TRI_STRIP_SET : - primType = GL_TRIANGLE_STRIP; - break; - case GEO_TYPE_INDEXED_TRI_FAN_SET : - primType = GL_TRIANGLE_FAN; - break; - case GEO_TYPE_INDEXED_LINE_STRIP_SET : - primType = GL_LINE_STRIP; - break; - } - - lockArray(ctxProperties, vertexCount); - - if (ctxProperties->multi_draw_arrays_ext || ctxProperties->multi_draw_arrays_sun) { - if (strip_len > 100) { - multiDrawElementsIndices = (jint**)malloc(strip_len * sizeof(int*)); - allocated = 1; - } - else { - multiDrawElementsIndices =(jint**) &tmpDrawElementsIndices; - } - - offset = initialIndexIndex; - for (i=0; i < strip_len;i++) { - multiDrawElementsIndices[i] = &indices[offset]; - offset += countArray[i]; - } - ctxProperties->glMultiDrawElementsEXT(primType, countArray, GL_UNSIGNED_INT,(const void **)multiDrawElementsIndices, strip_len); - - } else { - offset = initialIndexIndex; - for (i=0; i < strip_len;i++) { - glDrawElements(primType, countArray[i], GL_UNSIGNED_INT, &indices[offset]); - offset += countArray[i]; - } - } - (*(table->ReleasePrimitiveArrayCritical))(env, sarray, countArray, 0); - if (allocated) { - free(multiDrawElementsIndices); - } - - - } - else if ((geo_type == GEO_TYPE_INDEXED_QUAD_SET) || - (geo_type == GEO_TYPE_INDEXED_TRI_SET) || - (geo_type == GEO_TYPE_INDEXED_POINT_SET) || - (geo_type == GEO_TYPE_INDEXED_LINE_SET)) { - - switch (geo_type) { - case GEO_TYPE_INDEXED_QUAD_SET : - primType = GL_QUADS; - break; - case GEO_TYPE_INDEXED_TRI_SET : - primType = GL_TRIANGLES; - break; - case GEO_TYPE_INDEXED_POINT_SET : - primType = GL_POINTS; - break; - case GEO_TYPE_INDEXED_LINE_SET : - primType = GL_LINES; - break; - - } - - if ((ignoreVertexColors == JNI_TRUE) || (xform_ptr != NULL) || - ((vformat & GA_TEXTURE_COORDINATE) && ((texCoordSetMapLen > 1) || - (texCoordSetCount > 1)))) { - useInterleavedArrays = 0; - } else { - INTERLEAVEDARRAYS_TEST() - } - - if (useInterleavedArrays) { - glInterleavedArrays(iaFormat, bstride, verts); - } else { - if (vformat & GA_NORMALS) { - - if (nxform_ptr == NULL) { - glNormalPointer(GL_FLOAT, bstride, &(verts[normoff])); - } - else { - glNormalPointer(GL_FLOAT, 3 * sizeof(float), tmpNormalArray); - } - } - if (ignoreVertexColors == JNI_FALSE && vformat & GA_COLOR) { - if (vformat & GA_WITH_ALPHA || (useAlpha == GL_TRUE)) { - glColorPointer(4, GL_FLOAT, bstride, &(verts[coloroff])); - } else { - glColorPointer(3, GL_FLOAT, bstride, &(verts[coloroff])); - } - } - if (vformat & GA_COORDINATES) { - - if (xform_ptr == NULL) { - glVertexPointer(3, GL_FLOAT, bstride, &(verts[coordoff])); - } - else { - glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), tmpCoordArray); - } - } - - if (vformat & GA_TEXTURE_COORDINATE) { - executeTexture(texCoordSetMapLen, - texSize, bstride, texCoordoff, - texCoordSetMapOffset, - texCoordSetMapLen, - verts, ctxInfo); - } - - if (vformat & GA_VERTEX_ATTRIBUTES) { - jfloat *vAttrPtr = &verts[vAttrOff]; - - for (i = 0; i < vertexAttrCount; i++) { - ctxProperties->enableVertexAttrArray(ctxProperties, i); - ctxProperties->vertexAttrPointer(ctxProperties, i, vAttrSizesPtr[i], - GL_FLOAT, bstride, vAttrPtr); - vAttrPtr += vAttrSizesPtr[i]; - } - } - } - lockArray(ctxProperties, vertexCount); - switch (geo_type){ - case GEO_TYPE_INDEXED_QUAD_SET : glDrawElements(GL_QUADS,validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_TRI_SET : glDrawElements(GL_TRIANGLES, validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_POINT_SET : glDrawElements(GL_POINTS, validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - case GEO_TYPE_INDEXED_LINE_SET: glDrawElements(GL_LINES, validIndexCount, GL_UNSIGNED_INT, &indices[initialIndexIndex]);break; - } - } - - unlockArray(ctxProperties); - - if (vformat & GA_VERTEX_ATTRIBUTES) { - resetVertexAttrs(ctxInfo, vertexAttrCount); - } - - if (vformat & GA_TEXTURE_COORDINATE) { - resetTexture(ctxInfo); - } - - if (tmpNormalArray != NULL) { - free(tmpNormalArray); - } - if (tmpCoordArray != NULL) { - free(tmpCoordArray); - } - - (*(table->ReleasePrimitiveArrayCritical))(env, varray, verts, 0); - - (*(table->ReleasePrimitiveArrayCritical))(env, indexCoord, indices, 0); - - - if (texCoordSetMapLen > 0) - (*(table->ReleasePrimitiveArrayCritical))(env, texUnitOffset, - texCoordSetMapOffset, 0); - - if (xform_ptr != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, xform, xform_ptr, 0); - - if (nxform_ptr != NULL) - (*(table->ReleasePrimitiveArrayCritical))(env, nxform, nxform_ptr, 0); - - if (vAttrSizesPtr != NULL) { - table->ReleaseIntArrayElements(env, vertexAttrSizes, vAttrSizesPtr, JNI_ABORT); - } -} - - -/* execute geometry array with java array format */ -/* - * Class: javax_media_j3d_GeometryArrayRetained - * Method: buildGAForByRef - * Signature: (JLjavax/media/j3d/GeometryArrayRetained;IZZFZIIII[F[DI[F[BI[FI[I[I[[FI[I[II[Ljava/lang/Object;[D[D)V - */ -JNIEXPORT void JNICALL Java_javax_media_j3d_NativePipeline_buildGAForByRef( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean updateAlpha, - jfloat alpha, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jfloatArray vfcoords, - jdoubleArray vdcoords, - jint initialColorIndex, - jfloatArray cfdata, - jbyteArray cbdata, - jint initialNormalIndex, - jfloatArray ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jintArray vertexAttrIndices, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jdoubleArray xform, - jdoubleArray nxform) -{ - jclass geo_class; - JNIEnv table; - jboolean useAlpha = JNI_FALSE; - jfieldID strip_field; - jarray sarray; - jint i; - jsize strip_len; - jarray start_array; - jfieldID start_field; - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jdouble *xform_ptr = NULL; - jdouble *nxform_ptr = NULL; - jfloat *tmpFloatCoordArray = NULL, *tmpNormalArray = NULL, *tmpFloatColors = NULL; - jdouble *tmpDoubleCoordArray = NULL; - jbyte* tmpByteColors= NULL; - jfloat* fvptr = NULL, *nptr = NULL, *fcptr = NULL; - jdouble* dvptr = NULL; - jbyte* bcptr = NULL; - jarray *vaobjs = NULL; - jfloat **vertexAttrPointer = NULL; - jfloat **texCoordPointer = NULL; - jarray *texobjs = NULL; - int offset = 0; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean vattrDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_VATTR_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - - table = *env; - - if (vattrDefined) { - vaobjs = (jarray *)malloc(vertexAttrCount * sizeof(jarray)); - vertexAttrPointer = (jfloat **)malloc(vertexAttrCount * sizeof(jfloat *)); - - for (i = 0; i < vertexAttrCount; i++) { - vaobjs[i] = (*(table->GetObjectArrayElement))(env, vertexAttrData, i); - } - } - - if (textureDefined) { - texobjs = (jarray*)malloc(texCoordMapLength * sizeof(jarray)); - texCoordPointer = (jfloat**)malloc(texCoordMapLength * sizeof(jfloat*)); - - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (*(table->GetObjectArrayElement))(env, texCoords, i); - } - } - - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - /* - * process alpha for geometryArray without alpha - */ - if (updateAlpha == JNI_TRUE && ignoreVertexColors== JNI_FALSE) { - useAlpha = JNI_TRUE; - } - - /* - * call other JNI functions before entering Critical region - * i.e., GetPrimitiveArrayCritical - */ - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripVertexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - start_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripStartOffsetIndices", "[I"); - start_array = (jarray)(*(table->GetObjectField))(env, geo, - start_field); - } - - if (ignoreVertexColors == JNI_TRUE) { - vformat &= ~GA_COLOR; - floatColorsDefined = JNI_FALSE; - byteColorsDefined = JNI_FALSE; - } - - /* get vertex attr arrays */ - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - vertexAttrPointer[i] = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, vaobjs[i], NULL); - } - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)(*(table->GetPrimitiveArrayCritical))(env,texobjs[i], NULL); - else - texCoordPointer[i] = NULL; - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - glEnableClientState(GL_VERTEX_ARRAY); - fverts= (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, vfcoords, NULL); - fvptr = fverts; - } else if (doubleCoordDefined) { - glEnableClientState(GL_VERTEX_ARRAY); - dverts= (jdouble *) (*(table->GetPrimitiveArrayCritical))(env, vdcoords, NULL); - dvptr = dverts; - } - else { - glDisableClientState(GL_VERTEX_ARRAY); - } - - /* get color array */ - if (floatColorsDefined) { - glEnableClientState(GL_COLOR_ARRAY); - fclrs = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env, cfdata, NULL); - fcptr = fclrs; - } else if (byteColorsDefined) { - glEnableClientState(GL_COLOR_ARRAY); - bclrs = (jbyte *) (*(table->GetPrimitiveArrayCritical))(env, cbdata, NULL); - bcptr = bclrs; - } - else { - glDisableClientState(GL_COLOR_ARRAY); - } - /* get normal array */ - if (normalsDefined) { - glEnableClientState(GL_NORMAL_ARRAY); - norms = (jfloat *) (*(table->GetPrimitiveArrayCritical))(env,ndata, NULL); - nptr = norms; - } - else { - glDisableClientState(GL_NORMAL_ARRAY); - } - - /* get the static transform if exists */ - if (xform != NULL) { - xform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, xform, NULL); - - } - - - /* get the static normals transform if exists */ - if (nxform != NULL) { - nxform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, nxform, NULL); - } - - /* - * Check if normal is present and nxform_ptr id non-null, if yes, - * create a new normal array and apply the xform - */ - if (normalsDefined) { - if(nxform_ptr != NULL) { - /* create a temporary array for normals */ - tmpNormalArray = (jfloat*) malloc(vcount * sizeof(float) * 3); - for (i = initialNormalIndex; i < vcount*3; i+=3) { - tmpNormalArray[i] = (float) (nxform_ptr[0] * norms[i] + - nxform_ptr[1] * norms[i+1] + - nxform_ptr[2] * norms[i+2]); - tmpNormalArray[i+1] = (float) (nxform_ptr[4] * norms[i] + - nxform_ptr[5] * norms[i+1] + - nxform_ptr[6] * norms[i+2]); - tmpNormalArray[i+2] = (float) (nxform_ptr[8] * norms[i] + - nxform_ptr[9] * norms[i+1] + - nxform_ptr[10] * norms[i+2]); - } - nptr = tmpNormalArray; - } - - } - - if (xform_ptr != NULL) { - if (floatCoordDefined) { - /* create a temporary array for normals */ - tmpFloatCoordArray = (jfloat*) malloc(vcount * sizeof(float) * 3); - for (i = initialCoordIndex; i < vcount*3; i+=3) { - tmpFloatCoordArray[i] = (float) (xform_ptr[0] * fverts[i] + - xform_ptr[1] * fverts[i+1] + - xform_ptr[2] * fverts[i+2]); - tmpFloatCoordArray[i+1] = (float) (xform_ptr[4] * fverts[i] + - xform_ptr[5] * fverts[i+1] + - xform_ptr[6] * fverts[i+2]); - tmpFloatCoordArray[i+2] = (float) (xform_ptr[8] * fverts[i] + - xform_ptr[9] * fverts[i+1] + - xform_ptr[10] * fverts[i+2]); - } - fvptr = tmpFloatCoordArray; - } - else { - tmpDoubleCoordArray = (jdouble*) malloc(vcount * sizeof(double) * 3); - for (i = initialCoordIndex; i < vcount*3; i+=3) { - tmpDoubleCoordArray[i] = (double) (xform_ptr[0] * dverts[i] + - xform_ptr[1] * dverts[i+1] + - xform_ptr[2] * dverts[i+2]); - tmpDoubleCoordArray[i+1] = (double) (xform_ptr[4] * dverts[i] + - xform_ptr[5] * dverts[i+1] + - xform_ptr[6] * dverts[i+2]); - tmpDoubleCoordArray[i+2] = (double) (xform_ptr[8] * dverts[i] + - xform_ptr[9] * dverts[i+1] + - xform_ptr[10] * dverts[i+2]); - } - dvptr = tmpDoubleCoordArray; - } - - } - /* - fprintf(stderr, "floatColorsDefined = %d, useAlpha = %d\n", - floatColorsDefined,useAlpha); - */ - if (floatColorsDefined && useAlpha) { - tmpFloatColors = (jfloat*)malloc(vcount*sizeof(float) * 4); - if ((vformat & GA_WITH_ALPHA) != 0) { - /* fprintf(stderr, "with Alpha\n") */ - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpFloatColors[i] = fclrs[i]; - tmpFloatColors[i+1] = fclrs[i+1]; - tmpFloatColors[i+2] = fclrs[i+2]; - tmpFloatColors[i+3] = (float)(alpha* fclrs[i+3]); - } - } - else { - /* fprintf(stderr, "without Alpha\n") */ - int k = 0; - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpFloatColors[i] = fclrs[k++]; - tmpFloatColors[i+1] = fclrs[k++]; - tmpFloatColors[i+2] = fclrs[k++]; - tmpFloatColors[i+3] = (float)(alpha); - } - } - fcptr = tmpFloatColors; - vformat |= GA_WITH_ALPHA; - } - else if (byteColorsDefined && useAlpha) { - tmpByteColors = (jbyte*)malloc(vcount*sizeof(jbyte) * 4); - if ((vformat & GA_WITH_ALPHA) != 0) { - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpByteColors[i] = bclrs[i]; - tmpByteColors[i+1] = bclrs[i+1]; - tmpByteColors[i+2] =bclrs[i+2]; - tmpByteColors[i+3] = (jbyte) (alpha * ((int)bclrs[i+3] & 0xff)); - } - } - else { - int k = 0; - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpByteColors[i] = bclrs[k++]; - tmpByteColors[i+1] = bclrs[k++]; - tmpByteColors[i+2] =bclrs[k++]; - tmpByteColors[i+3] = (jbyte) (alpha * 255.0); - } - } - bcptr = tmpByteColors; - vformat |= GA_WITH_ALPHA; - - } - -#ifdef VERBOSE - fprintf(stderr, "GeometryArrayRetained.buildGAForByRef() -- calling executeGeometryArrayVA\n"); -#endif /* VERBOSE */ - - executeGeometryArrayVA(env, obj, ctxInfo, geo, geo_type, isNonUniformScale, - ignoreVertexColors, vcount, vformat, vdefined, - initialCoordIndex, fvptr, dvptr, initialColorIndex, - fcptr, bcptr, initialNormalIndex, - nptr, vertexAttrCount, vertexAttrSizes, - vertexAttrIndices, vertexAttrPointer, texCoordMapLength, - tcoordsetmap, texCoordMapLength, - texindices, texStride, texCoordPointer, 0, sarray, - strip_len, start_array); - - if (vattrDefined) { - for (i = 0; i < vertexAttrCount; i++) { - (*(table->ReleasePrimitiveArrayCritical))(env, vaobjs[i], vertexAttrPointer[i], 0); - } - } - - if (vaobjs != NULL) { - free(vaobjs); - } - if (vertexAttrPointer != NULL) { - free(vertexAttrPointer); - } - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texCoordPointer[i] != NULL) { - (*(table->ReleasePrimitiveArrayCritical))(env, texobjs[i], texCoordPointer[i], 0); - } - } - } - - if (texobjs != NULL) { - free(texobjs); - } - if (texCoordPointer != NULL) { - free(texCoordPointer); - } - - if (normalsDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, ndata, norms, 0); - if (tmpNormalArray != NULL) { - free(tmpNormalArray); - } - } - - - if (floatColorsDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, cfdata, fclrs, 0); - if (tmpFloatColors != NULL) { - free(tmpFloatColors); - } - } - else if (byteColorsDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, cbdata, bclrs, 0); - if (tmpByteColors != NULL) { - free(tmpByteColors); - } - } - - - if (floatCoordDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, vfcoords, fverts, 0); - if (tmpFloatCoordArray != NULL) { - free(tmpFloatCoordArray); - } - } - else if (doubleCoordDefined) { - (*env)->ReleasePrimitiveArrayCritical(env, vdcoords, dverts, 0); - if (tmpDoubleCoordArray != NULL) { - free(tmpDoubleCoordArray); - } - } -} - - -/* NOTE: NIO buffers are no longer supported in display lists. */ -#if 0 -/* execute geometry array with java array format */ -JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_buildGAForBuffer( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean updateAlpha, - jfloat alpha, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jobject vcoords, - jint initialColorIndex, - jobject cdataBuffer, - jint initialNormalIndex, - jobject ndata, - jint texCoordMapLength, - jintArray tcoordsetmap, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jdoubleArray xform, - jdoubleArray nxform) -{ - jclass geo_class; - JNIEnv table; - jboolean useAlpha = JNI_FALSE; - jfieldID strip_field; - jarray sarray; - jint i; - jsize strip_len; - jarray start_array; - jfieldID start_field; - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jdouble *xform_ptr = NULL; - jdouble *nxform_ptr = NULL; - jfloat *tmpFloatCoordArray = NULL, *tmpNormalArray = NULL, *tmpFloatColors = NULL; - jdouble *tmpDoubleCoordArray = NULL; - jbyte* tmpByteColors= NULL; - jfloat* fvptr = NULL, *nptr = NULL, *fcptr = NULL; - jdouble* dvptr = NULL; - jbyte* bcptr = NULL; - jfloat **texCoordPointer = NULL; - jarray *texobjs = NULL; - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - int offset = 0; - - GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; - jlong ctx = ctxProperties->context; - - table = *env; - - if (textureDefined) { - texobjs = (jarray*)malloc(texCoordMapLength * sizeof(jarray)); - texCoordPointer = (jfloat**)malloc(texCoordMapLength * sizeof(jfloat*)); - - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (*(table->GetObjectArrayElement))(env, texCoords, i); - } - } - - geo_class = (jclass) (*(table->GetObjectClass))(env, geo); - - - /* - * process alpha for geometryArray without alpha - */ - if (updateAlpha == JNI_TRUE && ignoreVertexColors== JNI_FALSE) { - useAlpha = JNI_TRUE; - } - - /* - * call other JNI functions before entering Critical region - * i.e., GetPrimitiveArrayCritical - */ - if (geo_type == GEO_TYPE_TRI_STRIP_SET || - geo_type == GEO_TYPE_TRI_FAN_SET || - geo_type == GEO_TYPE_LINE_STRIP_SET) { - - strip_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripVertexCounts", "[I"); - sarray = (jarray)(*(table->GetObjectField))(env, geo, strip_field); - strip_len = (jsize)(*(table->GetArrayLength))(env, sarray); - start_field = (jfieldID) (*(table->GetFieldID))(env, geo_class, - "stripStartOffsetIndices", "[I"); - start_array = (jarray)(*(table->GetObjectField))(env, geo, - start_field); - } - - if (ignoreVertexColors == JNI_TRUE) { - vformat &= ~GA_COLOR; - floatColorsDefined = JNI_FALSE; - byteColorsDefined = JNI_FALSE; - } - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)(*(table->GetPrimitiveArrayCritical))(env,texobjs[i], NULL); - else - texCoordPointer[i] = NULL; - - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - glEnableClientState(GL_VERTEX_ARRAY); - fverts= (jfloat *)(*(table->GetDirectBufferAddress))(env, vcoords ); - fvptr = fverts; - } else if (doubleCoordDefined) { - glEnableClientState(GL_VERTEX_ARRAY); - dverts= (jdouble *)(*(table->GetDirectBufferAddress))(env, vcoords ); - dvptr = dverts; - } - else { - glDisableClientState(GL_VERTEX_ARRAY); - } - - if(fverts == NULL && dverts == NULL) { - return; - } - - /* TODO KCR : get vertex attr arrays */ - - /* get color array */ - if (floatColorsDefined) { - glEnableClientState(GL_COLOR_ARRAY); - fclrs = (jfloat *)(*(table->GetDirectBufferAddress))(env, cdataBuffer); - fcptr = fclrs; - } else if (byteColorsDefined) { - glEnableClientState(GL_COLOR_ARRAY); - bclrs = (jbyte *)(*(table->GetDirectBufferAddress))(env, cdataBuffer); - bcptr = bclrs; - } - else { - glDisableClientState(GL_COLOR_ARRAY); - } - /* get normal array */ - if (normalsDefined) { - glEnableClientState(GL_NORMAL_ARRAY); - norms = (jfloat *)(*(table->GetDirectBufferAddress))(env, ndata); - nptr = norms; - } - else { - glDisableClientState(GL_NORMAL_ARRAY); - } - /* get the static transform if exists */ - if (xform != NULL) { - xform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, xform, NULL); - - } - - - /* get the static normals transform if exists */ - if (nxform != NULL) { - nxform_ptr = (jdouble *) (*(table->GetPrimitiveArrayCritical))( - env, nxform, NULL); - } - - - /* - * Check if normal is present and nxform_ptr id non-null, if yes, - * create a new normal array and apply the xform - */ - if (normalsDefined) { - if(nxform_ptr != NULL) { - /* create a temporary array for normals */ - tmpNormalArray = (jfloat*) malloc(vcount * sizeof(float) * 3); - for (i = initialNormalIndex; i < vcount*3; i+=3) { - tmpNormalArray[i] = (float) (nxform_ptr[0] * norms[i] + - nxform_ptr[1] * norms[i+1] + - nxform_ptr[2] * norms[i+2]); - tmpNormalArray[i+1] = (float) (nxform_ptr[4] * norms[i] + - nxform_ptr[5] * norms[i+1] + - nxform_ptr[6] * norms[i+2]); - tmpNormalArray[i+2] = (float) (nxform_ptr[8] * norms[i] + - nxform_ptr[9] * norms[i+1] + - nxform_ptr[10] * norms[i+2]); - } - nptr = tmpNormalArray; - } - - } - - if (xform_ptr != NULL) { - if (floatCoordDefined) { - /* create a temporary array for normals */ - tmpFloatCoordArray = (jfloat*) malloc(vcount * sizeof(float) * 3); - for (i = initialCoordIndex; i < vcount*3; i+=3) { - tmpFloatCoordArray[i] = (float) (xform_ptr[0] * fverts[i] + - xform_ptr[1] * fverts[i+1] + - xform_ptr[2] * fverts[i+2]); - tmpFloatCoordArray[i+1] = (float) (xform_ptr[4] * fverts[i] + - xform_ptr[5] * fverts[i+1] + - xform_ptr[6] * fverts[i+2]); - tmpFloatCoordArray[i+2] = (float) (xform_ptr[8] * fverts[i] + - xform_ptr[9] * fverts[i+1] + - xform_ptr[10] * fverts[i+2]); - } - fvptr = tmpFloatCoordArray; - } - else { - tmpDoubleCoordArray = (jdouble*) malloc(vcount * sizeof(double) * 3); - for (i = initialCoordIndex; i < vcount*3; i+=3) { - tmpDoubleCoordArray[i] = (double) (xform_ptr[0] * dverts[i] + - xform_ptr[1] * dverts[i+1] + - xform_ptr[2] * dverts[i+2]); - tmpDoubleCoordArray[i+1] = (double) (xform_ptr[4] * dverts[i] + - xform_ptr[5] * dverts[i+1] + - xform_ptr[6] * dverts[i+2]); - tmpDoubleCoordArray[i+2] = (double) (xform_ptr[8] * dverts[i] + - xform_ptr[9] * dverts[i+1] + - xform_ptr[10] * dverts[i+2]); - } - dvptr = tmpDoubleCoordArray; - } - - } - if (floatColorsDefined && useAlpha) { - tmpFloatColors = (jfloat*)malloc(vcount*sizeof(float) * 4); - if ((vformat & GA_WITH_ALPHA) != 0) { - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpFloatColors[i] = fclrs[i]; - tmpFloatColors[i+1] = fclrs[i+1]; - tmpFloatColors[i+2] = fclrs[i+2]; - tmpFloatColors[i+3] = (float)(alpha* fclrs[i+3]); - } - } - else { - int k = 0; - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpFloatColors[i] = fclrs[k++]; - tmpFloatColors[i+1] = fclrs[k++]; - tmpFloatColors[i+2] = fclrs[k++]; - tmpFloatColors[i+3] = (float)(alpha); - } - } - fcptr = tmpFloatColors; - vformat |= GA_WITH_ALPHA; - } - else if (byteColorsDefined && useAlpha) { - tmpByteColors = (jbyte*)malloc(vcount*sizeof(jbyte) * 4); - if ((vformat & GA_WITH_ALPHA) != 0) { - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpByteColors[i] = bclrs[i]; - tmpByteColors[i+1] = bclrs[i+1]; - tmpByteColors[i+2] =bclrs[i+2]; - tmpByteColors[i+3] = (jbyte) (alpha * ((int)bclrs[i+3] & 0xff)); - } - } - else { - int k = 0; - for (i = initialColorIndex; i < vcount*4; i+=4) { - tmpByteColors[i] = bclrs[k++]; - tmpByteColors[i+1] = bclrs[k++]; - tmpByteColors[i+2] =bclrs[k++]; - tmpByteColors[i+3] = (jbyte) (alpha * 255.0); - } - } - bcptr = tmpByteColors; - vformat |= GA_WITH_ALPHA; - - } - -#ifdef VERBOSE - fprintf(stderr, "GeometryArrayRetained.buildGAForBuffer() -- calling executeGeometryArrayVA\n"); -#endif /* VERBOSE */ - - executeGeometryArrayVA(env, obj, ctxInfo, geo, geo_type, - isNonUniformScale, ignoreVertexColors, - vcount, vformat, vdefined, initialCoordIndex, - fvptr, dvptr, initialColorIndex, - fcptr, bcptr, initialNormalIndex, - nptr, - /* TODO: vertexAttrCount, vertexAttrSizes, */ - /* TODO: vertexAttrIndices, vertexAttrPointer, */ - texCoordMapLength, - tcoordsetmap, texCoordMapLength, - texindices,texStride,texCoordPointer,0, sarray, strip_len, start_array); - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texCoordPointer[i] != NULL) { - (*(table->ReleasePrimitiveArrayCritical))(env, texobjs[i], texCoordPointer[i], 0); - } - } - } - - if (texobjs != NULL) { - free(texobjs); - } - if (texCoordPointer != NULL) { - free(texCoordPointer); - } - - if (tmpNormalArray != NULL) { - free(tmpNormalArray); - } - - - if (tmpFloatColors != NULL) { - free(tmpFloatColors); - } - else if (tmpByteColors != NULL) { - free(tmpByteColors); - } - - - if (tmpFloatCoordArray != NULL) { - free(tmpFloatCoordArray); - } - else if (tmpDoubleCoordArray != NULL) { - free(tmpFloatCoordArray); - } -} - -#endif /* 0 */ - |