diff options
Diffstat (limited to 'src/native/d3d/Attributes.cpp')
-rw-r--r-- | src/native/d3d/Attributes.cpp | 3269 |
1 files changed, 0 insertions, 3269 deletions
diff --git a/src/native/d3d/Attributes.cpp b/src/native/d3d/Attributes.cpp deleted file mode 100644 index 2dc0df9..0000000 --- a/src/native/d3d/Attributes.cpp +++ /dev/null @@ -1,3269 +0,0 @@ -/* - * $RCSfile$ - * - * Copyright 2000-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 "StdAfx.h" - - -const DWORD blendFunctionTable[] = -{ - D3DBLEND_ZERO, D3DBLEND_ONE, - D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA, - D3DBLEND_DESTCOLOR, D3DBLEND_SRCCOLOR, - D3DBLEND_INVSRCCOLOR, D3DBLEND_SRCCOLOR -}; - -const DWORD combineFunctionTable[] = -{ - D3DTOP_SELECTARG1, D3DTOP_SELECTARG1, D3DTOP_SELECTARG1, D3DTOP_SELECTARG1, - D3DTOP_MODULATE, D3DTOP_MODULATE2X, D3DTOP_MODULATE2X, D3DTOP_MODULATE4X, - D3DTOP_ADD, D3DTOP_ADD, D3DTOP_ADD, D3DTOP_ADD, - D3DTOP_ADDSIGNED, D3DTOP_ADDSIGNED2X, D3DTOP_ADDSIGNED2X, D3DTOP_ADDSIGNED2X, - D3DTOP_SUBTRACT, D3DTOP_SUBTRACT, D3DTOP_SUBTRACT, D3DTOP_SUBTRACT, - D3DTOP_LERP, D3DTOP_LERP, D3DTOP_LERP, D3DTOP_LERP, - D3DTOP_DOTPRODUCT3, D3DTOP_DOTPRODUCT3, D3DTOP_DOTPRODUCT3, D3DTOP_DOTPRODUCT3 -}; - -// Assume COMBINE_OBJECT_COLOR = 0 -// COMBINE_TEXTURE_COLOR = 1 -// COMBINE_CONSTANT_COLOR = 2 -// COMBINE_PREVIOUS_TEXTURE_UNIT_STATE = 3 -// -// COMBINE_SRC_COLOR = 0 -// COMBINE_ONE_MINUS_SRC_COLOR = 1 -// COMBINE_SRC_ALPHA = 2 -// COMBINE_ONE_MINUS_SRC_ALPHA = 3 -// -const DWORD combineSourceTable[] = -{ - D3DTA_DIFFUSE, - D3DTA_DIFFUSE | D3DTA_COMPLEMENT, - D3DTA_DIFFUSE | D3DTA_ALPHAREPLICATE, - D3DTA_DIFFUSE | D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE, - D3DTA_TEXTURE, - D3DTA_TEXTURE | D3DTA_COMPLEMENT, - D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE, - D3DTA_TEXTURE | D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE, - D3DTA_TFACTOR, - D3DTA_TFACTOR | D3DTA_COMPLEMENT, - D3DTA_TFACTOR | D3DTA_ALPHAREPLICATE, - D3DTA_TFACTOR | D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE, - D3DTA_CURRENT, - D3DTA_CURRENT | D3DTA_COMPLEMENT, - D3DTA_CURRENT | D3DTA_ALPHAREPLICATE, - D3DTA_CURRENT | D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE -}; - -// Assume TEXTURE_COORDINATE_2 = 0 -// TEXTURE_COORDINATE_3 = 1; -// TEXTURE_COORDINATE_4 = 2; -const int coordFormatTable[] = {2, 3, 4}; - -BOOL isLineWidthMessOutput = false; -BOOL isBackFaceMessOutput = false; -BOOL isLinePatternMessOutput = false; -BOOL isTexBorderMessOutput = false; - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateLinearFog( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat red, - jfloat green, - jfloat blue, - jdouble fdist, - jdouble bdist) -{ - GetDevice(); - - float fstart = (float) fdist; - float fend = (float) bdist; - - device->SetRenderState(d3dCtx->deviceInfo->fogMode, - D3DFOG_LINEAR); - device->SetRenderState(D3DRS_FOGCOLOR, - D3DCOLOR_COLORVALUE(red, green, blue, 0)); - - device->SetRenderState(D3DRS_FOGSTART, - *((LPDWORD) (&fstart))); - device->SetRenderState(D3DRS_FOGEND, - *((LPDWORD) (&fend))); - device->SetRenderState(D3DRS_FOGENABLE, TRUE); - -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateExponentialFog( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat red, - jfloat green, - jfloat blue, - jfloat density) -{ - GetDevice(); - - float d = (float) density; - - device->SetRenderState(d3dCtx->deviceInfo->fogMode, - D3DFOG_EXP); - device->SetRenderState(D3DRS_FOGCOLOR, - D3DCOLOR_COLORVALUE(red, green, blue, 0)); - device->SetRenderState(D3DRS_FOGDENSITY, - *((LPDWORD) (&d))); - device->SetRenderState(D3DRS_FOGENABLE, TRUE); - -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateModelClip( - JNIEnv *env, - jobject obj, - jlong ctx, - jint planeNum, - jboolean enableFlag, - jdouble A, - jdouble B, - jdouble C, - jdouble D) -{ - DWORD status; - float clip[4]; - - GetDevice(); - - clip[0] = -A; - clip[1] = -B; - clip[2] = -C; - clip[3] = -D; - - device->GetRenderState(D3DRS_CLIPPLANEENABLE, &status); - - if (enableFlag) { - device->SetClipPlane(planeNum, clip); - device->SetRenderState(D3DRS_CLIPPLANEENABLE, - status | (1 << planeNum)); - } else { - device->SetRenderState(D3DRS_CLIPPLANEENABLE, - status & ~(1 << planeNum)); - } -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setModelViewMatrix( - JNIEnv * env, - jobject obj, - jlong ctx, - jdoubleArray viewMatrix, - jdoubleArray modelMatrix) -{ - D3DXMATRIX d3dMatrix; - - GetDevice(); - - - jdouble *matrix = reinterpret_cast<jdouble*>( - env->GetPrimitiveArrayCritical(modelMatrix, NULL)); - - CopyTranspose(d3dMatrix, matrix); - - env->ReleasePrimitiveArrayCritical(modelMatrix, matrix, 0); - - - device->SetTransform(D3DTS_WORLD,&d3dMatrix); - - matrix = reinterpret_cast<jdouble*>( - env->GetPrimitiveArrayCritical(viewMatrix, NULL)); - CopyTranspose(d3dMatrix, matrix); - - env->ReleasePrimitiveArrayCritical(viewMatrix, matrix, 0); - - // Because we negate the third row in projection matrix to - // make ._34 = 1. Here we negate the third column of View - // matrix to compensate it. - d3dMatrix._13 = -d3dMatrix._13; - d3dMatrix._23 = -d3dMatrix._23; - d3dMatrix._33 = -d3dMatrix._33; - d3dMatrix._43 = -d3dMatrix._43; - - device->SetTransform(D3DTS_VIEW, &d3dMatrix); -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setProjectionMatrix( - JNIEnv * env, - jobject obj, - jlong ctx, - jdoubleArray projMatrix) -{ - - GetDevice(); - - jdouble *s = reinterpret_cast<jdouble*>( - env->GetPrimitiveArrayCritical(projMatrix, NULL)); - - /* - * There are five steps we need to do in order that this - * matrix is useful by D3D - * - * (1) We need to transpose the matrix since in Java3D v' = M*v - * but in Direct3D v' = v*N where N is the transpose of M - * - * (2) Invert the Z value in clipping coordinates because OpenGL - * uses left-handed clipping coordinates, while Java3D defines - * right-handed coordinates everywhere. i.e. do the following - * after the transpose - * - * d3dMatrix._13 *= -1; - * d3dMatrix._23 *= -1; - * d3dMatrix._33 *= -1; - * d3dMatrix._43 *= -1; - * - * (3) In Direct3D, the z-depths range is [0,1] instead of - * OGL [-1, 1], so we need to multiple it by - * - * [1 0 0 0] - * R = [0 1 0 0] - * [0 0 0.5 0] - * [0 0 0.5 1] - * - * after the transpose and negate. i.e. N*R - * - * (4) We want w-friendly perspective matrix, i.e., d3dMatrix._34 = 1 - * We do this first by divide the whole matrix by - * 1/d3dMatrix._34 Since d3dMatrix._34 is always negative as - * input from Java3D. Now d3dMatrix._34 = -1 - * - * (5) To make d3dMatrix._34 = 1, we negate the third row of it. - * Because of this, we need to negate the third column in - * View matrix to compensate this. - * - * All of the above operation is combined together in this - * implementation for optimization. - */ - D3DXMATRIX m; - - if (s[14] != 0) { - // Perspective projection - // s[14] is always < 0 - float ratio = -1/s[14]; - m._12= m._13 = m._14 = m._21 = m._23 = - m._24 = m._41 = m._42 = m._44 = 0; - m._11 = s[0]*ratio; - m._22 = s[5]*ratio; - m._31 = -s[2]*ratio; - m._32 = -s[6]*ratio; - m._33 = -(s[14]-s[10])*ratio/2; - m._43 = -s[11]*ratio/2; - m._34 = 1; - } else { - // parallel projection - m._12 = m._13 = m._14 = m._21 = m._23 = - m._24 = m._31 = m._32 = m._34 = 0; - m._11 = s[0]; - m._22 = s[5]; - m._33 = s[10]/2; - m._41 = s[3]; - m._42 = s[7]; - m._43 = (s[15]-s[11])/2; - m._44 = s[15]; - } - - env->ReleasePrimitiveArrayCritical(projMatrix, s, 0); - device->SetTransform(D3DTS_PROJECTION, &m); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setViewport( - JNIEnv *env, - jobject obj, - jlong ctx, - jint x, - jint y, - jint width, - jint height) -{ - GetDevice(); - - if (d3dCtx->bFullScreen) { - width = d3dCtx->devmode.dmPelsWidth; - height = d3dCtx->devmode.dmPelsHeight; - } - D3DVIEWPORT9 vp = {x, y, width, height, 0.0f, 1.0f}; - - device->SetViewport(&vp); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setSceneAmbient( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat red, - jfloat green, - jfloat blue) -{ - GetDevice(); - /* - Clamp(red); - Clamp(green); - Clamp(blue); - */ - device->SetRenderState(D3DRS_AMBIENT, - D3DCOLOR_COLORVALUE(red, green, blue, 0)); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setLightEnables( - JNIEnv *env, - jobject obj, - jlong ctx, - jlong enable_mask, - jint nlights) -{ - GetDevice(); - -#pragma warning(disable:4244) // loss of data from __int64 to int - - for (int i=nlights-1; i>=0; i--) { - device->LightEnable(i, enable_mask & (long)(1L<<i)); - } -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setLightingEnable( - JNIEnv *env, - jobject obj, - jlong ctx, - jboolean lightingOn) -{ - GetDevice(); - - d3dCtx->isLightEnable = lightingOn; - device->SetRenderState(D3DRS_LIGHTING, lightingOn); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_disableFog( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - GetDevice(); - device->SetRenderState(D3DRS_FOGENABLE, false); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_disableModelClip( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - GetDevice(); - device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); -} - -/** - * one of : - * STENCIL_KEEP - keeps the current value (no operation performed). This is the default setting. - * STENCIL_ZERO - Sets the stencil buffer value to 0. - * STENCIL_REPLACE - Sets the stencil buffer value to refValue, as specified by setStencilFunction. - * STENCIL_INCR - Increments the current stencil buffer value. - * STENCIL_DECR - Decrements the current stencil buffer value. - * STENCIL_INVERT - Bitwise inverts the current stencil buffer value. -*/ -DWORD getStencilOP(jint op) -{ - DWORD value = D3DSTENCILOP_KEEP; - switch(op) - { - case javax_media_j3d_RenderingAttributes_STENCIL_KEEP: - value = D3DSTENCILOP_KEEP; break; - case javax_media_j3d_RenderingAttributes_STENCIL_ZERO: - value = D3DSTENCILOP_ZERO; break; - case javax_media_j3d_RenderingAttributes_STENCIL_REPLACE: - value = D3DSTENCILOP_REPLACE; break; - case javax_media_j3d_RenderingAttributes_STENCIL_INCR: - value = D3DSTENCILOP_INCRSAT; break; - case javax_media_j3d_RenderingAttributes_STENCIL_DECR: - value = D3DSTENCILOP_DECRSAT; break; - case javax_media_j3d_RenderingAttributes_STENCIL_INVERT: - value = D3DSTENCILOP_INVERT; break; - default : - value = D3DSTENCILOP_KEEP; break; - } - - return value; -} - -/** - * ALWAYS - pixels are always drawn, irrespective of the stencil value. This effectively disables stencil testing. This is the default setting. - * NEVER - pixels are never drawn, irrespective of the stencil value. - * EQUAL - pixels are drawn if the stencil reference value is equal to the stored stencil value in the frame buffer. - * NOT_EQUAL - pixels are drawn if the stencil reference value is not equal to the stored stencil value in the frame buffer. - * LESS - pixels are drawn if the stencil reference value is less than the stored stencil value in the frame buffer. - * LESS_OR_EQUAL - pixels are drawn if the stencil reference value is less than or equal to the stored stencil value in the frame buffer. - * GREATER - pixels are drawn if the stencil reference value is greater than the stored stencil value in the frame buffer. - * GREATER_OR_EQUAL - pixels are drawn if the stencil reference value is greater than or equal to the stored stencil value in the frame buffer. -*/ -DWORD getStencilFunc(jint func) -{ - DWORD value = D3DCMP_ALWAYS; - switch(func) - { - case javax_media_j3d_RenderingAttributes_ALWAYS: - value = D3DCMP_ALWAYS; break; - case javax_media_j3d_RenderingAttributes_NEVER: - value = D3DCMP_NEVER; break; - case javax_media_j3d_RenderingAttributes_EQUAL: - value = D3DCMP_EQUAL; break; - case javax_media_j3d_RenderingAttributes_NOT_EQUAL: - value = D3DCMP_NOTEQUAL; break; - case javax_media_j3d_RenderingAttributes_LESS_OR_EQUAL: - value = D3DCMP_LESSEQUAL; break; - case javax_media_j3d_RenderingAttributes_GREATER: - value = D3DCMP_GREATER; break; - case javax_media_j3d_RenderingAttributes_GREATER_OR_EQUAL: - value = D3DCMP_GREATEREQUAL; break; - default : - value = D3DCMP_ALWAYS; break; - } - - return value; -} - -/** - * LESS_OR_EQUAL - DEFAULT pixels are drawn if the depth value is less than or equal to the stored depth value in the frame buffer. - * ALWAYS - pixels are always drawn, irrespective of the depth value. This effectively disables depth testing. - * NEVER - pixels are never drawn, irrespective of the depth value. - * EQUAL - pixels are drawn if the depth value is equal to the stored stencil value in the frame buffer. - * NOT_EQUAL - pixels are drawn if the depth value is not equal to the stored depth value in the frame buffer. - * LESS - pixels are drawn if the depth value is less than the stored stencil value in the frame buffer. - * GREATER - pixels are drawn if the depth value is greater than the stored stencil value in the frame buffer. - * GREATER_OR_EQUAL - pixels are drawn if the depth value is greater than or equal to the stored stencil value in the frame buffer. -*/ -DWORD getDepthFunc(jint func) -{ - DWORD value = D3DCMP_LESSEQUAL; - switch(func) - { - case javax_media_j3d_RenderingAttributes_ALWAYS: - value = D3DCMP_ALWAYS; break; - case javax_media_j3d_RenderingAttributes_NEVER: - value = D3DCMP_NEVER; break; - case javax_media_j3d_RenderingAttributes_EQUAL: - value = D3DCMP_EQUAL; break; - case javax_media_j3d_RenderingAttributes_NOT_EQUAL: - value = D3DCMP_NOTEQUAL; break; - case javax_media_j3d_RenderingAttributes_LESS_OR_EQUAL: - value = D3DCMP_LESSEQUAL; break; - case javax_media_j3d_RenderingAttributes_GREATER: - value = D3DCMP_GREATER; break; - case javax_media_j3d_RenderingAttributes_GREATER_OR_EQUAL: - value = D3DCMP_GREATEREQUAL; break; - default : - value = D3DCMP_LESSEQUAL; break; - } - - return value; -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetRenderingAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jboolean db_write_enable_override, - jboolean db_enable_override) -{ - GetDevice(); - - if (!db_write_enable_override) { - d3dCtx->zWriteEnable = TRUE; - device->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - } - - if (!db_enable_override) { - d3dCtx->zEnable = TRUE; - device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - } - - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_ALWAYS); - device->SetRenderState(D3DRS_ALPHAREF, 0); - if(d3dCtx->stencilWriteEnable) { - device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); - device->SetRenderState( D3DRS_STENCILREF, 0); - device->SetRenderState( D3DRS_STENCILMASK, 0xFFFFFFFF); - device->SetRenderState( D3DRS_STENCILWRITEMASK, 0xFFFFFFFF ); - - // Always increment the stencil value - device->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); - device->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); - device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); - - device->SetRenderState(D3DRS_STENCILENABLE, FALSE); - d3dCtx->stencilWriteEnable = false; - } - - /* setRasterOp(d3dCtx, R2_COPYPEN); */ - -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateRenderingAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jboolean db_write_enable_override, - jboolean db_enable_override, - jboolean db_enable, - jboolean db_write_enable, - jint db_func, - jfloat at_value, - jint at_func, - jboolean ignoreVertexColors, - jboolean rasterOpEnable, - jint rasterOp, - jboolean userStencilAvailable, - jboolean stencilEnable, - jint stencilFailOp, - jint stencilZFailOp, - jint stencilZPassOp, - jint stencilFunction, - jint stencilReferenceValue, - jint stencilCompareMask, - jint stencilWriteMask) -{ - - GetDevice(); - - DWORD alpha = (DWORD) (at_value * 255 + 0.5f); - - if (!db_enable_override) - { - if (db_enable) - { - d3dCtx->zEnable = TRUE; - device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - device->SetRenderState(D3DRS_ZFUNC, getDepthFunc(db_func)); - } - else - { - d3dCtx->zEnable = FALSE; - device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - } - } - - if (!db_write_enable_override) - { - d3dCtx->zWriteEnable = db_write_enable; - device->SetRenderState(D3DRS_ZWRITEENABLE, db_write_enable); - // disable ZFunc if ZBuffer is disabled ? no. - // ZFunc must work even when there is no z-buffer enable - device->SetRenderState(D3DRS_ZFUNC, getDepthFunc(db_func)); - } - - if (at_func == javax_media_j3d_RenderingAttributes_ALWAYS) - { - device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - } - else - { - device->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); - device->SetRenderState(D3DRS_ALPHAREF, alpha); - } - - switch (at_func) - { - case javax_media_j3d_RenderingAttributes_ALWAYS: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_ALWAYS); - break; - case javax_media_j3d_RenderingAttributes_NEVER: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_NEVER); - break; - case javax_media_j3d_RenderingAttributes_EQUAL: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_EQUAL); - break; - case javax_media_j3d_RenderingAttributes_NOT_EQUAL: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL); - break; - case javax_media_j3d_RenderingAttributes_LESS: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_LESS); - break; - case javax_media_j3d_RenderingAttributes_LESS_OR_EQUAL: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_LESSEQUAL); - break; - case javax_media_j3d_RenderingAttributes_GREATER: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); - break; - case javax_media_j3d_RenderingAttributes_GREATER_OR_EQUAL: - device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); - break; - } - -/* - stencilFailOp, * - stencilZFailOp, * - stencilZPassOp, * - stencilFunction, * - stencilReferenceValue, * - stencilCompareMask, * - stencilWriteMask * -*/ - if (userStencilAvailable == JNI_TRUE) - { - if (stencilEnable == JNI_TRUE) - { - // Turn on stenciling - device->SetRenderState( D3DRS_STENCILENABLE, TRUE ); - // printf("StencilEnable TRUE\n"); - // Set the function to always pass. - device->SetRenderState( D3DRS_STENCILFUNC, getStencilFunc(stencilFunction) ); - device->SetRenderState( D3DRS_STENCILREF, stencilReferenceValue ); - device->SetRenderState( D3DRS_STENCILMASK, stencilCompareMask ); - device->SetRenderState( D3DRS_STENCILWRITEMASK, stencilWriteMask ); - - // Always increment the stencil value - device->SetRenderState(D3DRS_STENCILFAIL, getStencilOP(stencilFailOp) ); - device->SetRenderState(D3DRS_STENCILZFAIL, getStencilOP(stencilZFailOp)); - device->SetRenderState(D3DRS_STENCILPASS, getStencilOP(stencilZPassOp) ); - } - else - { - device->SetRenderState( D3DRS_STENCILENABLE, FALSE ); - // printf("StencilEnable False\n"); - } - } - /* - else - { - printf("UserStencilEnable False\n"); - } - */ - -}// - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetPolygonAttributes( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - GetDevice(); - // D3D vertex order is reverse of OGL - d3dCtx->cullMode = D3DCULL_CW; - d3dCtx->fillMode = D3DFILL_SOLID; - device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); - d3dCtx->twoSideLightingEnable = false; - device->SetRenderState(D3DRS_DEPTHBIAS, 0); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updatePolygonAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jint polygonMode, - jint cullFace, - jboolean backFaceNormalFlip, - jfloat polygonOffset, - jfloat polygonOffsetFactor) -{ - - GetDevice(); - - jfloat zbias = polygonOffset + polygonOffsetFactor; - DWORD zbias_w = 0; - /* - * DirectX support Z-bias from 0 to 16 only and the - * direction is opposite to OGL. If we pass negative - * Z-bias the polygon will not render at all. - * So we map -ve polygon offset to positive value - * and +ve offset to 0. (i.e. we don't support positive - * polygon offset) - */ - if (zbias <= -1) { - zbias_w = max(-zbias/50, 1); - - if (zbias_w > 16) { - zbias_w = 16; - } - } - - device->SetRenderState(D3DRS_DEPTHBIAS, zbias_w); - - if (cullFace == javax_media_j3d_PolygonAttributes_CULL_NONE) { - d3dCtx->cullMode = D3DCULL_NONE; - device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - } else { - if (cullFace == javax_media_j3d_PolygonAttributes_CULL_BACK) { - d3dCtx->cullMode = D3DCULL_CW; - device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); - } else { - d3dCtx->cullMode = D3DCULL_CCW; - device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - } - } - - if (polygonMode == javax_media_j3d_PolygonAttributes_POLYGON_POINT) { - d3dCtx->fillMode = D3DFILL_POINT; - device->SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT); - } else if (polygonMode == javax_media_j3d_PolygonAttributes_POLYGON_LINE) { - d3dCtx->fillMode = D3DFILL_WIREFRAME; - device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); - } else { - d3dCtx->fillMode = D3DFILL_SOLID; - device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - } - - /* - if (debug && !isBackFaceMessOutput && - (backFaceNormalFlip) && (cullFace != javax_media_j3d_PolygonAttributes_CULL_BACK)) { - isBackFaceMessOutput = true; - printf("BackFaceNormalFlip is not support !\n"); - } - */ -} - -/* -void printDepthFunc(jint func) -{ - DWORD value = D3DCMP_LESSEQUAL; - printf("DepthFunc: "); - switch(func) - { - case javax_media_j3d_RenderingAttributes_ALWAYS: - printf(" D3DCMP_ALWAYS\n"); break; - case javax_media_j3d_RenderingAttributes_NEVER: - printf(" D3DCMP_NEVER\n"); break; - case javax_media_j3d_RenderingAttributes_EQUAL: - printf(" D3DCMP_EQUAL\n"); break; - case javax_media_j3d_RenderingAttributes_NOT_EQUAL: - printf(" D3DCMP_NOTEQUAL\n"); break; - case javax_media_j3d_RenderingAttributes_LESS_OR_EQUAL: - printf(" D3DCMP_LESSEQUAL\n"); break; - case javax_media_j3d_RenderingAttributes_GREATER: - printf(" D3DCMP_GREATER\n"); break; - case javax_media_j3d_RenderingAttributes_GREATER_OR_EQUAL: - printf(" D3DCMP_GREATEREQUAL\n"); break; - default : - printf(" D3DCMP_LESSEQUAL\n"); break; - } -} - -*/ - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetLineAttributes( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - // GetDevice(); - - // D3D don't support Line width - // glLineWidth(1); - // D3D9 doesnot support line Patterns - // @TODO must update this to use ID3DXLine Interface - /* - D3DLINEPATTERN pattern; - pattern.wRepeatFactor = 0; - pattern.wLinePattern = 0; - device->SetRenderState(D3DRS_LINEPATTERN, - *((LPDWORD) (&pattern))); - */ -} - - -// Note that some graphics card don't support it. -// In this case use RGB Emulation. -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateLineAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat lineWidth, - jint linePattern, - jint linePatternMask, - jint linePatternScaleFactor, - jboolean lineAntialiasing) -{ - // GetDevice(); - - //Alessandro - //D3DLINEPATTERN pattern; - - /* - if (lineWidth > 1) { - if (debug && !isLineWidthMessOutput) { - isLineWidthMessOutput = true; - printf("Line width > 1 not support !\n"); - } - } - */ - // glLineWidth(lineWidth); - /** Alessandro - if (linePattern == javax_media_j3d_LineAttributes_PATTERN_SOLID) { - pattern.wRepeatFactor = 0; - pattern.wLinePattern = 0; - - } else { - **/ - - /* - if (!d3dCtx->deviceInfo->linePatternSupport) { - if (debug && !isLinePatternMessOutput) { - printf("Device not support line pattern !\n"); - isLinePatternMessOutput = false; - } - } - */ - /** alessandro - if (linePattern == javax_media_j3d_LineAttributes_PATTERN_DASH) { // dashed lines - pattern.wRepeatFactor = 1; - pattern.wLinePattern = 0x00ff; - } else if (linePattern == javax_media_j3d_LineAttributes_PATTERN_DOT) { // dotted lines - pattern.wRepeatFactor = 1; - pattern.wLinePattern = 0x0101; - } else if (linePattern == javax_media_j3d_LineAttributes_PATTERN_DASH_DOT) { // dash-dotted lines - pattern.wRepeatFactor = 1; - pattern.wLinePattern = 0x087f; - } else if (linePattern == javax_media_j3d_LineAttributes_PATTERN_USER_DEFINED) { // user-defined mask - pattern.wRepeatFactor = linePatternScaleFactor; - pattern.wLinePattern = (WORD) linePatternMask; - } - } - - device->SetRenderState(D3DRS_LINEPATTERN, - *((LPDWORD) (&pattern))); - **/ - /* - if (lineAntialiasing == JNI_TRUE) { - glEnable (GL_LINE_SMOOTH); - } else { - glDisable (GL_LINE_SMOOTH); - } - */ -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetPointAttributes( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - GetDevice(); - - if (d3dCtx->pointSize != 1.0f) { - d3dCtx->pointSize = 1.0f; - device->SetRenderState(D3DRS_POINTSIZE, *((LPDWORD) &d3dCtx->pointSize)); - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updatePointAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat pointSize, - jboolean pointAntialiasing) -{ - // point Antialiasing not support by D3D - GetDevice(); - - if (pointSize < 1.0f) { - // We don't want to set pointSize unnecessary and - // trigger the software vertex processing mode in - // D3DVertexBuffer if possible. It is an error - // to set pointSize to zero under OGL. - pointSize = 1.0f; - } - - if (d3dCtx->pointSize != pointSize) { - device->SetRenderState(D3DRS_POINTSIZE, *((LPDWORD) - &pointSize)); - d3dCtx->pointSize = pointSize; - } -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetTexCoordGeneration( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - GetDevice(); - - int tus = d3dCtx->texUnitStage; - - if (tus >= d3dCtx->bindTextureIdLen) { - return; - } - - d3dCtx->texGenMode[tus] = TEX_GEN_NONE; - - if (d3dCtx->texTransformSet[tus]) { - device->SetTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus), - &(d3dCtx->texTransform[tus])); - } - - device->SetTextureStageState(tus, - D3DTSS_TEXCOORDINDEX, - D3DTSS_TCI_PASSTHRU); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexCoordGeneration( - JNIEnv *env, - jobject obj, - jlong ctx, - jboolean enable, - jint genMode, - jint format, - jfloat planeSx, - jfloat planeSy, - jfloat planeSz, - jfloat planeSw, - jfloat planeTx, - jfloat planeTy, - jfloat planeTz, - jfloat planeTw, - jfloat planeRx, - jfloat planeRy, - jfloat planeRz, - jfloat planeRw, - jfloat planeQx, - jfloat planeQy, - jfloat planeQz, - jfloat planeQw, - jdoubleArray eyeToVworld) -{ - - D3DXMATRIX m; - jdouble *mv; - GetDevice(); - - int tus = d3dCtx->texUnitStage; - - - if (tus >= d3dCtx->bindTextureIdLen) { - return; - } - - if (!enable) { - device->SetTextureStageState(tus, - D3DTSS_TEXCOORDINDEX, - D3DTSS_TCI_PASSTHRU); - d3dCtx->texGenMode[tus] = TEX_GEN_NONE; - return; - } - - d3dCtx->texCoordFormat[tus] = coordFormatTable[format]; - -// printf("TexCoordGenerationRetained_updateNative texStage %d set Mode %d, format %d, texTransformSet %d\n", tus, genMode, format, d3dCtx->texTransformSet[tus]); - - switch (genMode) { - case javax_media_j3d_TexCoordGeneration_EYE_LINEAR: - // Generated Coordinate = p1'*x + p2'*y + p3'*z + p4'*w; - // where (p1', p2', p3', p4') = (p1 p2 p3 p4)*eyeToVworld - mv = (jdouble * ) env->GetPrimitiveArrayCritical(eyeToVworld, 0); - m._11 = planeSx*mv[0] + planeSy*mv[4] + planeSz*mv[8] + planeSw*mv[12]; - m._21 = planeSx*mv[1] + planeSy*mv[5] + planeSz*mv[9] + planeSw*mv[13]; - m._31 = planeSx*mv[2] + planeSy*mv[6] + planeSz*mv[10] + planeSw*mv[14]; - m._41 = planeSx*mv[3] + planeSy*mv[7] + planeSz*mv[11] + planeSw*mv[15]; - m._12 = planeTx*mv[0] + planeTy*mv[4] + planeTz*mv[8] + planeTw*mv[12]; - m._22 = planeTx*mv[1] + planeTy*mv[5] + planeTz*mv[9] + planeTw*mv[13]; - m._32 = planeTx*mv[2] + planeTy*mv[6] + planeTz*mv[10] + planeTw*mv[14]; - m._42 = planeTx*mv[3] + planeTy*mv[7] + planeTz*mv[11] + planeTw*mv[15]; - - - if (format >= javax_media_j3d_TexCoordGeneration_TEXTURE_COORDINATE_3) { - m._13 = planeRx*mv[0] + planeRy*mv[4] + planeRz*mv[8] + planeRw*mv[12]; - m._23 = planeRx*mv[1] + planeRy*mv[5] + planeRz*mv[9] + planeRw*mv[13]; - m._33 = planeRx*mv[2] + planeRy*mv[6] + planeRz*mv[10] + planeRw*mv[14]; - m._43 = planeRx*mv[3] + planeRy*mv[7] + planeRz*mv[11] + planeRw*mv[15]; - - if (format >= javax_media_j3d_TexCoordGeneration_TEXTURE_COORDINATE_4) { - m._14 = planeQx*mv[0] + planeQy*mv[4] + planeQz*mv[8] + planeQw*mv[12]; - m._24 = planeQx*mv[1] + planeQy*mv[5] + planeQz*mv[9] + planeQw*mv[13]; - m._34 = planeQx*mv[2] + planeQy*mv[6] + planeQz*mv[10] + planeQw*mv[14]; - m._44 = planeQx*mv[3] + planeQy*mv[7] + planeQz*mv[11] + planeQw*mv[15]; - } else { - m._14 = 0; - m._24 = 0; - m._34 = 0; - m._44 = 0; - } - } else { - m._13 = 0; - m._23 = 0; - m._33 = 0; - m._43 = 0; - m._14 = 0; - m._24 = 0; - m._34 = 0; - m._44 = 0; - } - - env->ReleasePrimitiveArrayCritical(eyeToVworld, mv, 0); - - if (d3dCtx->texTransformSet[tus]) { - device->MultiplyTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus) , &m); - } else { - device->SetTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus), &m); - d3dCtx->texTransformSet[tus] = true; - } - d3dCtx->texGenMode[tus] = TEX_EYE_LINEAR; - - break; - - case javax_media_j3d_TexCoordGeneration_SPHERE_MAP: - /* - The matrix has to scale and translate the texture coordinates - Since in sphere map Tx = Nx/2 + 0.5, Ty = Ny/2 + 0.5 - */ - m._11 = 0.5f; m._12 = 0.0f; m._13 = 0.0f; m._14 = 0.0f; - m._21 = 0.0f; m._22 = 0.5f; m._23 = 0.0f; m._24 = 0.0f; - m._31 = 0.0f; m._32 = 0.0f; m._33 = 1.0f; m._34 = 0.0f; - m._41 = 0.5f; m._42 = 0.5f; m._43 = 0.0f; m._44 = 1.0f; - - if (d3dCtx->texTransformSet[tus]) { - // If texture transform already set, multiple by this - // matrix. - device->MultiplyTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus) , &m); - } else { - device->SetTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus), &m); - d3dCtx->texTransformSet[tus] = true; - } - - d3dCtx->texGenMode[tus] = TEX_SPHERE_MAP; - break; - case javax_media_j3d_TexCoordGeneration_OBJECT_LINEAR: - // OBJECT_LINEAR not support by D3D, we'll do it ourselve. - d3dCtx->planeS[tus][0] = planeSx; - d3dCtx->planeS[tus][1] = planeSy; - d3dCtx->planeS[tus][2] = planeSz; - d3dCtx->planeS[tus][3] = planeSw; - d3dCtx->planeT[tus][0] = planeTx; - d3dCtx->planeT[tus][1] = planeTy; - d3dCtx->planeT[tus][2] = planeTz; - d3dCtx->planeT[tus][3] = planeTw; - d3dCtx->planeR[tus][0] = planeRx; - d3dCtx->planeR[tus][1] = planeRy; - d3dCtx->planeR[tus][2] = planeRz; - d3dCtx->planeR[tus][3] = planeRw; - d3dCtx->planeQ[tus][0] = planeQx; - d3dCtx->planeQ[tus][1] = planeQy; - d3dCtx->planeQ[tus][2] = planeQz; - d3dCtx->planeQ[tus][3] = planeQw; - d3dCtx->texGenMode[tus] = TEX_OBJ_LINEAR; - break; - case javax_media_j3d_TexCoordGeneration_NORMAL_MAP: - d3dCtx->texGenMode[tus] = TEX_NORMAL_MAP; - break; - case javax_media_j3d_TexCoordGeneration_REFLECTION_MAP: - d3dCtx->texGenMode[tus] = TEX_REFLECT_MAP; - break; - default: - printf("Unknown TexCoordinate Generation mode %d\n", genMode); - } -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetTextureAttributes( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - GetDevice(); - - int tus = d3dCtx->texUnitStage; - - if (tus >= d3dCtx->bindTextureIdLen) { - return; - } - - if (d3dCtx->texTransformSet[tus]) { - d3dCtx->texTransformSet[tus] = false; - device->SetTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus), - &identityMatrix); - } - - // perspCorrectionMode always turn on in DX8.0 if device support - - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jdoubleArray transform, jboolean isIdentityT, - jint textureMode, - jint perspCorrectionMode, - jfloat textureBlendColorRed, - jfloat textureBlendColorGreen, - jfloat textureBlendColorBlue, - jfloat textureBlendColorAlpha, - jint format) -{ - - D3DCOLOR textureBlendColor; - BOOL alphaDisable = FALSE; - - GetDevice(); - - int tus = d3dCtx->texUnitStage; - - if (tus >= d3dCtx->bindTextureIdLen) { - return; - } - - // perspCorrectionMode always turn on in DX8.0 if device support - - if (isIdentityT) { - d3dCtx->texTransformSet[tus] = false; - device->SetTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus), - &identityMatrix); - } else { - D3DXMATRIX *m = &(d3dCtx->texTransform[tus]); - jdouble *mx_ptr = reinterpret_cast<jdouble *>( - env->GetPrimitiveArrayCritical(transform, NULL)); - CopyTranspose((*m), mx_ptr); - - env->ReleasePrimitiveArrayCritical(transform, mx_ptr, 0); - /* - printf("set Tex Transform \n"); - printf("%f, %f, %f, %f\n", (*m)._11, (*m)._12, (*m)._13, (*m)._14); - printf("%f, %f, %f, %f\n", (*m)._21, (*m)._22, (*m)._23, (*m)._24); - printf("%f, %f, %f, %f\n", (*m)._31, (*m)._23, (*m)._33, (*m)._34); - printf("%f, %f, %f, %f\n", (*m)._41, (*m)._42, (*m)._43, (*m)._44); - */ - d3dCtx->texTransformSet[tus] = true; - d3dCtx->texTranslateSet[tus] = false; - device->SetTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + tus), m); - } - - /* set texture environment mode */ - - switch (textureMode) { - case javax_media_j3d_TextureAttributes_MODULATE: - switch (format) { - case J3D_RGBA: - case INTENSITY: - case LUMINANCE_ALPHA: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_MODULATE); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_COLORARG2, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_MODULATE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG2, D3DTA_CURRENT); - break; - case J3D_RGB: - case LUMINANCE: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_MODULATE); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_COLORARG2, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_DISABLE); - break; - case ALPHA: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_MODULATE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG2, D3DTA_CURRENT); - break; - default: - printf("Format %d not support\n", format); - } - break; - case javax_media_j3d_TextureAttributes_DECAL: - switch (format) { - case J3D_RGBA: - case INTENSITY: - case LUMINANCE_ALPHA: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_BLENDTEXTUREALPHA); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_COLORARG2, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_DISABLE); - break; - case J3D_RGB: - case LUMINANCE: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_DISABLE); - break; - case ALPHA: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - break; - default: - printf("Format %d not support\n", format); - } - break; - case javax_media_j3d_TextureAttributes_BLEND: - // Two pass is needed for this mode, the first pass - // will - - textureBlendColor = D3DCOLOR_COLORVALUE(textureBlendColorRed, - textureBlendColorGreen, - textureBlendColorBlue, - textureBlendColorAlpha); - - device->SetRenderState(D3DRS_TEXTUREFACTOR, - *((LPDWORD) &textureBlendColor)); - - switch (format) { - case ALPHA: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_MODULATE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG2, D3DTA_CURRENT); - break; - case INTENSITY: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_BLENDTEXTUREALPHA); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_COLORARG2, D3DTA_TFACTOR); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_BLENDTEXTUREALPHA); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG2, D3DTA_TFACTOR); - break; - case J3D_RGB: - case LUMINANCE: - device->SetTextureStageState(0, - D3DTSS_ALPHAOP, - D3DTOP_DISABLE); - alphaDisable = TRUE; - // fallthrough - case J3D_RGBA: - case LUMINANCE_ALPHA: - - if (!d3dCtx->deviceInfo->texLerpSupport) { - // Use two pass, first pass will enable specular and - // compute Cf*(1 - Ct), second pass will disable specular and - // comptue Cc*Ct. Note that multi-texturing is disable - // in this case, so stage 0 is always use. - device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); - device->SetTextureStageState(0, D3DTSS_COLORARG1, - D3DTA_TEXTURE|D3DTA_COMPLEMENT); - device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); - - if (!alphaDisable) { - device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT); - } - } else { - device->SetTextureStageState(tus, D3DTSS_COLOROP, D3DTOP_LERP); - device->SetTextureStageState(tus, D3DTSS_COLORARG0, D3DTA_TEXTURE); - device->SetTextureStageState(tus, D3DTSS_COLORARG1, D3DTA_TFACTOR); - device->SetTextureStageState(tus, D3DTSS_COLORARG2, D3DTA_CURRENT); - - if (!alphaDisable) { - device->SetTextureStageState(tus, D3DTSS_ALPHAOP, D3DTOP_LERP); - device->SetTextureStageState(tus, D3DTSS_ALPHAARG0, D3DTA_TEXTURE); - device->SetTextureStageState(tus, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); - device->SetTextureStageState(tus, D3DTSS_ALPHAARG2, D3DTA_CURRENT); - } - } - break; - default: - printf("Format %d not support\n", format); - } - - - break; - case javax_media_j3d_TextureAttributes_REPLACE: - switch (format) { - case J3D_RGBA: - case INTENSITY: - case LUMINANCE_ALPHA: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - break; - case J3D_RGB: - case LUMINANCE: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_DISABLE); - break; - case ALPHA: - device->SetTextureStageState(tus, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_COLORARG1, D3DTA_CURRENT); - device->SetTextureStageState(tus, - D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - device->SetTextureStageState(tus, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - break; - default: - printf("Format %d not support\n", format); - } - break; - default: - // TEXTURE COMBINER case - break; - } -} - - -// // This procedure is invoked after Blend2Pass to restore the original value -// extern "C" JNIEXPORT -// void JNICALL Java_javax_media_j3d_NativePipeline_restoreBlend1Pass( -// JNIEnv *env, -// jobject obj, -// jlong ctx) -// { -// GetDevice(); - -// device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); -// device->SetTextureStageState(0, D3DTSS_COLORARG1, -// D3DTA_TEXTURE|D3DTA_COMPLEMENT); -// device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); - -// device->SetRenderState(D3DRS_SRCBLEND, -// d3dCtx->srcBlendFunc); -// device->SetRenderState(D3DRS_DESTBLEND, -// d3dCtx->dstBlendFunc); -// device->SetRenderState(D3DRS_ALPHABLENDENABLE, -// d3dCtx->blendEnable); -// } - - -// extern "C" JNIEXPORT -// void JNICALL Java_javax_media_j3d_NativePipeline_updateBlend2Pass( -// JNIEnv *env, -// jobject obj, -// jlong ctx) -// { -// GetDevice(); -// device->GetRenderState(D3DRS_SRCBLEND, -// &d3dCtx->srcBlendFunc); -// device->GetRenderState(D3DRS_DESTBLEND, -// &d3dCtx->dstBlendFunc); -// device->GetRenderState(D3DRS_ALPHABLENDENABLE, -// &d3dCtx->blendEnable); - -// device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); -// device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); -// device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); -// device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); -// device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); -// device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR); -// } - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateCombiner( - JNIEnv *env, - jobject obj, - jlong ctx, - jint combineRgbMode, - jint combineAlphaMode, - jintArray combineRgbSrc, - jintArray combineAlphaSrc, - jintArray combineRgbFcn, - jintArray combineAlphaFcn, - jint combineRgbScale, - jint combineAlphaScale) -{ - - GetDevice(); - - DWORD ts = d3dCtx->texUnitStage; - - jint *rgbSrc = (jint *) env->GetPrimitiveArrayCritical(combineRgbSrc, NULL); - jint *alphaSrc = (jint *) env->GetPrimitiveArrayCritical(combineAlphaSrc, NULL); - jint *rgbFcn = (jint *) env->GetPrimitiveArrayCritical(combineRgbFcn, NULL); - jint *alphaFcn = (jint *) env->GetPrimitiveArrayCritical(combineAlphaFcn, NULL); - - - device->SetTextureStageState(ts, D3DTSS_COLOROP, - combineFunctionTable[(combineRgbMode << 2) + combineRgbScale - 1]); - - if (combineRgbMode != javax_media_j3d_TextureAttributes_COMBINE_INTERPOLATE) { - device->SetTextureStageState(ts, D3DTSS_COLORARG1, - combineSourceTable[(rgbSrc[0] << 2) + rgbFcn[0]]); - if (combineRgbMode != javax_media_j3d_TextureAttributes_COMBINE_REPLACE) { - device->SetTextureStageState(ts, D3DTSS_COLORARG2, - combineSourceTable[(rgbSrc[1] << 2) + rgbFcn[1]]); - } - } else { - device->SetTextureStageState(ts, D3DTSS_COLORARG1, - combineSourceTable[(rgbSrc[2] << 2) + rgbFcn[2]]); - device->SetTextureStageState(ts, D3DTSS_COLORARG2, - combineSourceTable[(rgbSrc[0] << 2) + rgbFcn[0]]); - device->SetTextureStageState(ts, D3DTSS_COLORARG0, - combineSourceTable[(rgbSrc[1] << 2) + rgbFcn[1]]); - } - - device->SetTextureStageState(ts, D3DTSS_ALPHAOP, - combineFunctionTable[(combineAlphaMode << 2) + combineAlphaScale - 1]); - - if (combineAlphaMode != javax_media_j3d_TextureAttributes_COMBINE_INTERPOLATE) { - device->SetTextureStageState(ts, D3DTSS_ALPHAARG1, - combineSourceTable[(alphaSrc[0] << 2) + alphaFcn[0]]); - if (combineAlphaMode != javax_media_j3d_TextureAttributes_COMBINE_REPLACE) { - device->SetTextureStageState(ts, D3DTSS_ALPHAARG2, - combineSourceTable[(alphaSrc[1] << 2) + alphaFcn[1]]); - } - } else { - device->SetTextureStageState(ts, D3DTSS_ALPHAARG0, - combineSourceTable[(alphaSrc[2] << 2) + alphaFcn[2]]); - device->SetTextureStageState(ts, D3DTSS_ALPHAARG1, - combineSourceTable[(alphaSrc[0] << 2) + alphaFcn[0]]); - device->SetTextureStageState(ts, D3DTSS_ALPHAARG2, - combineSourceTable[(alphaSrc[1] << 2) + alphaFcn[1]]); - } - - env->ReleasePrimitiveArrayCritical(combineRgbSrc, rgbSrc, 0); - env->ReleasePrimitiveArrayCritical(combineAlphaSrc, alphaSrc, 0); - env->ReleasePrimitiveArrayCritical(combineRgbFcn, rgbFcn, 0); - env->ReleasePrimitiveArrayCritical(combineAlphaFcn, alphaFcn, 0); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureColorTable( - JNIEnv *env, - jobject obj, - jlong ctx, - jint numComponents, - jint colorTableSize, - jintArray textureColorTable) -{ - // Not support by D3D -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateMaterialColor( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat colorRed, - jfloat colorGreen, - jfloat colorBlue, - jfloat transparency) -{ - GetDevice(); - - d3dCtx->currentColor_r = colorRed; - d3dCtx->currentColor_g = colorGreen; - d3dCtx->currentColor_b = colorBlue; - d3dCtx->currentColor_a = transparency; - - d3dCtx->isLightEnable = false; - device->SetRenderState(D3DRS_LIGHTING, false); - if (d3dCtx->resetColorTarget) { - device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, - D3DMCS_COLOR1); - device->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, - D3DMCS_MATERIAL); - device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, - D3DMCS_MATERIAL); - device->SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, - D3DMCS_MATERIAL); - d3dCtx->resetColorTarget = false; - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateMaterial( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat colorRed, - jfloat colorGreen, - jfloat colorBlue, - jfloat transparency, - jfloat aRed, - jfloat aGreen, - jfloat aBlue, - jfloat eRed, - jfloat eGreen, - jfloat eBlue, - jfloat dRed, - jfloat dGreen, - jfloat dBlue, - jfloat sRed, - jfloat sGreen, - jfloat sBlue, - jfloat shininess, - jint colorTarget, - jboolean lightEnable) -{ - D3DMATERIAL9 material; - - GetDevice(); - - switch (colorTarget) { - case javax_media_j3d_Material_DIFFUSE: - device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, - D3DMCS_COLOR1); - break; - case javax_media_j3d_Material_SPECULAR: - device->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, - D3DMCS_COLOR1); - d3dCtx->resetColorTarget = true; - break; - case javax_media_j3d_Material_AMBIENT: - device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, - D3DMCS_COLOR1); - d3dCtx->resetColorTarget = true; - break; - case javax_media_j3d_Material_AMBIENT_AND_DIFFUSE: - device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, - D3DMCS_COLOR1); - device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, - D3DMCS_COLOR1); - d3dCtx->resetColorTarget = true; - break; - case javax_media_j3d_Material_EMISSIVE: - device->SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, - D3DMCS_COLOR1); - d3dCtx->resetColorTarget = true; - break; - default: - printf("Material updateNative: Uknown colorTarget %d\n", colorTarget); - } - - material.Power = shininess; - - CopyColor(material.Emissive, eRed, eGreen, eBlue, 1.0f); - CopyColor(material.Ambient, aRed, aGreen, aBlue, 1.0f); - CopyColor(material.Specular, sRed, sGreen, sBlue, 1.0f); - - d3dCtx->currentColor_a = transparency; - - if (lightEnable) { - d3dCtx->currentColor_r = dRed; - d3dCtx->currentColor_g = dGreen; - d3dCtx->currentColor_b = dBlue; - - CopyColor(material.Diffuse, dRed, dGreen, dBlue, - transparency); - - } else { - d3dCtx->currentColor_r = colorRed; - d3dCtx->currentColor_g = colorGreen; - d3dCtx->currentColor_b = colorBlue; - - CopyColor(material.Diffuse, colorRed, colorGreen, - colorBlue, transparency); - } - - - d3dCtx->isLightEnable = lightEnable; - device->SetRenderState(D3DRS_LIGHTING, lightEnable); - device->SetMaterial(&material); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetTransparency( - JNIEnv *env, - jobject obj, - jlong ctx, - jint geometryType, - jint polygonMode, - jboolean lineAA, - jboolean pointAA) -{ - GetDevice(); - - // Line/Point Antialiasing not support - - /* - if (((((geometryType & LINE) != 0) || polygonMode == POLYGON_LINE) - && lineAA == JNI_TRUE) || - ((((geometryType & _POINT) != 0) || polygonMode == POLYGON_POINT) - && pointAA == JNI_TRUE)) { - device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - } else { - */ - device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - // } -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTransparencyAttributes( - JNIEnv *env, - jobject tr, - jlong ctx, - jfloat transparency, - jint geometryType, - jint polygonMode, - jboolean lineAA, - jboolean pointAA, - jint transparencyMode, - jint srcBlendFunction, - jint dstBlendFunction) -{ - - GetDevice(); - - // No screen door transparency in D3D, use BLENDED - // Don't know how to use STIPPLEDALPHA either. - /* - if (transparencyMode != TRANS_SCREEN_DOOR) { - device->SetRenderState(D3DRS_STIPPLEDALPHA, FALSE); - } else { - device->SetRenderState(D3DRS_STIPPLEDALPHA, TRUE); - } - */ - - if (transparencyMode < javax_media_j3d_TransparencyAttributes_NONE) { - /* - ((((geometryType & LINE) != 0) || polygonMode == POLYGON_LINE) - && lineAA == JNI_TRUE) || - ((((geometryType & _POINT) != 0) || polygonMode == POLYGON_POINT) - && pointAA == JNI_TRUE)) { - */ - device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - device->SetRenderState(D3DRS_SRCBLEND, - blendFunctionTable[srcBlendFunction]); - device->SetRenderState(D3DRS_DESTBLEND, - blendFunctionTable[dstBlendFunction]); - } else { - device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - } -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetColoringAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat colorRed, - jfloat colorGreen, - jfloat colorBlue, - jfloat transparency, - jboolean lightEnable) -{ - - GetDevice(); - - if (!lightEnable) { - d3dCtx->currentColor_r = colorRed; - d3dCtx->currentColor_g = colorGreen; - d3dCtx->currentColor_b = colorBlue; - d3dCtx->currentColor_a = transparency; - } - device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); - // No line smooth in D3D -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateColoringAttributes( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat dRed, - jfloat dGreen, - jfloat dBlue, - jfloat colorRed, - jfloat colorGreen, - jfloat colorBlue, - jfloat transparency, - jboolean lightEnable, - jint shadeModel) -{ - - GetDevice(); - - d3dCtx->currentColor_a = transparency; - if (lightEnable) { - d3dCtx->currentColor_r = dRed; - d3dCtx->currentColor_g = dGreen; - d3dCtx->currentColor_b = dBlue; - } else { - d3dCtx->currentColor_r = colorRed; - d3dCtx->currentColor_g = colorGreen; - d3dCtx->currentColor_b = colorBlue; - } - - - if (shadeModel == javax_media_j3d_ColoringAttributes_SHADE_FLAT) { - device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); - } else { - device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); - } -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_resetTextureNative( - JNIEnv *env, - jobject obj, - jlong ctx, - jint texUnitIndex) -{ - GetDevice(); - - if (texUnitIndex < 0) { - texUnitIndex = 0; - } - - d3dCtx->texUnitStage = texUnitIndex; - - if (texUnitIndex >= d3dCtx->bindTextureIdLen) { - return; - } - device->SetTexture(texUnitIndex, NULL); - d3dCtx->bindTextureId[texUnitIndex] = -1; - - if (d3dCtx->texTransformSet[texUnitIndex]) { - d3dCtx->texTransformSet[texUnitIndex] = false; - device->SetTransform((D3DTRANSFORMSTATETYPE) - (D3DTS_TEXTURE0 + texUnitIndex), - &identityMatrix); - } - d3dCtx->texGenMode[texUnitIndex] = TEX_GEN_NONE; - device->SetTextureStageState(texUnitIndex, - D3DTSS_TEXCOORDINDEX, - D3DTSS_TCI_PASSTHRU); - device->SetTextureStageState(texUnitIndex, - D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(texUnitIndex, - D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(texUnitIndex, - D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - device->SetTextureStageState(texUnitIndex, - D3DTSS_ALPHAARG1, D3DTA_TEXTURE); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_bindTexture2D( - JNIEnv *env, - jobject obj, - jlong ctx, - jint objectId, - jboolean enable) -{ - GetDevice(); - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - return; - } - - if (!enable) { - device->SetTexture(d3dCtx->texUnitStage, NULL); - d3dCtx->bindTextureId[d3dCtx->texUnitStage] = -1; - } else { - if (d3dCtx->bindTextureId[d3dCtx->texUnitStage] == objectId) { - return; - } - - if (objectId >= d3dCtx->textureTableLen) { - DWORD i; - DWORD len = max(objectId+1, d3dCtx->textureTableLen << 1); - LPDIRECT3DTEXTURE9 *newTable = (LPDIRECT3DTEXTURE9 *) - malloc(sizeof(LPDIRECT3DTEXTURE9) * len); - - if (newTable == NULL) { - printf("Not enough memory to alloc texture table of size %d.\n", len); - return; - } - for (i=0; i < d3dCtx->textureTableLen; i++) { - newTable[i] = d3dCtx->textureTable[i]; - } - for (i=d3dCtx->textureTableLen; i < len; i++) { - newTable[i] = NULL; - } - d3dCtx->textureTableLen = len; - SafeFree(d3dCtx->textureTable); - d3dCtx->textureTable = newTable; - } - - d3dCtx->bindTextureId[d3dCtx->texUnitStage] = objectId; - if (d3dCtx->textureTable[objectId] != NULL) { - device->SetTexture(d3dCtx->texUnitStage, - d3dCtx->textureTable[objectId]); - } - // else we will bind this in updateTextureImage - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DFilterModes( - JNIEnv *env, - jobject obj, - jlong ctx, - jint minFilter, - jint magFilter) -{ - GetDevice(); - - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - return; - } - - d3dCtx->texLinearMode = false; - - /* set texture min filter */ - switch (minFilter) { - case javax_media_j3d_Texture_FASTEST: - case javax_media_j3d_Texture_BASE_LEVEL_POINT: - device->SetSamplerState(d3dCtx->texUnitStage, - D3DSAMP_MINFILTER, D3DTEXF_POINT); - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MIPFILTER, D3DTEXF_POINT); - break; - case javax_media_j3d_Texture_BASE_LEVEL_LINEAR: - d3dCtx->texLinearMode = true; - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MIPFILTER, D3DTEXF_POINT); - break; - case javax_media_j3d_Texture_MULTI_LEVEL_POINT: - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MINFILTER, D3DTEXF_POINT); - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); - break; - case javax_media_j3d_Texture_NICEST: - case javax_media_j3d_Texture_MULTI_LEVEL_LINEAR: - d3dCtx->texLinearMode = true; - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); - break; - } - - /* set texture mag filter */ - switch (magFilter) { - case javax_media_j3d_Texture_FASTEST: - case javax_media_j3d_Texture_BASE_LEVEL_POINT: - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MAGFILTER, D3DTEXF_POINT); - break; - case javax_media_j3d_Texture_NICEST: - case javax_media_j3d_Texture_BASE_LEVEL_LINEAR: - d3dCtx->texLinearMode = true; - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - break; - } - - return; -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DLodRange( - JNIEnv *env, - jobject obj, - jlong ctx, - jint baseLevel, - jint maximumLevel, - jfloat minimumLod, - jfloat maximumLod) -{ -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DLodOffset( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat lodOffsetS, - jfloat lodOffsetT, - jfloat lodOffsetR) -{ - /* not supported */ -} - -void updateTextureBoundary(JNIEnv *env, - jobject obj, - jlong ctx, - jint boundaryModeS, - jint boundaryModeT, - jint boundaryModeR, - jfloat boundaryRed, - jfloat boundaryGreen, - jfloat boundaryBlue, - jfloat boundaryAlpha) -{ - GetDevice(); - - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - return; - } - - /* set texture wrap parameter */ - BOOL useBorderMode = FALSE; - - // D3D ignored border color in CLAMP mode. - // Instead D3D use Border color in D3DTADDRESS_BORDER only. - // So we approximate the effect by using D3DTADDRESS_BORDER - // mode if linear filtering mode is used. - - switch (boundaryModeS) { - case javax_media_j3d_Texture_WRAP: - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSU, - D3DTADDRESS_WRAP); - break; - case javax_media_j3d_Texture_CLAMP: - if (!d3dCtx->texLinearMode || !d3dCtx->deviceInfo->texBorderModeSupport) { - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSU, - D3DTADDRESS_CLAMP); - } else { - useBorderMode = TRUE; - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSU, - D3DTADDRESS_BORDER); - } - break; - } - - switch (boundaryModeT) { - case javax_media_j3d_Texture_WRAP: - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSV, - D3DTADDRESS_WRAP); - break; - case javax_media_j3d_Texture_CLAMP: - if (!d3dCtx->texLinearMode || !d3dCtx->deviceInfo->texBorderModeSupport) { - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSV, - D3DTADDRESS_CLAMP); - } else { - useBorderMode = TRUE; - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSV, - D3DTADDRESS_BORDER); - } - break; - } - - if (boundaryModeR >= 0) { - switch (boundaryModeR) { - case javax_media_j3d_Texture_WRAP: - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSW, - D3DTADDRESS_WRAP); - break; - case javax_media_j3d_Texture_CLAMP: - if (!d3dCtx->texLinearMode || !d3dCtx->deviceInfo->texBorderModeSupport) { - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSW, - D3DTADDRESS_CLAMP); - } else { - useBorderMode = TRUE; - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_ADDRESSW, - D3DTADDRESS_BORDER); - } - break; - } - } - - if (useBorderMode) { - D3DCOLOR color = D3DCOLOR_COLORVALUE(boundaryRed, boundaryGreen, - boundaryBlue, boundaryAlpha); - - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_BORDERCOLOR, - *((DWORD *) &color)); - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DBoundary( - JNIEnv *env, - jobject obj, - jlong ctx, - jint boundaryModeS, - jint boundaryModeT, - jfloat boundaryRed, - jfloat boundaryGreen, - jfloat boundaryBlue, - jfloat boundaryAlpha) -{ - updateTextureBoundary(env, obj, ctx, boundaryModeS, - boundaryModeT, -1, - boundaryRed, boundaryGreen, - boundaryBlue, boundaryAlpha); - -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DSharpenFunc( - JNIEnv *env, - jobject obj, - jlong ctx, - jint numPts, - jfloatArray pts) -{ -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DFilter4Func( - JNIEnv *env, - jobject obj, - jlong ctx, - jint numPts, - jfloatArray pts) -{ -} - - -void updateTextureAnisotropicFilter( - jlong ctx, - jfloat degree) -{ - GetDevice(); - - if (degree > 1) { - DWORD deg = degree + 0.5f; // round float to int - // This will overwrite the previous setting in - // updateTextureFilterModes() - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MINFILTER, - D3DTEXF_ANISOTROPIC); - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MAGFILTER, - D3DTEXF_ANISOTROPIC); - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MIPFILTER, - D3DTEXF_ANISOTROPIC); - - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MAXANISOTROPY, deg); - } else { - // updateTextureFilterModes() will always invoke before - // updateTextureAnisotropicFilter() to set Filter mode - // correctly. - device->SetSamplerState (d3dCtx->texUnitStage, - D3DSAMP_MAXANISOTROPY, 1); - } - -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DAnisotropicFilter( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat degree) -{ - updateTextureAnisotropicFilter(ctx, degree); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DAnisotropicFilter( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat degree) -{ - GetCtx(); - - if (d3dCtx->deviceInfo->maxTextureDepth > 0) { - updateTextureAnisotropicFilter(ctx, degree); - } - -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapAnisotropicFilter( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat degree) -{ - updateTextureAnisotropicFilter(ctx, degree); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DSubImage( - JNIEnv *env, - jobject obj, - jlong ctx, - jint level, - jint xoffset, - jint yoffset, - jint textureFormat, - jint imageFormat, - jint imgXOffset, - jint imgYOffset, - jint tilew, - jint width, - jint height, - jint dataType, - jobject data, - jboolean useAutoMipMap) -{ - /* Note: useAutoMipMap is not use for SubImage in the d3d pipe */ - GetDevice(); - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - return; - } - - INT currBindTex = d3dCtx->bindTextureId[d3dCtx->texUnitStage]; - - if ((currBindTex < 1) || - (currBindTex >= d3dCtx->textureTableLen)) { - if (debug) { - printf("Internal Error : UpdateTextureSubImage bind texture ID %d, textureTableLen %d, texUnitStage = %d \n", currBindTex, d3dCtx->textureTableLen, d3dCtx->texUnitStage); - } - return; - } - - LPDIRECT3DTEXTURE9 surf = d3dCtx->textureTable[currBindTex]; - - if ((surf == NULL) || - ((level > 0) && (!d3dCtx->deviceInfo->supportMipmap))) { - return; - } - - void *imageObjPtr; - jbyte *dataBuffer; - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - imageObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)data, NULL); - } - else { - imageObjPtr = (void *)env->GetDirectBufferAddress(data); - } - - // update Image data - switch (imageFormat) { - case IMAGE_FORMAT_BYTE_BGR: - case IMAGE_FORMAT_BYTE_RGB: - case IMAGE_FORMAT_BYTE_ABGR: - case IMAGE_FORMAT_BYTE_RGBA: - case IMAGE_FORMAT_BYTE_LA: - case IMAGE_FORMAT_BYTE_GRAY: - case IMAGE_FORMAT_INT_BGR: - case IMAGE_FORMAT_INT_RGB: - case IMAGE_FORMAT_INT_ARGB: - dataBuffer = (jbyte *) imageObjPtr; - copyDataToSurface(imageFormat, textureFormat, xoffset, yoffset, - imgXOffset, imgYOffset, - width, height, tilew, dataBuffer, - surf, level); - break; - case IMAGE_FORMAT_USHORT_GRAY: - default: - throwAssert(env, "updateTexture2DSubImage : imageFormat illegal format"); - return; - } - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); - } - -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DImage( - JNIEnv *env, - jobject obj, - jlong ctx, - jint numLevels, - jint level, - jint textureFormat, - jint imageFormat, - jint width, - jint height, - jint boundaryWidth, - jint dataType, - jobject data, - jboolean useAutoMipMap) -{ - GetDevice(); - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - if (debug) { - printf("Internal Error: texUnitState %d, bindTextureIDLen %d\n", - d3dCtx->texUnitStage, d3dCtx->bindTextureIdLen); - } - return; - } - - INT currBindTex = d3dCtx->bindTextureId[d3dCtx->texUnitStage]; - - if ((currBindTex < 1) || - (currBindTex >= d3dCtx->textureTableLen)) { - if (debug) { - printf("Internal Error : UpdateTextureImage bind texture ID %d, textureTableLen %d, texUnitStage = %d \n", currBindTex, d3dCtx->textureTableLen, d3dCtx->texUnitStage); - } - return; - } - - LPDIRECT3DTEXTURE9 surf = d3dCtx->textureTable[currBindTex]; - - if (level == 0) { - if (surf != NULL) { - // see if no. of mipmap level change - - if (surf->GetLevelCount() != numLevels) { - d3dCtx->freeResource(surf); - d3dCtx->textureTable[currBindTex] = NULL; - surf = NULL; - } - } - - if (surf == NULL) { - // Need to create surface - surf = createTextureSurface(d3dCtx, numLevels, textureFormat, - width, height, useAutoMipMap); - - if (surf == NULL) { - return; - } - - d3dCtx->textureTable[currBindTex] = surf; - } - } else { - if (surf == NULL) { - return; - } - } - - if ((level > 0) && (!d3dCtx->deviceInfo->supportMipmap)) { - if (debug) { - printf("mipmap not support\n"); - } - return; - } - - // update Image data - if (data != NULL) { - void *imageObjPtr; - jbyte *dataBuffer; - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - imageObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)data, NULL); - } - else { - imageObjPtr = (void *)env->GetDirectBufferAddress(data); - } - - switch (imageFormat) { - case IMAGE_FORMAT_BYTE_BGR: - case IMAGE_FORMAT_BYTE_RGB: - case IMAGE_FORMAT_BYTE_ABGR: - case IMAGE_FORMAT_BYTE_RGBA: - case IMAGE_FORMAT_BYTE_LA: - case IMAGE_FORMAT_BYTE_GRAY: - case IMAGE_FORMAT_INT_BGR: - case IMAGE_FORMAT_INT_RGB: - case IMAGE_FORMAT_INT_ARGB: - dataBuffer = (jbyte *) imageObjPtr; - copyDataToSurface(imageFormat, textureFormat, 0, 0, 0, 0, - width, height, width, dataBuffer, - surf, level); - break; - case IMAGE_FORMAT_USHORT_GRAY: - default: - throwAssert(env, "updateTexture2DImage : imageFormat illegal format"); - return; - } - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); - } - } - device->SetTexture(d3dCtx->texUnitStage, surf); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_bindTexture3D( - JNIEnv *env, - jobject obj, - jlong ctx, - jint objectId, - jboolean enable) -{ - GetDevice(); - - if ((d3dCtx->deviceInfo->maxTextureDepth <= 0) || - (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen)) { - return; - } - - if (!enable) { - device->SetTexture(d3dCtx->texUnitStage, NULL); - d3dCtx->bindTextureId[d3dCtx->texUnitStage] = -1; - } else { - if (d3dCtx->bindTextureId[d3dCtx->texUnitStage] == objectId) { - return; - } - if (objectId >= d3dCtx->volumeTableLen) { - DWORD i; - DWORD len = max(objectId+1, d3dCtx->volumeTableLen << 1); - LPDIRECT3DVOLUMETEXTURE9 *newTable = (LPDIRECT3DVOLUMETEXTURE9 *) - malloc(sizeof(LPDIRECT3DVOLUMETEXTURE9) * len); - - if (newTable == NULL) { - printf("Not enough memory to alloc volume texture table of size %d.\n", len); - return; - } - for (i=0; i < d3dCtx->volumeTableLen; i++) { - newTable[i] = d3dCtx->volumeTable[i]; - } - for (i=d3dCtx->volumeTableLen; i < len; i++) { - newTable[i] = NULL; - } - d3dCtx->volumeTableLen = len; - SafeFree(d3dCtx->volumeTable); - d3dCtx->volumeTable = newTable; - } - - d3dCtx->bindTextureId[d3dCtx->texUnitStage] = objectId; - if (d3dCtx->volumeTable[objectId] != NULL) { - device->SetTexture(d3dCtx->texUnitStage, - d3dCtx->volumeTable[objectId]); - } - // else we will bind this in updateTextureImage - } - -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DFilterModes( - JNIEnv *env, - jobject obj, - jlong ctx, - jint minFilter, - jint magFilter) -{ - GetCtx(); - - if (d3dCtx->deviceInfo->maxTextureDepth > 0) { - Java_javax_media_j3d_NativePipeline_updateTexture2DFilterModes( - env, obj, ctx, minFilter, magFilter); - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DLodRange( - JNIEnv *env, - jobject obj, - jlong ctx, - jint baseLevel, - jint maximumLevel, - jfloat minimumLod, - jfloat maximumLod) -{ - // Not support -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DLodOffset( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat lodOffsetS, - jfloat lodOffsetT, - jfloat lodOffsetR) -{ - /* not supported */ -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DBoundary( - JNIEnv *env, - jobject obj, - jlong ctx, - jint boundaryModeS, - jint boundaryModeT, - jint boundaryModeR, - jfloat boundaryRed, - jfloat boundaryGreen, - jfloat boundaryBlue, - jfloat boundaryAlpha) -{ - - GetCtx(); - - if (d3dCtx->deviceInfo->maxTextureDepth > 0) { - - updateTextureBoundary( - env, obj, ctx, - boundaryModeS, - boundaryModeT, - boundaryModeR, - boundaryRed, - boundaryGreen, - boundaryBlue, - boundaryAlpha); - } -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DImage( - JNIEnv *env, - jobject obj, - jlong ctx, - jint numLevels, - jint level, - jint textureFormat, - jint imageFormat, - jint width, - jint height, - jint depth, - jint boundaryWidth, - jint dataType, - jobject data, - jboolean useAutoMipMap) -{ - GetDevice(); - - if (d3dCtx->deviceInfo->maxTextureDepth <= 0) { - return; - } - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - if (debug) { - printf("Internal Error: texUnitState %d, bindTextureIDLen %d\n", - d3dCtx->texUnitStage, d3dCtx->bindTextureIdLen); - } - return; - } - - - INT currBindTex = d3dCtx->bindTextureId[d3dCtx->texUnitStage]; - - if ((currBindTex < 1) || - (currBindTex >= d3dCtx->volumeTableLen)) { - if (debug) { - printf("Internal Error : UpdateTexture3DImage bind texture ID %d, volumeTableLen %d, texUnitStage = %d \n", currBindTex, d3dCtx->volumeTableLen, d3dCtx->texUnitStage); - } - return; - } - - LPDIRECT3DVOLUMETEXTURE9 surf = d3dCtx->volumeTable[currBindTex]; - - if (level == 0) { - if (surf != NULL) { - // see if no. of mipmap level change - - if (surf->GetLevelCount() != numLevels) { - d3dCtx->freeResource(surf); - d3dCtx->volumeTable[currBindTex] = NULL; - surf = NULL; - } - } - - if (surf == NULL) { - surf = createVolumeTexture(d3dCtx, numLevels, textureFormat, - width, height, depth, useAutoMipMap); - if (surf == NULL) { - return; - } - - d3dCtx->volumeTable[currBindTex] = surf; - } - } else { - if (surf == NULL) { - return; - } - } - - if ((level > 0) && (!d3dCtx->deviceInfo->supportMipmap)) { - if (debug) { - printf("mipmap not support\n"); - } - return; - } - - // update Image data - if (data != NULL) { - void *imageObjPtr; - jbyte *dataBuffer; - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - imageObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)data, NULL); - } - else { - imageObjPtr = (void *)env->GetDirectBufferAddress(data); - } - - switch (imageFormat) { - case IMAGE_FORMAT_BYTE_BGR: - case IMAGE_FORMAT_BYTE_RGB: - case IMAGE_FORMAT_BYTE_ABGR: - case IMAGE_FORMAT_BYTE_RGBA: - case IMAGE_FORMAT_BYTE_LA: - case IMAGE_FORMAT_BYTE_GRAY: - case IMAGE_FORMAT_INT_BGR: - case IMAGE_FORMAT_INT_RGB: - case IMAGE_FORMAT_INT_ARGB: - dataBuffer = (jbyte *) imageObjPtr; - copyDataToVolume(imageFormat, textureFormat, 0, 0, 0, 0, 0, 0, - width, height, depth, width, height, dataBuffer, - surf, level); - break; - case IMAGE_FORMAT_USHORT_GRAY: - default: - throwAssert(env, "updateTexture3DImage : imageFormat illegal format"); - return; - } - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); - } - } - device->SetTexture(d3dCtx->texUnitStage, surf); - -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DSubImage( - JNIEnv *env, - jobject obj, - jlong ctx, - jint level, - jint xoffset, - jint yoffset, - jint zoffset, - jint textureFormat, - jint imageFormat, - jint imgXOffset, - jint imgYOffset, - jint imgZOffset, - jint tilew, - jint tileh, - jint width, - jint height, - jint depth, - jint dataType, - jobject data, - jboolean useAutoMipMap) -{ - /* Note: useAutoMipMap is not use for SubImage in the d3d pipe */ - - GetDevice(); - - if ((d3dCtx->deviceInfo->maxTextureDepth <= 0) || - (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen)) { - return; - } - - INT currBindTex = d3dCtx->bindTextureId[d3dCtx->texUnitStage]; - - if ((currBindTex < 1) || - (currBindTex >= d3dCtx->volumeTableLen)) { - if (debug) { - printf("Internal Error : UpdateTexture3DSubImage bind texture ID %d, volumeableLen %d, texUnitStage = %d \n", currBindTex, d3dCtx->volumeTableLen, d3dCtx->texUnitStage); - } - return; - } - - LPDIRECT3DVOLUMETEXTURE9 surf = d3dCtx->volumeTable[currBindTex]; - - if ((surf == NULL) || - ((level > 0) && (!d3dCtx->deviceInfo->supportMipmap))) { - return; - } - - void *imageObjPtr; - jbyte *dataBuffer; - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - imageObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)data, NULL); - } - else { - imageObjPtr = (void *)env->GetDirectBufferAddress(data); - } - - // update Image data - switch (imageFormat) { - case IMAGE_FORMAT_BYTE_BGR: - case IMAGE_FORMAT_BYTE_RGB: - case IMAGE_FORMAT_BYTE_ABGR: - case IMAGE_FORMAT_BYTE_RGBA: - case IMAGE_FORMAT_BYTE_LA: - case IMAGE_FORMAT_BYTE_GRAY: - case IMAGE_FORMAT_INT_BGR: - case IMAGE_FORMAT_INT_RGB: - case IMAGE_FORMAT_INT_ARGB: - dataBuffer = (jbyte *) imageObjPtr; - copyDataToVolume(imageFormat, textureFormat, xoffset, - yoffset, zoffset, imgXOffset, imgYOffset, - imgZOffset, width, height, depth, - tilew, tileh, dataBuffer, - surf, level); - break; - case IMAGE_FORMAT_USHORT_GRAY: - default: - throwAssert(env, "updateTexture3DSubImage : imageFormat illegal format"); - return; - } - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); - } - -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_bindTextureCubeMap( - JNIEnv *env, - jobject obj, - jlong ctx, - jint objectId, - jboolean enable) -{ - GetDevice(); - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - return; - } - - if (!enable) { - device->SetTexture(d3dCtx->texUnitStage, NULL); - d3dCtx->bindTextureId[d3dCtx->texUnitStage] = -1; - } else { - - if (d3dCtx->bindTextureId[d3dCtx->texUnitStage] == objectId) { - return; - } - - if (objectId >= d3dCtx->cubeMapTableLen) { - DWORD i; - DWORD len = max(objectId+1, d3dCtx->cubeMapTableLen << 1); - LPDIRECT3DCUBETEXTURE9 *newTable = (LPDIRECT3DCUBETEXTURE9 *) - malloc(sizeof(LPDIRECT3DCUBETEXTURE9) * len); - - if (newTable == NULL) { - printf("Not enough memory to alloc cubeMap table of size %d.\n", len); - return; - } - for (i=0; i < d3dCtx->cubeMapTableLen; i++) { - newTable[i] = d3dCtx->cubeMapTable[i]; - } - for (i=d3dCtx->cubeMapTableLen; i < len; i++) { - newTable[i] = NULL; - } - d3dCtx->cubeMapTableLen = len; - SafeFree(d3dCtx->cubeMapTable); - d3dCtx->cubeMapTable = newTable; - } - - d3dCtx->bindTextureId[d3dCtx->texUnitStage] = objectId; - if (d3dCtx->cubeMapTable[objectId] != NULL) { - device->SetTexture(d3dCtx->texUnitStage, - d3dCtx->cubeMapTable[objectId]); - } - // else we will bind this in updateTextureImage - } -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapFilterModes( - JNIEnv *env, - jobject obj, - jlong ctx, - jint minFilter, - jint magFilter) -{ - Java_javax_media_j3d_NativePipeline_updateTexture2DFilterModes(env, - obj, ctx, minFilter, magFilter); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapLodRange( - JNIEnv *env, - jobject obj, - jlong ctx, - jint baseLevel, - jint maximumLevel, - jfloat minimumLod, - jfloat maximumLod) -{ - // not support -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapLodOffset( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat lodOffsetS, - jfloat lodOffsetT, - jfloat lodOffsetR) -{ - /* not supported */ -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapBoundary( - JNIEnv *env, - jobject obj, - jlong ctx, - jint boundaryModeS, - jint boundaryModeT, - jfloat boundaryRed, - jfloat boundaryGreen, - jfloat boundaryBlue, - jfloat boundaryAlpha) -{ - updateTextureBoundary(env, obj, ctx, boundaryModeS, - boundaryModeT, -1, boundaryRed, - boundaryGreen, boundaryBlue, - boundaryAlpha); - -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapSubImage( - JNIEnv *env, - jobject obj, - jlong ctx, - jint face, - jint level, - jint xoffset, - jint yoffset, - jint textureFormat, - jint imageFormat, - jint imgXOffset, - jint imgYOffset, - jint tilew, - jint width, - jint height, - jint dataType, - jobject data, - jboolean useAutoMipMap) -{ - /* Note: useAutoMipMap is not use for SubImage in the d3d pipe */ - - GetDevice(); - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - return; - } - - INT currBindTex = d3dCtx->bindTextureId[d3dCtx->texUnitStage]; - - if ((currBindTex < 1) || - (currBindTex >= d3dCtx->cubeMapTableLen)) { - if (debug) { - printf("Internal Error : UpdateCubeMapSubImage bind texture ID %d, cubeMapTableLen %d, texUnitStage = %d \n", currBindTex, d3dCtx->cubeMapTableLen, d3dCtx->texUnitStage); - } - return; - } - - LPDIRECT3DCUBETEXTURE9 surf = d3dCtx->cubeMapTable[currBindTex]; - - if ((surf == NULL) || - ((level > 0) && (!d3dCtx->deviceInfo->supportMipmap))) { - return; - } - - void *imageObjPtr; - jbyte *dataBuffer; - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - imageObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)data, NULL); - } - else { - imageObjPtr = (void *)env->GetDirectBufferAddress(data); - } - - // update Image data - switch (imageFormat) { - case IMAGE_FORMAT_BYTE_BGR: - case IMAGE_FORMAT_BYTE_RGB: - case IMAGE_FORMAT_BYTE_ABGR: - case IMAGE_FORMAT_BYTE_RGBA: - case IMAGE_FORMAT_BYTE_LA: - case IMAGE_FORMAT_BYTE_GRAY: - case IMAGE_FORMAT_INT_BGR: - case IMAGE_FORMAT_INT_RGB: - case IMAGE_FORMAT_INT_ARGB: - dataBuffer = (jbyte *) imageObjPtr; - copyDataToCubeMap(imageFormat, textureFormat, - xoffset, yoffset, - imgXOffset, imgYOffset, - width, height, - tilew, dataBuffer, - surf, level, face); - break; - case IMAGE_FORMAT_USHORT_GRAY: - default: - throwAssert(env, "updateTextureCubeMapSubImage : imageFormat illegal format"); - return; - } - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapImage( - JNIEnv *env, - jobject obj, - jlong ctx, - jint face, - jint numLevels, - jint level, - jint textureFormat, - jint imageFormat, - jint width, - jint height, - jint boundaryWidth, - jint dataType, - jobject data, - jboolean useAutoMipMap) -{ - GetDevice(); - - if (d3dCtx->texUnitStage >= d3dCtx->bindTextureIdLen) { - if (debug) { - printf("Internal Error: texUnitState %d, bindTextureIDLen %d\n", - d3dCtx->texUnitStage, d3dCtx->bindTextureIdLen); - } - return; - } - - - INT currBindTex = d3dCtx->bindTextureId[d3dCtx->texUnitStage]; - - if ((currBindTex < 1) || - (currBindTex >= d3dCtx->cubeMapTableLen)) { - if (debug) { - printf("Internal Error : UpdateCubeMapImage bind texture ID %d, cubeMapTableLen %d, texUnitStage = %d \n", currBindTex, d3dCtx->cubeMapTableLen, d3dCtx->texUnitStage); - } - return; - } - - LPDIRECT3DCUBETEXTURE9 surf = d3dCtx->cubeMapTable[currBindTex]; - - if (level == 0) { - if (surf != NULL) { - // see if no. of mipmap level change - - if (surf->GetLevelCount() != numLevels) { - d3dCtx->freeResource(surf); - d3dCtx->cubeMapTable[currBindTex] = NULL; - surf = NULL; - } - } - - if (surf == NULL) { - // Need to create surface - surf = createCubeMapTexture(d3dCtx, numLevels, textureFormat, - width, height, useAutoMipMap); - if (surf == NULL) { - return; - } - - d3dCtx->cubeMapTable[currBindTex] = surf; - } - } else { - if (surf == NULL) { - return; - } - } - - if ((level > 0) && (!d3dCtx->deviceInfo->supportMipmap)) { - if (debug) { - printf("mipmap not support\n"); - } - return; - } - - // update Image data - if (data != NULL) { - void *imageObjPtr; - jbyte *dataBuffer; - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - imageObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)data, NULL); - } - else { - imageObjPtr = (void *)env->GetDirectBufferAddress(data); - } - - switch (imageFormat) { - case IMAGE_FORMAT_BYTE_BGR: - case IMAGE_FORMAT_BYTE_RGB: - case IMAGE_FORMAT_BYTE_ABGR: - case IMAGE_FORMAT_BYTE_RGBA: - case IMAGE_FORMAT_BYTE_LA: - case IMAGE_FORMAT_BYTE_GRAY: - case IMAGE_FORMAT_INT_BGR: - case IMAGE_FORMAT_INT_RGB: - case IMAGE_FORMAT_INT_ARGB: - dataBuffer = (jbyte *) imageObjPtr; - copyDataToCubeMap(imageFormat, textureFormat, 0, 0, 0, 0, - width, height, width, dataBuffer, - surf, level, face); - break; - case IMAGE_FORMAT_USHORT_GRAY: - default: - throwAssert(env, "updateTextureCubeMapImage : imageFormat illegal format"); - return; - } - - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || - (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { - env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); - } - - } - - device->SetTexture(d3dCtx->texUnitStage, surf); -} - - -extern "C" JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_NativePipeline_decal1stChildSetup( - JNIEnv *env, - jobject obj, - jlong ctx) -{ - GetDevice2(); - - device->SetRenderState(D3DRS_STENCILENABLE, TRUE); - device->Clear(0, NULL, D3DCLEAR_STENCIL, 0, 1.0, 0); - device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); - device->SetRenderState(D3DRS_STENCILREF, 0x1); - device->SetRenderState(D3DRS_STENCILMASK, 0x1); - device->SetRenderState(D3DRS_STENCILFAIL, - D3DSTENCILOP_KEEP); - device->SetRenderState(D3DRS_STENCILZFAIL, - D3DSTENCILOP_KEEP); - device->SetRenderState(D3DRS_STENCILPASS, - D3DSTENCILOP_REPLACE); - return d3dCtx->zEnable; -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_decalNthChildSetup( - JNIEnv *env, - jobject obj, - jlong ctx) - -{ - GetDevice(); - - d3dCtx->zEnable = FALSE; - device->SetRenderState(D3DRS_ZENABLE, FALSE); - device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); - device->SetRenderState(D3DRS_STENCILREF, 0x1); - device->SetRenderState(D3DRS_STENCILMASK, 0x1); - device->SetRenderState(D3DRS_STENCILFAIL, - D3DSTENCILOP_KEEP); - device->SetRenderState(D3DRS_STENCILZFAIL, - D3DSTENCILOP_KEEP); - device->SetRenderState(D3DRS_STENCILPASS, - D3DSTENCILOP_KEEP); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_decalReset( - JNIEnv *env, - jobject obj, - jlong ctx, - jboolean depthBufferEnable) -{ - GetDevice(); - - device->SetRenderState(D3DRS_STENCILENABLE, FALSE); - - if (depthBufferEnable) { - d3dCtx->zEnable = TRUE; - device->SetRenderState(D3DRS_ZENABLE, TRUE); - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_ctxUpdateEyeLightingEnable( - JNIEnv *env, - jobject obj, - jlong ctx, - jboolean localEyeLightingEnable) -{ - GetDevice(); - device->SetRenderState(D3DRS_LOCALVIEWER, localEyeLightingEnable); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_activeTextureUnit( - JNIEnv *env, - jobject obj, - jlong ctx, - jint index) -{ - GetDevice(); - // If this index is greater than max support stage, - // then subsequence texture operation will ignore. - if (index < 0) { - index = 0; - } - - d3dCtx->texUnitStage = index; -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureUnitState( - JNIEnv *env, - jobject obj, - jlong ctx, - jint index, - jboolean enable) -{ - GetDevice(); - // If this index is greater than max support stage, - // then subsequence texture operation will ignore. - if (index <= 0) { - index = 0; - } - - d3dCtx->texUnitStage = index; - - if (!enable && (index < d3dCtx->bindTextureIdLen)) { - device->SetTexture(index, NULL); - d3dCtx->bindTextureId[index] = -1; - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setDepthFunc( - JNIEnv * env, - jobject obj, - jlong ctx, - jint func) -{ - GetDevice(); - - if (func == javax_media_j3d_RenderingAttributesRetained_LESS) { - device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); - } else if (func == - javax_media_j3d_RenderingAttributesRetained_LEQUAL) { - device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - } - -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setBlendColor( - JNIEnv *env, - jobject obj, - jlong ctx, - jfloat colorRed, - jfloat colorGreen, - jfloat colorBlue, - jfloat colorAlpha) -{ - // Not support in D3D -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setBlendFunc( - JNIEnv * env, - jobject obj, - jlong ctx, - jint srcBlendFunction, - jint dstBlendFunction) -{ - GetDevice(); - - device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - device->SetRenderState(D3DRS_SRCBLEND, - blendFunctionTable[srcBlendFunction]); - device->SetRenderState(D3DRS_DESTBLEND, - blendFunctionTable[dstBlendFunction]); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setFogEnableFlag( - JNIEnv * env, - jobject obj, - jlong ctx, - jboolean enable) -{ - GetDevice(); - - device->SetRenderState(D3DRS_FOGENABLE, enable); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_updateSeparateSpecularColorEnable( - JNIEnv *env, - jobject obj, - jlong ctx, - jboolean enable) -{ -} - - -// Fix issue 221 : Temporary stub until Cg is implemented -/* - * Class: javax_media_j3d_NativePipeline - * Method: loadNativeCgLibrary - * Signature: ([Ljava/lang/String;)Z - */ -JNIEXPORT jboolean JNICALL -Java_javax_media_j3d_NativePipeline_loadNativeCgLibrary( - JNIEnv *env, - jobject thiz, - jobjectArray libpath) -{ - return JNI_FALSE; -} |