aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/ogl/Canvas3D.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/native/ogl/Canvas3D.c')
-rw-r--r--src/native/ogl/Canvas3D.c1779
1 files changed, 675 insertions, 1104 deletions
diff --git a/src/native/ogl/Canvas3D.c b/src/native/ogl/Canvas3D.c
index 9c15e92..b6cb469 100644
--- a/src/native/ogl/Canvas3D.c
+++ b/src/native/ogl/Canvas3D.c
@@ -43,19 +43,18 @@ extern void throwAssert(JNIEnv *env, char *str);
static void initializeCtxInfo(JNIEnv *env, GraphicsContextPropertiesInfo* ctxInfo);
static void cleanupCtxInfo(GraphicsContextPropertiesInfo* ctxInfo);
static void disableAttribFor2D(GraphicsContextPropertiesInfo *ctxProperties);
+static void disableAttribForRaster(GraphicsContextPropertiesInfo *ctxProperties);
/*
* Class: javax_media_j3d_Canvas3D
* Method: getTextureColorTableSize
* Signature: ()I
*/
-extern int getTextureColorTableSize(
+static int getTextureColorTableSize(
JNIEnv *env,
jobject obj,
- jlong ctxInfo,
- char *extensionStr,
- int minorVersion);
-
+ GraphicsContextPropertiesInfo *ctxInfo,
+ char *extensionStr);
extern void checkGLSLShaderExtensions(
JNIEnv *env,
@@ -138,26 +137,25 @@ checkTextureExtensions(
JNIEnv *env,
jobject obj,
char *tmpExtensionStr,
- int versionNumber,
GraphicsContextPropertiesInfo* ctxInfo)
{
- if (isExtensionSupported(tmpExtensionStr, "GL_ARB_multitexture")) {
- ctxInfo->arb_multitexture = JNI_TRUE;
+ if (ctxInfo->gl13) {
ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_MULTI_TEXTURE;
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &ctxInfo->maxTextureUnits);
+ glGetIntegerv(GL_MAX_TEXTURE_UNITS, &ctxInfo->maxTextureUnits);
ctxInfo->maxTexCoordSets = ctxInfo->maxTextureUnits;
if (isExtensionSupported(tmpExtensionStr, "GL_ARB_vertex_shader")) {
glGetIntegerv(GL_MAX_TEXTURE_COORDS_ARB, &ctxInfo->maxTexCoordSets);
}
}
-
+
if(isExtensionSupported(tmpExtensionStr,"GL_SGI_texture_color_table" )){
ctxInfo->textureColorTableAvailable = JNI_TRUE;
ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_COLOR_TABLE;
/* get texture color table size */
/* need to check later */
- ctxInfo->textureColorTableSize = getTextureColorTableSize(env, obj, (jlong)ctxInfo, tmpExtensionStr, versionNumber);
+ ctxInfo->textureColorTableSize = getTextureColorTableSize(env, obj,
+ ctxInfo, tmpExtensionStr);
if (ctxInfo->textureColorTableSize <= 0) {
ctxInfo->textureColorTableAvailable = JNI_FALSE;
ctxInfo->textureExtMask &= ~javax_media_j3d_Canvas3D_TEXTURE_COLOR_TABLE;
@@ -289,13 +287,7 @@ checkTextureExtensions(
ctxInfo->combine_dot3_rgba_enum = GL_DOT3_RGBA_EXT;
}
- if (isExtensionSupported(tmpExtensionStr, "GL_ARB_texture_cube_map")) {
- ctxInfo->texture_cube_map_ext_enum = GL_TEXTURE_CUBE_MAP_ARB;
- ctxInfo->textureCubeMapAvailable = JNI_TRUE;
- ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_CUBE_MAP;
- } else if (isExtensionSupported(tmpExtensionStr, "GL_EXT_texture_cube_map")) {
- ctxInfo->texture_cube_map_ext_enum = GL_TEXTURE_CUBE_MAP_EXT;
- ctxInfo->textureCubeMapAvailable = JNI_TRUE;
+ if (ctxInfo->gl13) {
ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_CUBE_MAP;
}
@@ -374,22 +366,26 @@ checkTextureExtensions(
javax_media_j3d_Canvas3D_TEXTURE_ANISOTROPIC_FILTER;
}
- if (isExtensionSupported(tmpExtensionStr,
- "GL_ARB_texture_border_clamp")) {
- ctxInfo->texture_clamp_to_border_enum = GL_CLAMP_TO_BORDER_ARB;
- } else if (isExtensionSupported(tmpExtensionStr,
- "GL_SGIS_texture_border_clamp")) {
- ctxInfo->texture_clamp_to_border_enum = GL_CLAMP_TO_BORDER_SGIS;
+ if (ctxInfo->gl13) {
+ ctxInfo->texture_clamp_to_border_enum = GL_CLAMP_TO_BORDER;
} else {
ctxInfo->texture_clamp_to_border_enum = GL_CLAMP;
}
-
+
if (isExtensionSupported(tmpExtensionStr,
"GL_SGIX_texture_lod_bias")) {
ctxInfo->textureLodBiasAvailable = JNI_TRUE;
ctxInfo->textureExtMask |=
javax_media_j3d_Canvas3D_TEXTURE_LOD_OFFSET;
}
+
+ if (isExtensionSupported(tmpExtensionStr,
+ "GL_ARB_texture_non_power_of_two")) {
+ ctxInfo->textureNonPowerOfTwoAvailable = JNI_TRUE;
+ ctxInfo->textureExtMask |=
+ javax_media_j3d_Canvas3D_TEXTURE_NON_POWER_OF_TWO;
+ }
+
}
jboolean
@@ -433,6 +429,47 @@ getJavaBoolEnv(JNIEnv *env, char* envStr)
return (*(table->GetBooleanField))(env, obj, fieldID);
}
+jint
+getJavaIntEnv(JNIEnv *env, char* envStr)
+{
+ JNIEnv table = *env;
+ jclass cls;
+ jfieldID fieldID;
+ jobject obj;
+
+ cls = (jclass) (*(table->FindClass))(env, "javax/media/j3d/VirtualUniverse");
+
+ if (cls == NULL) {
+ return JNI_FALSE;
+ }
+
+ fieldID = (jfieldID) (*(table->GetStaticFieldID))(env, cls, "mc",
+ "Ljavax/media/j3d/MasterControl;");
+ if (fieldID == NULL) {
+ return JNI_FALSE;
+ }
+
+ obj = (*(table->GetStaticObjectField))(env, cls, fieldID);
+
+ if (obj == NULL) {
+ return JNI_FALSE;
+ }
+
+ cls = (jclass) (*(table->FindClass))(env, "javax/media/j3d/MasterControl");
+
+ if (cls == NULL) {
+ return JNI_FALSE;
+ }
+
+ fieldID = (jfieldID) (*(table->GetFieldID))(env, cls, envStr, "I");
+
+ if (fieldID == NULL ) {
+ return JNI_FALSE;
+ }
+
+ return (*(table->GetIntField))(env, obj, fieldID);
+}
+
/*
* Dummy functions for language-independent vertex attribute functions
*/
@@ -536,88 +573,96 @@ getPropertiesFromCurrentContext(
/* find out the version, major and minor version number */
extractVersionInfo(tmpVersionStr, versionNumbers);
+
/* *********************************************************/
/* setup the graphics context properties */
- /* NOTE : At some point we will want to require OpenGL 1.3 */
- /* Check for OpenGL 1.2 core or better */
- if ((versionNumbers[0] > 1) ||
- (versionNumbers[0] == 1 && versionNumbers[1] >= 2)) {
+ /*
+ * NOTE: Java 3D now requires OpenGL 1.3 for full functionality.
+ * For backwards compatibility with certain older graphics cards and
+ * drivers (e.g., the Linux DRI driver for older ATI cards),
+ * we will try to run on OpenGL 1.2 in an unsupported manner. However,
+ * we will not attempt to use OpenGL extensions for any features that
+ * are available in OpenGL 1.3, specifically multitexture, multisample,
+ * and cube map textures.
+ */
+ if (versionNumbers[0] < 1 ||
+ (versionNumbers[0] == 1 && versionNumbers[1] < 2)) {
+ jclass rte;
- if (versionNumbers[0] == 1 && versionNumbers[1] == 2) {
- fprintf(stderr,
- "Java 3D WARNING : OpenGL 1.3 will be required in the near future (GL_VERSION=%d.%d)\n",
+ fprintf(stderr,
+ "Java 3D ERROR : OpenGL 1.2 or better is required (GL_VERSION=%d.%d)\n",
versionNumbers[0], versionNumbers[1]);
+ if ((rte = (*(table->FindClass))(env, "javax/media/j3d/IllegalRenderingStateException")) != NULL) {
+ (*(table->ThrowNew))(env, rte, "GL_VERSION");
}
+ return JNI_FALSE;
+ }
+
+ if (versionNumbers[0] > 1) {
+ /* OpenGL 2.x -- set flags for 1.3 and 2.0 or greater */
+ ctxInfo->gl20 = JNI_TRUE;
+ ctxInfo->gl13 = JNI_TRUE;
+ }
+ else {
+ if (versionNumbers[1] == 2) {
+ fprintf(stderr,
+ "*********************************************************\n");
+ fprintf(stderr,
+ "*** JAVA 3D: WARNING OpenGL 1.2 is no longer supported.\n");
+ fprintf(stderr,
+ "*** Will attempt to run with reduced functionality.\n");
+ fprintf(stderr,
+ "*********************************************************\n");
+ } else {
+ // OpenGL 1.x (1.3 or greater)
+ ctxInfo->gl13 = JNI_TRUE;
+ }
+ }
+
- ctxInfo->rescale_normal_ext = JNI_TRUE;
- ctxInfo->rescale_normal_ext_enum = GL_RESCALE_NORMAL;
- ctxInfo->bgr_ext = JNI_TRUE;
- ctxInfo->bgr_ext_enum = GL_BGR;
- ctxInfo->texture3DAvailable = JNI_TRUE;
- ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_3D;
+ /* Setup function pointers for core OpenGL 1.3 features */
+
+ ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_3D;
#if defined(UNIX)
- ctxInfo->glTexImage3DEXT = (MYPFNGLTEXIMAGE3DPROC )dlsym(RTLD_DEFAULT, "glTexImage3D");
- ctxInfo->glTexSubImage3DEXT = (MYPFNGLTEXSUBIMAGE3DPROC )dlsym(RTLD_DEFAULT, "glTexSubImage3D");
+ ctxInfo->glTexImage3DEXT = (MYPFNGLTEXIMAGE3DPROC )dlsym(RTLD_DEFAULT, "glTexImage3D");
+ ctxInfo->glTexSubImage3DEXT = (MYPFNGLTEXSUBIMAGE3DPROC )dlsym(RTLD_DEFAULT, "glTexSubImage3D");
#endif
#ifdef WIN32
- ctxInfo->glTexImage3DEXT = (MYPFNGLTEXIMAGE3DPROC )wglGetProcAddress("glTexImage3D");
- ctxInfo->glTexSubImage3DEXT = (MYPFNGLTEXSUBIMAGE3DPROC )wglGetProcAddress("glTexSubImage3D");
- if ((ctxInfo->glTexImage3DEXT == NULL) || (ctxInfo->glTexSubImage3DEXT == NULL)) {
- ctxInfo->textureExtMask &= ~javax_media_j3d_Canvas3D_TEXTURE_3D;
- ctxInfo->texture3DAvailable = JNI_FALSE;
- }
+ ctxInfo->glTexImage3DEXT = (MYPFNGLTEXIMAGE3DPROC )wglGetProcAddress("glTexImage3D");
+ ctxInfo->glTexSubImage3DEXT = (MYPFNGLTEXSUBIMAGE3DPROC )wglGetProcAddress("glTexSubImage3D");
#endif
- ctxInfo->texture_3D_ext_enum = GL_TEXTURE_3D;
- ctxInfo->texture_wrap_r_ext_enum = GL_TEXTURE_WRAP_R;
- ctxInfo->texture_clamp_to_edge_enum = GL_CLAMP_TO_EDGE;
- if(isExtensionSupported(tmpExtensionStr, "GL_ARB_imaging")){
- ctxInfo->blend_color_ext = JNI_TRUE;
-
- ctxInfo->blendFunctionTable[BLEND_CONSTANT_COLOR] = GL_CONSTANT_COLOR;
+ if(isExtensionSupported(tmpExtensionStr, "GL_ARB_imaging")){
+ ctxInfo->blend_color_ext = JNI_TRUE;
+
+ ctxInfo->blendFunctionTable[BLEND_CONSTANT_COLOR] = GL_CONSTANT_COLOR;
#if defined(UNIX)
- ctxInfo->glBlendColor = (MYPFNGLBLENDCOLORPROC )dlsym(RTLD_DEFAULT, "glBlendColor");
+ ctxInfo->glBlendColor = (MYPFNGLBLENDCOLORPROC )dlsym(RTLD_DEFAULT, "glBlendColor");
#endif
#ifdef WIN32
- ctxInfo->glBlendColor = (MYPFNGLBLENDCOLORPROC )wglGetProcAddress("glBlendColor");
- if (ctxInfo->glBlendColor == NULL) {
- ctxInfo->blend_color_ext = JNI_FALSE;
- }
+ ctxInfo->glBlendColor = (MYPFNGLBLENDCOLORPROC )wglGetProcAddress("glBlendColor");
+ if (ctxInfo->glBlendColor == NULL) {
+ ctxInfo->blend_color_ext = JNI_FALSE;
+ }
#endif
- }
-
- ctxInfo->seperate_specular_color = JNI_TRUE;
- ctxInfo->light_model_color_control_enum = GL_LIGHT_MODEL_COLOR_CONTROL;
- ctxInfo->single_color_enum = GL_SINGLE_COLOR;
- ctxInfo->seperate_specular_color_enum = GL_SEPARATE_SPECULAR_COLOR;
+ }
- ctxInfo->textureLodAvailable = JNI_TRUE;
- ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_LOD_RANGE;
- ctxInfo->texture_min_lod_enum = GL_TEXTURE_MIN_LOD;
- ctxInfo->texture_max_lod_enum = GL_TEXTURE_MAX_LOD;
- ctxInfo->texture_base_level_enum = GL_TEXTURE_BASE_LEVEL;
- ctxInfo->texture_max_level_enum = GL_TEXTURE_MAX_LEVEL;
+ ctxInfo->textureLodAvailable = JNI_TRUE;
+ ctxInfo->textureExtMask |= javax_media_j3d_Canvas3D_TEXTURE_LOD_RANGE;
+ ctxInfo->texture_min_lod_enum = GL_TEXTURE_MIN_LOD;
+ ctxInfo->texture_max_lod_enum = GL_TEXTURE_MAX_LOD;
+ ctxInfo->texture_base_level_enum = GL_TEXTURE_BASE_LEVEL;
+ ctxInfo->texture_max_level_enum = GL_TEXTURE_MAX_LEVEL;
- /* ... */
- }
- else {
- jclass rte;
- fprintf(stderr,
- "Java 3D ERROR : OpenGL 1.2 or better is required (GL_VERSION=%d.%d)\n",
- versionNumbers[0], versionNumbers[1]);
- if ((rte = (*(table->FindClass))(env, "java/lang/IllegalStateException")) != NULL) {
- (*(table->ThrowNew))(env, rte, "GL_VERSION");
- }
- return JNI_FALSE;
+ /* look for OpenGL 2.0 features */
+ if (ctxInfo->gl20) {
+ ctxInfo->textureNonPowerOfTwoAvailable = JNI_TRUE;
+ ctxInfo->textureExtMask |=
+ javax_media_j3d_Canvas3D_TEXTURE_NON_POWER_OF_TWO;
}
- /*
- * TODO: Remove extension checks for those features that are core
- * in OpenGL 1.2 and just use the core feature.
- */
-
/* check extensions for remaining of 1.1 and 1.2 */
if(isExtensionSupported(tmpExtensionStr, "GL_EXT_multi_draw_arrays")){
ctxInfo->multi_draw_arrays_ext = JNI_TRUE;
@@ -632,45 +677,29 @@ getPropertiesFromCurrentContext(
ctxInfo->compiled_vertex_array_ext = JNI_TRUE;
}
-
- if(isExtensionSupported(tmpExtensionStr, "GLX_SUN_video_resize")){
- ctxInfo->videoResizeAvailable = JNI_TRUE;
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_SUN_VIDEO_RESIZE;
- }
-
if(isExtensionSupported(tmpExtensionStr, "GL_SUN_global_alpha")){
ctxInfo->global_alpha_sun = JNI_TRUE;
}
- if(isExtensionSupported(tmpExtensionStr, "GL_SUNX_constant_data")){
- ctxInfo->constant_data_sun = JNI_TRUE;
- }
-
if(isExtensionSupported(tmpExtensionStr, "GL_EXT_abgr")) {
ctxInfo->abgr_ext = JNI_TRUE;
}
-
- if(isExtensionSupported(tmpExtensionStr, "GL_ARB_transpose_matrix")) {
- ctxInfo->arb_transpose_matrix = JNI_TRUE;
- }
-#if defined(UNIX)
/*
- * setup ARB_multisample, under windows this is setup in
+ * Setup ctxInfo->multisample; under windows this is setup in
* NativeConfigTemplate when pixel format is choose
*/
- if (isExtensionSupported(tmpExtensionStr, "GL_ARB_multisample")){
- ctxInfo->arb_multisample = JNI_TRUE;
- }
+#if defined(UNIX)
+ ctxInfo->multisample = ctxInfo->gl13;
#endif
#ifdef WIN32
if(offScreen) {
- ctxInfo->arb_multisample = PixelFormatInfoPtr->offScreenHasMultisample;
+ ctxInfo->multisample = PixelFormatInfoPtr->offScreenHasMultisample;
}
else {
- ctxInfo->arb_multisample = PixelFormatInfoPtr->onScreenHasMultisample;
+ ctxInfo->multisample = PixelFormatInfoPtr->onScreenHasMultisample;
}
/*
@@ -678,8 +707,8 @@ getPropertiesFromCurrentContext(
PixelFormatInfoPtr->onScreenHasMultisample,
PixelFormatInfoPtr->offScreenHasMultisample);
- fprintf(stderr, "Canvas3D - ctxInfo->arb_multisample = %d, offScreen = %d\n",
- ctxInfo->arb_multisample, offScreen);
+ fprintf(stderr, "Canvas3D - ctxInfo->multisample = %d, offScreen = %d\n",
+ ctxInfo->multisample, offScreen);
*/
#endif
@@ -688,75 +717,43 @@ getPropertiesFromCurrentContext(
* Disable multisample by default since OpenGL will enable
* it by default if the surface is multisample capable.
*/
- if (ctxInfo->arb_multisample && !ctxInfo->implicit_multisample) {
- glDisable(GL_MULTISAMPLE_ARB);
+ if (ctxInfo->multisample && !ctxInfo->implicit_multisample) {
+ glDisable(GL_MULTISAMPLE);
}
/* Check texture extensions */
- checkTextureExtensions(env, obj, tmpExtensionStr, versionNumbers[1],
- ctxInfo);
+ checkTextureExtensions(env, obj, tmpExtensionStr, ctxInfo);
/* Check shader extensions */
- checkGLSLShaderExtensions(env, obj, tmpExtensionStr, ctxInfo, glslLibraryAvailable);
- checkCgShaderExtensions(env, obj, tmpExtensionStr, ctxInfo, cgLibraryAvailable);
-
- /* ... */
-
- /* *********************************************************/
- /* Set up rescale_normal if extension supported */
- if (ctxInfo->rescale_normal_ext ) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_EXT_RESCALE_NORMAL;
+ if (ctxInfo->gl13) {
+ checkGLSLShaderExtensions(env, obj, tmpExtensionStr, ctxInfo, glslLibraryAvailable);
+ checkCgShaderExtensions(env, obj, tmpExtensionStr, ctxInfo, cgLibraryAvailable);
+ } else {
+ /* Force shaders to be disabled, since no multitexture support */
+ char *emptyExtStr = " ";
+ checkGLSLShaderExtensions(env, obj, emptyExtStr, ctxInfo, JNI_FALSE);
+ checkCgShaderExtensions(env, obj, emptyExtStr, ctxInfo, JNI_FALSE);
}
- /* Setup the multi_draw_array */
- if(ctxInfo->multi_draw_arrays_ext) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_EXT_MULTI_DRAW_ARRAYS;
- } else if (ctxInfo->multi_draw_arrays_sun) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_SUN_MULTI_DRAW_ARRAYS;
- }
- if(ctxInfo->compiled_vertex_array_ext) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_EXT_COMPILED_VERTEX_ARRAYS;
- }
-
+ /* *********************************************************/
/* Setup GL_SUN_gloabl_alpha */
if (ctxInfo->global_alpha_sun) {
ctxInfo->extMask |= javax_media_j3d_Canvas3D_SUN_GLOBAL_ALPHA;
}
- /* Setup GL_SUNX_constant_data */
- if (ctxInfo->constant_data_sun) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_SUN_CONSTANT_DATA;
- }
-
/* Setup GL_EXT_abgr */
if (ctxInfo->abgr_ext) {
ctxInfo->extMask |= javax_media_j3d_Canvas3D_EXT_ABGR;
}
- /* Setup GL_BGR_EXT */
- if (ctxInfo->bgr_ext) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_EXT_BGR;
- }
+ /* GL_BGR is always supported */
+ ctxInfo->extMask |= javax_media_j3d_Canvas3D_EXT_BGR;
- /* Setup GL_ARB_transpose_matrix */
- if (ctxInfo->arb_transpose_matrix) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_ARB_TRANSPOSE_MATRIX;
- }
-
- /* Setup GL_EXT_separate_specular_color */
- if(ctxInfo->seperate_specular_color) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_EXT_SEPARATE_SPECULAR_COLOR;
- }
-
- if (ctxInfo->constant_data_sun) {
- /* glPixelStorei(GL_UNPACK_CONSTANT_DATA_SUNX, GL_TRUE); */
+ if(ctxInfo->multisample) {
+ ctxInfo->extMask |= javax_media_j3d_Canvas3D_MULTISAMPLE;
}
-
- if(ctxInfo->arb_multisample) {
- ctxInfo->extMask |= javax_media_j3d_Canvas3D_ARB_MULTISAMPLE;
- }
-
+
/* setup those functions pointers */
#ifdef WIN32
@@ -786,53 +783,15 @@ getPropertiesFromCurrentContext(
}
}
- if (ctxInfo->arb_multitexture) {
- ctxInfo->glClientActiveTextureARB = (MYPFNGLCLIENTACTIVETEXTUREARBPROC)wglGetProcAddress("glClientActiveTextureARB");
- ctxInfo->glMultiTexCoord2fvARB = (MYPFNGLMULTITEXCOORD2FVARBPROC)wglGetProcAddress("glMultiTexCoord2fvARB");
- ctxInfo->glMultiTexCoord3fvARB = (MYPFNGLMULTITEXCOORD3FVARBPROC)wglGetProcAddress("glMultiTexCoord3fvARB");
- ctxInfo->glMultiTexCoord4fvARB = (MYPFNGLMULTITEXCOORD4FVARBPROC)wglGetProcAddress("glMultiTexCoord4fvARB");
- ctxInfo->glActiveTextureARB = (MYPFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB");
- /*
- if (ctxInfo->glClientActiveTextureARB == NULL) {
- printf("ctxInfo->glClientActiveTextureARB == NULL\n");
- }
- if (ctxInfo->glMultiTexCoord2fvARB == NULL) {
- printf("ctxInfo->glMultiTexCoord2fvARB == NULL\n");
- }
- if (ctxInfo->glMultiTexCoord3fvARB == NULL) {
- printf("ctxInfo->glMultiTexCoord3fvARB == NULL\n");
- }
- if (ctxInfo->glMultiTexCoord4fvARB == NULL) {
- printf("ctxInfo->glMultiTexCoord4fvARB == NULL\n");
- }
- if (ctxInfo->glActiveTextureARB == NULL) {
- printf("ctxInfo->glActiveTextureARB == NULL\n");
- }
- */
- if ((ctxInfo->glClientActiveTextureARB == NULL) ||
- (ctxInfo->glMultiTexCoord2fvARB == NULL) ||
- (ctxInfo->glMultiTexCoord3fvARB == NULL) ||
- (ctxInfo->glMultiTexCoord4fvARB == NULL) ||
- (ctxInfo->glActiveTextureARB == NULL)) {
- ctxInfo->arb_multitexture = JNI_FALSE;
- }
- }
-
- if(ctxInfo->arb_transpose_matrix) {
- ctxInfo->glLoadTransposeMatrixdARB = (MYPFNGLLOADTRANSPOSEMATRIXDARBPROC)wglGetProcAddress("glLoadTransposeMatrixdARB");
- ctxInfo->glMultTransposeMatrixdARB = (MYPFNGLMULTTRANSPOSEMATRIXDARBPROC)wglGetProcAddress("glMultTransposeMatrixdARB");
- /*
- if (ctxInfo->glLoadTransposeMatrixdARB == NULL) {
- printf("ctxInfo->glLoadTransposeMatrixdARB == NULL\n");
- }
- if (ctxInfo->glMultTransposeMatrixdARB == NULL) {
- printf("ctxInfo->glMultTransposeMatrixdARB == NULL\n");
- }
- */
- if ((ctxInfo->glLoadTransposeMatrixdARB == NULL) ||
- (ctxInfo->glMultTransposeMatrixdARB == NULL)) {
- ctxInfo->arb_transpose_matrix = JNI_FALSE;
- }
+ if (ctxInfo->gl13) {
+ ctxInfo->glClientActiveTexture = (MYPFNGLCLIENTACTIVETEXTUREPROC)wglGetProcAddress("glClientActiveTexture");
+ ctxInfo->glActiveTexture = (MYPFNGLACTIVETEXTUREPROC) wglGetProcAddress("glActiveTexture");
+ ctxInfo->glMultiTexCoord2fv = (MYPFNGLMULTITEXCOORD2FVPROC)wglGetProcAddress("glMultiTexCoord2fv");
+ ctxInfo->glMultiTexCoord3fv = (MYPFNGLMULTITEXCOORD3FVPROC)wglGetProcAddress("glMultiTexCoord3fv");
+ ctxInfo->glMultiTexCoord4fv = (MYPFNGLMULTITEXCOORD4FVPROC)wglGetProcAddress("glMultiTexCoord4fv");
+
+ ctxInfo->glLoadTransposeMatrixd = (MYPFNGLLOADTRANSPOSEMATRIXDPROC)wglGetProcAddress("glLoadTransposeMatrixd");
+ ctxInfo->glMultTransposeMatrixd = (MYPFNGLMULTTRANSPOSEMATRIXDPROC)wglGetProcAddress("glMultTransposeMatrixd");
}
if (ctxInfo->global_alpha_sun) {
@@ -878,35 +837,24 @@ getPropertiesFromCurrentContext(
}
}
- if(ctxInfo->arb_multitexture){
- ctxInfo->glClientActiveTextureARB =
- (MYPFNGLCLIENTACTIVETEXTUREARBPROC)dlsym(RTLD_DEFAULT, "glClientActiveTextureARB");
- ctxInfo->glMultiTexCoord2fvARB =
- (MYPFNGLMULTITEXCOORD2FVARBPROC)dlsym(RTLD_DEFAULT, "glMultiTexCoord2fvARB");
- ctxInfo->glMultiTexCoord3fvARB =
- (MYPFNGLMULTITEXCOORD3FVARBPROC)dlsym(RTLD_DEFAULT, "glMultiTexCoord3fvARB");
- ctxInfo->glMultiTexCoord4fvARB =
- (MYPFNGLMULTITEXCOORD4FVARBPROC)dlsym(RTLD_DEFAULT, "glMultiTexCoord4fvARB");
- ctxInfo->glActiveTextureARB =
- (MYPFNGLACTIVETEXTUREARBPROC)dlsym(RTLD_DEFAULT, "glActiveTextureARB");
- if ((ctxInfo->glClientActiveTextureARB == NULL) ||
- (ctxInfo->glMultiTexCoord2fvARB == NULL) ||
- (ctxInfo->glMultiTexCoord3fvARB == NULL) ||
- (ctxInfo->glMultiTexCoord4fvARB == NULL) ||
- (ctxInfo->glActiveTextureARB == NULL)) {
- ctxInfo->arb_multitexture = JNI_FALSE;
- }
- }
- if(ctxInfo->arb_transpose_matrix) {
- ctxInfo->glLoadTransposeMatrixdARB =
- (MYPFNGLLOADTRANSPOSEMATRIXDARBPROC)dlsym(RTLD_DEFAULT, "glLoadTransposeMatrixdARB");
- ctxInfo->glMultTransposeMatrixdARB =
- (MYPFNGLMULTTRANSPOSEMATRIXDARBPROC)dlsym(RTLD_DEFAULT, "glMultTransposeMatrixdARB");
- if ((ctxInfo->glLoadTransposeMatrixdARB == NULL) ||
- (ctxInfo->glMultTransposeMatrixdARB == NULL)) {
- ctxInfo->arb_transpose_matrix = JNI_FALSE;
- }
+ if(ctxInfo->gl13){
+ ctxInfo->glClientActiveTexture =
+ (MYPFNGLCLIENTACTIVETEXTUREPROC)dlsym(RTLD_DEFAULT, "glClientActiveTexture");
+ ctxInfo->glMultiTexCoord2fv =
+ (MYPFNGLMULTITEXCOORD2FVPROC)dlsym(RTLD_DEFAULT, "glMultiTexCoord2fv");
+ ctxInfo->glMultiTexCoord3fv =
+ (MYPFNGLMULTITEXCOORD3FVPROC)dlsym(RTLD_DEFAULT, "glMultiTexCoord3fv");
+ ctxInfo->glMultiTexCoord4fv =
+ (MYPFNGLMULTITEXCOORD4FVPROC)dlsym(RTLD_DEFAULT, "glMultiTexCoord4fv");
+ ctxInfo->glActiveTexture =
+ (MYPFNGLACTIVETEXTUREPROC)dlsym(RTLD_DEFAULT, "glActiveTexture");
+
+ ctxInfo->glLoadTransposeMatrixd =
+ (MYPFNGLLOADTRANSPOSEMATRIXDPROC)dlsym(RTLD_DEFAULT, "glLoadTransposeMatrixd");
+ ctxInfo->glMultTransposeMatrixd =
+ (MYPFNGLMULTTRANSPOSEMATRIXDPROC)dlsym(RTLD_DEFAULT, "glMultTransposeMatrixd");
}
+
if(ctxInfo->global_alpha_sun) {
ctxInfo->glGlobalAlphaFactorfSUN =
(MYPFNGLGLOBALALPHAFACTORFSUNPROC)dlsym(RTLD_DEFAULT, "glGlobalAlphaFactorfSUN");
@@ -914,15 +862,6 @@ getPropertiesFromCurrentContext(
ctxInfo->global_alpha_sun = JNI_FALSE;
}
}
-
- if(ctxInfo->videoResizeAvailable) {
- ctxInfo->glXVideoResizeSUN =
- (MYPFNGLXVIDEORESIZESUN)dlsym(RTLD_DEFAULT, "glXVideoResizeSUN");
- if (ctxInfo->glXVideoResizeSUN == NULL) {
- ctxInfo->videoResizeAvailable = JNI_FALSE;
- ctxInfo->extMask &= ~javax_media_j3d_Canvas3D_SUN_VIDEO_RESIZE;
- }
- }
#endif /* UNIX */
@@ -950,22 +889,20 @@ void setupCanvasProperties(
/* set the canvas.multiTexAccelerated flag */
rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "multiTexAccelerated", "Z");
- (*(table->SetBooleanField))(env, obj, rsc_field, ctxInfo->arb_multitexture);
-
- if (ctxInfo->arb_multitexture) {
- rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxTextureUnits", "I");
- (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxTextureUnits);
- rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxTexCoordSets", "I");
- (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxTexCoordSets);
- rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxTextureImageUnits", "I");
- (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxTextureImageUnits);
- rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxVertexTextureImageUnits", "I");
- (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxVertexTextureImageUnits);
- rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxCombinedTextureImageUnits", "I");
- (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxCombinedTextureImageUnits);
- rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxVertexAttrs", "I");
- (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxVertexAttrs);
- }
+ (*(table->SetBooleanField))(env, obj, rsc_field, ctxInfo->gl13);
+
+ rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxTextureUnits", "I");
+ (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxTextureUnits);
+ rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxTexCoordSets", "I");
+ (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxTexCoordSets);
+ rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxTextureImageUnits", "I");
+ (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxTextureImageUnits);
+ rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxVertexTextureImageUnits", "I");
+ (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxVertexTextureImageUnits);
+ rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxCombinedTextureImageUnits", "I");
+ (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxCombinedTextureImageUnits);
+ rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "maxVertexAttrs", "I");
+ (*(table->SetIntField))(env, obj, rsc_field, ctxInfo->maxVertexAttrs);
rsc_field = (jfieldID) (*(table->GetFieldID))(env, cv_class, "extensionsSupported", "I");
(*(table->SetIntField))(env, obj, rsc_field, ctxInfo->extMask);
@@ -1025,11 +962,11 @@ void setupCanvasProperties(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_destroyContext(
+void JNICALL Java_javax_media_j3d_NativePipeline_destroyContext(
JNIEnv *env,
- jclass cl,
+ jobject obj,
jlong display,
- jint window,
+ jlong window,
jlong ctxInfo)
{
GraphicsContextPropertiesInfo* s = (GraphicsContextPropertiesInfo* )ctxInfo;
@@ -1075,12 +1012,12 @@ LONG WINAPI WndProc( HWND hWnd, UINT msg,
JNIEXPORT
-jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext(
+jlong JNICALL Java_javax_media_j3d_NativePipeline_createNewContext(
JNIEnv *env,
jobject obj,
+ jobject cv,
jlong display,
- jint window,
- jint vid,
+ jlong window,
jlong fbConfigListPtr,
jlong sharedCtxInfo,
jboolean isSharedCtx,
@@ -1092,9 +1029,6 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext(
jlong sharedCtx;
int stencilSize=0;
- static GLboolean first_time = GL_TRUE;
- static GLboolean force_normalize = GL_FALSE;
-
GraphicsContextPropertiesInfo *ctxInfo = NULL;
GraphicsContextPropertiesInfo *sharedCtxStructure;
int PixelFormatID=0;
@@ -1133,7 +1067,7 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext(
else if((fbConfigList == NULL) || (fbConfigList[0] == NULL)) {
/*
* fbConfig must be a valid pointer to an GLXFBConfig struct returned
- * by glXChooseFBConfig() for a physical screen. The visual id in vid
+ * by glXChooseFBConfig() for a physical screen. The visual id
* is not sufficient for handling OpenGL with Xinerama mode disabled:
* it doesn't distinguish between the physical screens making up the
* virtual screen when the X server is running in Xinerama mode.
@@ -1186,7 +1120,7 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext(
/*
fprintf(stderr, "Canvas3D_createNewContext: \n");
- fprintf(stderr, "vid %d window 0x%x\n", vid, window);
+ fprintf(stderr, "window 0x%x\n", window);
*/
if(sharedCtxInfo == 0)
sharedCtx = 0;
@@ -1198,11 +1132,7 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext(
hdc = (HDC) window;
/* Need to handle onScreen and offScreen differently */
- /* vid is for onScreen and fbConfigListPtr is for offScreen */
- /*
- * vid must be a PixelFormat returned
- * by wglChoosePixelFormat() or wglChoosePixelFormatARB.
- */
+ /* fbConfigListPtr has both an on-screen and off-screen pixel format */
if(!offScreen) { /* Fix to issue 104 */
if ((PixelFormatInfoPtr == NULL) || (PixelFormatInfoPtr->onScreenPFormat <= 0)) {
@@ -1268,53 +1198,41 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext(
initializeCtxInfo(env, ctxInfo);
ctxInfo->context = gctx;
- if (!getPropertiesFromCurrentContext(env, obj, ctxInfo, (jlong) hdc, PixelFormatID,
+ if (!getPropertiesFromCurrentContext(env, cv, ctxInfo, (jlong) hdc, PixelFormatID,
fbConfigListPtr, offScreen,
glslLibraryAvailable, cgLibraryAvailable)) {
return 0;
}
-
/* setup structure */
if(!isSharedCtx){
/* Setup field in Java side */
- setupCanvasProperties(env, obj, ctxInfo);
- }
-
- /* Set up rescale_normal if extension supported */
- if (first_time && getJavaBoolEnv(env, "isForceNormalized")) {
- force_normalize = GL_TRUE;
- first_time = GL_FALSE;
+ setupCanvasProperties(env, cv, ctxInfo);
}
- if (force_normalize) {
- /* Disable rescale normal */
- ctxInfo->rescale_normal_ext = GL_FALSE;
- }
-
- if (ctxInfo->rescale_normal_ext ) {
- glEnable(ctxInfo->rescale_normal_ext_enum);
- }
- else {
- glEnable(GL_NORMALIZE);
- }
+ /* Enable rescale normal */
+ glEnable(GL_RESCALE_NORMAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
glDepthFunc(GL_LEQUAL);
glEnable(GL_COLOR_MATERIAL);
glReadBuffer(GL_FRONT);
+
+ /* Java 3D images are aligned to 1 byte */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
return ((jlong)ctxInfo);
}
JNIEXPORT
-jboolean JNICALL Java_javax_media_j3d_Canvas3D_useCtx(
+jboolean JNICALL Java_javax_media_j3d_NativePipeline_useCtx(
JNIEnv *env,
- jclass cl,
+ jobject obj,
jlong ctxInfo,
jlong display,
- jint window)
+ jlong window)
{
GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
jlong ctx = ctxProperties->context;
@@ -1351,7 +1269,7 @@ jboolean JNICALL Java_javax_media_j3d_Canvas3D_useCtx(
}
JNIEXPORT
-jint JNICALL Java_javax_media_j3d_Canvas3D_getNumCtxLights(
+jint JNICALL Java_javax_media_j3d_NativePipeline_getNumCtxLights(
JNIEnv *env,
jobject obj,
jlong ctxInfo)
@@ -1362,112 +1280,8 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_getNumCtxLights(
return((jint)nlights);
}
-
-
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_composite(
- JNIEnv *env,
- jobject obj,
- jlong ctxInfo,
- jint px,
- jint py,
- jint minX,
- jint minY,
- jint maxX,
- jint maxY,
- jint rasWidth,
- jbyteArray imageYdown,
- jint winWidth,
- jint winHeight)
-{
- GLenum gltype;
- JNIEnv table;
- jbyte *byteData;
- GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
- jlong ctx = ctxProperties->context;
-
- table = *env;
-
-#ifdef VERBOSE
- fprintf(stderr, "Canvas3D.composite()\n");
-#endif
- /* Temporarily disable fragment and most 3D operations */
- /* XXXX: the GL_TEXTURE_BIT may not be necessary here */
- glPushAttrib(GL_ENABLE_BIT|GL_TEXTURE_BIT|GL_DEPTH_BUFFER_BIT);
- disableAttribFor2D(ctxProperties);
-
- glEnable(GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- /* loaded identity modelview and projection matrix */
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0.0, (double)winWidth, 0.0, (double)winHeight, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- /* start from upper left corner */
- glRasterPos2i(px + minX, winHeight-(py + minY));
-
- glPixelZoom(1.0, -1.0);
-
- byteData = (jbyte *)(*(table->GetPrimitiveArrayCritical))(env,
- imageYdown,
- NULL);
- /* if abgr_ext is supported then the data will be in that format */
- if (ctxProperties->abgr_ext) {
- gltype = GL_ABGR_EXT;
- } else {
- gltype = GL_RGBA;
- }
-
- /*
- * set the actual width of data which is the width of the canvas
- * because what needs to be drawn may be smaller than the canvas
- */
- glPixelStorei(GL_UNPACK_ROW_LENGTH, rasWidth);
-
- /*
- * we only need to skip pixels if width of the area to draw is smaller
- * than the width of the raster
- */
-
- /*
- * skip this many rows in the data because the size of what
- * needs to be drawn may be smaller than the canvas
- */
- glPixelStorei(GL_UNPACK_SKIP_ROWS, minY);
- /*
- * skip this many pixels in the data before drawing because
- * the size of what needs to be drawn may be smaller than the
- * canvas
- */
- glPixelStorei(GL_UNPACK_SKIP_PIXELS, minX);
-
-
- glDrawPixels(maxX - minX, maxY - minY,
- gltype, GL_UNSIGNED_BYTE, byteData);
-
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
- glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
-
- glMatrixMode(GL_PROJECTION);
-
- glLoadIdentity();
-
- (*(table->ReleasePrimitiveArrayCritical))(env, imageYdown, byteData, 0);
-
- /* Java 3D always clears the Z-buffer */
- glDepthMask(GL_TRUE);
- glClear(GL_DEPTH_BUFFER_BIT);
-
- glPopAttrib();
-}
-
-
-JNIEXPORT
-jboolean JNICALL Java_javax_media_j3d_Canvas3D_initTexturemapping(
+jboolean JNICALL Java_javax_media_j3d_NativePipeline_initTexturemapping(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -1505,7 +1319,7 @@ jboolean JNICALL Java_javax_media_j3d_Canvas3D_initTexturemapping(
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_texturemapping(
+void JNICALL Java_javax_media_j3d_NativePipeline_texturemapping(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -1545,7 +1359,6 @@ void JNICALL Java_javax_media_j3d_Canvas3D_texturemapping(
/* glGetIntegerv(GL_TEXTURE_BINDING_2D,&binding); */
glDepthMask(GL_FALSE);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, objectId);
/* set up texture parameter */
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@@ -1581,10 +1394,10 @@ void JNICALL Java_javax_media_j3d_Canvas3D_texturemapping(
gltype = GL_ABGR_EXT;
} else {
switch (format) {
- case FORMAT_BYTE_RGBA:
+ case IMAGE_FORMAT_BYTE_RGBA:
gltype = GL_RGBA;
break;
- case FORMAT_BYTE_RGB:
+ case IMAGE_FORMAT_BYTE_RGB:
gltype = GL_RGB;
break;
}
@@ -1637,522 +1450,277 @@ void JNICALL Java_javax_media_j3d_Canvas3D_texturemapping(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_clear(
- JNIEnv *env,
- jobject obj,
- jlong ctxInfo,
- jfloat r,
- jfloat g,
- jfloat b,
- jint winWidth,
- jint winHeight,
- jobject pa2d,
- jint imageScaleMode,
- jbyteArray pixels_obj)
-
-{
- jclass pa2d_class;
- jfieldID format_field, width_field, height_field;
- int format, width, height;
- GLubyte * pixels;
- JNIEnv table;
- GLenum gltype;
- float xzoom, yzoom, zoom;
- float rasterX, rasterY;
- int repeatX, repeatY, i, j;
- int row_length, skip_pixels, skip_rows, subwidth, subheight;
+void JNICALL Java_javax_media_j3d_NativePipeline_clear(JNIEnv *env,
+ jobject obj,
+ jlong ctxInfo,
+ jfloat r,
+ jfloat g,
+ jfloat b)
+{
GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
- jlong ctx = ctxProperties->context;
- table = *env;
-
-#ifdef VERBOSE
- fprintf(stderr, "Canvas3D.clear()\n");
-#endif
+ jlong ctx = ctxProperties->context;
- if(!pa2d) {
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
- }
- else {
- /* Do a cool image blit */
- pa2d_class = (jclass) (*(table->GetObjectClass))(env, pa2d);
- format_field = (jfieldID) (*(table->GetFieldID))(env, pa2d_class,
- "storedYdownFormat", "I");
- width_field = (jfieldID) (*(table->GetFieldID))(env, pa2d_class,
- "width", "I");
- height_field = (jfieldID) (*(table->GetFieldID))(env, pa2d_class,
- "height", "I");
-
- format = (int) (*(table->GetIntField))(env, pa2d, format_field);
- width = (int) (*(table->GetIntField))(env, pa2d, width_field);
- height = (int) (*(table->GetIntField))(env, pa2d, height_field);
-
- pixels = (GLubyte *) (*(table->GetPrimitiveArrayCritical))(env,
- pixels_obj, NULL);
-
- /* Temporarily disable fragment and most 3D operations */
- /* XXXX: the GL_TEXTURE_BIT may not be necessary */
- glPushAttrib(GL_ENABLE_BIT|GL_TEXTURE_BIT);
- disableAttribFor2D(ctxProperties);
-
- /* loaded identity modelview and projection matrix */
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- switch (format) {
- case FORMAT_BYTE_RGBA:
- gltype = GL_RGBA;
- break;
- case FORMAT_BYTE_RGB:
- gltype = GL_RGB;
- break;
-
- case FORMAT_BYTE_ABGR:
- if (ctxProperties->abgr_ext) { /* If its zero, should never come here! */
- gltype = GL_ABGR_EXT;
- }
- break;
-
- case FORMAT_BYTE_BGR:
- if (ctxProperties->bgr_ext) { /* If its zero, should never come here! */
- gltype = ctxProperties->bgr_ext_enum ;
- }
- break;
-
- case FORMAT_BYTE_LA:
- gltype = GL_LUMINANCE_ALPHA;
- break;
- case FORMAT_BYTE_GRAY:
- case FORMAT_USHORT_GRAY:
- default:
- throwAssert(env, "illegal format");
- break;
- }
-
- /* start from upper left corner */
- glRasterPos3f(-1.0, 1.0, 0.0);
-
- /* setup the pixel zoom */
- xzoom = (float)winWidth/width;
- yzoom = (float)winHeight/height;
- switch(imageScaleMode){
- case javax_media_j3d_Background_SCALE_NONE:
- if(xzoom > 1.0f || yzoom > 1.0f)
- {
- /* else don't need to clear the background with background color */
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
- }
- glPixelZoom(1.0, -1.0);
- glDrawPixels(width, height, gltype, GL_UNSIGNED_BYTE,
- pixels);
-
- break;
- case javax_media_j3d_Background_SCALE_FIT_MIN:
- if(xzoom != yzoom ) {
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
- }
- zoom = xzoom < yzoom? xzoom:yzoom;
- glPixelZoom(zoom, -zoom);
- glDrawPixels(width, height, gltype, GL_UNSIGNED_BYTE,
- pixels);
- break;
- case javax_media_j3d_Background_SCALE_FIT_MAX:
- zoom = xzoom > yzoom? xzoom:yzoom;
- glPixelZoom(zoom, -zoom);
- glDrawPixels(width, height, gltype, GL_UNSIGNED_BYTE,
- pixels);
-
- break;
- case javax_media_j3d_Background_SCALE_FIT_ALL:
- glPixelZoom(xzoom, -yzoom);
- glDrawPixels(width, height, gltype, GL_UNSIGNED_BYTE,
- pixels);
- break;
- case javax_media_j3d_Background_SCALE_REPEAT:
- glPixelZoom(1.0, -1.0);
- /* get those raster positions */
- repeatX = winWidth/width;
- if(repeatX * width < winWidth)
- repeatX++;
- repeatY = winHeight/height;
- if(repeatY * height < winHeight)
- repeatY++;
- for(i = 0; i < repeatX; i++)
- for(j = 0; j < repeatY; j++) {
- rasterX = -1.0f + (float)width/winWidth * i * 2;
- rasterY = 1.0f - (float)height/winHeight * j * 2;
- glRasterPos3f(rasterX, rasterY, 0.0);
- glDrawPixels(width, height, gltype, GL_UNSIGNED_BYTE,
- pixels);
- }
- break;
-
- case javax_media_j3d_Background_SCALE_NONE_CENTER:
- if(xzoom > 1.0f || yzoom > 1.0f){
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
- }
- if(xzoom >= 1.0f){
- rasterX = -(float)width/winWidth;
- subwidth = width;
- }
- else {
- rasterX = -1.0;
- row_length = width;
- glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);
- skip_pixels = (width-winWidth)/2;
- glPixelStorei(GL_UNPACK_SKIP_PIXELS, skip_pixels);
- subwidth = winWidth;
- }
- if(yzoom >= 1.0f){
- rasterY = (float)height/winHeight;
- subheight = height;
- }
- else {
- rasterY = 1.0f;
- skip_rows = (height-winHeight)/2;
- glPixelStorei(GL_UNPACK_SKIP_ROWS, skip_rows);
- subheight = winHeight;
- }
- glRasterPos3f(rasterX, rasterY, 0.0);
- glPixelZoom(1.0, -1.0);
- glDrawPixels(subwidth, subheight, gltype, GL_UNSIGNED_BYTE,
- pixels);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
- glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
- break;
- }
+#ifdef VERBOSE
+ fprintf(stderr, "Canvas3D.clear()\n");
+#endif
+
+ glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
+ glClear(GL_COLOR_BUFFER_BIT);
- /* Restore attributes */
- glPopAttrib();
-
- (*(table->ReleasePrimitiveArrayCritical))(env, pixels_obj,
- (jbyte *)pixels, 0);
- }
/* Java 3D always clears the Z-buffer */
glPushAttrib(GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
glClear(GL_DEPTH_BUFFER_BIT);
glPopAttrib();
+
+#if 0
+
+ /* Java 3D always clears the Z-buffer */
+ glPushAttrib(GL_DEPTH_BUFFER_BIT);
+ glDepthMask(GL_TRUE);
+ glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
+ glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+ glPopAttrib();
+#endif
+
+
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_textureclear(JNIEnv *env,
+void JNICALL Java_javax_media_j3d_NativePipeline_textureFillBackground(JNIEnv *env,
jobject obj,
jlong ctxInfo,
- jint maxX,
- jint maxY,
- jfloat r,
- jfloat g,
- jfloat b,
- jint winWidth,
- jint winHeight,
- jint objectId,
- jint imageScaleMode,
- jobject pa2d,
- jboolean update)
+ jfloat texMinU,
+ jfloat texMaxU,
+ jfloat texMinV,
+ jfloat texMaxV,
+ jfloat mapMinX,
+ jfloat mapMaxX,
+ jfloat mapMinY,
+ jfloat mapMaxY)
{
- jclass pa2d_class;
- jfieldID pixels_field, format_field, width_field, height_field;
- jbyteArray pixels_obj;
- int format, width, height;
- GLubyte * pixels;
JNIEnv table;
- GLenum gltype;
- GLfloat texMinU, texMinV, texMaxU, texMaxV, adjustV;
- GLfloat mapMinX, mapMinY, mapMaxX, mapMaxY;
- GLfloat halfWidth, halfHeight;
- float xzoom, yzoom, zoom;
- int i, j;
GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
jlong ctx = ctxProperties->context;
- table = *env;
-
- /* update = 1; */
+ table = *env;
#ifdef VERBOSE
- fprintf(stderr, "Canvas3D.textureclear()\n");
-#endif
- if(!pa2d){
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
- }
- /* glPushAttrib(GL_DEPTH_BUFFER_BIT); */
- if (pa2d) {
- /* Do a cool image blit */
- pa2d_class = (jclass) (*(table->GetObjectClass))(env, pa2d);
-
- pixels_field = (jfieldID) (*(table->GetFieldID))(env, pa2d_class,
- "imageYup", "[B");
- format_field = (jfieldID) (*(table->GetFieldID))(env, pa2d_class,
- "storedYupFormat", "I");
- pixels_obj = (jbyteArray)(*(table->GetObjectField))(env, pa2d,
- pixels_field);
-
- width_field = (jfieldID) (*(table->GetFieldID))(env, pa2d_class,
- "width", "I");
- height_field = (jfieldID) (*(table->GetFieldID))(env, pa2d_class,
- "height", "I");
+ fprintf(stderr, "Canvas3D.textureFillBackground()\n");
+#endif
+ /* Temporarily disable fragment and most 3D operations */
+ glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_POLYGON_BIT);
- format = (int) (*(table->GetIntField))(env, pa2d, format_field);
- width = (int) (*(table->GetIntField))(env, pa2d, width_field);
- height = (int) (*(table->GetIntField))(env, pa2d, height_field);
- pixels = (GLubyte *) (*(table->GetPrimitiveArrayCritical))(env,
- pixels_obj, NULL);
+ disableAttribFor2D(ctxProperties);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_TEXTURE_2D);
-#ifdef VERBOSE
- fprintf(stderr, "width = %d height = %d \n", width, height);
-#endif
-
- /* Temporarily disable fragment and most 3D operations */
- glPushAttrib(GL_ENABLE_BIT|GL_TEXTURE_BIT|GL_POLYGON_BIT);
- disableAttribFor2D(ctxProperties);
+ /* reset the polygon mode */
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- Java_javax_media_j3d_Canvas3D_resetTexCoordGeneration(env, obj, ctxInfo);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glEnable(GL_TEXTURE_2D);
+ /* loaded identity modelview and projection matrix */
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glLoadIdentity();
+
+#ifdef VERBOSE
+ printf("(texMinU,texMinV,texMaxU,texMaxV) = (%3.2f,%3.2f,%3.2f,%3.2f)\n",
+ texMinU,texMinV,texMaxU,texMaxV);
+ printf("(mapMinX,mapMinY,mapMaxX,mapMaxY) = (%3.2f,%3.2f,%3.2f,%3.2f)\n",
+ mapMinX,mapMinY,mapMaxX,mapMaxY);
+#endif
+
+ glBegin(GL_QUADS);
+ glTexCoord2f((float) texMinU, (float) texMinV);
+ glVertex2f((float) mapMinX, (float) mapMinY);
+ glTexCoord2f((float) texMaxU, (float) texMinV);
+ glVertex2f((float) mapMaxX, (float) mapMinY);
+ glTexCoord2f((float) texMaxU, (float) texMaxV);
+ glVertex2f((float) mapMaxX, (float) mapMaxY);
+ glTexCoord2f((float) texMinU, (float) texMaxV);
+ glVertex2f((float) mapMinX, (float) mapMaxY);
+ glEnd();
+
+ /* Restore texture Matrix transform */
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+ /* Restore attributes */
+ glPopAttrib();
+}
+
+JNIEXPORT
+void JNICALL Java_javax_media_j3d_NativePipeline_textureFillRaster(JNIEnv *env,
+ jobject obj,
+ jlong ctxInfo,
+ jfloat texMinU,
+ jfloat texMaxU,
+ jfloat texMinV,
+ jfloat texMaxV,
+ jfloat mapMinX,
+ jfloat mapMaxX,
+ jfloat mapMinY,
+ jfloat mapMaxY,
+ jfloat mapZ,
+ jfloat alpha)
+{
+ JNIEnv table;
+ GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
+ jlong ctx = ctxProperties->context;
+
+ table = *env;
+
+#ifdef VERBOSE
+ fprintf(stderr, "Canvas3D.textureFillRaster()\n");
+#endif
+ /* Temporarily disable fragment and most 3D operations */
+ glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_POLYGON_BIT |
+ GL_CURRENT_BIT);
+
+ disableAttribForRaster(ctxProperties);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glColor4f(1.0f, 1.0f, 1.0f, (float) alpha);
- /* reset the polygon mode */
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ /* reset the polygon mode */
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glDepthMask(GL_FALSE);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glBindTexture(GL_TEXTURE_2D, objectId);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- /* set up texture parameter */
- if(update){
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- }
+ /* loaded identity modelview and projection matrix */
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
+
#ifdef VERBOSE
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
-#endif
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-
-
-
- if(update){
- switch (format) {
- case FORMAT_BYTE_RGBA:
- gltype = GL_RGBA;
-#ifdef VERBOSE
- fprintf(stderr, "FORMAT_BYTE_RGBA\n");
+ printf("(texMinU,texMinV,texMaxU,texMaxV) = (%3.2f,%3.2f,%3.2f,%3.2f)\n",
+ texMinU,texMinV,texMaxU,texMaxV);
+ printf("(mapMinX,mapMinY,mapMaxX,mapMaxY) = (%3.2f,%3.2f,%3.2f,%3.2f)\n",
+ mapMinX,mapMinY,mapMaxX,mapMaxY);
#endif
- break;
- case FORMAT_BYTE_RGB:
- gltype = GL_RGB;
-#ifdef VERBOSE
- fprintf(stderr, "FORMAT_BYTE_RGB\n");
+
+ glBegin(GL_QUADS);
+
+ glTexCoord2f((float) texMinU, (float) texMinV);
+ glVertex3f((float) mapMinX, (float) mapMinY, (float) mapZ);
+ glTexCoord2f((float) texMaxU, (float) texMinV);
+ glVertex3f((float) mapMaxX, (float) mapMinY, (float) mapZ);
+ glTexCoord2f((float) texMaxU, (float) texMaxV);
+ glVertex3f((float) mapMaxX, (float) mapMaxY, (float) mapZ);
+ glTexCoord2f((float) texMinU, (float) texMaxV);
+ glVertex3f((float) mapMinX, (float) mapMaxY, (float) mapZ);
+
+ glEnd();
+
+ /* Restore matrices */
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ /* Restore attributes */
+ glPopAttrib();
+}
+
+JNIEXPORT
+void JNICALL Java_javax_media_j3d_NativePipeline_executeRasterDepth(JNIEnv *env,
+ jobject obj,
+ jlong ctxInfo,
+ jfloat posX,
+ jfloat posY,
+ jfloat posZ,
+ jint srcOffsetX,
+ jint srcOffsetY,
+ jint rasterWidth,
+ jint rasterHeight,
+ jint depthWidth,
+ jint depthHeight,
+ jint depthFormat,
+ jobject depthData)
+{
+ GLint drawBuf;
+ void *depthObjPtr;
+
+ JNIEnv table;
+ GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
+ jlong ctx = ctxProperties->context;
+
+ table = *env;
+
+#ifdef VERBOSE
+ fprintf(stderr, "Canvas3D.executeRasterDepth()\n");
#endif
- break;
-
- /* GL_ABGR_EXT */
- case FORMAT_BYTE_ABGR:
- if (ctxProperties->abgr_ext) { /* If its zero, should never come here! */
- gltype = GL_ABGR_EXT;
- }
- break;
-
- /* GL_BGR_EXT or GL_BGR */
- case FORMAT_BYTE_BGR:
- if (ctxProperties->bgr_ext) { /* If its zero, should never come here! */
- gltype = ctxProperties->bgr_ext_enum;
- }
- break;
-
- case FORMAT_BYTE_LA:
- gltype = GL_LUMINANCE_ALPHA;
- break;
-
- case FORMAT_BYTE_GRAY:
- case FORMAT_USHORT_GRAY:
- default:
- throwAssert(env, "illegal format");
- break;
- }
-
- /* texture map here! */
- glTexImage2D(GL_TEXTURE_2D, 0, gltype, width,
- height, 0, gltype, GL_UNSIGNED_BYTE,
- pixels);
- }
- /* loaded identity modelview and projection matrix */
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadIdentity();
-
- xzoom = (float)winWidth/maxX;
- yzoom = (float)winHeight/maxY;
- switch(imageScaleMode) {
- case javax_media_j3d_Background_SCALE_NONE:
- if(xzoom > 1.0f || yzoom > 1.0f){
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
- }
- texMinU = 0.0f;
- texMinV = 0.0f;
- texMaxU = 1.0f;
- texMaxV = 1.0f;
- halfWidth = (GLfloat)winWidth/2.0f;
- halfHeight = (GLfloat)winHeight/2.0f;
- mapMinX = (float) ((0 - halfWidth)/halfWidth);
- mapMinY = (float) ((0 - halfHeight)/halfHeight);
- mapMaxX = (float) ((maxX - halfWidth)/halfWidth);
- mapMaxY = (float) ((maxY - halfHeight)/halfHeight);
- adjustV = ((float)winHeight - (float)maxY)/halfHeight;
- mapMinY += adjustV;
- mapMaxY += adjustV;
- break;
- case javax_media_j3d_Background_SCALE_FIT_MIN:
- if(xzoom != yzoom){
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
- }
+ glRasterPos3f(posX, posY, posZ);
- zoom = xzoom < yzoom? xzoom: yzoom;
- texMinU = 0.0f;
- texMinV = 0.0f;
- texMaxU = 1.0f;
- texMaxV = 1.0f;
- mapMinX = -1.0f;
- mapMaxY = 1.0f;
- if(xzoom < yzoom){
- mapMaxX = 1.0f;
- mapMinY = -1.0f + 2.0f * ( 1.0f - zoom * (float)maxY/(float) winHeight );
- } else {
- mapMaxX = -1.0f + zoom * (float)maxX/winWidth * 2;
- mapMinY = -1.0f;
- }
- break;
- case javax_media_j3d_Background_SCALE_FIT_MAX:
- zoom = xzoom > yzoom? xzoom: yzoom;
- /*fprintf(stderr, "zoom: %f, xzoom: %f, yzoom: %f\n", zoom, xzoom, yzoom);*/
- mapMinX = -1.0f;
- mapMinY = -1.0f;
- mapMaxX = 1.0f;
- mapMaxY = 1.0f;
- if(xzoom < yzoom) {
- texMinU = 0.0f;
- texMinV = 0.0f;
- texMaxU = (float)winWidth/maxX/zoom;
- texMaxV = 1.0f;
- } else {
- texMinU = 0.0f;
- texMinV = 1.0f - (float)winHeight/maxY/zoom;
- texMaxU = 1.0f;
- texMaxV = 1.0f;
+ glGetIntegerv(GL_DRAW_BUFFER, &drawBuf);
+ /* disable draw buffer */
+ glDrawBuffer(GL_NONE);
+
+ /*
+ * raster position is upper left corner, default for Java3D
+ * ImageComponent currently has the data reverse in Y
+ */
+ glPixelZoom(1.0, -1.0);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, depthWidth);
+ if (srcOffsetX >= 0) {
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, srcOffsetX);
+ if (srcOffsetX + rasterWidth > depthWidth) {
+ rasterWidth = depthWidth - srcOffsetX;
}
- break;
- case javax_media_j3d_Background_SCALE_FIT_ALL:
- texMinU = 0.0f;
- texMinV = 0.0f;
- texMaxU = 1.0f;
- texMaxV = 1.0f;
- mapMinX = -1.0f;
- mapMinY = -1.0f;
- mapMaxX = 1.0f;
- mapMaxY = 1.0f;
- break;
- case javax_media_j3d_Background_SCALE_REPEAT:
- /* glScalef(1.0f, -1.0f, 1.0f); */
- i = winWidth/width;
- j = winHeight/height;
- texMinU = 0.0f;
- texMinV = (float)(j + 1) - yzoom;
- texMaxU = xzoom;
- texMaxV = (float)(j + 1);
- mapMinX = -1.0f;
- mapMinY = -1.0f;
- mapMaxX = 1.0f;
- mapMaxY = 1.0f;
- break;
- case javax_media_j3d_Background_SCALE_NONE_CENTER:
- if(xzoom > 1.0f || yzoom > 1.0f){
- glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue);
- glClear(GL_COLOR_BUFFER_BIT);
+ } else {
+ rasterWidth += srcOffsetX;
+ if (rasterWidth > depthWidth) {
+ rasterWidth = depthWidth;
}
- if(xzoom >= 1.0f){
- texMinU = 0.0f;
- texMaxU = 1.0f;
- mapMinX = -(float)maxX/winWidth;
- mapMaxX = (float)maxX/winWidth;
- } else {
- texMinU = 0.5f - (float)winWidth/maxX/2;
- texMaxU = 0.5f + (float)winWidth/maxX/2;
- mapMinX = -1.0f;
- mapMaxX = 1.0f;
+ }
+ if (srcOffsetY >= 0) {
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, srcOffsetY);
+ if (srcOffsetY + rasterHeight > depthHeight) {
+ rasterHeight = depthHeight - srcOffsetY;
}
- if(yzoom >= 1.0f) {
- texMinV = 0.0f;
- texMaxV = 1.0f;
- mapMinY = -(float)maxY/winHeight;
- mapMaxY = (float)maxY/winHeight;
- }else {
- texMinV = 0.5f - (float)winHeight/maxY/2;
- texMaxV = 0.5f + (float)winHeight/maxY/2;
- mapMinY = -1.0f;
- mapMaxY = 1.0f;
+ } else {
+ rasterHeight += srcOffsetY;
+ if (rasterHeight > depthHeight) {
+ rasterHeight = depthHeight;
}
- break;
}
-#ifdef VERBOSE
- printf("adjustV = %3.2f\n",adjustV);
- printf("(texMinU,texMinV,texMaxU,texMaxV) = (%3.2f,%3.2f,%3.2f,%3.2f)\n",
- texMinU,texMinV,texMaxU,texMaxV);
- printf("(mapMinX,mapMinY,mapMaxX,mapMaxY) = (%3.2f,%3.2f,%3.2f,%3.2f)\n",
- mapMinX,mapMinY,mapMaxX,mapMaxY);
-#endif
+
+ depthObjPtr =
+ (void *)(*(table->GetPrimitiveArrayCritical))(env, (jarray)depthData, NULL);
+
+ if (depthFormat == javax_media_j3d_DepthComponentRetained_DEPTH_COMPONENT_TYPE_INT) {
+ glDrawPixels(rasterWidth, rasterHeight, GL_DEPTH_COMPONENT,
+ GL_UNSIGNED_INT, depthObjPtr);
+ } else { /* javax_media_j3d_DepthComponentRetained_DEPTH_COMPONENT_TYPE_FLOAT */
+ glDrawPixels(rasterWidth, rasterHeight, GL_DEPTH_COMPONENT,
+ GL_FLOAT, depthObjPtr);
+ }
- glBegin(GL_QUADS);
-#ifdef VERBOSE
- /* glTexCoord2f(0.2, 0.2); glVertex2f(0.0,0.0); */
- /* glTexCoord2f(0.4, 0.2); glVertex2f(0.2,0.0); */
- /* glTexCoord2f(0.4, 0.4); glVertex2f(0.2,0.2); */
- /* glTexCoord2f(0.2, 0.4); glVertex2f(0.0,0.2); */
- glColor3f(1.0, 0.0, 0.0);
-#endif
- glTexCoord2f(texMinU, texMinV); glVertex2f(mapMinX,mapMinY);
- glTexCoord2f(texMaxU, texMinV); glVertex2f(mapMaxX,mapMinY);
- glTexCoord2f(texMaxU, texMaxV); glVertex2f(mapMaxX,mapMaxY);
- glTexCoord2f(texMinU, texMaxV); glVertex2f(mapMinX,mapMaxY);
- glEnd();
-
- /* Restore texture Matrix transform */
- glPopMatrix();
+ (*(table->ReleasePrimitiveArrayCritical))(env, depthData, depthObjPtr, 0);
+
+
+ /* re-enable draw buffer */
+ glDrawBuffer(drawBuf);
- glMatrixMode(GL_MODELVIEW);
- /* Restore attributes */
- glPopAttrib();
- (*(table->ReleasePrimitiveArrayCritical))(env, pixels_obj,
- (jbyte *)pixels, 0);
- }
-
- /* Java 3D always clears the Z-buffer */
- glPushAttrib(GL_DEPTH_BUFFER_BIT);
- glDepthMask(GL_TRUE);
- glClear(GL_DEPTH_BUFFER_BIT);
- glPopAttrib();
-
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_setRenderMode(
+void JNICALL Java_javax_media_j3d_NativePipeline_setRenderMode(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -2221,7 +1789,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_setRenderMode(
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_clearAccum(
+void JNICALL Java_javax_media_j3d_NativePipeline_clearAccum(
JNIEnv *env,
jobject obj,
jlong ctxInfo)
@@ -2232,7 +1800,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_clearAccum(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_accum(
+void JNICALL Java_javax_media_j3d_NativePipeline_accum(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -2248,7 +1816,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_accum(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_accumReturn(
+void JNICALL Java_javax_media_j3d_NativePipeline_accumReturn(
JNIEnv *env,
jobject obj,
jlong ctxInfo)
@@ -2259,7 +1827,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_accumReturn(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_setDepthBufferWriteEnable(
+void JNICALL Java_javax_media_j3d_NativePipeline_setDepthBufferWriteEnable(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -2274,23 +1842,24 @@ void JNICALL Java_javax_media_j3d_Canvas3D_setDepthBufferWriteEnable(
JNIEXPORT
-jint JNICALL Java_javax_media_j3d_Canvas3D_swapBuffers(
+jint JNICALL Java_javax_media_j3d_NativePipeline_swapBuffers(
JNIEnv *env,
jobject obj,
+ jobject cv,
jlong ctxInfo,
jlong display,
- jint win)
+ jlong window)
{
#if defined(UNIX)
- glXSwapBuffers((Display *)display, (Window)win);
+ glXSwapBuffers((Display *)display, (Window)window);
#endif
#ifdef WIN32
HDC hdc;
- hdc = (HDC) win;
+ hdc = (HDC) window;
SwapBuffers(hdc);
#endif
@@ -2306,7 +1875,7 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_swapBuffers(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_syncRender(
+void JNICALL Java_javax_media_j3d_NativePipeline_syncRender(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -2321,7 +1890,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_syncRender(
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_newDisplayList(
+void JNICALL Java_javax_media_j3d_NativePipeline_newDisplayList(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -2336,7 +1905,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_newDisplayList(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_endDisplayList(
+void JNICALL Java_javax_media_j3d_NativePipeline_endDisplayList(
JNIEnv *env,
jobject obj,
jlong ctxInfo)
@@ -2346,7 +1915,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_endDisplayList(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_setGlobalAlpha(
+void JNICALL Java_javax_media_j3d_NativePipeline_setGlobalAlpha(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -2363,23 +1932,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_setGlobalAlpha(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_disableGlobalAlpha(
- JNIEnv *env,
- jobject obj,
- jlong ctxInfo)
-{
-
- GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
- jlong ctx = ctxProperties->context;
-
- /* GL_GLOBAL_ALPHA_SUN */
- if(ctxProperties->global_alpha_sun){
- glDisable(GL_GLOBAL_ALPHA_SUN);
- }
-}
-
-JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_callDisplayList(
+void JNICALL Java_javax_media_j3d_NativePipeline_callDisplayList(
JNIEnv *env,
jobject obj,
jlong ctxInfo,
@@ -2402,22 +1955,23 @@ void JNICALL Java_javax_media_j3d_Canvas3D_callDisplayList(
return;
}
- /* resale_normal_ext */
- if (ctxProperties->rescale_normal_ext && isNonUniformScale) {
+ /* Set normalization if non-uniform scale */
+ if (isNonUniformScale) {
glEnable(GL_NORMALIZE);
}
glCallList(id);
- if (ctxProperties->rescale_normal_ext && isNonUniformScale) {
+ /* Turn normalization back off */
+ if (isNonUniformScale) {
glDisable(GL_NORMALIZE);
}
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_freeDisplayList(
+void JNICALL Java_javax_media_j3d_NativePipeline_freeDisplayList(
JNIEnv *env,
- jclass cl,
+ jobject obj,
jlong ctxInfo,
jint id)
{
@@ -2431,9 +1985,9 @@ void JNICALL Java_javax_media_j3d_Canvas3D_freeDisplayList(
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_freeTexture(
+void JNICALL Java_javax_media_j3d_NativePipeline_freeTexture(
JNIEnv *env,
- jclass cl,
+ jobject obj,
jlong ctxInfo,
jint id)
{
@@ -2455,15 +2009,14 @@ void JNICALL Java_javax_media_j3d_Canvas3D_freeTexture(
int getTextureColorTableSize(
JNIEnv *env,
jobject obj,
- jlong ctxInfo,
- char *extensionStr,
- int minorVersion)
+ GraphicsContextPropertiesInfo *ctxInfo,
+ char *extensionStr)
{
- GraphicsContextPropertiesInfo* ctxProperties = (GraphicsContextPropertiesInfo* )ctxInfo;
+ GraphicsContextPropertiesInfo* ctxProperties = ctxInfo;
int size;
-
- if(minorVersion >= 2 && isExtensionSupported(extensionStr, "GL_ARB_imaging")){
-
+
+ if (isExtensionSupported(extensionStr, "GL_ARB_imaging")) {
+
#ifdef WIN32
ctxProperties->glColorTable = (MYPFNGLCOLORTABLEPROC)wglGetProcAddress("glColorTable");
ctxProperties->glGetColorTableParameteriv =
@@ -2477,6 +2030,7 @@ int getTextureColorTableSize(
#endif
} else if(isExtensionSupported(extensionStr, "GL_SGI_color_table")) {
+
#ifdef WIN32
ctxProperties->glColorTable = (MYPFNGLCOLORTABLEPROC)wglGetProcAddress("glColorTableSGI");
ctxProperties->glGetColorTableParameteriv =
@@ -2488,16 +2042,16 @@ int getTextureColorTableSize(
ctxProperties->glGetColorTableParameteriv =
(MYPFNGLGETCOLORTABLEPARAMETERIVPROC)dlsym(RTLD_DEFAULT, "glGetColorTableParameterivSGI");
#endif
-
+
} else {
return 0;
}
if ((ctxProperties->glColorTable == NULL) ||
- (ctxProperties->glGetColorTableParameteriv == NULL)) {
+ (ctxProperties->glGetColorTableParameteriv == NULL)) {
return 0;
}
-
+
ctxProperties->glColorTable(GL_PROXY_TEXTURE_COLOR_TABLE_SGI, GL_RGBA, 256, GL_RGB,
GL_INT, NULL);
ctxProperties->glGetColorTableParameteriv(GL_PROXY_TEXTURE_COLOR_TABLE_SGI,
@@ -2505,62 +2059,13 @@ int getTextureColorTableSize(
return size;
}
-/* For dvr support */
-JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_videoResize(
- JNIEnv *env,
- jobject obj,
- jlong ctxInfo,
- jlong display,
- jint win,
- jfloat dvrFactor)
-{
-#if defined(UNIX)
-
- GraphicsContextPropertiesInfo* ctxProperties = (GraphicsContextPropertiesInfo* )ctxInfo;
-
- /* Not need to do ext. supported checking. This check is done in java. */
-
- /* fprintf(stderr, "Canvas3D.c -- glXVideoResize -- %d %f\n", win, dvrFactor); */
- ctxProperties->glXVideoResizeSUN((Display *)display, (Window)win, (float) dvrFactor);
-#endif
-
-}
-
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_videoResizeCompensation(
- JNIEnv *env,
- jobject obj,
- jlong ctxInfo,
- jboolean enable)
-{
-
-#if defined(UNIX)
- GraphicsContextPropertiesInfo *ctxProperties =
- (GraphicsContextPropertiesInfo *)ctxInfo;
-
- if (ctxProperties->videoResizeAvailable) {
- if(enable == JNI_TRUE) {
- /* fprintf(stderr, "videoResizeCompensation - glEnable"); */
- glEnable(GL_VIDEO_RESIZE_COMPENSATION_SUN);
- }
- else {
- /* fprintf(stderr, "videoResizeCompensation - glDisable"); */
- glDisable(GL_VIDEO_RESIZE_COMPENSATION_SUN);
- }
- }
-
-#endif
-
-}
-
-JNIEXPORT
-jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer(
+jlong JNICALL Java_javax_media_j3d_NativePipeline_createOffScreenBuffer(
JNIEnv *env,
jobject obj,
+ jobject cv,
jlong ctxInfo,
jlong display,
- jint vid,
jlong fbConfigListPtr,
jint width,
jint height)
@@ -2586,7 +2091,7 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer(
*/
-
+
/* Query DRAWABLE_TYPE. Will use Pbuffer if fbConfig support it,
else will try for Pixmap. If neither one exists, flag error message
and return None */
@@ -2616,7 +2121,7 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer(
fprintf(stderr, "Java 3D ERROR : glXCreateGLXPbuffer() returns None\n");
}
- return pbuff;
+ return (jlong)pbuff;
}
else if((val & GLX_PIXMAP_BIT) != 0) {
Pixmap pixmap;
@@ -2666,11 +2171,11 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer(
}
/* fprintf(stderr, "glxpixmap %d\n",(int) glxpixmap); */
- return glxpixmap;
+ return (jlong)glxpixmap;
}
else {
fprintf(stderr, "Java 3D ERROR : FBConfig doesn't support pbuffer or pixmap returns None\n");
- return None;
+ return (jlong)None;
}
@@ -2710,7 +2215,7 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer(
(int) display, pFormatInfoPtr->offScreenPFormat, width, height);
*/
- cv_class = (jclass) (*(table->GetObjectClass))(env, obj);
+ cv_class = (jclass) (*(table->GetObjectClass))(env, cv);
offScreenBuffer_field =
(jfieldID) (*(table->GetFieldID))(env, cv_class, "offScreenBufferInfo", "J");
@@ -2801,9 +2306,9 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer(
offScreenBufferInfo->isPbuffer = GL_TRUE;
offScreenBufferInfo->hpbuf = hpbuf;
- (*(table->SetLongField))(env, obj, offScreenBuffer_field, (jlong)offScreenBufferInfo);
+ (*(table->SetLongField))(env, cv, offScreenBuffer_field, (jlong)offScreenBufferInfo);
- return (jint) hpbufdc;
+ return (jlong) hpbufdc;
}
/* fprintf(stderr, "***** Use Bitmap for offscreen ******\n"); */
@@ -2856,21 +2361,23 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer(
offScreenBufferInfo->isPbuffer = GL_FALSE;
offScreenBufferInfo->hpbuf = 0;
- (*(table->SetLongField))(env, obj, offScreenBuffer_field, (jlong)offScreenBufferInfo);
+ (*(table->SetLongField))(env, cv, offScreenBuffer_field, (jlong)offScreenBufferInfo);
+
+ return ((jlong)bitmapHdc);
- return ((jint)bitmapHdc);
-
#endif /* WIN32 */
}
+
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_destroyOffScreenBuffer(
+void JNICALL Java_javax_media_j3d_NativePipeline_destroyOffScreenBuffer(
JNIEnv *env,
jobject obj,
+ jobject cv,
jlong ctxInfo,
jlong display,
jlong fbConfigListPtr,
- jint window)
+ jlong window)
{
jclass cv_class;
jfieldID offScreenBuffer_field;
@@ -2900,12 +2407,12 @@ void JNICALL Java_javax_media_j3d_Canvas3D_destroyOffScreenBuffer(
OffScreenBufferInfo *offScreenBufferInfo = NULL;
HDC hpbufdc = (HDC) window;
- cv_class = (jclass) (*(table->GetObjectClass))(env, obj);
+ cv_class = (jclass) (*(table->GetObjectClass))(env, cv);
offScreenBuffer_field =
(jfieldID) (*(table->GetFieldID))(env, cv_class, "offScreenBufferInfo", "J");
offScreenBufferInfo =
- (OffScreenBufferInfo *) (*(table->GetLongField))(env, obj, offScreenBuffer_field);
+ (OffScreenBufferInfo *) (*(table->GetLongField))(env, cv, offScreenBuffer_field);
/*
fprintf(stderr,"Canvas3D_destroyOffScreenBuffer : offScreenBufferInfo 0x%x\n",
@@ -2935,81 +2442,131 @@ void JNICALL Java_javax_media_j3d_Canvas3D_destroyOffScreenBuffer(
}
free(offScreenBufferInfo);
- (*(table->SetLongField))(env, obj, offScreenBuffer_field, (jlong)0);
+ (*(table->SetLongField))(env, cv, offScreenBuffer_field, (jlong)0);
#endif /* WIN32 */
}
-
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_readOffScreenBuffer(
+void JNICALL Java_javax_media_j3d_NativePipeline_readOffScreenBuffer(
JNIEnv *env,
jobject obj,
+ jobject cv,
jlong ctxInfo,
jint format,
+ jint dataType,
+ jobject data,
jint width,
jint height)
{
JNIEnv table = *env;
- jclass cv_class;
- jfieldID byteData_field;
- jbyteArray byteData_array;
- jbyte *byteData;
int type;
-
+ void *imageObjPtr;
+
GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
jlong ctx = ctxProperties->context;
glPixelStorei(GL_PACK_ROW_LENGTH, width);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
- cv_class = (jclass) (*(table->GetObjectClass))(env, obj);
- byteData_field = (jfieldID) (*(table->GetFieldID))(env, cv_class,
- "byteBuffer", "[B");
- byteData_array = (jbyteArray)(*(table->GetObjectField))(env, obj,
- byteData_field);
- byteData = (jbyte *)(*(table->GetPrimitiveArrayCritical))(env,
- byteData_array, NULL);
+ if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) {
+ imageObjPtr = (void *)(*(table->GetPrimitiveArrayCritical))(env, (jarray)data, NULL);
+ }
+ else {
+ imageObjPtr = (void *)(*(table->GetDirectBufferAddress))(env, data);
+ }
-
- switch (format) {
- case FORMAT_BYTE_RGBA:
- type = GL_RGBA;
- break;
- case FORMAT_BYTE_RGB:
- type = GL_RGB;
- break;
-
- /* GL_ABGR_EXT */
- case FORMAT_BYTE_ABGR:
- if (ctxProperties->abgr_ext) { /* If its zero, should never come here! */
- type = GL_ABGR_EXT;
- }
- break;
+ if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_BYTE_BUFFER)) {
+ switch (format) {
+ /* GL_BGR */
+ case IMAGE_FORMAT_BYTE_BGR:
+ type = GL_BGR;
+ break;
+ case IMAGE_FORMAT_BYTE_RGB:
+ type = GL_RGB;
+ break;
+ /* GL_ABGR_EXT */
+ case IMAGE_FORMAT_BYTE_ABGR:
+ if (ctxProperties->abgr_ext) { /* If its zero, should never come here! */
+ type = GL_ABGR_EXT;
+ }
+ else {
+ throwAssert(env, "GL_ABGR_EXT format is unsupported");
+ return;
+ }
+ break;
+ case IMAGE_FORMAT_BYTE_RGBA:
+ type = GL_RGBA;
+ break;
+
+ /* This method only supports 3 and 4 components formats and BYTE types. */
+ case IMAGE_FORMAT_BYTE_LA:
+ case IMAGE_FORMAT_BYTE_GRAY:
+ case IMAGE_FORMAT_USHORT_GRAY:
+ case IMAGE_FORMAT_INT_BGR:
+ case IMAGE_FORMAT_INT_RGB:
+ case IMAGE_FORMAT_INT_ARGB:
+ default:
+ throwAssert(env, "illegal format");
+ return;
+ }
+
+ glReadPixels(0, 0, width, height, type, GL_UNSIGNED_BYTE, imageObjPtr);
+
+ }
+ else if((dataType == IMAGE_DATA_TYPE_INT_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_BUFFER)) {
+ GLenum intType = GL_UNSIGNED_INT_8_8_8_8;
+ GLboolean forceAlphaToOne = GL_FALSE;
- /* GL_BGR_EXT */
- case FORMAT_BYTE_BGR:
- if (ctxProperties->bgr_ext) { /* If its zero, should never come here! */
- type = ctxProperties->bgr_ext_enum;
+ switch (format) {
+ /* GL_BGR */
+ case IMAGE_FORMAT_INT_BGR: /* Assume XBGR format */
+ type = GL_RGBA;
+ intType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ forceAlphaToOne = GL_TRUE;
+ break;
+ case IMAGE_FORMAT_INT_RGB: /* Assume XRGB format */
+ forceAlphaToOne = GL_TRUE;
+ /* Fall through to next case */
+ case IMAGE_FORMAT_INT_ARGB:
+ type = GL_BGRA;
+ intType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ break;
+ /* This method only supports 3 and 4 components formats and INT types. */
+ case IMAGE_FORMAT_BYTE_LA:
+ case IMAGE_FORMAT_BYTE_GRAY:
+ case IMAGE_FORMAT_USHORT_GRAY:
+ case IMAGE_FORMAT_BYTE_BGR:
+ case IMAGE_FORMAT_BYTE_RGB:
+ case IMAGE_FORMAT_BYTE_RGBA:
+ case IMAGE_FORMAT_BYTE_ABGR:
+ default:
+ throwAssert(env, "illegal format");
+ return;
+ }
+
+ /* Force Alpha to 1.0 if needed */
+ if(forceAlphaToOne) {
+ glPixelTransferf(GL_ALPHA_SCALE, 0.0f);
+ glPixelTransferf(GL_ALPHA_BIAS, 1.0f);
}
- break;
- case FORMAT_BYTE_LA:
- type = GL_LUMINANCE_ALPHA;
- break;
+ glReadPixels(0, 0, width, height, type, intType, imageObjPtr);
- case FORMAT_BYTE_GRAY:
- case FORMAT_USHORT_GRAY:
- default:
- throwAssert(env, "illegal format");
- break;
+ /* Restore Alpha scale and bias */
+ if(forceAlphaToOne) {
+ glPixelTransferf(GL_ALPHA_SCALE, 1.0f);
+ glPixelTransferf(GL_ALPHA_BIAS, 0.0f);
+ }
+ }
+ else {
+ throwAssert(env, "illegal image data type");
}
-
- glReadPixels(0, 0, width, height, type, GL_UNSIGNED_BYTE, byteData);
+ if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) {
+ (*(table->ReleasePrimitiveArrayCritical))(env, data, imageObjPtr, 0);
+ }
- (*(table->ReleasePrimitiveArrayCritical))(env, byteData_array,
- byteData, 0);
}
static void
@@ -3023,17 +2580,12 @@ initializeCtxInfo(JNIEnv *env , GraphicsContextPropertiesInfo* ctxInfo)
ctxInfo->rendererStr = NULL;
ctxInfo->extensionStr = NULL;
ctxInfo->versionNumbers[0] = 1;
- ctxInfo->versionNumbers[1] = 1;
+ ctxInfo->versionNumbers[1] = 1;
+ ctxInfo->gl13 = JNI_FALSE;
+ ctxInfo->gl20 = JNI_FALSE;
- /* both in 1.2 core part and 1.1 extensions */
- ctxInfo->rescale_normal_ext = JNI_FALSE;
- ctxInfo->bgr_ext = JNI_FALSE;
- ctxInfo->texture3DAvailable = JNI_FALSE;
- ctxInfo->seperate_specular_color = JNI_FALSE;
-
/* 1.2 and GL_ARB_imaging */
ctxInfo->blend_color_ext = JNI_FALSE;
- ctxInfo->color_table_ext = JNI_FALSE;
ctxInfo->blendFunctionTable[BLEND_ZERO] = GL_ZERO;
ctxInfo->blendFunctionTable[BLEND_ONE] = GL_ONE;
ctxInfo->blendFunctionTable[BLEND_SRC_ALPHA] = GL_SRC_ALPHA;
@@ -3049,9 +2601,9 @@ initializeCtxInfo(JNIEnv *env , GraphicsContextPropertiesInfo* ctxInfo)
ctxInfo->multi_draw_arrays_sun = JNI_FALSE;
ctxInfo->compiled_vertex_array_ext = JNI_FALSE;
- ctxInfo->videoResizeAvailable = JNI_FALSE;
+ ctxInfo->texture_clamp_to_border_enum = GL_CLAMP;
+
ctxInfo->global_alpha_sun = JNI_FALSE;
- ctxInfo->constant_data_sun = JNI_FALSE;
/* EXT extensions */
ctxInfo->abgr_ext = JNI_FALSE;
@@ -3063,11 +2615,9 @@ initializeCtxInfo(JNIEnv *env , GraphicsContextPropertiesInfo* ctxInfo)
/* by MIK OF CLASSX */
ctxInfo->alphaClearValue = (getJavaBoolEnv(env, "transparentOffScreen") ? 0.0f : 1.0f);
- /* ARB extensions */
- ctxInfo->arb_transpose_matrix = JNI_FALSE;
- ctxInfo->arb_multitexture = JNI_FALSE;
+ ctxInfo->multisample = JNI_FALSE;
- ctxInfo->arb_multisample = JNI_FALSE;
+ /* Multitexture support */
ctxInfo->maxTexCoordSets = 1;
ctxInfo->maxTextureUnits = 1;
ctxInfo->maxTextureImageUnits = 0;
@@ -3077,7 +2627,6 @@ initializeCtxInfo(JNIEnv *env , GraphicsContextPropertiesInfo* ctxInfo)
ctxInfo->textureEnvCombineAvailable = JNI_FALSE;
ctxInfo->textureCombineDot3Available = JNI_FALSE;
ctxInfo->textureCombineSubtractAvailable = JNI_FALSE;
- ctxInfo->textureCubeMapAvailable = JNI_FALSE;
/* NV extensions */
ctxInfo->textureRegisterCombinersAvailable = JNI_FALSE;
@@ -3091,6 +2640,7 @@ initializeCtxInfo(JNIEnv *env , GraphicsContextPropertiesInfo* ctxInfo)
ctxInfo->textureColorTableSize = 0;
ctxInfo->textureLodAvailable = JNI_FALSE;
ctxInfo->textureLodBiasAvailable = JNI_FALSE;
+ ctxInfo->textureNonPowerOfTwoAvailable = JNI_FALSE;
/* extension mask */
ctxInfo->extMask = 0;
@@ -3105,17 +2655,17 @@ initializeCtxInfo(JNIEnv *env , GraphicsContextPropertiesInfo* ctxInfo)
ctxInfo->glGetColorTableParameteriv = NULL;
ctxInfo->glTexImage3DEXT = NULL;
ctxInfo->glTexSubImage3DEXT = NULL;
- ctxInfo->glClientActiveTextureARB = NULL;
+ ctxInfo->glClientActiveTexture = NULL;
ctxInfo->glMultiDrawArraysEXT = NULL;
ctxInfo->glMultiDrawElementsEXT = NULL;
ctxInfo->glLockArraysEXT = NULL;
ctxInfo->glUnlockArraysEXT = NULL;
- ctxInfo->glMultiTexCoord2fvARB = NULL;
- ctxInfo->glMultiTexCoord3fvARB = NULL;
- ctxInfo->glMultiTexCoord4fvARB = NULL;
- ctxInfo->glLoadTransposeMatrixdARB = NULL;
- ctxInfo->glMultTransposeMatrixdARB = NULL;
- ctxInfo->glActiveTextureARB = NULL;
+ ctxInfo->glMultiTexCoord2fv = NULL;
+ ctxInfo->glMultiTexCoord3fv = NULL;
+ ctxInfo->glMultiTexCoord4fv = NULL;
+ ctxInfo->glLoadTransposeMatrixd = NULL;
+ ctxInfo->glMultTransposeMatrixd = NULL;
+ ctxInfo->glActiveTexture = NULL;
ctxInfo->glGlobalAlphaFactorfSUN = NULL;
ctxInfo->glCombinerInputNV = NULL;
@@ -3148,10 +2698,6 @@ initializeCtxInfo(JNIEnv *env , GraphicsContextPropertiesInfo* ctxInfo)
/* Initialize shader info pointers */
ctxInfo->glslCtxInfo = NULL;
ctxInfo->cgCtxInfo = NULL;
-
-#if defined(UNIX)
- ctxInfo->glXVideoResizeSUN = NULL;
-#endif /* UNIX */
}
static void
@@ -3231,12 +2777,12 @@ HWND createDummyWindow(const char* szAppName) {
#endif
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext(
+void JNICALL Java_javax_media_j3d_NativePipeline_createQueryContext(
JNIEnv *env,
jobject obj,
+ jobject cv,
jlong display,
- jint window,
- jint vid,
+ jlong window,
jlong fbConfigListPtr,
jboolean offScreen,
jint width,
@@ -3247,7 +2793,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext(
JNIEnv table = *env;
jlong gctx;
int stencilSize=0;
- jint newWin;
+ jlong newWin;
int PixelFormatID=0;
GraphicsContextPropertiesInfo* ctxInfo = (GraphicsContextPropertiesInfo *)malloc(sizeof(GraphicsContextPropertiesInfo));
@@ -3309,14 +2855,14 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext(
glWin = XCreateWindow((Display *)display, root, 0, 0, width, height, 0,
vinfo->depth, InputOutput, vinfo->visual,
win_mask, &win_attrs);
- newWin = (jint)glWin;
+ newWin = (jlong)glWin;
}
}
else if(window == 0 && offScreen){
- newWin = Java_javax_media_j3d_Canvas3D_createOffScreenBuffer( env, obj, 0,
- display, window,
- fbConfigListPtr,
- width, height);
+ newWin = Java_javax_media_j3d_NativePipeline_createOffScreenBuffer(env,
+ obj, cv, 0, display,
+ fbConfigListPtr,
+ width, height);
}
else if(window != 0) {
newWin = window;
@@ -3350,11 +2896,6 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext(
fprintf(stderr, "Canvas3D_createQueryContext:\n");
fprintf(stderr, "window is 0x%x, offScreen %d\n", window, offScreen);
*/
-
- /*
- * vid must be valid PixelFormat returned
- * by wglChoosePixelFormat() or wglChoosePixelFormatARB.
- */
/* Fix to issue 104 */
if(!offScreen) {
@@ -3387,16 +2928,17 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext(
}
else if(window == 0 && offScreen){
/* fprintf(stderr, "CreateQueryContext : window == 0 && offScreen\n"); */
- hdc = (HDC)Java_javax_media_j3d_Canvas3D_createOffScreenBuffer( env, obj, 0, display,
- vid, fbConfigListPtr,
- width, height);
+ hdc = (HDC)Java_javax_media_j3d_NativePipeline_createOffScreenBuffer(env,
+ obj, cv, 0, display,
+ fbConfigListPtr,
+ width, height);
}
else if(window != 0){
/* fprintf(stderr, "CreateQueryContext : window != 0 0x%x\n", window); */
hdc = (HDC) window;
}
- newWin = (jint)hdc;
+ newWin = (jlong)hdc;
SetPixelFormat(hdc, PixelFormatID, NULL);
@@ -3430,18 +2972,18 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext(
ctxInfo->context = gctx;
/* get current context properties */
- if (getPropertiesFromCurrentContext(env, obj, ctxInfo, (jlong) hdc, PixelFormatID,
+ if (getPropertiesFromCurrentContext(env, cv, ctxInfo, (jlong) hdc, PixelFormatID,
fbConfigListPtr, offScreen,
glslLibraryAvailable, cgLibraryAvailable)) {
/* put the properties to the Java side */
- setupCanvasProperties(env, obj, ctxInfo);
+ setupCanvasProperties(env, cv, ctxInfo);
}
/* clear up the context , colormap and window if appropriate */
if(window == 0 && !offScreen){
#if defined(UNIX)
- Java_javax_media_j3d_Canvas3D_destroyContext(env, obj, display, newWin, (jlong)ctxInfo);
+ Java_javax_media_j3d_NativePipeline_destroyContext(env, obj, display, newWin, (jlong)ctxInfo);
XDestroyWindow((Display *)display, glWin);
XFreeColormap((Display *)display, cmap);
#endif /* UNIX */
@@ -3450,33 +2992,33 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext(
ReleaseDC(hDummyWnd, hdc);
/* Destroy context */
/* This will free ctxInfo also */
- Java_javax_media_j3d_Canvas3D_destroyContext(env, obj, display,newWin, (jlong)ctxInfo);
+ Java_javax_media_j3d_NativePipeline_destroyContext(env, obj, display,newWin, (jlong)ctxInfo);
DestroyWindow(hDummyWnd);
UnregisterClass(szAppName, (HINSTANCE)NULL);
#endif /* WIN32 */
}
else if(window == 0 && offScreen) {
- Java_javax_media_j3d_Canvas3D_destroyOffScreenBuffer(env, obj, gctx, display, fbConfigListPtr, newWin);
- Java_javax_media_j3d_Canvas3D_destroyContext(env, obj, display, newWin, (jlong)ctxInfo);
+ Java_javax_media_j3d_NativePipeline_destroyOffScreenBuffer(env, obj, cv, gctx, display, fbConfigListPtr, newWin);
+ Java_javax_media_j3d_NativePipeline_destroyContext(env, obj, display, newWin, (jlong)ctxInfo);
}
else if(window != 0){
- Java_javax_media_j3d_Canvas3D_destroyContext(env, obj, display, newWin, (jlong)ctxInfo);
+ Java_javax_media_j3d_NativePipeline_destroyContext(env, obj, display, newWin, (jlong)ctxInfo);
}
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_beginScene(
+void JNICALL Java_javax_media_j3d_NativePipeline_beginScene(
JNIEnv *env,
jobject obj,
jlong ctxInfo)
{
- /* Not used by OGL version */
+ /* Not used by OGL renderer */
}
JNIEXPORT
-void JNICALL Java_javax_media_j3d_Canvas3D_endScene(
+void JNICALL Java_javax_media_j3d_NativePipeline_endScene(
JNIEnv *env,
jobject obj,
jlong ctxInfo)
@@ -3488,18 +3030,18 @@ void JNICALL Java_javax_media_j3d_Canvas3D_endScene(
}
/* Setup the multisampling for full scene antialiasing */
-JNIEXPORT void JNICALL Java_javax_media_j3d_Canvas3D_setFullSceneAntialiasing
+JNIEXPORT void JNICALL Java_javax_media_j3d_NativePipeline_setFullSceneAntialiasing
(JNIEnv *env, jobject obj, jlong ctxInfo, jboolean enable)
{
GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo;
jlong ctx = ctxProperties->context;
- if (ctxProperties->arb_multisample && !ctxProperties->implicit_multisample) {
+ if (ctxProperties->multisample && !ctxProperties->implicit_multisample) {
if(enable == JNI_TRUE) {
- glEnable(GL_MULTISAMPLE_ARB);
+ glEnable(GL_MULTISAMPLE);
}
else {
- glDisable(GL_MULTISAMPLE_ARB);
+ glDisable(GL_MULTISAMPLE);
}
}
@@ -3511,7 +3053,7 @@ JNIEXPORT void JNICALL Java_javax_media_j3d_Canvas3D_setFullSceneAntialiasing
* Return false if <= 8 bit color under windows
*/
JNIEXPORT
-jboolean JNICALL Java_javax_media_j3d_Canvas3D_validGraphicsMode(
+jboolean JNICALL Java_javax_media_j3d_NativePipeline_validGraphicsMode(
JNIEnv *env,
jobject obj)
{
@@ -3528,9 +3070,18 @@ jboolean JNICALL Java_javax_media_j3d_Canvas3D_validGraphicsMode(
}
+JNIEXPORT
+void JNICALL Java_javax_media_j3d_NativePipeline_cleanupRenderer(
+ JNIEnv *env,
+ jobject obj)
+{
+ /* No-op for OGL pipeline */
+}
+
+
/*
* Function to disable most rendering attributes when doing a 2D
- * clear, image copy, or image composite operation. Note that the
+ * clear, or image copy operation. Note that the
* caller must save/restore the attributes with
* pushAttrib(GL_ENABLE_BIT|...) and popAttrib()
*/
@@ -3560,13 +3111,8 @@ disableAttribFor2D(GraphicsContextPropertiesInfo *ctxProperties)
glDisable(GL_CLIP_PLANE0 + i);
}
- if (ctxProperties->texture3DAvailable) {
- glDisable(ctxProperties->texture_3D_ext_enum);
- }
-
- if (ctxProperties->textureCubeMapAvailable) {
- glDisable(ctxProperties->texture_cube_map_ext_enum);
- }
+ glDisable(GL_TEXTURE_3D);
+ glDisable(GL_TEXTURE_CUBE_MAP);
if (ctxProperties->textureRegisterCombinersAvailable) {
glDisable(GL_REGISTER_COMBINERS_NV);
@@ -3580,3 +3126,28 @@ disableAttribFor2D(GraphicsContextPropertiesInfo *ctxProperties)
glDisable(GL_GLOBAL_ALPHA_SUN);
}
}
+
+/*
+ * Function to disable most rendering attributes when doing a Raster
+ * clear, or image copy operation. Note that the
+ * caller must save/restore the attributes with
+ * pushAttrib(GL_ENABLE_BIT|...) and popAttrib()
+ */
+static void
+disableAttribForRaster(GraphicsContextPropertiesInfo *ctxProperties)
+{
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ glDisable(GL_POLYGON_STIPPLE);
+
+ // TODO: Disable if Raster.CLIP_POSITION is true
+// for (int i = 0; i < 6; i++) {
+// glDisable(GL_CLIP_PLANE0 + i);
+// }
+
+ if (ctxProperties->global_alpha_sun) {
+ glDisable(GL_GLOBAL_ALPHA_SUN);
+ }
+}