aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/native/d3d/Canvas3D.cpp131
-rw-r--r--src/native/d3d/D3dCtx.hpp13
-rw-r--r--src/native/d3d/D3dUtil.cpp55
3 files changed, 169 insertions, 30 deletions
diff --git a/src/native/d3d/Canvas3D.cpp b/src/native/d3d/Canvas3D.cpp
index b2336c7..dbe7042 100644
--- a/src/native/d3d/Canvas3D.cpp
+++ b/src/native/d3d/Canvas3D.cpp
@@ -360,7 +360,7 @@ void JNICALL Java_javax_media_j3d_NativePipeline_textureFillBackground(
D3DXMATRIX Ortho2D;
D3DXMATRIX ptm, wtm, vtm;
- D3DTLVERTEX verts[4];
+ COORDTEXVERTEX verts[4];
D3DXMATRIX texMatrix;
int tus;
@@ -485,11 +485,10 @@ void JNICALL Java_javax_media_j3d_NativePipeline_textureFillBackground(
device->SetVertexShader(NULL);
- device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1 |
- D3DFVF_DIFFUSE | D3DFVF_TEXCOORDSIZE2(0));
+ device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0));
device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,
- 2, verts, sizeof(D3DTLVERTEX));
+ 2, verts, sizeof(COORDTEXVERTEX));
/* Restore renderstates */
@@ -529,11 +528,129 @@ void JNICALL Java_javax_media_j3d_NativePipeline_textureFillRaster(JNIEnv *env,
jfloat mapZ,
jfloat alpha)
{
+
+ DWORD cull, lighting;
+ D3DXMATRIX Ortho2D;
+ D3DXMATRIX ptm, wtm, vtm;
+ COORDCLRTEXVERTEX verts[4];
+ D3DXMATRIX texMatrix;
+ int tus;
+
GetDevice();
- /* printf("Canvas3D.textureFillRaster()\n"); */
- /* TODO : Implement textureFillRaster() */
- printf("[TODO NEEDED] Canvas3D : *** textureFillRaster is not implemented yet.\n");
+ 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);
+
+ 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);
}
diff --git a/src/native/d3d/D3dCtx.hpp b/src/native/d3d/D3dCtx.hpp
index 2c3b8e2..f51925c 100644
--- a/src/native/d3d/D3dCtx.hpp
+++ b/src/native/d3d/D3dCtx.hpp
@@ -45,11 +45,24 @@ typedef struct _D3DVERTEX {
float x, y, z;
} D3DVERTEX;
+
typedef struct _D3DTLVERTEX {
float sx, sy, sz, rhw;
float tu, tv;
} D3DTLVERTEX;
+typedef struct _COORDTEXVERTEX {
+ float sx, sy, sz;
+ float tu, tv;
+} COORDTEXVERTEX;
+
+typedef struct _COORDCLRTEXVERTEX {
+ float sx, sy, sz;
+ D3DCOLOR color;
+ float tu, tv;
+} COORDCLRTEXVERTEX;
+
+
typedef vector<LPDIRECT3DRESOURCE9> LPDIRECT3DRESOURCE9Vector;
typedef vector<LPDIRECT3DVERTEXBUFFER9> LPDIRECT3DVERTEXBUFFER9Vector;
//issue 135 iterator for vectors
diff --git a/src/native/d3d/D3dUtil.cpp b/src/native/d3d/D3dUtil.cpp
index 0b9cd7c..6b5c1df 100644
--- a/src/native/d3d/D3dUtil.cpp
+++ b/src/native/d3d/D3dUtil.cpp
@@ -889,6 +889,7 @@ LPDIRECT3DVOLUMETEXTURE9 createVolumeTexture(D3dCtx *d3dCtx,
// copy data from DirectDraw surface to memory
+// and reverse the Y axis
void copyDataFromSurface(jint imageFormat,
jint xoffset, jint yoffset,
jint subWidth, jint subHeight,
@@ -900,8 +901,6 @@ void copyDataFromSurface(jint imageFormat,
PIXELFORMAT ddpf;
HRESULT hr;
- printf("[Java 3D] copyDataFromSurface: not tested yet %d\n", imageFormat);
-
if (surf == NULL) {
return;
}
@@ -940,6 +939,9 @@ void copyDataFromSurface(jint imageFormat,
if ((imageFormat == IMAGE_FORMAT_INT_RGB) ||
(imageFormat == IMAGE_FORMAT_INT_ARGB)) {
dstPitch = subWidth << 2;
+ destRow += (subHeight-1)*dstPitch;
+
+ printf("[Java 3D] copyDataFromSurface: (1) %d\n", ddpf.dwRGBBitCount);
if ((ddpf.dwRGBBitCount == 32) &&
(ddpf.dwRBitMask == 0xff0000) &&
@@ -958,7 +960,7 @@ void copyDataFromSurface(jint imageFormat,
*dst++ = (byte) 0xff;
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else {
for (int i=yoffset; i < ylimit; i++) {
@@ -971,7 +973,7 @@ void copyDataFromSurface(jint imageFormat,
*dst++ = *src++;
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
}
} else { // handle less common format
@@ -1006,7 +1008,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 24) &&
(ddpf.dwRGBBitCount > 16)) {
@@ -1023,7 +1025,7 @@ void copyDataFromSurface(jint imageFormat,
*dst++ = (byte) ((mask >> 16) & 0xff);
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 16) &&
(ddpf.dwRGBBitCount > 8)) {
@@ -1039,7 +1041,7 @@ void copyDataFromSurface(jint imageFormat,
*dst++ = (byte) ((mask >> 8) & 0xff);
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if (ddpf.dwRGBBitCount <= 8) {
printf("[Java 3D] copyDataFromSurface: Format on (8 bits or less surface) not support %d\n", imageFormat);
@@ -1048,7 +1050,11 @@ void copyDataFromSurface(jint imageFormat,
} else if ((imageFormat == IMAGE_FORMAT_BYTE_RGBA) ||
(imageFormat == IMAGE_FORMAT_BYTE_RGB) ||
(imageFormat == IMAGE_FORMAT_INT_BGR)) {
+
+ printf("[Java 3D] copyDataFromSurface: (2) %d\n", ddpf.dwRGBBitCount);
+
dstPitch = subWidth << 2;
+ destRow += (subHeight-1)*dstPitch;
if ((ddpf.dwRGBBitCount == 32) &&
(ddpf.dwRBitMask == 0xff0000) &&
@@ -1070,7 +1076,7 @@ void copyDataFromSurface(jint imageFormat,
*dst++ = (byte) 0xff;
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else {
for (int i=yoffset; i < ylimit; i++) {
@@ -1086,7 +1092,7 @@ void copyDataFromSurface(jint imageFormat,
*dst++ = *src++;
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
}
} else { // handle less common format
@@ -1146,7 +1152,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 24) &&
(ddpf.dwRGBBitCount > 16)) {
@@ -1192,7 +1198,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 16) &&
(ddpf.dwRGBBitCount > 8)) {
@@ -1240,7 +1246,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if (ddpf.dwRGBBitCount <= 8) {
for (int i=yoffset; i < ylimit; i++) {
@@ -1283,7 +1289,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
}
}
@@ -1293,6 +1299,7 @@ void copyDataFromSurface(jint imageFormat,
int ashift = firstBit(ddpf.dwRGBAlphaBitMask) +
ucountBits(ddpf.dwRGBAlphaBitMask) - 8;
dstPitch = subWidth << 1;
+ destRow += (subHeight-1)*dstPitch;
if ((ddpf.dwRGBBitCount == 32) &&
(ddpf.dwRBitMask == 0xff0000) &&
@@ -1315,7 +1322,8 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
+
}
} else { // handle less common format
int gshift = firstBit(ddpf.dwGBitMask) +
@@ -1352,7 +1360,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 24) &&
(ddpf.dwRGBBitCount > 16)) {
@@ -1384,7 +1392,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 16) &&
(ddpf.dwRGBBitCount > 8)) {
@@ -1415,7 +1423,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if (ddpf.dwRGBBitCount <= 8) {
for (int i=yoffset; i < ylimit; i++) {
@@ -1443,7 +1451,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
}
}
@@ -1452,6 +1460,7 @@ void copyDataFromSurface(jint imageFormat,
int gshift = firstBit(ddpf.dwGBitMask) +
ucountBits(ddpf.dwGBitMask) - 8;
dstPitch = subWidth;
+ destRow += (subHeight-1)*dstPitch;
if ((ddpf.dwRGBBitCount == 32) &&
(ddpf.dwRBitMask == 0xff0000) &&
@@ -1469,7 +1478,7 @@ void copyDataFromSurface(jint imageFormat,
*src++;
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else { // handle less common format
int gshift = firstBit(ddpf.dwGBitMask) +
@@ -1495,7 +1504,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 24) &&
(ddpf.dwRGBBitCount > 16)) {
@@ -1516,7 +1525,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if ((ddpf.dwRGBBitCount <= 16) &&
(ddpf.dwRGBBitCount > 8)) {
@@ -1536,7 +1545,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
} else if (ddpf.dwRGBBitCount <= 8) {
for (int i=yoffset; i < ylimit; i++) {
@@ -1553,7 +1562,7 @@ void copyDataFromSurface(jint imageFormat,
}
}
srcRow += lockedRect.Pitch;
- destRow += dstPitch;
+ destRow -= dstPitch;
}
}
}