aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/d3d/Canvas3D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/native/d3d/Canvas3D.cpp')
-rw-r--r--src/native/d3d/Canvas3D.cpp1325
1 files changed, 0 insertions, 1325 deletions
diff --git a/src/native/d3d/Canvas3D.cpp b/src/native/d3d/Canvas3D.cpp
deleted file mode 100644
index 9d847e9..0000000
--- a/src/native/d3d/Canvas3D.cpp
+++ /dev/null
@@ -1,1325 +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"
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_setDrawActive(
- JNIEnv *env,
- jobject obj,
- jint fd)
-{
- // This function is only used for Solaris OpenGL
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_widSync(
- JNIEnv *env,
- jobject obj,
- jint fd,
- jint numWindows)
-{
- // This function is only used for Solaris OpenGL
-}
-
-
-
-extern "C" JNIEXPORT
-jboolean JNICALL Java_javax_media_j3d_NativePipeline_useSharedCtx(
- JNIEnv *env,
- jobject obj)
-{
- return JNI_FALSE;
-}
-
-
-
-extern "C" JNIEXPORT
-jlong JNICALL Java_javax_media_j3d_NativePipeline_createNewContext(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong display,
- jlong window,
- jlong fbConfigListPtr,
- jlong sharedCtx,
- jboolean isSharedCtx,
- jboolean offScreen,
- jboolean glslLibraryAvailable,
- jboolean cgLibraryAvailable)
-{
- HWND hwnd = WindowFromDC(reinterpret_cast<HDC>(window));
-
- lock();
- int vid = 0; // TODO: get needed info from fbConfigListPtr
- D3dCtx* ctx = new D3dCtx(env, cv, hwnd, offScreen, vid);
- if (ctx == NULL) {
- printf("%s", getErrorMessage(OUTOFMEMORY));
- unlock();
- return 0;
- }
-
- if (offScreen)
- {
- jclass cls = (jclass) env->GetObjectClass(cv);
- jfieldID fieldId = env->GetFieldID(cls,
- "offScreenCanvasSize",
- "Ljava/awt/Dimension;");
- jobject dimObj = env->GetObjectField(cv, fieldId);
- if (dimObj == NULL)
- {
- // user invoke queryProperties()
- ctx->offScreenWidth = 1;
- ctx->offScreenHeight = 1;
- }
- else
- {
- cls = (jclass) env->GetObjectClass(dimObj);
- fieldId = env->GetFieldID(cls, "width", "I");
- ctx->offScreenWidth = env->GetIntField(dimObj, fieldId);
- fieldId = env->GetFieldID(cls, "height", "I");
- ctx->offScreenHeight = env->GetIntField(dimObj, fieldId);
- }
- }
-
- if (!ctx->initialize(env, cv))
- {
- delete ctx;
- unlock();
- return 0;
- }
- d3dCtxList.push_back(ctx);
-
- unlock();
- return reinterpret_cast<jlong>(ctx);
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_createQueryContext(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong display,
- jlong window,
- jlong fbConfigListPtr,
- jboolean offScreen,
- jint width,
- jint height,
- jboolean glslLibraryAvailable,
- jboolean cgLibraryAvailable)
-{
- HWND hwnd = WindowFromDC(reinterpret_cast<HDC>(window));
-
- lock();
- // always use offscreen for property since it
- // makes no difference in D3D and this will also
- // instruct initialize() to use offScreenWidth/Height
- // instead of current window width/height to create
- // context.
-
- int vid = 0; // TODO: get needed info from fbConfigListPtr
- D3dCtx* ctx = new D3dCtx(env, cv, hwnd, true, vid);
- if (ctx == NULL) {
- printf("%s", getErrorMessage(OUTOFMEMORY));
- unlock();
- return;
- }
-
- ctx->offScreenWidth = width;
- ctx->offScreenHeight = height;
-
- ctx->initialize(env, cv);
- delete ctx;
- unlock();
-}
-
-extern "C" JNIEXPORT
-jboolean JNICALL Java_javax_media_j3d_NativePipeline_useCtx(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jlong display,
- jlong window)
-{
- return JNI_TRUE;
- // D3D doesn't have notation of current context
-}
-
-
-extern "C" JNIEXPORT
-jint JNICALL Java_javax_media_j3d_NativePipeline_getNumCtxLights(
- JNIEnv *env,
- jobject obj,
- jlong ctx)
-{
- GetDevice2();
-
- int nlight = d3dCtx->deviceInfo->maxActiveLights;
- if (nlight <= 0) {
- // In emulation & referene mode, D3D return -1
- // work around by setting 8.
- nlight = 8;
- }
- return nlight;
-}
-
-extern "C" JNIEXPORT
-jboolean JNICALL Java_javax_media_j3d_NativePipeline_initTexturemapping(
- JNIEnv *env,
- jobject texture,
- jlong ctx,
- jint texWidth,
- jint texHeight,
- jint objectId)
-{
- GetCtx2();
-
-
- if ((objectId >= 0) &&
- (objectId < d3dCtx->textureTableLen) &&
- (d3dCtx->textureTable[objectId] != NULL)) {
- // delete the previous texture reference
- // when canvas resize
- Java_javax_media_j3d_NativePipeline_freeTexture(env,
- NULL,
- ctx,
- objectId);
- }
-
- Java_javax_media_j3d_NativePipeline_bindTexture2D(env, texture, ctx, objectId, TRUE);
-
- Java_javax_media_j3d_NativePipeline_updateTexture2DImage(env, texture, ctx, 1, 0,
- J3D_RGBA, 0, texWidth,
- texHeight, 0, 0, NULL, JNI_FALSE);
- return (d3dCtx->textureTable[objectId] != NULL);
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_texturemapping(
- JNIEnv *env,
- jobject texture,
- jlong ctx,
- jint px,
- jint py,
- jint minX,
- jint minY,
- jint maxX,
- jint maxY,
- jint texWidth,
- jint texHeight,
- jint rasWidth,
- jint format,
- jint objectId,
- jbyteArray byteData,
- jint winWidth,
- jint winHeight)
-{
- GetDevice();
-
- Java_javax_media_j3d_NativePipeline_bindTexture2D(
- env, texture, ctx, objectId, TRUE);
-
- Java_javax_media_j3d_NativePipeline_updateTexture2DSubImage(
- env, texture, ctx, 0, minX, minY, J3D_RGBA, format,
- minX, minY, rasWidth, maxX-minX, maxY-minY, IMAGE_DATA_TYPE_BYTE_ARRAY,
- byteData, JNI_FALSE);
-
- LPDIRECT3DTEXTURE9 surf = d3dCtx->textureTable[objectId];
-
- if (surf == NULL) {
- if (debug) {
- printf("[Java 3D] Fail to apply texture in J3DGraphics2D !\n");
- }
- return;
- }
-
- D3DTLVERTEX screenCoord;
- DWORD zcmpfunc;
-
- screenCoord.sx = (px + minX) - 0.5f;
- screenCoord.sy = (py + minY) - 0.5f;
-
- // sz can be any number since we will disable z buffer
- // However rhw can't be 0, otherwise texture will not shown
- screenCoord.sz = 0.999f;
- screenCoord.rhw = 1;
-
- DWORD blendEnable;
- DWORD srcBlend;
- DWORD dstBlend;
-
- // disable z buffer
- device->GetRenderState(D3DRS_ZFUNC, &zcmpfunc);
- device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
- device->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
-
- device->GetRenderState(D3DRS_ALPHABLENDENABLE, &blendEnable);
- device->GetRenderState(D3DRS_SRCBLEND, &srcBlend);
- device->GetRenderState(D3DRS_DESTBLEND, &dstBlend);
-
- device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
- device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
- device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
-
- drawTextureRect(d3dCtx, device, surf, screenCoord,
- minX, minY, maxX, maxY,
- maxX - minX, maxY - minY, false);
-
- Java_javax_media_j3d_NativePipeline_bindTexture2D(
- env, texture, ctx, objectId, FALSE);
-
- device->SetRenderState(D3DRS_ALPHABLENDENABLE, blendEnable);
- device->SetRenderState(D3DRS_SRCBLEND, srcBlend);
- device->SetRenderState(D3DRS_DESTBLEND, dstBlend);
- device->SetRenderState(D3DRS_ZFUNC, zcmpfunc);
- device->SetRenderState(D3DRS_ZWRITEENABLE,
- d3dCtx->zWriteEnable);
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_clear(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jfloat r,
- jfloat g,
- jfloat b,
- jboolean clearStencil)
-{
-
- GetDevice();
-
-// TODO ACES: The d3dCtx->stencilEnable and d3dCtx->stencilWriteEnable flags
-// are not used in the rest of the code. They are never set to a value, and
-// they are not looked at by most of the code.
-
- /* Java 3D always clears the Z-buffer */
-
- if (!d3dCtx->zWriteEnable) {
- device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
- }
-
- // Issue 239 - clear stencil, if requested
- if (clearStencil) {
- device->SetRenderState(D3DRS_STENCILENABLE, TRUE);
- device->SetRenderState(D3DRS_STENCILWRITEMASK, ~0);
-
- // clear stencil and ZBuffer
- HRESULT hr = device->Clear(0, NULL,
- D3DCLEAR_STENCIL | D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
- D3DCOLOR_COLORVALUE(r, g, b, 1.0f), 1.0, 0);
- if (hr == D3DERR_INVALIDCALL) {
- printf("[Java3D] Error cleaning Canvas3D stencil & ZBuffer\n");
- }
- // printf("canvas3D clear stencil & ZBuffer\n");
-
- // TODO: DO WE NEED TO RESTORE THE STENCIL ENABLE AND WRITE MASK???
-// if (!d3dCtx->stencilEnable) {
-// device->SetRenderState(D3DRS_STENCILENABLE, FALSE);
-// }
-// if (!d3dCtx->stencilWriteEnable) {
-// device->SetRenderState(D3DRS_STENCILWRITEMASK, 0);
-// }
-
- }
- else {
- // clear ZBuffer only
- HRESULT hr = device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
- D3DCOLOR_COLORVALUE(r, g, b, 1.0f), 1.0, 0);
- if (hr == D3DERR_INVALIDCALL) {
- printf("[Java3D] Error cleaning Canvas3D ZBuffer\n");
- }
- // printf("canvas3D clear ZBuffer\n");
- }
-
- if (!d3dCtx->zWriteEnable) {
- device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
- }
-
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_textureFillBackground(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jfloat texMinU,
- jfloat texMaxU,
- jfloat texMinV,
- jfloat texMaxV,
- jfloat mapMinX,
- jfloat mapMaxX,
- jfloat mapMinY,
- jfloat mapMaxY,
- jboolean useBilinearFilter)
-{
-
- DWORD alphaTest, alphaBlend, cull, zBuffer,
- fog, lighting, stencil, specular;
-
- D3DXMATRIX Ortho2D;
- D3DXMATRIX ptm, wtm, vtm;
- COORDTEXVERTEX verts[4];
- D3DXMATRIX texMatrix;
- int tus;
-
- GetDevice();
-
- device->GetRenderState(D3DRS_ALPHATESTENABLE, &alphaTest);
- device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
-
- device->GetRenderState(D3DRS_ALPHABLENDENABLE, &alphaBlend);
- device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
-
- device->GetRenderState(D3DRS_CULLMODE, &cull);
- device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
-
- device->GetRenderState(D3DRS_ZENABLE, &zBuffer);
- device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
-
- device->GetRenderState(D3DRS_FOGENABLE, &fog);
- device->SetRenderState(D3DRS_FOGENABLE, FALSE);
-
- device->GetRenderState(D3DRS_LIGHTING, &lighting);
- device->SetRenderState(D3DRS_LIGHTING, FALSE);
-
- device->GetRenderState(D3DRS_STENCILENABLE, &stencil);
- device->SetRenderState(D3DRS_STENCILENABLE, FALSE);
-
- device->GetRenderState(D3DRS_SPECULARENABLE, &specular);
- device->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
-
- tus = d3dCtx->texUnitStage;
-
- if (tus >= d3dCtx->bindTextureIdLen) {
- if (debug) {
- printf("Internal Error: texUnitState %d, bindTextureIDLen %d\n",
- d3dCtx->texUnitStage, d3dCtx->bindTextureIdLen);
- }
- return;
- }
-
- if (d3dCtx->texTransformSet[tus]) {
- device->GetTransform((D3DTRANSFORMSTATETYPE)
- (D3DTS_TEXTURE0 + tus),
- &texMatrix);
-
- device->SetTransform((D3DTRANSFORMSTATETYPE)
- (D3DTS_TEXTURE0 + tus),
- &identityMatrix);
- }
-
- // TextureStage will be restore by caller.
- device->SetTextureStageState(tus,
- D3DTSS_TEXCOORDINDEX,
- D3DTSS_TCI_PASSTHRU);
-
- /* Setup filter mode if needed */
- if(useBilinearFilter) {
- /* fprintf(stderr, "Background : use bilinear filter\n"); */
- device->SetSamplerState (tus, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- device->SetSamplerState (tus, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
- device->SetSamplerState (tus, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- }
- /* For debugging only
- else {
- fprintf(stderr, "Background : Not use bilinear filter\n");
- }
- */
-
- device->GetTransform(D3DTS_PROJECTION, &ptm);
- device->GetTransform(D3DTS_WORLD, &wtm);
- device->GetTransform(D3DTS_VIEW, &vtm);
-
- Ortho2D._11 = 1.0;
- Ortho2D._12 = 0.0;
- Ortho2D._13 = 0.0;
- Ortho2D._14 = 0.0;
-
- Ortho2D._21 = 0.0;
- Ortho2D._22 = 1.0;
- Ortho2D._23 = 0.0;
- Ortho2D._24 = 0.0;
-
- Ortho2D._31 = 0.0;
- Ortho2D._32 = 0.0;
- Ortho2D._33 = 0.5;
- Ortho2D._34 = 0.0;
-
- Ortho2D._41 = 0.0;
- Ortho2D._42 = 0.0;
- Ortho2D._43 = 0.5;
- Ortho2D._44 = 1.0;
-
- /*
- printf("Ortho2D matix : \n");
- printf("%f, %f, %f, %f\n", Ortho2D._11, Ortho2D._12, Ortho2D._13, Ortho2D._14);
- printf("%f, %f, %f, %f\n", Ortho2D._21, Ortho2D._22, Ortho2D._23, Ortho2D._24);
- printf("%f, %f, %f, %f\n", Ortho2D._31, Ortho2D._32, Ortho2D._33, Ortho2D._34);
- printf("%f, %f, %f, %f\n", Ortho2D._41, Ortho2D._42, Ortho2D._43, Ortho2D._44);
- */
-
- device->SetTransform(D3DTS_PROJECTION, &Ortho2D);
- device->SetTransform(D3DTS_WORLD, &identityMatrix);
- device->SetTransform(D3DTS_VIEW, &identityMatrix);
-
- verts[0].tu = texMinU; /* tumin; */
- verts[0].tv = texMaxV; /* tvmax; */
- verts[1].tu = texMinU; /* tumin; */
- verts[1].tv = texMinV; /* tvmin; */
- verts[2].tu = texMaxU; /* tumax; */
- verts[2].tv = texMaxV; /* tvmax; */
- verts[3].tu = texMaxU; /* tumax; */
- verts[3].tv = texMinV; /* tvmin; */
-
- verts[0].sx = mapMinX;
- verts[0].sy = mapMaxY;
- verts[0].sz = 0.999f;
-
- verts[1].sx = mapMinX;
- verts[1].sy = mapMinY;
- verts[1].sz = 0.999f;
-
- verts[2].sx = mapMaxX;
- verts[2].sy = mapMaxY;
- verts[2].sz = 0.999f;
-
- verts[3].sx = mapMaxX;
- verts[3].sy = mapMinY;
- verts[3].sz = 0.999f;
-
- /*
- 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);
- */
-
- device->SetVertexShader(NULL);
-
- device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0));
-
- device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,
- 2, verts, sizeof(COORDTEXVERTEX));
-
-
- /* Restore renderstates */
- device->SetRenderState(D3DRS_ALPHATESTENABLE, alphaTest);
- device->SetRenderState(D3DRS_CULLMODE, cull);
- device->SetRenderState(D3DRS_ZENABLE, zBuffer);
- device->SetRenderState(D3DRS_FOGENABLE, fog);
- device->SetRenderState(D3DRS_LIGHTING, lighting);
- device->SetRenderState(D3DRS_STENCILENABLE, stencil);
- device->SetRenderState(D3DRS_SPECULARENABLE, specular);
-
- /* Restore texture Matrix transform */
- if (d3dCtx->texTransformSet[tus]) {
- device->SetTransform((D3DTRANSFORMSTATETYPE)
- (D3DTS_TEXTURE0 + tus),
- &texMatrix);
- }
-
- device->SetTransform(D3DTS_PROJECTION, &ptm);
- device->SetTransform(D3DTS_WORLD, &wtm);
- device->SetTransform(D3DTS_VIEW, &vtm);
-
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_textureFillRaster(JNIEnv *env,
- jobject obj,
- jlong ctx,
- jfloat texMinU,
- jfloat texMaxU,
- jfloat texMinV,
- jfloat texMaxV,
- jfloat mapMinX,
- jfloat mapMaxX,
- jfloat mapMinY,
- jfloat mapMaxY,
- jfloat mapZ,
- jfloat alpha,
- jboolean useBilinearFilter)
-{
-
- DWORD cull, lighting;
- D3DXMATRIX Ortho2D;
- D3DXMATRIX ptm, wtm, vtm;
- COORDCLRTEXVERTEX verts[4];
- D3DXMATRIX texMatrix;
- int tus;
-
- GetDevice();
-
- device->GetRenderState(D3DRS_CULLMODE, &cull);
- device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
-
- device->GetRenderState(D3DRS_LIGHTING, &lighting);
- device->SetRenderState(D3DRS_LIGHTING, FALSE);
-
- tus = d3dCtx->texUnitStage;
-
- if (tus >= d3dCtx->bindTextureIdLen) {
- if (debug) {
- printf("Internal Error: texUnitState %d, bindTextureIDLen %d\n",
- d3dCtx->texUnitStage, d3dCtx->bindTextureIdLen);
- }
- return;
- }
-
- // TextureStage will be restore by caller.
- device->SetTextureStageState(tus, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
- device->SetTextureStageState(tus, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- device->SetTextureStageState(tus, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
-
- /* Setup filter mode if needed */
- if(useBilinearFilter) {
- /* fprintf(stderr, "Raster : use bilinear filter\n"); */
- device->SetSamplerState (tus, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- device->SetSamplerState (tus, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
- device->SetSamplerState (tus, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- }
- /* For debugging only
- else {
- fprintf(stderr, "Raster : Not use bilinear filter\n");
- }
- */
-
- device->GetTransform(D3DTS_PROJECTION, &ptm);
- device->GetTransform(D3DTS_WORLD, &wtm);
- device->GetTransform(D3DTS_VIEW, &vtm);
-
- Ortho2D._11 = 2.0;
- Ortho2D._12 = 0.0;
- Ortho2D._13 = 0.0;
- Ortho2D._14 = 0.0;
-
- Ortho2D._21 = 0.0;
- Ortho2D._22 = 2.0;
- Ortho2D._23 = 0.0;
- Ortho2D._24 = 0.0;
-
- Ortho2D._31 = 0.0;
- Ortho2D._32 = 0.0;
- Ortho2D._33 = -1.0;
- Ortho2D._34 = 0.0;
-
- Ortho2D._41 = -1.0;
- Ortho2D._42 = -1.0;
- Ortho2D._43 = 0.0;
- Ortho2D._44 = 1.0;
-
- /*
- printf("Ortho2D matix : \n");
- printf("%f, %f, %f, %f\n", Ortho2D._11, Ortho2D._12, Ortho2D._13, Ortho2D._14);
- printf("%f, %f, %f, %f\n", Ortho2D._21, Ortho2D._22, Ortho2D._23, Ortho2D._24);
- printf("%f, %f, %f, %f\n", Ortho2D._31, Ortho2D._32, Ortho2D._33, Ortho2D._34);
- printf("%f, %f, %f, %f\n", Ortho2D._41, Ortho2D._42, Ortho2D._43, Ortho2D._44);
- */
-
- device->SetTransform(D3DTS_WORLD, &identityMatrix);
- device->SetTransform(D3DTS_VIEW, &identityMatrix);
- device->SetTransform(D3DTS_PROJECTION, &Ortho2D);
-
- verts[0].tu = texMinU; /* tumin; */
- verts[0].tv = texMaxV; /* tvmax; */
- verts[1].tu = texMinU; /* tumin; */
- verts[1].tv = texMinV; /* tvmin; */
- verts[2].tu = texMaxU; /* tumax; */
- verts[2].tv = texMaxV; /* tvmax; */
- verts[3].tu = texMaxU; /* tumax; */
- verts[3].tv = texMinV; /* tvmin; */
-
- D3DCOLOR alphaColor = 0xffffff | ((int)(alpha * 255.0f) << 24);
-
- verts[0].color = alphaColor;
- verts[0].sx = mapMinX;
- verts[0].sy = mapMaxY;
- verts[0].sz = mapZ;
-
- verts[1].color = alphaColor;
- verts[1].sx = mapMinX;
- verts[1].sy = mapMinY;
- verts[1].sz = mapZ;
-
- verts[2].color = alphaColor;
- verts[2].sx = mapMaxX;
- verts[2].sy = mapMaxY;
- verts[2].sz = mapZ;
-
- verts[3].color = alphaColor;
- verts[3].sx = mapMaxX;
- verts[3].sy = mapMinY;
- verts[3].sz = mapZ;
-
- /*
- 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);
-
- printf("(mapZ) = (%3.2f)\n",mapZ);
- */
- device->SetVertexShader(NULL);
-
- device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1 |
- D3DFVF_DIFFUSE | D3DFVF_TEXCOORDSIZE2(0));
-
- device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,
- 2, verts, sizeof(COORDCLRTEXVERTEX));
-
-
- /* Restore renderstates */
- device->SetRenderState(D3DRS_CULLMODE, cull);
- device->SetRenderState(D3DRS_LIGHTING, lighting);
-
- /* Restore texture Matrix transform */
- device->SetTransform(D3DTS_PROJECTION, &ptm);
- device->SetTransform(D3DTS_WORLD, &wtm);
- device->SetTransform(D3DTS_VIEW, &vtm);
-}
-
-
-JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_executeRasterDepth(JNIEnv *env,
- jobject obj,
- jlong ctx,
- jfloat posX,
- jfloat posY,
- jfloat posZ,
- jint srcOffsetX,
- jint srcOffsetY,
- jint rasterWidth,
- jint rasterHeight,
- jint depthWidth,
- jint depthHeight,
- jint depthFormat,
- jobject depthData)
-{
- void *depthObjPtr;
- D3DVERTEX worldCoord;
- D3DTLVERTEX screenCoord;
- int endx = srcOffsetX + rasterWidth;
- int endy = srcOffsetY + rasterHeight;
-
- GetDevice();
- /* printf("*** Canvas3D.executeRasterDepth() ***\n"); */
-
- // clipping
- if (srcOffsetX > depthWidth) {
- srcOffsetX = depthWidth;
- } else if (srcOffsetX < 0) {
- srcOffsetX = 0;
- }
- if (srcOffsetY > depthHeight) {
- srcOffsetY = depthHeight;
- } else if (srcOffsetY < 0) {
- srcOffsetY = 0;
- }
-
- if (endx > depthWidth) {
- endx = depthWidth;
- } else if (endx < 0) {
- endx = 0;
- }
- if (endy > depthHeight) {
- endy = depthHeight;
- } else if (endy < 0) {
- endy = 0;
- }
-
- int h = endy - srcOffsetY;
- int w = endx - srcOffsetX;
-
- // raster position is upper left corner, default for Java3D
- // ImageComponent currently has the data reverse in Y
- if ((h > 0) && (w > 0)) {
- worldCoord.x = posX;
- worldCoord.y = posY;
- worldCoord.z = posZ;
-
- d3dCtx->transform(&worldCoord, &screenCoord);
-
- if (d3dCtx->depthStencilSurface == NULL) {
- HRESULT hr =
- device->GetDepthStencilSurface(&d3dCtx->depthStencilSurface);
- if (FAILED(hr)) {
- if (debug) {
- printf("[Java3D] Fail to get depth stencil surface %s\n",
- DXGetErrorString9(hr));
- }
- return;
- }
- }
-
- depthObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)depthData, NULL);
-
- if (depthFormat == javax_media_j3d_DepthComponentRetained_DEPTH_COMPONENT_TYPE_INT) {
- copyDepthToSurface(d3dCtx,
- device,
- (int)(screenCoord.sx),
- (int)(screenCoord.sy),
- srcOffsetX, srcOffsetY,
- w, h, depthWidth, depthHeight,
- (jint *)depthObjPtr, d3dCtx->depthStencilSurface);
-
- } else { // javax_media_j3d_DepthComponentRetained_DEPTH_COMPONENT_TYPE_FLOAT
-
- copyDepthToSurface(d3dCtx,
- device,
- (int)(screenCoord.sx),
- (int)(screenCoord.sy),
- srcOffsetX, srcOffsetY,
- w, h, depthWidth, depthHeight,
- (jfloat *)depthObjPtr, d3dCtx->depthStencilSurface);
- }
- env->ReleasePrimitiveArrayCritical((jarray)depthData, depthObjPtr, 0);
-
- }
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_setRenderMode(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jint mode,
- jboolean dbEnable)
-{
- // D3D v8.0 doesn't support stereo
-}
-
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_clearAccum(
- JNIEnv *env,
- jobject obj,
- jlong ctx)
-{
- // D3D use full-scene antialiasing capbilities in device
- // instead of accumulation buffer (which it didn't support)
-}
-
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_accum(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jfloat value)
-{
- // D3D use full-scene antialiasing capbilities in device
- // instead of accumulation buffer (which didn't support)
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_accumReturn(
- JNIEnv *env,
- jobject obj,
- jlong ctx)
-{
- // D3D use full-scene antialiasing capbilities in device
- // instead of accumulation buffer (which it didn't support)
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_setDepthBufferWriteEnable(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jboolean mode)
-{
- GetDevice();
-
- d3dCtx->zWriteEnable = mode;
- device->SetRenderState(D3DRS_ZWRITEENABLE, mode);
-}
-
-
-VOID freePointerList()
-{
- if (useFreePointerList0) {
- if (freePointerList1.size() > 0) {
- lockSurfaceList();
- for (ITER_VOID p = freePointerList1.begin();
- p != freePointerList1.end(); ++p) {
- delete (*p);
- }
-
- freePointerList1.clear();
- unlockSurfaceList();
- }
- useFreePointerList0 = false;
- } else {
- if (freePointerList0.size() > 0) {
- lockSurfaceList();
- for (ITER_VOID p = freePointerList0.begin();
- p != freePointerList0.end(); ++p) {
- delete (*p);
- }
-
- freePointerList0.clear();
- unlockSurfaceList();
- }
- useFreePointerList0 = true;
-
- }
-}
-
-
-extern "C" JNIEXPORT
-jint JNICALL Java_javax_media_j3d_NativePipeline_swapBuffers(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong ctx,
- jlong display,
- jlong window)
-{
- GetDevice2();
-
- int retCode = NOCHANGE;
-
- HRESULT hr = device->Present(NULL, NULL, NULL, NULL);
-
- if (FAILED(hr)) {
- hr = device->TestCooperativeLevel();
- if (D3DERR_DEVICELOST == hr) {
- return NOCHANGE;
- }
- if (D3DERR_DEVICENOTRESET == hr) {
- if (debug) {
- printf("Buffer swap error %s, try Reset() the surface... \n",
- DXGetErrorString9(hr));
- }
- retCode = d3dCtx->resetSurface(env, cv);
- GetDevice2();
- hr = device->Present(NULL, NULL, NULL, NULL);
- if (FAILED(hr)) {
- if (debug) {
- printf("Buffer swap error %s \n",
- DXGetErrorString9(hr));
- }
- }
- }
-
- }
-
- d3dCtx->freeList();
- freePointerList();
- return retCode;
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_syncRender(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jboolean waitFlag)
-{
- // do nothing since D3D always wait in Blt
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_newDisplayList(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jint id)
-{
- GetCtx();
-
- if (id <= 0) {
- if (debug) {
- printf("In Canvas3D.newDisplayList id pass in = %d !\n", id);
- }
- return;
- }
-
- if (id >= d3dCtx->dlTableSize) {
- int newSize = d3dCtx->dlTableSize << 1;
- if (id >= newSize) {
- newSize = id+1;
- }
- int i=0;
- LPD3DDISPLAYLIST *newTable = new LPD3DDISPLAYLIST[newSize];
-
- if (newTable == NULL) {
- printf("%s", getErrorMessage(OUTOFMEMORY));
- exit(1);
- }
- // entry 0 is not used
- newTable[0] = NULL;
- while (++i < d3dCtx->dlTableSize) {
- newTable[i] = d3dCtx->displayListTable[i];
- }
- while (i < newSize) {
- newTable[i++] = NULL;
- }
- d3dCtx->dlTableSize = newSize;
- SafeDelete(d3dCtx->displayListTable);
- d3dCtx->displayListTable = newTable;
- }
-
- if (d3dCtx->displayListTable[id] != NULL) {
- SafeDelete(d3dCtx->displayListTable[id]);
- }
- d3dCtx->displayListTable[id] = new D3dDisplayList();
- if (d3dCtx->displayListTable[id] == NULL) {
- printf("%s", getErrorMessage(OUTOFMEMORY));
- exit(1);
- }
- d3dCtx->currDisplayListID = id;
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_endDisplayList(
- JNIEnv *env,
- jobject obj,
- jlong ctx)
-{
- GetDevice();
- d3dCtx->displayListTable[d3dCtx->currDisplayListID]->optimize(d3dCtx);
- d3dCtx->currDisplayListID = 0;
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_callDisplayList(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jint id,
- jboolean isNonUniformScale)
-{
- GetDevice();
-
- // TODO: Remove this two safe checks when release
- // d3dCtx->displayListTable[id]->render(d3dCtx);
-
-
- if ((id <= 0) || (id >= d3dCtx->dlTableSize)) {
- if (debug) {
- if (id <= 0) {
- printf("[Java 3D] Invalid Display List ID %d is invoked !\n", id);
- } else {
- printf("[Java 3D] Display List ID %d not yet initialize !\n", id);
- }
- }
- return;
- }
-
- LPD3DDISPLAYLIST dl = d3dCtx->displayListTable[id];
-
- if (dl == NULL) {
- if (debug) {
- printf("[Java 3D] Display List ID %d not yet initialize !\n", id);
- }
- return;
- }
- dl->render(d3dCtx);
-
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_freeDisplayList(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jint id)
-{
- GetCtx();
-
- if ((id < 0) || (id >= d3dCtx->dlTableSize)) {
- if (debug) {
- printf("[Java 3D] FreeDisplayList, id %d not within table range %d!\n", id,
- d3dCtx->dlTableSize);
- }
- return;
- }
-
- SafeDelete(d3dCtx->displayListTable[id]);
-}
-
-
-/*
- Native function to delete OGL texture object after j3d texture object
- has been deleted by java garbage collector.
- */
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_freeTexture(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jint id)
-{
- GetDevice();
-
- for (int i=0; i < d3dCtx->bindTextureIdLen; i++) {
- if (d3dCtx->bindTextureId[i] == id) {
- device->SetTexture(i, NULL);
- d3dCtx->bindTextureId[i] = -1;
- }
- }
-
- if ((id >= d3dCtx->textureTableLen) || (id < 1)) {
- if (debug) {
- printf("Internal Error : freeTexture ID %d, textureTableLen %d \n",
- id, d3dCtx->textureTableLen);
- }
- return;
- }
-
- d3dCtx->freeResource(d3dCtx->textureTable[id]);
- d3dCtx->textureTable[id] = NULL;
-}
-
-
-extern "C" JNIEXPORT
-jint JNICALL Java_javax_media_j3d_NativePipeline_getTextureUnitCount(
- JNIEnv *env,
- jobject obj,
- jlong ctx)
-{
- GetCtx2();
- return d3dCtx->deviceInfo->maxTextureUnitStageSupport;
-}
-
-
-extern "C" JNIEXPORT
-jlong JNICALL Java_javax_media_j3d_NativePipeline_createOffScreenBuffer(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong ctx,
- jlong display,
- jlong fbConfigListPtr,
- jint width,
- jint height)
- {
- // Issue 396.
- // createContext() will be invoked later in Renderer
- return 1;
-}
-
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_destroyContext(
- JNIEnv *env,
- jobject obj,
- jlong display,
- jlong window,
- jlong ctx)
-{
- GetDevice();
-
- lock();
- d3dCtxList.erase(find(d3dCtxList.begin(), d3dCtxList.end(), d3dCtx));
- delete d3dCtx;
- unlock();
-
- Java_javax_media_j3d_NativePipeline_cleanupRenderer(env, obj);
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_destroyOffScreenBuffer(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong ctx,
- jlong display,
- jlong fbConfigListPtr,
- jlong window)
-{
- // do nothing, since the old buffer will destory
- // in createOffScreenBuffer
-
- // TODO : this means that we will hold onto the last off-screen buffer;
- // we should clean this up at some point
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_readOffScreenBuffer(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong ctx,
- jint format,
- jint dataType,
- jobject data,
- jint width,
- jint height)
-{
- void *imageObjPtr;
-
- GetDevice();
-
- if (format == IMAGE_FORMAT_USHORT_GRAY) {
- printf("[Java 3D] readOffScreenBuffer not support IMAGE_FORMAT_USHORT_GRAY\n");
- return;
- }
-
- if (d3dCtx->backSurface == NULL) {
- HRESULT hr = device->GetBackBuffer(0,0, D3DBACKBUFFER_TYPE_MONO, //iSwapChain is 0
- &d3dCtx->backSurface);
- if (FAILED(hr)) {
- printf("[Java 3D] GetBackBuffer fail %s\n",
- DXGetErrorString9(hr));
- return;
- }
- }
-
- 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);
- }
-
- copyDataFromSurface(format, 0, 0, width, height, (jbyte *)imageObjPtr,
- d3dCtx->backSurface);
-
- if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) {
- env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0);
- }
- return;
-}
-
-
-extern "C" JNIEXPORT
-jint JNICALL Java_javax_media_j3d_NativePipeline_resizeD3DCanvas(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong ctx)
-{
- int status;
-
- GetCtx2();
- lock();
- status = d3dCtx->resize(env, cv);
- unlock();
-
- return status;
-}
-
-
-extern "C" JNIEXPORT
-jint JNICALL Java_javax_media_j3d_NativePipeline_toggleFullScreenMode(
- JNIEnv *env,
- jobject obj,
- jobject cv,
- jlong ctx)
-{
- int status;
-
- GetCtx2();
- lock();
- status = d3dCtx->toggleMode(!d3dCtx->bFullScreen, env, cv);
- unlock();
- if (status == RECREATEDFAIL) {
- return RECREATEDDRAW;
- }
- return status;
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_setFullSceneAntialiasing(
- JNIEnv *env,
- jobject obj,
- jlong ctx,
- jboolean enable)
-{
- GetDevice();
-
- if (!implicitMultisample) {
- device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, enable);
- }
-}
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_cleanupRenderer(
- JNIEnv *env,
- jobject obj)
-{
- lock();
- if (d3dCtxList.empty()) {
- D3dDriverInfo::release();
- }
- unlock();
-
- // Need to call it two times to free both list0 and list1
- freePointerList();
- freePointerList();
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_beginScene(
- JNIEnv *env,
- jobject obj,
- jlong ctx)
-{
- GetDevice();
- device->BeginScene();
-}
-
-
-extern "C" JNIEXPORT
-void JNICALL Java_javax_media_j3d_NativePipeline_endScene(
- JNIEnv *env,
- jobject obj,
- jlong ctx)
-{
- GetDevice();
- device->EndScene();
-}
-
-
-extern "C" JNIEXPORT
-jboolean JNICALL Java_javax_media_j3d_NativePipeline_validGraphicsMode(
- JNIEnv *env,
- jobject obj)
-{
- DEVMODE devMode;
-
- EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode);
- return (devMode.dmBitsPerPel > 8);
-}