diff options
Diffstat (limited to 'src/native/d3d/GeometryArrayRetained.cpp')
-rw-r--r-- | src/native/d3d/GeometryArrayRetained.cpp | 5190 |
1 files changed, 0 insertions, 5190 deletions
diff --git a/src/native/d3d/GeometryArrayRetained.cpp b/src/native/d3d/GeometryArrayRetained.cpp deleted file mode 100644 index 3e6548d..0000000 --- a/src/native/d3d/GeometryArrayRetained.cpp +++ /dev/null @@ -1,5190 +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" - - -//#define VBDEBUG -//#define TEXDEBUG - -#define getVertexFormat(texSize) \ - (((texSize) << D3DFVF_TEXCOUNT_SHIFT) & D3DFVF_TEXCOUNT_MASK) - -/* - * This correspond to the constant in d3dtypes.h - * under D3D 7.0/8.0 header and may not portable : - * Still valid with D3D 9.0 (aces) - * D3DFVF_TEXTUREFORMAT1 3 - * D3DFVF_TEXTUREFORMAT2 0 - * D3DFVF_TEXTUREFORMAT3 1 - * D3DFVF_TEXTUREFORMAT4 2 - */ -CONST static DWORD TexFormatSizeTable[5] = {0, 3, 0, 1, 2}; -static float defaultTexCoord[4] = {0, 0, 0, 0}; - -typedef struct _D3DDRAWPRIMITIVESTRIDEDDATA -{ - DWORD positionStride; - jfloat *fpositionPtr; - jdouble *dpositionPtr; - DWORD normalStride; - jfloat *normalPtr; - DWORD diffuseStride; - jfloat *fdiffusePtr; - jbyte *bdiffusePtr; - jint *indexPtr; - jint initialIndexIndex; - DWORD textureCoordsStride[D3DDP_MAXTEXCOORD]; - jfloat* textureCoordsPtr[D3DDP_MAXTEXCOORD]; - jint texCoordPosition[D3DDP_MAXTEXCOORD]; - boolean useAlpha; - boolean modulateAlpha; - jfloat alpha; -} D3DDRAWPRIMITIVESTRIDEDDATA, *LPD3DDRAWPRIMITIVESTRIDEDDATA; - - -void copyIndexVertexToVB(D3dCtx *d3dCtx, - D3DDRAWPRIMITIVESTRIDEDDATA* strideData, - DWORD indexCount, - jint cDirty, - BOOL insertStrideToVB, - BOOL expandQuadIndex) -{ - HRESULT hr; - - if (cDirty & javax_media_j3d_GeometryArrayRetained_INDEX_CHANGED) { - jint *src = strideData->indexPtr + strideData->initialIndexIndex; - LPDIRECT3DINDEXBUFFER9 indexBuffer = d3dCtx->pVB->indexBuffer; - D3DINDEXBUFFER_DESC desc; - BYTE *bptr; - - indexBuffer->GetDesc(&desc); - hr = indexBuffer->Lock(0, 0, (VOID**)&bptr, 0); - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKINDEXVBFAIL, hr); - return; - } - - int i = indexCount; - - if (desc.Format == D3DFMT_INDEX16) { - USHORT *dst = (USHORT *) bptr; - - if (!expandQuadIndex) { - while (--i >= 0) { - *dst++ = *src++; - } - } else { - USHORT *endptr = dst + (USHORT) 3*indexCount/2; - - while (dst < endptr) { - *dst++ = *src; - *dst++ = *(src+1); - *dst++ = *(src+2); - *dst++ = *src; - src++; - src++; - *dst++ = *src; - src++; - *dst++ = *src; - src++; - } - } - } else { - UINT *dst = (UINT *) bptr; - - if (!expandQuadIndex) { - while (--i >= 0) { - *dst++ = *src++; - } - } else { - UINT *endptr = dst + (UINT) 3*indexCount/2; - while (dst < endptr) { - *dst++ = *src; - *dst++ = *(src+1); - *dst++ = *(src+2); - *dst++ = *src; - src++; - src++; - *dst++ = *src; - src++; - *dst++ = *src; - src++; - } - - dst = (UINT *) bptr; - } - } - - indexBuffer->Unlock(); - } - - if (insertStrideToVB) { - d3dCtx->pVB->addStride(d3dCtx->pVB->indexCount); - } -} - -// This function copy the stride vertex data into Vertex Buffer -// point by vbptr and update vbptr -void copyVertexToVB(D3dCtx *d3dCtx, - D3DDRAWPRIMITIVESTRIDEDDATA* strideData, - DWORD vcount, - float **vbptr, - jint cDirty, - BOOL insertStrideToVB, - jdouble* xform, - jdouble* nxform) -{ - float *dst; - float *src; - double *dsrc; - DWORD i; - DWORD srcStride; - DWORD currStride; - - DWORD dstStride = d3dCtx->pVB->stride >> 2; - DWORD vertexFormat = d3dCtx->pVB->vertexFormat; - float *endptr; - - // Copy Position - if (cDirty & javax_media_j3d_GeometryArrayRetained_COORDINATE_CHANGED) { - dst = *vbptr; - // Before we call two times src++ in position and - // normal copy so we only need to add dstStride - 2 - // at the end. - srcStride = strideData->positionStride - 2; - endptr = dst + vcount*dstStride; - dstStride -= 2; - src = strideData->fpositionPtr; - - if (xform == NULL) { - if (src != NULL) { - while (dst < endptr) { - *dst++ = *src++; // pos x - *dst++ = *src++; // pos y - *dst = *src; // pos z - dst += dstStride; - src += srcStride; - } - } else { - // double is used for position coordinate in executeVA() - dsrc = strideData->dpositionPtr; - while (dst < endptr) { - *dst++ = *dsrc++; // pos x - *dst++ = *dsrc++; // pos y - *dst = *dsrc; // pos z - dst += dstStride; - dsrc += srcStride; - } - } - } else { - if (src != NULL) { - float x, y, z, w; - while (dst < endptr) { - x = *src++; - y = *src++; - z = *src; // pos z - w = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - *dst++ = (xform[0]*x + xform[1]*y + xform[2]*z + xform[3])*w; - *dst++ = (xform[4]*x + xform[5]*y + xform[6]*z + xform[7])*w; - *dst = (xform[8]*x + xform[9]*y + xform[10]*z + xform[11])*w; - dst += dstStride; - src += srcStride; - } - } else { - double x, y, z, w; - // double is used for position coordinate in executeVA() - dsrc = strideData->dpositionPtr; - while (dst < endptr) { - x = *src++; - y = *src++; - z = *src; // pos z - w = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - *dst++ = (xform[0]*x + xform[1]*y + xform[2]*z + xform[3])*w; - *dst++ = (xform[4]*x + xform[5]*y + xform[6]*z + xform[7])*w; - *dst = (xform[8]*x + xform[9]*y + xform[10]*z + xform[11])*w; - dst += dstStride; - dsrc += srcStride; - } - } - - } - // restore value - dstStride += 2; - } - - // Copy Normal - if (vertexFormat & D3DFVF_NORMAL) { - if (cDirty & javax_media_j3d_GeometryArrayRetained_NORMAL_CHANGED) { - dst = *vbptr + 3; - src = strideData->normalPtr; - srcStride = strideData->normalStride - 2; - endptr = dst + vcount*dstStride; - dstStride -= 2; - if (nxform == NULL) { - while (dst < endptr) { - *dst++ = *src++; // norm x - *dst++ = *src++; // norm y - *dst = *src; // norm z - dst += dstStride; - src += srcStride; - } - } else { - float nx, ny, nz, nw; - while (dst < endptr) { - nx = *src++; - ny = *src++; - nz = *src; // pos z - nw = 1/(nxform[12]*nx + nxform[13]*ny + nxform[14]*nz + nxform[15]); - *dst++ = (nxform[0]*nx + nxform[1]*ny + nxform[2]*nz + nxform[3])*nw; - *dst++ = (nxform[4]*nx + nxform[5]*ny + nxform[6]*nz + nxform[7])*nw; - *dst = (nxform[8]*nx + nxform[9]*ny + nxform[10]*nz + nxform[11])*nw; - dst += dstStride; - dsrc += srcStride; - } - } - // restore value - dstStride += 2; - } - // nx,ny,nz copy in addtion to x, y, z - currStride = 6; - } else { - // This is used to keep track of the offset - // from beginning of the current type copy. - currStride = 3; // x,y,z already copy - } - - // Copy Diffuse Color (DWORD & float are of the same size) - - if (vertexFormat & D3DFVF_DIFFUSE) { - if (cDirty & javax_media_j3d_GeometryArrayRetained_COLOR_CHANGED) { - - DWORD* wdst = (DWORD *) *vbptr + currStride; - DWORD* wendptr = wdst + vcount*dstStride; - - if (strideData->fdiffusePtr) { - float* wsrc = strideData->fdiffusePtr; - float r, g, b, a; - if ((d3dCtx->currDisplayListID <= 0) || - !strideData->modulateAlpha) { - // execute() or executeVA() - - if (strideData->useAlpha) { - srcStride = strideData->diffuseStride - 3; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc++; - a = *wsrc; - *wdst = D3DCOLOR_COLORVALUE(r, g, b, a); - wdst += dstStride; - wsrc += srcStride; - } - } else { - srcStride = strideData->diffuseStride - 2; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc; - *wdst = D3DCOLOR_COLORVALUE(r, g, b, 0); - wdst += dstStride; - wsrc += srcStride; - } - } - } else { - // buildGA() & modulateAlpha - float alpha = strideData->alpha; - if (strideData->useAlpha) { - srcStride = strideData->diffuseStride - 3; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc++; - a = *wsrc * alpha; - *wdst = D3DCOLOR_COLORVALUE(r, g, b, a); - wdst += dstStride; - wsrc += srcStride; - } - } else { - srcStride = strideData->diffuseStride - 2; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc; - *wdst = D3DCOLOR_COLORVALUE(r, g, b, alpha); - wdst += dstStride; - wsrc += srcStride; - } - } - - } - } else { // byte color pointer - jbyte* wsrc = strideData->bdiffusePtr; - jbyte r, g, b, a; - if ((d3dCtx->currDisplayListID <= 0) || - !strideData->modulateAlpha) { - // execute() or executeVA() - - if (strideData->useAlpha) { - srcStride = strideData->diffuseStride - 3; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc++; - a = *wsrc; - *wdst = D3DCOLOR_RGBA(r, g, b, a); - wdst += dstStride; - wsrc += srcStride; - } - } else { - srcStride = strideData->diffuseStride - 2; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc; - *wdst = D3DCOLOR_RGBA(r, g, b, 0); - wdst += dstStride; - wsrc += srcStride; - } - } - } else { - // buildGA() & modeulateAlpha - // Currently buildGA() will not use byte color - // so this code should never execute. - jbyte alpha = (jbyte)(255*strideData->alpha); - if (strideData->useAlpha) { - srcStride = strideData->diffuseStride - 3; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc++; - a = (jbyte)(((int)(*wsrc) & 0xff) * strideData->alpha); - *wdst = D3DCOLOR_RGBA(r, g, b, a); - wdst += dstStride; - wsrc += srcStride; - } - } else { - srcStride = strideData->diffuseStride - 2; - while (wdst < wendptr) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc; - *wdst = D3DCOLOR_RGBA(r, g, b, alpha); - wdst += dstStride; - wsrc += srcStride; - } - } - - } - } - - } - - currStride++; // additional one DWORD of color copy - } - - // Copy Texture - int ts; - int texPos; - boolean invalidTexCoord; - -#ifdef TEXDEBUG - printf("In copyVertexToVB TexSet Used %d\n", d3dCtx->texSetUsed); -#endif - for (i=0; i < d3dCtx->texSetUsed; i++) { - ts = d3dCtx->texStride[i]; - - // TODO: skip when ts = 0 - if (ts == 0) { - continue; - } - texPos = strideData->texCoordPosition[i]; - - invalidTexCoord = ((texPos != d3dCtx->pVB->texCoordPosition[i]) || - (texPos == TEX_OBJ_LINEAR)); - -#ifdef TEXDEBUG - printf("%d texPos %d, invalidate Cached TexCoord %d, ts %d\n",i, texPos, invalidTexCoord, ts); -#endif - if ((cDirty & javax_media_j3d_GeometryArrayRetained_TEXTURE_CHANGED) || - invalidTexCoord) { - - if (texPos >= 0) { - dst = *vbptr + currStride; - src = strideData->textureCoordsPtr[i]; - endptr = dst + vcount*dstStride; -#ifdef TEXDEBUG - printf("copy directly, ts %d\n", ts); -#endif - if (ts == 2) { - dstStride--; - srcStride = strideData->textureCoordsStride[i] - 1; - while (dst < endptr) { - *dst++ = *src++; // tx - *dst = *src; // ty - dst += dstStride; - src += srcStride; - } - dstStride++; - } else if (ts == 3) { - dstStride -= 2; - srcStride = strideData->textureCoordsStride[i] - 2; - while (dst < endptr) { - *dst++ = *src++; // tx - *dst++ = *src++; // ty - *dst = *src; // tz - dst += dstStride; - src += srcStride; - } - dstStride += 2; - } else { - // ts == 4 - dstStride -= 3; - srcStride = strideData->textureCoordsStride[i] - 3; - while (dst < endptr) { - *dst++ = *src++; // tx - *dst++ = *src++; // ty - *dst++ = *src++; // tz - *dst = *src; // tw - dst += dstStride; - src += srcStride; - } - dstStride += 3; - } - - } else { - if (texPos == TEX_OBJ_LINEAR) { - // automatic texture generation for Object Linear - float *ps = d3dCtx->planeS[i]; - float *pt = d3dCtx->planeT[i]; - float *pr = d3dCtx->planeR[i]; - float *pq = d3dCtx->planeQ[i]; -#ifdef TEXDEBUG - printf("gen obj linear tex, ts %d\n", ts); -#endif - if (strideData->fpositionPtr) { - float x, y, z; - dst = *vbptr + currStride; - endptr = dst + vcount*dstStride; - src = strideData->fpositionPtr; - srcStride = strideData->positionStride - 2; - if (ts == 2) { - dstStride--; - if (xform == NULL) { - while (dst < endptr) { - x = *src++; - y = *src++; - z = *src; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - dst += dstStride; - src += srcStride; - } - } else { - float tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - dst += dstStride; - src += srcStride; - } - } - dstStride++; - } else if (ts == 3) { - dstStride -= 2; - if (xform == NULL) { - while (dst < endptr) { - x = *src++; - y = *src++; - z = *src; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - dst += dstStride; - src += srcStride; - } - } else { - float tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - dst += dstStride; - src += srcStride; - } - } - - dstStride += 2; - } else { - // ts == 4 - dstStride -= 3; - - if (!d3dCtx->texTransformSet[i]) { - if (xform == NULL) { - while (dst < endptr) { - x = *src++; - y = *src++; - z = *src; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst++ = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - *dst = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - dst += dstStride; - src += srcStride; - } - } else { - float tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst++ = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - *dst = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - dst += dstStride; - src += srcStride; - } - } - } else { - // do texture transform manually - D3DXMATRIX *m = &(d3dCtx->texTransform[i]); - double tx, ty, tz, tw; - if (xform == NULL) { - while (dst < endptr) { - x = *src++; - y = *src++; - z = *src; - tx = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - ty = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - tz = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - tw = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - *dst++ = (*m)._11*tx + (*m)._21*ty + (*m)._31*tz + (*m)._41*tw; - *dst++ = (*m)._12*tx + (*m)._22*ty + (*m)._32*tz + (*m)._42*tw; - *dst++ = (*m)._13*tx + (*m)._23*ty + (*m)._33*tz + (*m)._43*tw; - *dst = (*m)._14*tx + (*m)._24*ty + (*m)._34*tz + (*m)._44*tw; - dst += dstStride; - src += srcStride; - } - } else { - float tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - tx = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - ty = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - tz = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - tw = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - *dst++ = (*m)._11*tx + (*m)._21*ty + (*m)._31*tz + (*m)._41*tw; - *dst++ = (*m)._12*tx + (*m)._22*ty + (*m)._32*tz + (*m)._42*tw; - *dst++ = (*m)._13*tx + (*m)._23*ty + (*m)._33*tz + (*m)._43*tw; - *dst = (*m)._14*tx + (*m)._24*ty + (*m)._34*tz + (*m)._44*tw; - dst += dstStride; - src += srcStride; - } - } - } - dstStride += 3; - } - } else { - // double type position pointer - double x, y, z; - dst = *vbptr + currStride; - endptr = dst + vcount*dstStride; - dsrc = strideData->dpositionPtr; - srcStride = strideData->positionStride - 2; - if (ts == 2) { - dstStride--; - if (xform == NULL) { - while (dst < endptr) { - x = *dsrc++; - y = *dsrc++; - z = *dsrc; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - dst += dstStride; - dsrc += srcStride; - } - } else { - double tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - dst += dstStride; - src += srcStride; - } - } - dstStride++; - } else if (ts == 3) { - dstStride -= 2; - if (xform == NULL) { - while (dst < endptr) { - x = *dsrc++; - y = *dsrc++; - z = *dsrc; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - dst += dstStride; - dsrc += srcStride; - } - } else { - double tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - dst += dstStride; - src += srcStride; - } - } - dstStride += 2; - } else { - // ts == 4 - dstStride -= 3; - if (!d3dCtx->texTransformSet[i]) { - if (xform == NULL) { - while (dst < endptr) { - x = *dsrc++; - y = *dsrc++; - z = *dsrc; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst++ = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - *dst = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - dst += dstStride; - dsrc += srcStride; - } - } else { - double tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - *dst++ = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - *dst++ = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - *dst++ = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - *dst = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - dst += dstStride; - src += srcStride; - } - } - } else { -// do texture transform manually - D3DXMATRIX *m = &(d3dCtx->texTransform[i]); - double tx, ty, tz, tw; - if (xform == NULL) { - while (dst < endptr) { - x = *src++; - y = *src++; - z = *src; - tx = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - ty = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - tz = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - tw = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - *dst++ = ((*m)._11*tx + (*m)._21*ty + (*m)._31*tz + (*m)._41*tw); - *dst++ = ((*m)._12*tx + (*m)._22*ty + (*m)._32*tz + (*m)._42*tw); - *dst++ = ((*m)._13*tx + (*m)._23*ty + (*m)._33*tz + (*m)._43*tw); - *dst = (*m)._14*tx + (*m)._24*ty + (*m)._34*tz + (*m)._44*tw; - dst += dstStride; - src += srcStride; - } - } else { - float tx, ty, tz, tw; - while (dst < endptr) { - tx = *src++; - ty = *src++; - tz = *src; - tw = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - x = (xform[0]*tx + xform[1]*ty + xform[2]*tz + xform[3])*tw; - y = (xform[4]*tx + xform[5]*ty + xform[6]*tz + xform[7])*tw; - z = (xform[8]*tx + xform[9]*ty + xform[10]*tz + xform[11])*tw; - tx = ps[0]*x + ps[1]*y + ps[2]*z + ps[3]; - ty = pt[0]*x + pt[1]*y + pt[2]*z + pt[3]; - tz = pr[0]*x + pr[1]*y + pr[2]*z + pr[3]; - tw = pq[0]*x + pq[1]*y + pq[2]*z + pq[3]; - *dst++ = ((*m)._11*tx + (*m)._21*ty + (*m)._31*tz + (*m)._41*tw); - *dst++ = ((*m)._12*tx + (*m)._22*ty + (*m)._32*tz + (*m)._42*tw); - *dst++ = ((*m)._13*tx + (*m)._23*ty + (*m)._33*tz + (*m)._43*tw); - *dst = (*m)._14*tx + (*m)._24*ty + (*m)._34*tz + (*m)._44*tw; - dst += dstStride; - src += srcStride; - } - } - } - dstStride += 3; - } - } - } else if (texPos == TEX_GEN_INVALID) { - // application error, disable by setting texCoord to zero -#ifdef TEXDEBUG - printf("app error, ts %d\n", ts); -#endif - dst = *vbptr + currStride; - endptr = dst + vcount*dstStride; - if (ts == 2) { - dstStride--; - while (dst < endptr) { - *dst++ = 0; - *dst = 0; - dst += dstStride; - } - dstStride++; - } else if (ts == 3) { - dstStride -= 2; - while (dst < endptr) { - *dst++ = 0; - *dst++ = 0; - *dst = 0; - dst += dstStride; - } - dstStride += 2; - } else { - // ts == 4 - dstStride -= 3; - while (dst < endptr) { - *dst++ = 0; - *dst++ = 0; - *dst++ = 0; - *dst = 0; - dst += dstStride; - } - dstStride += 3; - } - } else { - // Other automatic texture generation type handle - // by driver - //printf("TexStage %d, Tex gen by driver, texPos = %d\n", i, texPos); - } - } - } - - currStride += ts; - } - - if (insertStrideToVB) { - d3dCtx->pVB->addStride(vcount); - } - - // Adjust VB pointer so that when this function is invoked - // again, it append to the VB correctly. - *vbptr += (vcount*dstStride); -} - - -void copyOneVertexToVB(D3dCtx *d3dCtx, - float **vbptr, - D3DDRAWPRIMITIVESTRIDEDDATA* strideData, - DWORD idx, - jint cDirty, - jdouble* xform, - jdouble* nxform) -{ - float *src; - float *dst = *vbptr; - DWORD vertexFormat = d3dCtx->pVB->vertexFormat; - float posX, posY, posZ; - - // Copy Position - - // if (cDirty & javax_media_j3d_GeometryArrayRetained_COORDINATE_CHANGED) - // Set the posX, posY, posZ anyway since TexGeneration will use it - // if dirty. - - if (strideData->fpositionPtr != NULL) { - src = strideData->fpositionPtr + - idx*strideData->positionStride; - - if (xform == NULL) { - posX = *src++; // pos x - posY = *src++; // pos y - posZ = *src; // pos z - } else { - float x, y, z, w; - x = *src++; - y = *src++; - z = *src; - w = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - posX = (xform[0]*x + xform[1]*y + xform[2]*z + xform[3])*w; - posY = (xform[4]*x + xform[5]*y + xform[6]*z + xform[7])*w; - posZ = (xform[8]*x + xform[9]*y + xform[10]*z + xform[11])*w; - } - } else { - // double is used for position coordinate in executeVA() - double *dsrc = strideData->dpositionPtr + - idx*strideData->positionStride; - - if (xform == NULL) { - posX = (float) *dsrc++; // pos x - posY = (float) *dsrc++; // pos y - posZ = (float) *dsrc; // pos z - } else { - double x, y, z, w; - x = *dsrc++; - y = *dsrc++; - z = *dsrc; - w = 1/(xform[12]*x + xform[13]*y + xform[14]*z + xform[15]); - posX = (float) (xform[0]*x + xform[1]*y + xform[2]*z + xform[3])*w; - posY = (float) (xform[4]*x + xform[5]*y + xform[6]*z + xform[7])*w; - posZ = (float) (xform[8]*x + xform[9]*y + xform[10]*z + xform[11])*w; - } - } - *dst++ = posX; - *dst++ = posY; - *dst++ = posZ; - - // Copy Normal - if (vertexFormat & D3DFVF_NORMAL) { - if (cDirty & javax_media_j3d_GeometryArrayRetained_NORMAL_CHANGED) { - src = strideData->normalPtr + - idx*strideData->normalStride; - if (nxform == NULL) { - *dst++ = *src++; // norm x - *dst++ = *src++; // norm y - *dst++ = *src; // norm z - } else { - float nx, ny, nz, nw; - nx = *src++; // norm x - ny = *src++; // norm y - nz = *src; // norm z - nw = 1/(nxform[12]*nx + nxform[13]*ny + nxform[14]*nz + nxform[15]); - *dst++ = (nxform[0]*nx + nxform[1]*ny + nxform[2]*nz + nxform[3])*nw; - *dst++ = (nxform[4]*nx + nxform[5]*ny + nxform[6]*nz + nxform[7])*nw; - *dst = (nxform[8]*nx + nxform[9]*ny + nxform[10]*nz + nxform[11])*nw; - } - } - } - - - // Copy Diffuse Color (DWORD & float are of the same size) - if (vertexFormat & D3DFVF_DIFFUSE) { - if (cDirty & javax_media_j3d_GeometryArrayRetained_COLOR_CHANGED) { - DWORD* wdst = (DWORD *) dst; - if (strideData->fdiffusePtr) { - src = strideData->fdiffusePtr + - idx*strideData->diffuseStride; - float r, g, b, a; - if ((d3dCtx->currDisplayListID <= 0) || - !strideData->modulateAlpha) { - // execute() or executeVA() - if (strideData->useAlpha) { - r = *src++; - g = *src++; - b = *src++; - a = *src; - } else { - r = *src++; - g = *src++; - b = *src; - a = 0; - } - } else { - // buildGA() & modeulateAlpha - if (strideData->useAlpha) { - r = *src++; - g = *src++; - b = *src++; - a = *src * strideData->alpha; - } else { - r = *src++; - g = *src++; - b = *src; - a = strideData->alpha; - } - } - *wdst = D3DCOLOR_COLORVALUE(r, g, b, a); - } else { // byte color pointer - jbyte* wsrc = strideData->bdiffusePtr + - idx*strideData->diffuseStride; - jbyte r, g, b, a; - if ((d3dCtx->currDisplayListID <= 0) || - !strideData->modulateAlpha) { - // execute() or executeVA() - if (strideData->useAlpha) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc++; - a = *wsrc; - } else { - r = *wsrc++; - g = *wsrc++; - b = *wsrc; - a = 0; - } - } else { - // buildGA() & modeulateAlpha - // Currently buildGA() will not use byte color - // so this code should never execute. - jbyte alpha = (jbyte) (255*strideData->alpha); - if (strideData->useAlpha) { - r = *wsrc++; - g = *wsrc++; - b = *wsrc++; - a = (jbyte)(((int)(*wsrc) & 0xff) * strideData->alpha); - } else { - r = *wsrc++; - g = *wsrc++; - b = *wsrc; - a = alpha; - - } - } - *wdst = D3DCOLOR_RGBA(r, g, b, a); - } - } - dst++; // additional one DWORD of color copy - } - - - // Copy Texture - int ts; - int texPos; - boolean invalidTexCoord; - - for (int i=0; i < d3dCtx->texSetUsed; i++) { - ts = d3dCtx->texStride[i]; - if (ts == 0) { - continue; - } - texPos = strideData->texCoordPosition[i]; - - invalidTexCoord = ((texPos != d3dCtx->pVB->texCoordPosition[i]) || - (texPos == TEX_OBJ_LINEAR)); - - if ((cDirty & javax_media_j3d_GeometryArrayRetained_TEXTURE_CHANGED) || invalidTexCoord) { - if (texPos >= 0) { - src = strideData->textureCoordsPtr[i] + - idx*strideData->textureCoordsStride[i]; - *dst++ = *src++; // tx - *dst++ = *src++; // ty - if (ts >= 3) { - *dst++ = *src++; // tx - if (ts >= 4) { - *dst++ = *src; // tx - } - } - } else { - // automatic texture generation - if (texPos == TEX_OBJ_LINEAR) { - float *ps = d3dCtx->planeS[i]; - float *pt = d3dCtx->planeT[i]; - float *pr = d3dCtx->planeR[i]; - float *pq = d3dCtx->planeQ[i]; - - if ((ts < 4) || (!d3dCtx->texTransformSet[i])) { - *dst++ = ps[0]*posX + ps[1]*posY + ps[2]*posZ + ps[3]; - *dst++ = pt[0]*posX + pt[1]*posY + pt[2]*posZ + pt[3]; - if (ts >= 3) { - *dst++ = pr[0]*posX + pr[1]*posY + pr[2]*posZ + pr[3]; - if (ts >= 4) { - *dst++ = pq[0]*posX + pq[1]*posY + pq[2]*posZ + pq[3]; - } - } - } else { - float tx, ty, tz, tw; - D3DXMATRIX *m = &(d3dCtx->texTransform[i]); - tx = ps[0]*posX + ps[1]*posY + ps[2]*posZ + ps[3]; - ty = pt[0]*posX + pt[1]*posY + pt[2]*posZ + pt[3]; - tz = pr[0]*posX + pr[1]*posY + pr[2]*posZ + pr[3]; - tw = pq[0]*posX + pq[1]*posY + pq[2]*posZ + pq[3]; - *dst++ = (*m)._11*tx + (*m)._21*ty + (*m)._31*tz + (*m)._41*tw; - *dst++ = (*m)._12*tx + (*m)._22*ty + (*m)._32*tz + (*m)._42*tw; - *dst++ = (*m)._13*tx + (*m)._23*ty + (*m)._33*tz + (*m)._43*tw; - *dst++ = (*m)._14*tx + (*m)._24*ty + (*m)._34*tz + (*m)._44*tw; - } - } else if (texPos == TEX_GEN_INVALID) { - // application error, disable by setting texCoord to zero - *dst++ = 0; - *dst++ = 0; - if (ts >= 3) { - *dst++ = 0; - if (ts >= 4) { - *dst++ = 0; - } - } - } else { - // should not happen - dst += ts; - } - } - } else { - dst += ts; - } - } - - *vbptr = dst; -} - - -float* allocateVB(D3dCtx *d3dCtx, - LPDIRECT3DDEVICE9 device, - int vcount, - int maxVertexLimit, - jint *cdirty) -{ - LPD3DVERTEXBUFFER vb = d3dCtx->pVB->nextVB; - HRESULT hr; - float *ptr = NULL; - - - if (vcount > maxVertexLimit) { - vcount = maxVertexLimit; - } - - if ((vb != NULL) && (vb->vcount < vcount)) { - delete vb; - d3dCtx->pVB->nextVB = NULL; - vb = NULL; - } - - if (vb == NULL) { - vb = new D3dVertexBuffer(); - if (vb == NULL) { - D3dCtx::d3dWarning(OUTOFMEMORY); - return NULL; - } - - vb->stride = d3dCtx->pVB->stride; - vb->vertexFormat = d3dCtx->pVB->vertexFormat; - // Don't set totalVertexCount - vb->isIndexPrimitive = d3dCtx->pVB->isIndexPrimitive; - vb->primitiveType = d3dCtx->pVB->primitiveType; - vb->isPointFlagUsed = d3dCtx->pVB->isPointFlagUsed; - vb->vcount = vcount; - vb->maxVertexLimit = maxVertexLimit; - -#ifdef VBDEBUG - printf("Create secondary VertexBuffer of size %d, display list ID %d, pointFlag %d\n", - vb->vcount, d3dCtx->currDisplayListID, vb->isPointFlagUsed); -#endif - if (!vb->isPointFlagUsed) { - hr = device->CreateVertexBuffer(vb->stride*vcount, - D3DUSAGE_WRITEONLY, - vb->vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - } else { - hr = device->CreateVertexBuffer(vb->stride*vcount, - D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS, - vb->vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - } - if (FAILED(hr)) { - vb->buffer = NULL; - delete vb; - D3dCtx::d3dWarning(CREATEVBFAIL, hr); - return NULL; - } - d3dCtx->pVB->nextVB = vb; - *cdirty = javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED; - } - - hr = vb->buffer->Lock(0, 0,(VOID**) &ptr, 0); - - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKVBFAIL, hr); - delete vb; - d3dCtx->pVB->nextVB = NULL; - return NULL; - } - - d3dCtx->pVB = vb; - - vb->stripLen = 0; - return ptr; -} - - - -BOOL createCopyVBVertex(D3dCtx *d3dCtx, - LPDIRECT3DDEVICE9 device, - D3DDRAWPRIMITIVESTRIDEDDATA *strideData, - int vcount, jint cDirty, - jdouble* xform, - jdouble* nxform) -{ - LPD3DVERTEXBUFFER vb = d3dCtx->pVB; - float *vbptr; - - - if (vb->stripLen > 0) { - // VertexBuffer already used, create a new one or used - // the next VB in the list - // maxVertexLimit is already check before, so we can - // pass vcount as maxVertexLimit - vbptr = allocateVB(d3dCtx, device, vcount, vcount, &cDirty); - if (vbptr == NULL) { - return FALSE; - } - - } else { - // use the same VB - HRESULT hr; - hr = vb->buffer->Lock(0, 0, (VOID**)&vbptr, 0); - - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKVBFAIL, hr); - return FALSE; - } - - } - - copyVertexToVB(d3dCtx, strideData, vcount, &vbptr, cDirty, true, - xform, nxform); - - d3dCtx->pVB->buffer->Unlock(); - return TRUE; -} - - -/* - * Draw Primitive with vertexCount > D3DMAXNUMVERTICES. - * In this case we call the drawing routine multiple times. - */ -void splitVertexToMultipleVB(D3dCtx *d3dCtx, - LPD3DDRAWPRIMITIVESTRIDEDDATA strideData, - int vcount, - int maxVertexLimit, - jint cDirty, - jdouble* xform, - jdouble* nxform) -{ - int i, inc; - int min = 0; - int max = 0; - jfloat *oldfPosition; - double *olddPosition; - jfloat *oldNormal; - jfloat *oldfDiffuse; - jbyte *oldbDiffuse; - float* oldTexCoords[D3DDP_MAXTEXCOORD]; - int vc; - int texSetUsed = d3dCtx->texSetUsed; - LPDIRECT3DDEVICE9 device = d3dCtx->pDevice; - jfloat fr, fg, fb, fa; - jbyte br, bg, bb, ba; - boolean success; - - DWORD vertexFormat = d3dCtx->pVB->vertexFormat; - - // save stride pointers since strip set may have - // multiple call to this procedure. - oldfPosition = strideData->fpositionPtr; - olddPosition = strideData->dpositionPtr; - oldNormal = strideData->normalPtr; - oldfDiffuse = strideData->fdiffusePtr; - oldbDiffuse = strideData->bdiffusePtr; - - for (i=0; i < texSetUsed; i++) { - oldTexCoords[i] = strideData->textureCoordsPtr[i]; - } - - - - switch (d3dCtx->pVB->primitiveType) { - case D3DPT_TRIANGLEFAN: - { - // Copy the very first vertx and repeat the last vertex - jfloat fx, fy, fz, nx, ny, nz; - jdouble dx, dy, dz; - jfloat tx[D3DDP_MAXTEXCOORD]; - jfloat ty[D3DDP_MAXTEXCOORD]; - jfloat tz[D3DDP_MAXTEXCOORD]; - jfloat tw[D3DDP_MAXTEXCOORD]; - inc = maxVertexLimit - 2; - - if (oldfPosition) { - fx = *oldfPosition; - fy = *(oldfPosition+1); - fz = *(oldfPosition+2); - } else { - // must be double, since this routine will - // not invoke when there is no position available - dx = *olddPosition; - dy = *(olddPosition+1); - dz = *(olddPosition+2); - } - - if (oldNormal) { - nx = *oldNormal; - ny = *(oldNormal+1); - nz = *(oldNormal+2); - } - if (oldfDiffuse) { - fr = *oldfDiffuse; - fg = *(oldfDiffuse+1); - fb = *(oldfDiffuse+2); - if (strideData->useAlpha) { - fa = *(oldfDiffuse+3); - } - } else if (oldbDiffuse) { - br = *oldbDiffuse; - bg = *(oldbDiffuse+1); - bb = *(oldbDiffuse+2); - if (strideData->useAlpha) { - ba = *(oldbDiffuse+3); - } - } - - for (i=0; i < texSetUsed; i++) { - tx[i] = *oldTexCoords[i]; - ty[i] = *(oldTexCoords[i]+1); - if (d3dCtx->texStride[i] > 2) { - tz[i] = *(oldTexCoords[i]+2); - if (d3dCtx->texStride[i] > 3) { - tw[i] = *(oldTexCoords[i]+3); - } - } - } - while (true) { - vc = (vcount >= maxVertexLimit ? maxVertexLimit : vcount); - - success = createCopyVBVertex(d3dCtx, device, strideData, - vc, cDirty, xform, nxform); - // restore old values - if (oldfPosition) { - *(strideData->fpositionPtr) = fx; - *(strideData->fpositionPtr+1) = fy; - *(strideData->fpositionPtr+2) = fz; - } else { - *(strideData->dpositionPtr) = dx; - *(strideData->dpositionPtr+1) = dy; - *(strideData->dpositionPtr+2) = dz; - } - if (oldNormal) { - *(strideData->normalPtr) = nx; - *(strideData->normalPtr+1) = ny; - *(strideData->normalPtr+2) = nz; - } - if (oldfDiffuse) { - *(strideData->fdiffusePtr) = fr; - *(strideData->fdiffusePtr+1) = fg; - *(strideData->fdiffusePtr+2) = fb; - if (strideData->useAlpha) { - *(strideData->fdiffusePtr+3) = fa; - } - } else if (oldbDiffuse) { - *(strideData->bdiffusePtr) = br; - *(strideData->bdiffusePtr+1) = bg; - *(strideData->bdiffusePtr+2) = bb; - if (strideData->useAlpha) { - *(strideData->bdiffusePtr+3) = ba; - } - } - for (i=0; i < texSetUsed; i++) { - *(strideData->textureCoordsPtr[i]) = tx[i]; - *(strideData->textureCoordsPtr[i]+1) = ty[i]; - if (d3dCtx->texStride[i] > 2) { - *(strideData->textureCoordsPtr[i]+2) = tz[i]; - if (d3dCtx->texStride[i] > 3) { - *(strideData->textureCoordsPtr[i]+3) = tw[i]; - } - } - } - - vcount -= inc; - if (!success || (vcount <= 2)) { - break; - } - - if (oldfPosition) { - strideData->fpositionPtr += strideData->positionStride*inc; - fx = *strideData->fpositionPtr; - *strideData->fpositionPtr = *oldfPosition; - fy = *(strideData->fpositionPtr+1); - *(strideData->fpositionPtr+1) = *(oldfPosition+1); - fz = *(strideData->fpositionPtr+2); - *(strideData->fpositionPtr+2) = *(oldfPosition+2); - } else { - strideData->dpositionPtr += strideData->positionStride*inc; - dx = *strideData->dpositionPtr; - *strideData->dpositionPtr = *olddPosition; - dy = *(strideData->dpositionPtr+1); - *(strideData->dpositionPtr+1) = *(olddPosition+1); - dz = *(strideData->dpositionPtr+2); - *(strideData->dpositionPtr+2) = *(olddPosition+2); - } - - - if (oldNormal) { - strideData->normalPtr += strideData->normalStride*inc; - nx = *strideData->normalPtr; - *strideData->normalPtr = *oldNormal; - ny = *(strideData->normalPtr+1); - *(strideData->normalPtr+1) = *(oldNormal+1); - nz = *(strideData->normalPtr+2); - *(strideData->normalPtr+2) = *(oldNormal+2); - } - - if (oldfDiffuse) { - strideData->fdiffusePtr += strideData->diffuseStride*inc; - fr = *strideData->fdiffusePtr; - *strideData->fdiffusePtr = *oldfDiffuse; - fg = *(strideData->fdiffusePtr+1); - *(strideData->fdiffusePtr+1) = *(oldfDiffuse+1); - fb = *(strideData->fdiffusePtr+2); - *(strideData->fdiffusePtr+2) = *(oldfDiffuse+2); - if (strideData->useAlpha) { - fa = *(strideData->fdiffusePtr+3); - *(strideData->fdiffusePtr+3) = *(oldfDiffuse+3); - } - } else if (oldbDiffuse) { - strideData->bdiffusePtr += strideData->diffuseStride*inc; - br = *strideData->bdiffusePtr; - *strideData->bdiffusePtr = *oldbDiffuse; - bg = *(strideData->bdiffusePtr+1); - *(strideData->bdiffusePtr+1) = *(oldbDiffuse+1); - bb = *(strideData->bdiffusePtr+2); - *(strideData->bdiffusePtr+2) = *(oldbDiffuse+2); - if (strideData->useAlpha) { - ba = *(strideData->bdiffusePtr+3); - *(strideData->bdiffusePtr+3) = *(oldbDiffuse+3); - } - } - - for (i=0; i < texSetUsed; i++) { - strideData->textureCoordsPtr[i] += - strideData->textureCoordsStride[i]*inc; - - tx[i] = *strideData->textureCoordsPtr[i]; - ty[i] = *(strideData->textureCoordsPtr[i]+1); - *(strideData->textureCoordsPtr[i]) = *oldTexCoords[i]; - *(strideData->textureCoordsPtr[i]+1) = *(oldTexCoords[i]+1); - if (d3dCtx->texStride[i] > 2) { - tz[i] = *(strideData->textureCoordsPtr[i]+2); - *(strideData->textureCoordsPtr[i]+2) - = *(oldTexCoords[i]+ 2); - if (d3dCtx->texStride[i] > 3) { - tw[i] = *(strideData->textureCoordsPtr[i]+3); - *(strideData->textureCoordsPtr[i]+3) - = *(oldTexCoords[i]+ 3); - } - - } - } - - } - break; - } - case D3DPT_POINTLIST: - if (max == 0) { - max = maxVertexLimit; - } - // fall through - case D3DPT_LINESTRIP: - if (max == 0) { - max = maxVertexLimit; - min = 1; // repeat the last vertex; - } - // fall through - case D3DPT_TRIANGLELIST: - if (max == 0) { - if (d3dCtx->pVB->isIndexPrimitive) { - // QuadArray - max = maxVertexLimit - (maxVertexLimit % 4); - } else { - max = maxVertexLimit - (maxVertexLimit % 3); - } - } - // fall through - case D3DPT_LINELIST: - if (max == 0) { - max = maxVertexLimit - (maxVertexLimit % 2); - } - // fall through - case D3DPT_TRIANGLESTRIP: - if (max == 0) { - max = maxVertexLimit - (maxVertexLimit % 4); - min = 2; // repeat the last two vertices - } - inc = max - min; - - while (true) { - vc = (vcount >= max ? max : vcount); - - if (!createCopyVBVertex(d3dCtx, device, strideData, vc, - cDirty, xform, nxform)) { - break; - } - - vcount -= inc; - if (vcount <= min) { - break; - } - if (oldfPosition) { - strideData->fpositionPtr += strideData->positionStride*inc; - } else { - strideData->dpositionPtr += strideData->positionStride*inc; - } - - if (oldNormal) { - strideData->normalPtr += strideData->normalStride*inc; - } - if (oldfDiffuse) { - strideData->fdiffusePtr += strideData->diffuseStride*inc; - } else if (oldbDiffuse) { - strideData->bdiffusePtr += strideData->diffuseStride*inc; - } - for (i=0; i < texSetUsed; i++) { - strideData->textureCoordsPtr[i] += - strideData->textureCoordsStride[i]*inc; - } - } - break; - } - - // Restore old pointers; - strideData->fpositionPtr = oldfPosition; - strideData->dpositionPtr = olddPosition; - strideData->normalPtr = oldNormal; - strideData->fdiffusePtr = oldfDiffuse; - strideData->bdiffusePtr = oldbDiffuse; - - for (i=0; i < texSetUsed; i++) { - strideData->textureCoordsPtr[i] = oldTexCoords[i]; - } -} - - -BOOL reIndexifyIndexVertexToVBs(D3dCtx *d3dCtx, - D3DDRAWPRIMITIVESTRIDEDDATA* strideData, - DWORD indexCount, - DWORD vcount, - jint cDirty, - BOOL expandQuadIndex, - DWORD maxVertexLimit, - jdouble* xform, - jdouble* nxform) -{ - LPD3DVERTEXBUFFER vb = d3dCtx->pVB; - HRESULT hr; - LPDIRECT3DDEVICE9 device = d3dCtx->pDevice; - - int vbSize; - - if (!expandQuadIndex) { - vbSize = indexCount; - } else { - vbSize = (3*indexCount) >> 1; - } - - if (vb->stripLen > 0) { - // VertexBuffer already used, create a new one or used - // the next VB in the list - // maxVertexLimit is already check before, so we can - // pass indexCount as maxVertexLimit. - // The maximum vertex that can happens is equal - // to indexCount so we can just set vcount = indexCount - vb = vb->nextVB; - if ((vb != NULL) && (vb->vcount < vbSize)) { - delete vb; - d3dCtx->pVB->nextVB = NULL; - vb = NULL; - } - - if (vb == NULL) { - vb = new D3dVertexBuffer(); - if (vb == NULL) { - D3dCtx::d3dWarning(OUTOFMEMORY); - return false; - } - - vb->stride = d3dCtx->pVB->stride; - vb->vertexFormat = d3dCtx->pVB->vertexFormat; - // Don't set totalVertexCount - vb->isIndexPrimitive = d3dCtx->pVB->isIndexPrimitive; - vb->primitiveType = d3dCtx->pVB->primitiveType; - vb->isPointFlagUsed = d3dCtx->pVB->isPointFlagUsed; - vb->vcount = vbSize; - vb->maxVertexLimit = maxVertexLimit; - -#ifdef VBDEBUG - printf("Create secondary VertexBuffer of size %d, display list ID %d, pointFlag %d\n", - vbSize, d3dCtx->currDisplayListID, vb->isPointFlagUsed); -#endif - - if (!vb->isPointFlagUsed) { - hr = device->CreateVertexBuffer(vb->stride*vbSize, - D3DUSAGE_WRITEONLY, - vb->vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - } else { - hr = device->CreateVertexBuffer(vb->stride*vbSize, - D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS, - vb->vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - vb->isPointFlagUsed = true; - } - - if (FAILED(hr)) { - vb->buffer = NULL; - vb->release(); - D3dCtx::d3dWarning(CREATEVBFAIL, hr); - return false; - } - d3dCtx->pVB->nextVB = vb; - cDirty = javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED; - } - } - - if (vb->indexBuffer == NULL) { - // No need to set totalIndexCount - vb->indexCount = vbSize; - - if (indexCount <= 0xffff) { - hr = device->CreateIndexBuffer(vbSize*sizeof(WORD), - D3DUSAGE_WRITEONLY, - D3DFMT_INDEX16, - D3DPOOL_DEFAULT, - &vb->indexBuffer, - NULL); - } else { - hr = device->CreateIndexBuffer(vbSize*sizeof(UINT), - D3DUSAGE_WRITEONLY, - D3DFMT_INDEX32, - D3DPOOL_DEFAULT, - &vb->indexBuffer, - NULL); - } - - if (FAILED(hr)) { - vb->indexBuffer = NULL; - vb->release(); - D3dCtx::d3dWarning(CREATEINDEXVBFAIL, hr); - return false; - } - - cDirty |= javax_media_j3d_GeometryArrayRetained_INDEX_CHANGED; - } - - float *vbptr; - // Note that DWORD (use for color) is of same size - // as float (use for vertex/normal) - hr = vb->buffer->Lock(0, 0, (VOID**)&vbptr, 0); - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKVBFAIL, hr); - // recreate it next time - vb->release(); - return false; - } - - d3dCtx->pVB = vb; - - // The current VB is not yet used. - vb->stripLen = 0; - - if (cDirty) { - D3DINDEXBUFFER_DESC desc; - BYTE *bptr; - - vb->indexBuffer->GetDesc(&desc); - hr = vb->indexBuffer->Lock(0, 0, (VOID**)&bptr, 0); - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKINDEXVBFAIL, hr); - vb->buffer->Unlock(); - return false; - } - - if (d3dCtx->reIndexifyTable == NULL) { - // vcount will not change during renderIndexGeometry - // and splitIndexVertex so it is safe not to check - // size of reIndexifyTable and recreate a bigger - // one. - d3dCtx->reIndexifyTable = new DWORD[vcount]; - if (d3dCtx->reIndexifyTable == NULL) { - D3dCtx::d3dWarning(OUTOFMEMORY, hr); - vb->release(); - return false; - } - - } - - ZeroMemory(d3dCtx->reIndexifyTable, sizeof(DWORD)*vcount); - - DWORD i; - jint *idxPtr = strideData->indexPtr + strideData->initialIndexIndex; - USHORT firstEntry = *idxPtr; - DWORD *table = d3dCtx->reIndexifyTable; - - if (desc.Format == D3DFMT_INDEX16) { - USHORT *dst = (USHORT *) bptr; - USHORT newIdx, prevIdx = -1, count = 0; - USHORT idx[3], vc = 0; - - for (i=0; i < indexCount; i++) { - newIdx = table[*idxPtr]; - if ((newIdx == 0) && (*idxPtr != firstEntry)) { - newIdx = ++count; - table[*idxPtr] = newIdx; - } - if (!expandQuadIndex) { - *dst++ = newIdx; - } else { - if (vc < 3) { - idx[vc++] = newIdx; - } else { - // vc = 3 - *dst++ = idx[0]; - *dst++ = idx[1]; - *dst++ = idx[2]; - *dst++ = idx[0]; - *dst++ = idx[2]; - *dst++ = newIdx; - vc = 0; - } - } - if (newIdx != prevIdx) { - copyOneVertexToVB(d3dCtx, &vbptr, strideData, - *idxPtr++, cDirty, xform, nxform); - prevIdx = newIdx; - } else { - idxPtr++; - } - - } - } else { - DWORD *dst = (DWORD *) bptr; - DWORD newIdx, prevIdx = -1, count = 0; - DWORD idx[3], vc = 0; - - for (i=0; i < indexCount; i++) { - newIdx = table[*idxPtr]; - if ((newIdx == 0) && (*idxPtr != firstEntry)) { - newIdx = ++count; - table[*idxPtr] = newIdx; - } - if (!expandQuadIndex) { - *dst++ = newIdx; - } else { - if (vc < 3) { - idx[vc++] = newIdx; - } else { - // vc = 3 - *dst++ = idx[0]; - *dst++ = idx[1]; - *dst++ = idx[2]; - *dst++ = idx[0]; - *dst++ = idx[2]; - *dst++ = newIdx; - vc = 0; - } - } - if (newIdx != prevIdx) { - copyOneVertexToVB(d3dCtx, &vbptr, strideData, - *idxPtr++, cDirty, xform, nxform); - prevIdx = newIdx; - } else { - idxPtr++; - } - } - } - } - - - vb->addStride(vbSize); - vb->indexBuffer->Unlock(); - vb->buffer->Unlock(); - return true; -} - - -void splitIndexVertexToMultipleVB(D3dCtx *d3dCtx, - LPD3DDRAWPRIMITIVESTRIDEDDATA strideData, - int indexCount, - int vertexCount, - int maxVertexLimit, - jint cDirty, - BOOL expandQuadIndex, - jdouble* xform, - jdouble* nxform) -{ - int vc; - BOOL success; - int inc; - int min = 0; - int max = 0; - int initialIdxIdx = strideData->initialIndexIndex; - - - switch (d3dCtx->pVB->primitiveType) { - case D3DPT_TRIANGLEFAN: - { - jint firstIdx = strideData->indexPtr[initialIdxIdx]; - jint prevIdx = firstIdx; - - inc = maxVertexLimit - 2; - - while (true) { - vc = (indexCount >= maxVertexLimit ? maxVertexLimit : indexCount); - success = reIndexifyIndexVertexToVBs(d3dCtx, - strideData, - vc, - vertexCount, - cDirty, - expandQuadIndex, - maxVertexLimit, - xform, nxform); - // restore index - strideData->indexPtr[strideData->initialIndexIndex] = prevIdx; - indexCount -= inc; - - if (!success || (indexCount <= 2)) { - break; - } - // repeat the last index - strideData->initialIndexIndex += (vc - 2); - // replace by first index - prevIdx = strideData->indexPtr[strideData->initialIndexIndex]; - strideData->indexPtr[strideData->initialIndexIndex] = firstIdx; - } - } - break; - case D3DPT_POINTLIST: - if (max == 0) { - max = maxVertexLimit; - } - // fall through - case D3DPT_LINESTRIP: - if (max == 0) { - max = maxVertexLimit; - min = 1; // repeat the last vertex; - } - // fall through - case D3DPT_TRIANGLELIST: - if (max == 0) { - if (expandQuadIndex) { - // QuadArray - max = maxVertexLimit - (maxVertexLimit % 4); - } else { - max = maxVertexLimit - (maxVertexLimit % 3); - } - } - // fall through - case D3DPT_LINELIST: - if (max == 0) { - max = maxVertexLimit - (maxVertexLimit % 2); - } - // fall through - case D3DPT_TRIANGLESTRIP: - if (max == 0) { - max = maxVertexLimit - (maxVertexLimit % 4); - min = 2; // repeat the last two vertices - } - inc = max - min; - - while (true) { - vc = (indexCount >= max ? max : indexCount); - - if (!reIndexifyIndexVertexToVBs(d3dCtx, - strideData, - vc, - vertexCount, - cDirty, - expandQuadIndex, - maxVertexLimit, - xform, nxform)) { - break; - } - - indexCount -= inc; - if (indexCount <= min) { - break; - } - strideData->initialIndexIndex += inc; - } - } - strideData->initialIndexIndex = initialIdxIdx; -} - -// This is used by quad polygon line mode -void DrawPolygonLine(D3dCtx *d3dCtx, - LPDIRECT3DDEVICE9 device, - DWORD vertexFormat, - D3DDRAWPRIMITIVESTRIDEDDATA *strideData) -{ - HRESULT hr; - float *vbptr; - - hr = d3dCtx->pVB->buffer->Lock(0, 0, (VOID**) &vbptr, 0 ); - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKVBFAIL, hr); - return; - } - // DisplayList will not use in this case, so xform = nxform = NULL - copyVertexToVB(d3dCtx, strideData, 4, &vbptr, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED, true, - NULL, NULL); - d3dCtx->pVB->buffer->Unlock(); - device->SetStreamSource(0, d3dCtx->pVB->buffer, 0, - d3dCtx->pVB->stride); - device->SetIndices(d3dCtx->lineModeIndexBuffer); - //device->SetVertexShader(vertexFormat); - device->SetVertexShader(NULL); - device->SetFVF(vertexFormat); - - device->DrawIndexedPrimitive(D3DPT_LINESTRIP,0, 0, 4, 0, 4); -} - - -// This is used by indexed quad polygon line mode -void DrawIndexPolygonLine(D3dCtx *d3dCtx, - LPDIRECT3DDEVICE9 device, - DWORD vertexFormat, - D3DDRAWPRIMITIVESTRIDEDDATA *strideData, - jint idx0, jint idx1, jint idx2, jint idx3) -{ - HRESULT hr; - float *vbptr; - - hr = d3dCtx->pVB->buffer->Lock(0, 0, (VOID**) &vbptr, 0 ); - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKVBFAIL, hr); - return; - } - - copyOneVertexToVB(d3dCtx, &vbptr, strideData, idx0, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED, - NULL, NULL); - copyOneVertexToVB(d3dCtx, &vbptr, strideData, idx1, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED, - NULL, NULL); - copyOneVertexToVB(d3dCtx, &vbptr, strideData, idx2, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED, - NULL, NULL); - copyOneVertexToVB(d3dCtx, &vbptr, strideData, idx3, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED, - NULL, NULL); - - d3dCtx->pVB->buffer->Unlock(); - device->SetStreamSource(0, d3dCtx->pVB->buffer, 0, - d3dCtx->pVB->stride); - //device->SetVertexShader(vertexFormat); - device->SetVertexShader(NULL); - device->SetFVF(vertexFormat); - - device->SetIndices(d3dCtx->lineModeIndexBuffer); - - device->DrawIndexedPrimitive(D3DPT_LINESTRIP,0, 0, 4, 0, 4); -} - - -void renderGeometry(JNIEnv *env, - D3dCtx *d3dCtx, - LPDIRECT3DDEVICE9 device, - jobject geo, - jint geo_type, - D3DDRAWPRIMITIVESTRIDEDDATA *strideData, - DWORD vertexFormat, - jint vcount, - jdouble* xform, - jdouble* nxform, - jint cDirty) -{ - D3DPRIMITIVETYPE d3dRenderType; - BOOL renderTypeSet = false; - int i, j, genMode; - LPD3DVERTEXBUFFER vb = NULL; - D3dVertexBufferVector *vbVector; - float *vbptr; - -#ifdef VBDEBUG - BOOL createNew = false; -#endif - - if (vcount <= 0) { - return; - } - - jclass geoClass = env->GetObjectClass(geo); - DWORD maxVertexLimit = d3dCtx->deviceInfo->maxVertexCount[geo_type]; - DWORD texSetUsed = d3dCtx->texSetUsed; - HRESULT hr; - BOOL needPointFlag = (geo_type == GEO_TYPE_POINT_SET) || - ((geo_type != GEO_TYPE_LINE_STRIP_SET) && - (geo_type != GEO_TYPE_LINE_SET) && - (d3dCtx->fillMode == D3DFILL_POINT)); - - BOOL buildDL = (d3dCtx->currDisplayListID > 0); - - lockGeometry(); - - if (!buildDL) { - jfieldID fieldID = env->GetFieldID(geoClass, "pVertexBuffers", "J"); - jobject cloneSource = NULL; - - vbVector = reinterpret_cast<D3dVertexBufferVector *> - (env->GetLongField(geo, fieldID)); - - if (vbVector == NULL) { - // It is possible this is the mirrorGeometry - // from cloneNonIndexGeometry() - jfieldID fieldID2 = env->GetFieldID(geoClass, - "cloneSourceArray", - "Ljavax/media/j3d/IndexedGeometryArrayRetained;"); - cloneSource = env->GetObjectField(geo, fieldID2); - - if (cloneSource != NULL) { - jclass cloneClass = env->GetObjectClass(cloneSource); - fieldID = env->GetFieldID(cloneClass, "pVertexBuffers", "J"); - - vbVector = reinterpret_cast<D3dVertexBufferVector *> - (env->GetLongField(cloneSource, fieldID)); - } - - } - - - // This is the first time rendering is invoked on the - // first GeometryArray - if (vbVector == NULL) { - vbVector = new D3dVertexBufferVector(); - if (vbVector == NULL) { - D3dCtx::d3dWarning(OUTOFMEMORY); - unlockGeometry(); - return; - } - if (cloneSource == NULL) { - env->SetLongField(geo, fieldID, - reinterpret_cast<long>(vbVector)); - } else { - env->SetLongField(cloneSource, fieldID, - reinterpret_cast<long>(vbVector)); - } - - } else { - // Found the vb in the list of vbVector - for (ITER_LPD3DVERTEXBUFFER s = vbVector->begin(); - s != vbVector->end(); ++s) { - if ((*s)->ctx == d3dCtx) { - vb = *s; - break; - } - } - } - } - - if (vb == NULL) { - // This is the first time rendering is invoked - // using this ctx - vb = new D3dVertexBuffer(); - - if (vb == NULL) { - D3dCtx::d3dWarning(OUTOFMEMORY); - unlockGeometry(); - return; - } - vb->ctx = d3dCtx; - vb->maxVertexLimit = maxVertexLimit; - - if (!buildDL) { - vb->vbVector = vbVector; - - // add it to the GeometryArray pVertexBuffers list - vbVector->push_back(vb); - - // add it to the ctx lists - vb->next = d3dCtx->vertexBufferTable.next; - vb->previous = &(d3dCtx->vertexBufferTable); - d3dCtx->vertexBufferTable.next = vb; - if (vb->next != NULL) { - vb->next->previous = vb; - } - } - } - - if ((vb->buffer != NULL) && - ((vb->vertexFormat != vertexFormat) || - (vb->totalVertexCount < vcount) || - (cDirty & - javax_media_j3d_GeometryArrayRetained_STRIPCOUNT_CHANGED) || - (!vb->isPointFlagUsed && needPointFlag))) { - // immediate release VB and reconstruct a new one - vb->release(); - } - - if (vb->buffer == NULL) { - vb->stride = D3DXGetFVFVertexSize(vertexFormat); - vb->vertexFormat = vertexFormat; - vb->totalVertexCount = vcount; - vb->vcount = (vcount >= maxVertexLimit ? maxVertexLimit : vcount); -#ifdef VBDEBUG - printf("Create primary VertexBuffer of size %d, display list ID %d, pointFlag %d\n", - vb->vcount, d3dCtx->currDisplayListID, needPointFlag); -#endif - if (!needPointFlag) { - hr = device->CreateVertexBuffer(vb->stride*vb->vcount, - D3DUSAGE_WRITEONLY, - vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - } else { - hr = device->CreateVertexBuffer(vb->stride*vb->vcount, - D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS, - vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - vb->isPointFlagUsed = true; - } - - if (FAILED(hr)) { - vb->buffer = NULL; - D3dCtx::d3dWarning(CREATEVBFAIL, hr); - unlockGeometry(); - return; - } -#ifdef VBDEBUG - createNew = true; -#endif - cDirty = javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED; - } - - unlockGeometry(); - - if (buildDL) { - // In display list mode, add it to the displayList ID table - d3dCtx->displayListTable[d3dCtx->currDisplayListID]->add(vb); - } else { - - if (vb->primitiveType == D3DPT_FORCE_DWORD) { - // This happens when previous frame use Quad Line - // so buffer not yet initialize - cDirty = javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED; - } - - if (!cDirty && - ((geo_type != GEO_TYPE_QUAD_SET) || - (d3dCtx->fillMode != D3DFILL_WIREFRAME))) { - for (i=0; i < d3dCtx->texSetUsed; i++) { - genMode = strideData->texCoordPosition[i]; - if ((genMode == TEX_OBJ_LINEAR) || - ((genMode != vb->texCoordPosition[i]) && - (genMode != TEX_GEN_AUTO))) { - // For object linear mode user can set the plane - // equations so we need to change texture coordinate. - break; - } - } - if (i == d3dCtx->texSetUsed) { - vb->render(d3dCtx); -#ifdef TEXDEBUG - printf("Skip VB Copy\n"); -#endif - return; - } - } - } - - // Note that DWORD (use for color) is of same size - // as float (use for vertex/normal) - - hr = vb->buffer->Lock(0, 0, (VOID**)&vbptr, 0); - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKVBFAIL, hr); - // recreate it next time - vb->release(); - return; - } - - d3dCtx->pVB = vb; - // The current VB is not yet used. - vb->stripLen = 0; - - switch (geo_type) { - case GEO_TYPE_TRI_STRIP_SET: - d3dRenderType = D3DPT_TRIANGLESTRIP; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("Tri strip set %d\n", vcount); - } -#endif - // fall through - case GEO_TYPE_TRI_FAN_SET: - if (renderTypeSet == false) { -#ifdef VBDEBUG - if (createNew) { - printf("Tri fan set %d\n", vcount); - } -#endif - d3dRenderType = D3DPT_TRIANGLEFAN; - renderTypeSet = true; - } - // fall through - case GEO_TYPE_LINE_STRIP_SET: - { - if (renderTypeSet == false) { - d3dRenderType = D3DPT_LINESTRIP; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("Tri line set %d \n", vcount); - } -#endif - } - - jfieldID strip_field = env->GetFieldID(geoClass, - "stripVertexCounts", "[I"); - jarray sarray = (jarray)env->GetObjectField(geo, strip_field); - jsize strip_len = (jsize)env->GetArrayLength(sarray); - - jint* strips = (jint *)env->GetPrimitiveArrayCritical(sarray, NULL); - - int nlastStrip = 0; - int totalLen = 0; - int oldTotalLen = 0; - int vsum = 0; - - vb->primitiveType = d3dRenderType; - - if (vcount <= vb->vcount) { - copyVertexToVB(d3dCtx, strideData, vcount, - &vbptr, cDirty, false, xform, nxform); - vb->addStrides(strip_len, strips); -#ifdef VBDEBUG - if (createNew) { - printf("Strip Length %d : ", strip_len); - for (int k=0; k < strip_len; k++) { - printf("%d ", strips[k]); - } - printf("\n"); - } -#endif - } else { -#ifdef VBDEBUG - if (createNew) { - printf("Strip Length %d : ", strip_len); - } -#endif - - for (i = 0; i < strip_len; i++) { - if (strideData->fpositionPtr) { - strideData->fpositionPtr += - strideData->positionStride*nlastStrip; - } else { - strideData->dpositionPtr += - strideData->positionStride*nlastStrip; - } - - if (strideData->normalPtr) { - strideData->normalPtr += - strideData->normalStride*nlastStrip; - } - - if (strideData->fdiffusePtr) { - strideData->fdiffusePtr += - strideData->diffuseStride*nlastStrip; - } else if (strideData->bdiffusePtr) { - strideData->bdiffusePtr += - strideData->diffuseStride*nlastStrip; - } - - - if (strideData->textureCoordsPtr[0]) { - for (j=0; j < texSetUsed; j++) { - strideData->textureCoordsPtr[j] += - strideData->textureCoordsStride[j]* nlastStrip; - } - } - - - nlastStrip = strips[i]; - oldTotalLen = totalLen; - totalLen += nlastStrip; - - if (totalLen > vcount) { - // This should not happen since - // setValidVertexCount is disable - // in v1.3. We should always have - // (sum of strips[] < vcount) - nlastStrip = (vcount - (totalLen - nlastStrip)); - totalLen = vcount; - } - - if (nlastStrip <= 0) { - continue; - } - - - if (vbptr == NULL) { - // This happen when the lastStrip copy - // is greater than maxVertexLimit. - // So we Unlock the last buffer - vbptr = allocateVB(d3dCtx, device, - vcount - oldTotalLen, - maxVertexLimit, &cDirty); - vsum = 0; - if (vbptr == NULL) { - break; // render whatever geometry the current VB have - } - } -#ifdef VBDEBUG - if (createNew) { - printf(" %d ", nlastStrip); - } -#endif - if ((vsum + nlastStrip) <= d3dCtx->pVB->vcount) { - // There is space available to put in vertices - vsum += nlastStrip; - copyVertexToVB(d3dCtx, strideData, nlastStrip, - &vbptr, cDirty, true, xform, nxform); - } else { - // Need to create a new VB - if (nlastStrip <= maxVertexLimit) { - // No need to split strip in multiple VB - if (d3dCtx->pVB->stripLen > 0) { - if (vbptr != NULL) { - d3dCtx->pVB->buffer->Unlock(); - } - vbptr = allocateVB(d3dCtx, device, - vcount - oldTotalLen, - maxVertexLimit, &cDirty); - if (vbptr == NULL) { - break; - } - vsum = 0; - } - vsum += nlastStrip; - copyVertexToVB(d3dCtx, strideData, nlastStrip, - &vbptr, cDirty, true, - xform, nxform); - } else { - d3dCtx->pVB->buffer->Unlock(); - vbptr = NULL; - vsum = 0; - // Multiple VBs for large vertex size - splitVertexToMultipleVB(d3dCtx, strideData, - nlastStrip, - maxVertexLimit, - cDirty, xform, nxform); - vbptr = NULL; - } - } - } -#ifdef VBDEBUG - if (createNew) { - printf("\n"); - } -#endif - } - env->ReleasePrimitiveArrayCritical(sarray, strips, NULL); - } - break; - case GEO_TYPE_QUAD_SET: -#ifdef VBDEBUG - if (createNew) { - printf("quad set %d\n", vcount); - } -#endif - - if (buildDL || - (d3dCtx->fillMode != D3DFILL_WIREFRAME)) { - /* - * Note we can't just check - * if (d3dCtx->fillMode != D3DFILL_WIREFRAME) - * since the fillMode may set back to - * non-line mode AFTER build display list - * In fact it is gaurantee that when displaylist - * mode is used we are not in line mode - */ - - // break down solid into two triangles - if (createQuadIndices(d3dCtx, vcount)) { - // It happens when - // vcount*3/2 != d3dCtx->quadIndexBufferSize - // to conform with index buffer Limitation in - // graphics card. So we adjust using a smaller - // maxVertexLimit when spliting into - // multiple Vertex Buffers. - maxVertexLimit = 2*d3dCtx->quadIndexBufferSize/3; - vb->maxVertexLimit = maxVertexLimit; - vb->vcount = vb->maxVertexLimit; - } - d3dRenderType = D3DPT_TRIANGLELIST; - vb->isIndexPrimitive = true; - renderTypeSet = true; - // fall through - } - else - { // line mode - // we don't want to see extra line appear in the - // diagonal of quads if it splits into two - // triangles. This is REALLY SLOW !!! - int len = vcount >> 2; - int offsetPos = 0; - int offsetNorm = 0; - int offsetColor = 0; - int strideOffsetPos = strideData->positionStride << 2; - int strideOffsetNorm = strideData->normalStride << 2; - int strideOffsetColor = strideData->diffuseStride << 2; - jfloat *pdf = strideData->fpositionPtr; - jdouble *pdd = strideData->dpositionPtr; - jfloat *pn = strideData->normalPtr; - jfloat *pcf = strideData->fdiffusePtr; - jbyte *pcb = strideData->bdiffusePtr; - jfloat* pt[D3DDP_MAXTEXCOORD]; - - pt[0] = NULL; - - if (((vertexFormat & D3DFVF_DIFFUSE) == 0) && - (!d3dCtx->isLightEnable)) { - d3dCtx->setAmbientLightMaterial(); - } - - vb->buffer->Unlock(); - vbptr = NULL; -#ifdef VBDEBUG - if (createNew) { - printf("quad set polygon line %d\n", vcount); - } -#endif - - for (i=0; i < texSetUsed; i++) { - pt[i] = (FLOAT *) strideData->textureCoordsPtr[i]; - } - - jfloat *fptr; - jdouble *dptr; - jbyte *bptr; - jfloat *fspt; - jdouble *dspt; - int posStride = strideData->positionStride; - D3DVERTEX worldCoord[3]; - D3DTLVERTEX screenCoord[3]; - - vb->primitiveType = D3DPT_FORCE_DWORD; - - if (d3dCtx->lineModeIndexBuffer == NULL) { - createLineModeIndexBuffer(d3dCtx); - } - - for (i = 0; i < (vcount >> 2); i++) { - if (pdf) { - fspt = fptr = pdf + offsetPos; - strideData->fpositionPtr = fptr; - } else { - dspt = dptr = pdd + offsetPos; - strideData->dpositionPtr = dptr; - } - - if (pn) { - fptr = pn + offsetNorm; - strideData->normalPtr = fptr; - } - - if (pcf) { - fptr = pcf + offsetColor; - strideData->fdiffusePtr = fptr; - } else if (pcb) { - bptr = pcb + offsetColor; - strideData->bdiffusePtr = bptr; - } - - if (pt[0]) { - for (j=0; j < texSetUsed; j++) { - DWORD stride3 = 3*strideData->textureCoordsStride[j]; - fptr = pt[j] + i*(strideData->textureCoordsStride[j] << 2); - strideData->textureCoordsPtr[j] = fptr; - } - } - if (d3dCtx->cullMode != D3DCULL_NONE) { - // Do back face culling here - if (pdf) { - worldCoord[0].x = fspt[0]; - worldCoord[0].y = fspt[1]; - worldCoord[0].z = fspt[2]; - fspt += posStride; - worldCoord[1].x = fspt[0]; - worldCoord[1].y = fspt[1]; - worldCoord[1].z = fspt[2]; - fspt += posStride; - worldCoord[2].x = fspt[0]; - worldCoord[2].y = fspt[1]; - worldCoord[2].z = fspt[2]; - } else { - worldCoord[0].x = dspt[0]; - worldCoord[0].y = dspt[1]; - worldCoord[0].z = dspt[2]; - dspt += posStride; - worldCoord[1].x = dspt[0]; - worldCoord[1].y = dspt[1]; - worldCoord[1].z = dspt[2]; - dspt += posStride; - worldCoord[2].x = dspt[0]; - worldCoord[2].y = dspt[1]; - worldCoord[2].z = dspt[2]; - } - d3dCtx->transform(&worldCoord[0], &screenCoord[0]); - d3dCtx->transform(&worldCoord[1], &screenCoord[1]); - d3dCtx->transform(&worldCoord[2], &screenCoord[2]); - screenCoord[0].sx -= screenCoord[1].sx; - screenCoord[0].sy -= screenCoord[1].sy; - screenCoord[2].sx -= screenCoord[1].sx; - screenCoord[2].sy -= screenCoord[1].sy; - if (d3dCtx->cullMode == D3DCULL_CW) { - // clip back face - if ((screenCoord[0].sx*screenCoord[2].sy - - screenCoord[2].sx*screenCoord[0].sy) >= 0) { - DrawPolygonLine(d3dCtx, - device, - vertexFormat, - strideData); - } - } else { // Clip front face - if ((screenCoord[0].sx*screenCoord[2].sy - - screenCoord[2].sx*screenCoord[0].sy) <= 0) { - DrawPolygonLine(d3dCtx, - device, - vertexFormat, - strideData); - } - } - } else { - // cullMode == D3DCULL_NONE - DrawPolygonLine(d3dCtx, - device, - vertexFormat, - strideData); - } - offsetPos += strideOffsetPos; - offsetNorm += strideOffsetNorm; - offsetColor += strideOffsetColor; - } - - if (((vertexFormat & D3DFVF_DIFFUSE) == 0) && - (!d3dCtx->isLightEnable)) { - d3dCtx->restoreDefaultLightMaterial(); - } - // Don't call vb->Renderer() at the end - return; - } - // fallthrough - case GEO_TYPE_TRI_SET: - if (renderTypeSet == false) { - d3dRenderType = D3DPT_TRIANGLELIST; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("tri set %d\n", vcount); - } -#endif - } - // fallthrough - case GEO_TYPE_LINE_SET: - if (renderTypeSet == false) { - d3dRenderType = D3DPT_LINELIST; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("line set %d\n", vcount); - } -#endif - } - // fallthrough - case GEO_TYPE_POINT_SET: - if (renderTypeSet == false) { - d3dRenderType = D3DPT_POINTLIST; -#ifdef VBDEBUG - if (createNew) { - printf("point set %d\n", vcount); - } -#endif - } - vb->primitiveType = d3dRenderType; - - if (vcount <= vb->vcount) { - copyVertexToVB(d3dCtx, strideData, vcount, &vbptr, - cDirty, true, xform, nxform); - } else { - if (vbptr != NULL) { - vb->buffer->Unlock(); - vbptr = NULL; - } - - splitVertexToMultipleVB(d3dCtx, strideData, vcount, - maxVertexLimit, - cDirty, xform, nxform); - vbptr = NULL; - } - break; - default: - printf("GeometryArrayRetained_execute:unknown geo_type %ld \n", geo_type); - } - - if (vbptr != NULL) { - // d3dCtx->pVB is the last reference in VB list - d3dCtx->pVB->buffer->Unlock(); - } - - for (i=0; i < d3dCtx->texSetUsed; i++) { - d3dCtx->pVB->texCoordPosition[i] = - strideData->texCoordPosition[i]; - } - - if (!buildDL) { - // Not in displaylist mode, directly render VB - // vb is the root reference in VB list - vb->render(d3dCtx); - } -} - - -void renderIndexGeometry(JNIEnv *env, - D3dCtx *d3dCtx, - LPDIRECT3DDEVICE9 device, - jobject geo, - jint geo_type, - D3DDRAWPRIMITIVESTRIDEDDATA *strideData, - DWORD vertexFormat, - jint vcount, - jint indexCount, - jdouble* xform, - jdouble* nxform, - jint cDirty) -{ - D3DPRIMITIVETYPE d3dRenderType; - BOOL renderTypeSet = false; - BOOL expandQuadIndex = false; - int i; - LPD3DVERTEXBUFFER vb = NULL; - D3dVertexBufferVector *vbVector; - float *vbptr; - -#ifdef VBDEBUG - BOOL createNew = false; -#endif - - if (indexCount <= 0) { - return; - } - - jclass geoClass = env->GetObjectClass(geo); - DWORD maxVertexLimit = - min(d3dCtx->deviceInfo->maxVertexCount[geo_type], - d3dCtx->deviceInfo->maxVertexIndex); - DWORD texSetUsed = d3dCtx->texSetUsed; - HRESULT hr; - BOOL needPointFlag = (geo_type == GEO_TYPE_INDEXED_POINT_SET) || - ((geo_type != GEO_TYPE_INDEXED_LINE_STRIP_SET) && - (geo_type != GEO_TYPE_INDEXED_LINE_SET) && - (d3dCtx->fillMode == D3DFILL_POINT)); - - BOOL buildDL = (d3dCtx->currDisplayListID > 0); - - if (geo_type == GEO_TYPE_INDEXED_QUAD_SET) { - // Since the index we create with be 1.5 times the original index - maxVertexLimit = 2*maxVertexLimit/3; - } - - - lockGeometry(); - - if (!buildDL) { - jfieldID fieldID = env->GetFieldID(geoClass, "pVertexBuffers", "J"); - vbVector = reinterpret_cast<D3dVertexBufferVector *> - (env->GetLongField(geo, fieldID)); - - if (vbVector == NULL) { - // This is the first time rendering is invoked on the - // first GeometryArray - vbVector = new D3dVertexBufferVector(); - if (vbVector == NULL) { - D3dCtx::d3dWarning(OUTOFMEMORY); - unlockGeometry(); - return; - } - env->SetLongField(geo, fieldID, reinterpret_cast<long>(vbVector)); - } else { - // Found the vb in the list of vbVector - for (ITER_LPD3DVERTEXBUFFER s = vbVector->begin(); - s != vbVector->end(); ++s) { - if ((*s)->ctx == d3dCtx) { - vb = *s; - break; - } - } - } - } - - if (vb == NULL) { - // This is the first time rendering is invoked - // using this ctx - vb = new D3dVertexBuffer(); - - if (vb == NULL) { - D3dCtx::d3dWarning(OUTOFMEMORY); - unlockGeometry(); - return; - } - vb->ctx = d3dCtx; - vb->maxVertexLimit = maxVertexLimit; - - if (!buildDL) { - vb->vbVector = vbVector; - - // add it to the GeometryArray pVertexBuffers list - vbVector->push_back(vb); - - // add it to the ctx lists - vb->next = d3dCtx->vertexBufferTable.next; - vb->previous = &(d3dCtx->vertexBufferTable); - d3dCtx->vertexBufferTable.next = vb; - if (vb->next != NULL) { - vb->next->previous = vb; - } - } - } - - if (((vb->indexBuffer != NULL) && - (vb->totalIndexCount < indexCount)) || - ((vb->buffer != NULL) && - ((vb->vertexFormat != vertexFormat) || - (vb->totalVertexCount < vcount) || - (!vb->isPointFlagUsed && needPointFlag)))) { - // immediate release VB and reconstruct a new one - vb->release(); - } - - - if (vb->buffer == NULL) { - vb->stride = D3DXGetFVFVertexSize(vertexFormat); - vb->vertexFormat = vertexFormat; - vb->totalVertexCount = vcount; - vb->isIndexPrimitive = true; - vb->vcount = (vcount >= maxVertexLimit ? maxVertexLimit : vcount); -#ifdef VBDEBUG - printf("Create primary VertexBuffer of size %d, display list ID %d, pointFlag %d\n", - vb->vcount, d3dCtx->currDisplayListID, needPointFlag); -#endif - - if (!needPointFlag) { - hr = device->CreateVertexBuffer(vb->stride*vb->vcount, - D3DUSAGE_WRITEONLY, - vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - } else { - hr = device->CreateVertexBuffer(vb->stride*vb->vcount, - D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS, - vertexFormat, - D3DPOOL_DEFAULT, - &vb->buffer, - NULL); - vb->isPointFlagUsed = true; - } - - if (FAILED(hr)) { - vb->buffer = NULL; - D3dCtx::d3dWarning(CREATEVBFAIL, hr); - unlockGeometry(); - return; - } -#ifdef VBDEBUG - createNew = true; -#endif - cDirty = javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED; - } - - if (vb->indexBuffer == NULL) { - - vb->totalIndexCount = indexCount; - vb->indexCount = (indexCount >= maxVertexLimit ? - maxVertexLimit : indexCount); - - if (geo_type == GEO_TYPE_INDEXED_QUAD_SET) { - // Since we will construct another index with - // 1.5 times of the original. - vb->indexCount = (3*vb->indexCount) >> 1; - vb->totalIndexCount = (3*indexCount) >> 1; - } - - - if (indexCount <= 0xffff) { - hr = device->CreateIndexBuffer(vb->indexCount*sizeof(WORD), - D3DUSAGE_WRITEONLY, - D3DFMT_INDEX16, - D3DPOOL_DEFAULT, - &vb->indexBuffer, - NULL); - } else { - hr = device->CreateIndexBuffer(vb->indexCount*sizeof(UINT), - D3DUSAGE_WRITEONLY, - D3DFMT_INDEX32, - D3DPOOL_DEFAULT, - &vb->indexBuffer, - NULL); - } - - if (FAILED(hr)) { - vb->indexBuffer = NULL; - D3dCtx::d3dWarning(CREATEINDEXVBFAIL, hr); - unlockGeometry(); - return; - } - - cDirty |= javax_media_j3d_GeometryArrayRetained_INDEX_CHANGED; - } - - unlockGeometry(); - - if (buildDL) { - // In display list mode, add it to the displayList ID table - d3dCtx->displayListTable[d3dCtx->currDisplayListID]->add(vb); - } else { - - if (vb->primitiveType == D3DPT_FORCE_DWORD) { - // This happens when previous frame use Quad Line - // so buffer not yet initialize - cDirty = - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED | - javax_media_j3d_GeometryArrayRetained_INDEX_CHANGED; - } - - if (!cDirty && - ((geo_type != GEO_TYPE_INDEXED_QUAD_SET) || - (d3dCtx->fillMode != D3DFILL_WIREFRAME))) { - for (i=0; i < d3dCtx->texSetUsed; i++) { - if ((strideData->texCoordPosition[i] != - vb->texCoordPosition[i]) - && - (strideData->texCoordPosition[i] != TEX_GEN_AUTO)) { - break; - } - } - if (i == d3dCtx->texSetUsed) { - vb->render(d3dCtx); - return; - } - } - } - - // Note that DWORD (use for color) is of same size - // as float (use for vertex/normal) - hr = vb->buffer->Lock(0, 0, (VOID**)&vbptr, 0); - if (FAILED(hr)) { - D3dCtx::d3dWarning(LOCKVBFAIL, hr); - // recreate it next time - vb->release(); - return; - } - - d3dCtx->pVB = vb; - - // The current VB is not yet used. - vb->stripLen = 0; - - switch (geo_type) { - case GEO_TYPE_INDEXED_TRI_STRIP_SET: - d3dRenderType = D3DPT_TRIANGLESTRIP; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("Tri strip set %d\n", vcount); - } -#endif - // fall through - case GEO_TYPE_INDEXED_TRI_FAN_SET: - if (renderTypeSet == false) { -#ifdef VBDEBUG - if (createNew) { - printf("Tri fan set %d\n", vcount); - } -#endif - d3dRenderType = D3DPT_TRIANGLEFAN; - renderTypeSet = true; - } - // fall through - case GEO_TYPE_INDEXED_LINE_STRIP_SET: - { - if (renderTypeSet == false) { - d3dRenderType = D3DPT_LINESTRIP; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("Tri line set %d \n", vcount); - } -#endif - } - - jfieldID strip_field = env->GetFieldID(geoClass, - "stripIndexCounts", "[I"); - jarray sarray = (jarray)env->GetObjectField(geo, strip_field); - jsize strip_len = (jsize)env->GetArrayLength(sarray); - - jint* strips = (jint *)env->GetPrimitiveArrayCritical(sarray, NULL); - int nlastStrip = 0; - - vb->primitiveType = d3dRenderType; -#ifdef VBDEBUG - if (createNew) { - printf("Strip Length %d : ", strip_len); - } -#endif - - if ((vb->totalIndexCount <= vb->indexCount) && - (vcount <= vb->vcount)) { - copyIndexVertexToVB(d3dCtx, strideData, - indexCount, cDirty, false, false); - copyVertexToVB(d3dCtx, strideData, vcount, - &vbptr, cDirty, false, xform, nxform); - vb->addStrides(strip_len, strips); - } else { - vb->buffer->Unlock(); - vbptr = NULL; - strideData->indexPtr += strideData->initialIndexIndex; - strideData->initialIndexIndex = 0; - for (i = 0; i < strip_len; i++) { - strideData->indexPtr += nlastStrip; - - nlastStrip = strips[i]; - - if (nlastStrip <= 0) { - continue; - } -#ifdef VBDEBUG - if (createNew) { - printf(" %d", nlastStrip); - } -#endif - if (nlastStrip <= vb->indexCount) { - reIndexifyIndexVertexToVBs(d3dCtx, strideData, - nlastStrip, vcount, - cDirty, - false, - maxVertexLimit, - xform, nxform); - } else { - // Multiple VBs for large vertex size - splitIndexVertexToMultipleVB(d3dCtx, - strideData, - nlastStrip, - vcount, - maxVertexLimit, - cDirty, - false, - xform, nxform); - } - SafeDelete(d3dCtx->reIndexifyTable); - } -#ifdef VBDEBUG - if (createNew) { - printf("\n"); - } -#endif - } - env->ReleasePrimitiveArrayCritical(sarray, strips, NULL); - } - - break; - case GEO_TYPE_INDEXED_QUAD_SET: -#ifdef VBDEBUG - if (createNew) { - printf("quad set %d\n", vcount); - } -#endif - if (buildDL || - (d3dCtx->fillMode != D3DFILL_WIREFRAME)) { - d3dRenderType = D3DPT_TRIANGLELIST; - renderTypeSet = true; - expandQuadIndex = true; - // fall through - } - // start quad WireFrame - else { - // polygon line mode - // we don't want to see extra line appear in the - // diagonal of quads if it splits into two - // triangles. This is REALLY SLOW !!! - int posStride = strideData->positionStride; - D3DVERTEX worldCoord[3]; - D3DTLVERTEX screenCoord[3]; - jint *idxPtr = strideData->indexPtr; - jfloat *fspt; - jdouble *dspt; - jint idx0, idx1, idx2, idx3; - - if (((vertexFormat & D3DFVF_DIFFUSE) == 0) && - (!d3dCtx->isLightEnable)) { - d3dCtx->setAmbientLightMaterial(); - } - - vb->buffer->Unlock(); - vbptr = NULL; -#ifdef VBDEBUG - if (createNew) { - printf("indexed quad set polygon line %d\n", vcount); - } -#endif - if (d3dCtx->lineModeIndexBuffer == NULL) { - createLineModeIndexBuffer(d3dCtx); - } - - vb->primitiveType = D3DPT_FORCE_DWORD; - - for (i = 0; i < (indexCount >> 2); i++) - { - if (d3dCtx->cullMode != D3DCULL_NONE) - { - // Do back face culling here - idx0 = *idxPtr++; - idx1 = *idxPtr++; - idx2 = *idxPtr++; - idx3 = *idxPtr++; - - if (strideData->fpositionPtr) - { - fspt = strideData->fpositionPtr + posStride*idx0; - worldCoord[0].x = *fspt++; - worldCoord[0].y = *fspt++; - worldCoord[0].z = *fspt++; - fspt = strideData->fpositionPtr + posStride*idx1; - worldCoord[1].x = *fspt++; - worldCoord[1].y = *fspt++; - worldCoord[1].z = *fspt++; - fspt = strideData->fpositionPtr + posStride*idx2; - worldCoord[2].x = *fspt++; - worldCoord[2].y = *fspt++; - worldCoord[2].z = *fspt++; - } - else - { - dspt = strideData->dpositionPtr + posStride*idx0; - worldCoord[0].x = *dspt++; - worldCoord[0].y = *dspt++; - worldCoord[0].z = *dspt++; - dspt = strideData->dpositionPtr + posStride*idx1; - worldCoord[1].x = *dspt++; - worldCoord[1].y = *dspt++; - worldCoord[1].z = *dspt++; - dspt = strideData->dpositionPtr + posStride*idx2; - worldCoord[2].x = *dspt++; - worldCoord[2].y = *dspt++; - worldCoord[2].z = *dspt++; - } - - d3dCtx->transform(&worldCoord[0], &screenCoord[0]); - d3dCtx->transform(&worldCoord[1], &screenCoord[1]); - d3dCtx->transform(&worldCoord[2], &screenCoord[2]); - screenCoord[0].sx -= screenCoord[1].sx; - screenCoord[0].sy -= screenCoord[1].sy; - screenCoord[2].sx -= screenCoord[1].sx; - screenCoord[2].sy -= screenCoord[1].sy; - - if (d3dCtx->cullMode == D3DCULL_CW) - { - if ((screenCoord[0].sx*screenCoord[2].sy - - screenCoord[2].sx*screenCoord[0].sy) >= 0) - { - DrawIndexPolygonLine(d3dCtx, - device, - vertexFormat, - strideData, - idx0, idx1, - idx2, idx3); - } - } - else - { // Clip front face - if ((screenCoord[0].sx*screenCoord[2].sy - - screenCoord[2].sx*screenCoord[0].sy) <= 0) - { - DrawIndexPolygonLine(d3dCtx, - device, - vertexFormat, - strideData, - idx0, idx1, - idx2, idx3); - } - } - } - else - { - // cullMode == D3DCULL_NONE - DrawIndexPolygonLine(d3dCtx, - device, - vertexFormat, - strideData, - idx0, idx1, - idx2, idx3); - } - }//for - - if (((vertexFormat & D3DFVF_DIFFUSE) == 0) && - (!d3dCtx->isLightEnable)) - { - d3dCtx->restoreDefaultLightMaterial(); - } - // Don't call vb->Renderer() at the end - return; - } - - //end index Quad WireFrame - - // fall through - case GEO_TYPE_INDEXED_TRI_SET: - if (renderTypeSet == false) { - d3dRenderType = D3DPT_TRIANGLELIST; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("tri set %d\n", vcount); - } -#endif - } - // fallthrough - case GEO_TYPE_INDEXED_LINE_SET: - if (renderTypeSet == false) { - d3dRenderType = D3DPT_LINELIST; - renderTypeSet = true; -#ifdef VBDEBUG - if (createNew) { - printf("line set %d\n", vcount); - } -#endif - } - // fallthrough - case GEO_TYPE_INDEXED_POINT_SET: - if (renderTypeSet == false) { - d3dRenderType = D3DPT_POINTLIST; -#ifdef VBDEBUG - if (createNew) { - printf("point set %d\n", vcount); - } -#endif - } - vb->primitiveType = d3dRenderType; - - if (vb->totalIndexCount <= vb->indexCount) { - if (vcount <= vb->vcount) { - copyIndexVertexToVB(d3dCtx, strideData, - indexCount, - cDirty, true, expandQuadIndex); - copyVertexToVB(d3dCtx, strideData, vcount, &vbptr, - cDirty, false, xform, nxform); - } else { - vb->buffer->Unlock(); - vbptr = NULL; - reIndexifyIndexVertexToVBs(d3dCtx, strideData, - indexCount, vcount, - cDirty, - expandQuadIndex, - maxVertexLimit, - xform, nxform); - SafeDelete(d3dCtx->reIndexifyTable); - } - } else { - vb->buffer->Unlock(); - vbptr = NULL; - splitIndexVertexToMultipleVB(d3dCtx, - strideData, - indexCount, - vcount, - maxVertexLimit, - cDirty, - expandQuadIndex, - xform, nxform); - SafeDelete(d3dCtx->reIndexifyTable); - } - break; - default: - printf("IndexedGeometryArrayRetained_execute:unknown geo_type %ld \n", geo_type); - } - - if (vbptr != NULL) { - // d3dCtx->pVB is the last reference in VB list - d3dCtx->pVB->buffer->Unlock(); - } - - // Save new texture position to detect any change - // in next round. - for (i=0; i < d3dCtx->texSetUsed; i++) { - d3dCtx->pVB->texCoordPosition[i] = - strideData->texCoordPosition[i]; - } - - if (!buildDL) { - // Not in displaylist mode, directly render VB - // vb is the root reference in VB list - vb->render(d3dCtx); - } -} - - -/* - * Set the default texture coordinate pointers when automatically - * texture generation is used or when there is application error - */ -inline void setDefaultTextureCoordPointers(D3dCtx *d3dCtx, - D3DDRAWPRIMITIVESTRIDEDDATA *strideData, - DWORD* vertexFormat, - jint ts, - int genMode, - int tus) -{ - strideData->textureCoordsPtr[tus] = &defaultTexCoord[0]; - strideData->textureCoordsStride[tus] = 0; - strideData->texCoordPosition[tus] = genMode; - d3dCtx->texStride[tus] = ts; - *vertexFormat |= (TexFormatSizeTable[ts] << (tus*2 + 16)); -} - - -/* - * Set the textureCoordStride & textureCoordsPtr in strideData - */ -void setTextureCoordPointers(JNIEnv *env, - D3dCtx* d3dCtx, - LPDIRECT3DDEVICE9 device, - D3DDRAWPRIMITIVESTRIDEDDATA *strideData, - jint texoff, - jint texStride, - jint ts, - jboolean textureDefined, - jintArray tcoordsetmap, - jint texCoordMapLength, - jintArray texUnitOffset, - jint numActiveTexUnit, - DWORD* vertexFormat, - // Used by executeGeometryArray() & - // executeIndexedGeometryArray() only - jfloat* verts, - // Used by executeGeometryArrayVA() & - // executeIndexedGeometryArrayVA() only - jfloat** texCoordPointer, - // Used by executeGeometryArrayVA() only - jintArray texindices) - -{ - jint *texCoordSetMapOffset = NULL; - jint *initialTexIndices = NULL; - jint *texCoordSetMap = NULL; - jint textureUnitIndex; - int genMode; - jint offsetOrTexset; - BOOL nonVAGeom = (verts != NULL); - int texSetInVB = 0; - - // TODO : - int pass = -1; - - /* - * In case of automatic texture generation, - * (vformat & GA_TEXTURE_COORDINATE) may equal to zero so we - * can't wrap around this whole block with the condition. - */ - d3dCtx->texSetUsed = 0; - - // For GA buildGA(), numActiveTexUnit is 1 even though texture - // is not used. This is only accurate for execute() immediate case. - if (numActiveTexUnit <= 0) { - return; - } - - if (texCoordMapLength > 0) { - if (nonVAGeom) { - // In executeGeometryArray() or executeIndexedGeometryArray() - texCoordSetMapOffset = (jint *) env->GetPrimitiveArrayCritical(texUnitOffset, NULL); - } else { - // In executeGeometryArrayVA() or executeIndexedGeometryArrayVA() - texCoordSetMap = (jint *) - env->GetPrimitiveArrayCritical(tcoordsetmap, NULL); - } - - } - - if (texindices != NULL) { - // In executeGeometryArrayVA() - initialTexIndices = (jint *) env->GetPrimitiveArrayCritical(texindices, NULL); - } - - // DisplayList is used for multiple texture single pass mode - // Or when go through the VertexArray in OGL, pass = -1 - int tus; -#ifdef TEXDEBUG - printf("*** Multiple Pass *** %d, nonVAGeom %d, buildDL %d, numActiveTexUnit %d, texCoordMapLength %d, texDef %d\n", pass, - nonVAGeom, (d3dCtx->currDisplayListID > 0), - numActiveTexUnit, texCoordMapLength, textureDefined); -#endif - - - for (textureUnitIndex = 0; textureUnitIndex < numActiveTexUnit; - textureUnitIndex++) { - - tus = textureUnitIndex; - - if (d3dCtx->currDisplayListID > 0) { - genMode = setTextureStage(d3dCtx, device, - textureUnitIndex, tus); - } else { - // This happen when we switch from displayList to - // vertexArray mode. The displayList is already - // built with 1-1 mapping so we can't use the - // textureUnitIndex Mapping - genMode = setTextureStage(d3dCtx, device, - textureUnitIndex, - textureUnitIndex); - } -#ifdef TEXDEBUG - printf("[pass %d] genMode %d, tus %d\n", textureUnitIndex, - genMode, tus); -#endif - if (genMode != TEX_OBJ_LINEAR) { - if (textureDefined) { - if (tus < texCoordMapLength) { - offsetOrTexset = (nonVAGeom ? - texCoordSetMapOffset[tus]:texCoordSetMap[tus]); - - if (offsetOrTexset != -1) { - if (nonVAGeom) { - strideData->textureCoordsPtr[textureUnitIndex] = - &verts[texoff + offsetOrTexset]; - } else if (initialTexIndices != NULL) { - strideData->textureCoordsPtr[textureUnitIndex] = - &(texCoordPointer[offsetOrTexset][initialTexIndices[offsetOrTexset]*texStride]); - } else { - strideData->textureCoordsPtr[textureUnitIndex] = - &(texCoordPointer[offsetOrTexset][0]); - } - strideData->textureCoordsStride[textureUnitIndex] = texStride; - strideData->texCoordPosition[textureUnitIndex] - = offsetOrTexset; - *vertexFormat |= (TexFormatSizeTable[ts] << (textureUnitIndex*2 + 16)); - d3dCtx->texStride[textureUnitIndex] = ts; - setTexTransformStageFlag(d3dCtx, device, - textureUnitIndex, - ts, genMode); - texSetInVB++; -#ifdef TEXDEBUG - printf("[pass %d] Non Object Linear, texDefined, ts=%d, tus %d\n", textureUnitIndex, ts, tus); -#endif - } else { - // This texture status is disable, this - // should not happen in D3D since - // TextureBin always compact unused state - // - unless when DisplayList is build and - // automatic texture generation - // used. Since if DL use - // updateAttributes() not yet invoke to - // set genMode correctly. - if (debug && (d3dCtx->currDisplayListID <= 0)) { - printf("[Java3D] TextureBin not compact textureUnitState correctly, numActiveTex %d, disableUnit %d, current mapped Texture Unit %d\n", numActiveTexUnit, tus, textureUnitIndex); - } - setDefaultTextureCoordPointers(d3dCtx, strideData, - vertexFormat, ts, - genMode, - textureUnitIndex); - setTexTransformStageFlag(d3dCtx, device, - textureUnitIndex, - ts, genMode); - texSetInVB++; -#ifdef TEXDEBUG - printf("[pass %d] Non Object Linear, texDefined, ts=%d\n", textureUnitIndex, ts); -#endif - } - } else { - // Internal error, should not happen. - if (debug) { - printf("[Java3D] TextureCoordMapLength length %d, is smaller than texture unit %d, map texture unit %d\n", texCoordMapLength, tus, textureUnitIndex); - } - setDefaultTextureCoordPointers(d3dCtx, strideData, - vertexFormat, ts, - TEX_GEN_INVALID, - textureUnitIndex); - setTexTransformStageFlag(d3dCtx, device, - textureUnitIndex, ts, - genMode); - - texSetInVB++; -#ifdef TEXDEBUG - printf("[pass %d] Non Object Linear, texDefined, offset/texset = -1, ts=%d\n", textureUnitIndex, ts); -#endif - } - } else { - // May be in automatically texture coordinate - // generation mode. - // May have trouble if automatically texture - // coordinate not used. Note that we pass ts = 0 - // so that copyVertexToVB() will not inc. the - // stride for this unused tex stage. - - // It is also the case in buildGA() case when - // numActiveTexUnit is 1 by default even though - // texture is not used. - /* - if ((d3dCtx->currDisplayListID <= 0) && - (genMode == TEX_GEN_NONE)) { - // application error, use default TexCoord - setDefaultTextureCoordPointers(d3dCtx, strideData, - vertexFormat, - ts, - TEX_GEN_NONE, - textureUnitIndex); - texSetInVB++; - } - */ - - setDefaultTextureCoordPointers(d3dCtx, strideData, - vertexFormat, - 0, - // This must be < 0 - TEX_GEN_AUTO, - textureUnitIndex); - setTexTransformStageFlag(d3dCtx, device, textureUnitIndex, - d3dCtx->texCoordFormat[textureUnitIndex], genMode); - - -#ifdef TEXDEBUG - printf("[pass %d] Non Object Linear, No texDefined, ts=0\n", textureUnitIndex); -#endif - } - } else { - // Automatic Texture generation Object Linear is used - setDefaultTextureCoordPointers(d3dCtx, strideData, - vertexFormat, - d3dCtx->texCoordFormat[textureUnitIndex], - genMode, - textureUnitIndex); - setTexTransformStageFlag(d3dCtx, device, textureUnitIndex, - d3dCtx->texCoordFormat[textureUnitIndex], genMode); - texSetInVB++; -#ifdef TEXDEBUG - printf("[pass %d] Object Linear, No texDefined, ts=%d\n", textureUnitIndex, d3dCtx->texCoordFormat[textureUnitIndex]); -#endif - } - } - d3dCtx->texSetUsed = numActiveTexUnit; -#ifdef TEXDEBUG - printf("No of texSetInVB %d, numActiveTexUnit %d\n", - texSetInVB, numActiveTexUnit); -#endif - - - if (texCoordSetMapOffset != NULL) { - env->ReleasePrimitiveArrayCritical(texUnitOffset, - texCoordSetMapOffset, NULL); - } - - if (texCoordSetMap != NULL) { - env->ReleasePrimitiveArrayCritical(tcoordsetmap, - texCoordSetMap, NULL); - } - - if (initialTexIndices != NULL) { - env->ReleasePrimitiveArrayCritical(texindices, - initialTexIndices, NULL); - } - - // texSetInVB <= d3dCtx->TexSetUsed - *vertexFormat |= getVertexFormat(texSetInVB); -} - - - -void executeGeometryArrayVA( - JNIEnv *env, - jobject obj, - jlong ctx, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean modAlpha, - float alpha, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jfloat* fverts, - jdouble* dverts, - jint initialColorIndex, - jfloat* fclrs, - jbyte* bclrs, - jint initialNormalIndex, - jfloat* norms, - int texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jintArray texindices, - jint texStride, - jfloat** texCoordPointer, - jdoubleArray xform, - jdoubleArray nxform, - jint cDirty) -{ - D3DDRAWPRIMITIVESTRIDEDDATA strideData; - DWORD vertexFormat = 0; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - GetDevice(); - - ZeroMemory(&strideData, sizeof(D3DDRAWPRIMITIVESTRIDEDDATA)); - - strideData.modulateAlpha = modAlpha; - strideData.alpha = alpha; - - - // setup coordinate pointers - if (floatCoordDefined || doubleCoordDefined) { - vertexFormat |= D3DFVF_XYZ; - - if (floatCoordDefined) { - strideData.fpositionPtr = &fverts[initialCoordIndex*3]; - } else if (doubleCoordDefined) { - strideData.dpositionPtr = &dverts[initialCoordIndex*3]; - } - - strideData.positionStride = 3; - - } else { - // nothing worth doing if no coordinates define - return; - } - - // setup normal pointers - if (normalsDefined) { - vertexFormat |= D3DFVF_NORMAL; - strideData.normalPtr = &norms[initialNormalIndex*3]; - strideData.normalStride = 3; - } - - - // setup color pointers - if (!(floatColorsDefined || byteColorsDefined) - || ignoreVertexColors) { - // Use Material color - // Assume VertexBuffer will recreate when ignoreVertexColors - // property changed. Otherwise we need to remove - // the following one line - vertexFormat &= ~D3DFVF_DIFFUSE; - } else { - if ((vformat & GA_WITH_ALPHA) != 0) { - strideData.diffuseStride = 4; - strideData.useAlpha = true; - } else { - strideData.diffuseStride = 3; - strideData.useAlpha = false; - } - if (floatColorsDefined) { - strideData.fdiffusePtr = &fclrs[initialColorIndex*strideData.diffuseStride]; - } else { - strideData.bdiffusePtr = &bclrs[initialColorIndex*strideData.diffuseStride]; - } - - vertexFormat |= D3DFVF_DIFFUSE; - } - - int ts = 2; // In case of automatic texture generation - - if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - ts = 3; - } else if ((vformat & GA_TEXTURE_COORDINATE_4) != 0) { - ts = 4; - } - - - // setup texture pointer - setTextureCoordPointers(env, d3dCtx, device, - &strideData, - 0, texStride, ts, - textureDefined, - tcoordsetmap, - texCoordMapLength, - NULL, - numActiveTexUnit, - &vertexFormat, - NULL, texCoordPointer, - texindices); - - - - jdouble* xform_ptr = NULL; - jdouble* nxform_ptr = NULL; - - if (xform != NULL) { - xform_ptr = (jdouble *) env->GetPrimitiveArrayCritical(xform, NULL); - - } - - if (nxform != NULL) { - nxform_ptr = (jdouble *) env->GetPrimitiveArrayCritical(nxform, NULL); - } - - // Construct/update VertexBuffer, render() if not in display list mode - renderGeometry(env, d3dCtx, device, geo, geo_type, &strideData, - vertexFormat, vcount, xform_ptr, nxform_ptr, cDirty); - - if (xform_ptr != NULL) { - env->ReleasePrimitiveArrayCritical(xform, xform_ptr, 0); - } - if (nxform_ptr != NULL) { - env->ReleasePrimitiveArrayCritical(nxform, nxform_ptr, 0); - } - -} - - - - -/* execute geometry array with java array format */ -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeVABuffer( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jobject vcoords, - jint initialColorIndex, - jobject cdataBuffer, - jfloatArray cfdata, - jbyteArray cbdata, - jint initialNormalIndex, - jobject ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jintArray vertexAttrIndices, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jint cdirty) -{ - - jfloat *fverts = NULL; - jdouble *dverts = NULL ; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jfloat* texCoordPointer[D3DDP_MAXTEXCOORD]; - jarray texobjs[D3DDP_MAXTEXCOORD]; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)env->GetObjectArrayElement(texCoords, i); - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts = (jfloat *)env->GetDirectBufferAddress( vcoords ); - } else if (doubleCoordDefined) { - dverts = (jdouble *)env->GetDirectBufferAddress( vcoords ); - } - - if(fverts == NULL && dverts == NULL) - return; - - /* get color array */ - if (floatColorsDefined) { - if(cfdata != NULL) { - fclrs = (jfloat *) env->GetPrimitiveArrayCritical( cfdata, NULL); - } else { - fclrs = (jfloat *) env->GetDirectBufferAddress (cdataBuffer); - - } - } - else if (byteColorsDefined) { - if(cbdata != NULL) { - bclrs = (jbyte *) env->GetPrimitiveArrayCritical( cbdata, NULL); - } else { - bclrs = (jbyte *) env->GetDirectBufferAddress(cdataBuffer); - } - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *)env->GetDirectBufferAddress(ndata); - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)env->GetDirectBufferAddress(texobjs[i]); - else - texCoordPointer[i] = NULL; - - } - } - - executeGeometryArrayVA(env, obj, ctxInfo, geo, geo_type, - isNonUniformScale, false, 0, ignoreVertexColors, - vcount, vformat, vdefined, initialCoordIndex, - fverts, dverts, initialColorIndex, - fclrs, bclrs, initialNormalIndex, - norms, - texCoordMapLength, - tcoordsetmap,numActiveTexUnit, - texindices,texStride,texCoordPointer, NULL, - NULL, cdirty); - - if(floatColorsDefined && cfdata != NULL) - env->ReleasePrimitiveArrayCritical( cfdata, fclrs, 0); - else if(byteColorsDefined && cbdata != NULL) - env->ReleasePrimitiveArrayCritical(cbdata, bclrs, 0); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeVA( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jfloatArray vfcoords, - jdoubleArray vdcoords, - jint initialColorIndex, - jfloatArray cfdata, - jbyteArray cbdata, - jint initialNormalIndex, - jfloatArray ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jintArray vertexAttrIndices, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jint cdirty) - { - - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jfloat *fclrs = NULL; - jbyte *bclrs = NULL; - jfloat *norms = NULL; - jfloat* texCoordPointer[D3DDP_MAXTEXCOORD]; - jarray texobjs[D3DDP_MAXTEXCOORD]; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)env->GetObjectArrayElement( texCoords, i); - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts= (jfloat *) env->GetPrimitiveArrayCritical( vfcoords, NULL); - } else if (doubleCoordDefined) { - dverts= (jdouble *) env->GetPrimitiveArrayCritical( vdcoords, NULL); - } - - if ((fverts == NULL) && (dverts == NULL)) { - return; - } - - /* get color array */ - if (floatColorsDefined) { - fclrs = (jfloat *) env->GetPrimitiveArrayCritical( cfdata, NULL); - } else if (byteColorsDefined) { - bclrs = (jbyte *)env->GetPrimitiveArrayCritical( cbdata, NULL); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *) env->GetPrimitiveArrayCritical(ndata, NULL); - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) { - texCoordPointer[i] = (jfloat*)env->GetPrimitiveArrayCritical(texobjs[i], NULL); - } else { - texCoordPointer[i] = NULL; - } - - } - } - executeGeometryArrayVA(env, obj, ctxInfo, geo, geo_type, - isNonUniformScale, false, 0, - ignoreVertexColors, - vcount, vformat, vdefined, initialCoordIndex, - fverts, dverts, initialColorIndex, - fclrs, bclrs, initialNormalIndex, - norms, texCoordMapLength, - tcoordsetmap,numActiveTexUnit, - texindices,texStride,texCoordPointer, - NULL, NULL, cdirty); - - if (floatCoordDefined) { - env->ReleasePrimitiveArrayCritical( vfcoords, fverts, 0); - } - else if (doubleCoordDefined) { - env->ReleasePrimitiveArrayCritical( vdcoords, dverts, 0); - } - - if (floatColorsDefined) { - env->ReleasePrimitiveArrayCritical( cfdata, fclrs, 0); - } - else if (byteColorsDefined) { - env->ReleasePrimitiveArrayCritical( cbdata, bclrs, 0); - } - - if (normalsDefined) { - env->ReleasePrimitiveArrayCritical( ndata, norms, 0); - } - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texCoordPointer[i] != NULL) { - env->ReleasePrimitiveArrayCritical(texobjs[i], texCoordPointer[i], 0); - } - } - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_disableGlobalAlpha( - JNIEnv *env, - jobject obj, - jlong ctx, - jobject geo, - jint vformat, - jboolean useAlpha, - jboolean ignoreVertexColors) -{ - // not used in D3D -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_setVertexFormat( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jobject geo, - jint vformat, - jboolean useAlpha, - jboolean ignoreVertexColors) -{ - // not used in D3D -} - - -void executeGeometryArray(JNIEnv *env, - jobject obj, jlong ctx, - jobject geo, jint geo_type, - jboolean isNonUniformScale, - jboolean modAlpha, // buildGA, should alpha be mode - jfloat alpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordMapLength, - jintArray texUnitOffset, - jint numActiveTexUnit, - jfloat* verts, jfloatArray carray, - jdoubleArray xform, jdoubleArray nxform, - jint cDirty, - jboolean useAlpha) // Should alpha be sent down -{ - D3DDRAWPRIMITIVESTRIDEDDATA strideData; - DWORD vertexFormat = 0; - jint stride, coordoff, normoff, coloroff, texoff; - int texStride, ts = 0; - - GetDevice(); - - ZeroMemory(&strideData, sizeof(D3DDRAWPRIMITIVESTRIDEDDATA)); - - strideData.modulateAlpha = modAlpha; - strideData.alpha = alpha; - - /* This matches the code in GeometryArrayRetained.java */ - stride = coordoff = normoff = coloroff = texoff = 0; - - if ((vformat & GA_COORDINATES) != 0) { - stride += 3; - vertexFormat |= D3DFVF_XYZ; - } else { - // nothing worth doing if no coordinates define - return; - } - - if ((vformat & GA_NORMALS) != 0) { - stride += 3; - coordoff += 3; - vertexFormat |= D3DFVF_NORMAL; - } - - if ((vformat & GA_COLOR) != 0) { - if ((vformat & GA_WITH_ALPHA) != 0 ) { - stride += 4; - normoff += 4; - coordoff += 4; - } else { // Handle the case of executeInterleaved 3f - stride += 3; - normoff += 3; - coordoff += 3; - } - vertexFormat |= D3DFVF_DIFFUSE; - } - - // In case of automatic texture generation - ts = 2; - - if (vformat & GA_TEXTURE_COORDINATE) { - if ((vformat & GA_TEXTURE_COORDINATE_2) != 0) { - texStride = texCoordSetCount << 1; - } else if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - ts = 3; - texStride = texCoordSetCount*3; - } else { // GA_TEXTURE_COORDINATE_4 - ts = 4; - texStride = texCoordSetCount << 2; - } - stride += texStride; - normoff += texStride; - coloroff += texStride; - coordoff += texStride; - } - - jfloat *cverts = NULL; - - texoff = startVIndex*stride; - coordoff += texoff; - normoff += texoff; - - if (carray != NULL) { - // separate color array is used - coloroff = startVIndex*4; - } else { - coloroff += texoff; - } - - // setup coordinates pointer - strideData.fpositionPtr = &verts[coordoff]; - strideData.positionStride = stride; - - // setup color pointer - if (((vformat & GA_COLOR) == 0) || ignoreVertexColors) { - // Use Material color - // Assume VertexBuffer will recreate when ignoreVertexColors - // property changed. Otherwise we need to remove - // the following one line - vertexFormat &= ~D3DFVF_DIFFUSE; - } else { - if (carray == NULL) { - strideData.fdiffusePtr = &verts[coloroff]; - strideData.diffuseStride = stride; - strideData.useAlpha = (vformat & GA_WITH_ALPHA); - } else { - cverts = (jfloat*) env->GetPrimitiveArrayCritical(carray, NULL); - strideData.fdiffusePtr = &cverts[coloroff]; - strideData.diffuseStride = 4; - strideData.useAlpha = true; - } - } - - - // setup normal pointer - if ((vformat & GA_NORMALS) != 0) { - strideData.normalPtr = &verts[normoff]; - strideData.normalStride = stride; - } - - // setup texture pointer - setTextureCoordPointers(env, d3dCtx, device, - &strideData, - texoff, stride, ts, - (vformat & GA_TEXTURE_COORDINATE), - NULL, - texCoordMapLength, - texUnitOffset, - numActiveTexUnit, - &vertexFormat, - verts, NULL, NULL); - - - jdouble* xform_ptr = NULL; - jdouble* nxform_ptr = NULL; - - if (xform != NULL) { - xform_ptr = (jdouble *) env->GetPrimitiveArrayCritical(xform, NULL); - - } - - if (nxform != NULL) { - nxform_ptr = (jdouble *) env->GetPrimitiveArrayCritical(nxform, NULL); - } - - renderGeometry(env, d3dCtx, device, geo, geo_type, &strideData, - vertexFormat, vcount, xform_ptr, nxform_ptr, cDirty); - - if (xform_ptr != NULL) { - env->ReleasePrimitiveArrayCritical(xform, xform_ptr, 0); - } - if (nxform_ptr != NULL) { - env->ReleasePrimitiveArrayCritical(nxform, nxform_ptr, 0); - } - - - /* env->ReleasePrimitiveArrayCritical(varray, verts, NULL); */ - - if (cverts != NULL) { - env->ReleasePrimitiveArrayCritical(carray, cverts, NULL); - } -} - - -/* - * Class: javax_media_j3d_NativePipeline - * Method: buildGA - * Signature: (JLjavax/media/j3d/GeometryArrayRetained;IZZFZIIII[II[II[I[D[D[F)V - */ -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_buildGA(JNIEnv *env, - jobject obj, jlong ctx, jobject geo, - jint geo_type, - jboolean isNonUniformScale, jboolean updateAlpha, float alpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordMapLength, - jintArray texUnitOffset, - jint vertexAttrCount, jintArray vertexAttrSizes, - jdoubleArray xform, jdoubleArray nxform, - jfloatArray varray) -{ - - jfloat *verts = NULL; - - if (varray != NULL) { - verts = (jfloat *) env->GetPrimitiveArrayCritical(varray, NULL); - } - - if (verts == NULL) { - return; - } - - if (((vformat & GA_COLOR) != 0) && - ((vformat & GA_BY_REFERENCE) == 0)) { - // alpha component is added for buildGA - vformat |= GA_WITH_ALPHA; - } - - - executeGeometryArray(env, - obj, ctx, geo, geo_type, isNonUniformScale, - updateAlpha, - alpha, - ignoreVertexColors, - startVIndex, - vcount, - vformat, - texCoordSetCount, - texCoordSetMapArray, - texCoordMapLength, - texUnitOffset, - texCoordMapLength, - verts, NULL, - xform, nxform, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED, - false); - - env->ReleasePrimitiveArrayCritical( varray, verts, 0); -} - - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_execute(JNIEnv *env, - jobject obj, jlong ctx,jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordMapLength, jintArray texUnitOffset, - jint numActiveTexUnit, - jint vertexAttrCount, jintArray vertexAttrSizes, - jfloatArray varray, jfloatArray carray, jint cDirty) -{ - jfloat *verts = NULL; - - if (varray != NULL) { - verts = (jfloat *) env->GetPrimitiveArrayCritical( varray, NULL); - } - - if (verts == NULL) { - return; - } - - executeGeometryArray(env, obj, ctx, geo, geo_type, - isNonUniformScale, - false, - 0, ignoreVertexColors, startVIndex, - vcount, vformat, texCoordSetCount, - texCoordSetMapArray, - texCoordMapLength, texUnitOffset, - numActiveTexUnit, - verts, carray, NULL, NULL, cDirty,useAlpha); - - env->ReleasePrimitiveArrayCritical( varray, verts, 0); - -} - - -/* interleaved data with nio buffer as data format */ -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeInterleavedBuffer(JNIEnv *env, - jobject obj, jlong ctx, jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint startVIndex, - jint vcount, jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMapArray, jint texCoordMapLength, - jintArray texUnitOffset, - jint numActiveTexUnit, - jobject varray, jfloatArray carray, jint cDirty) { - - jfloat *verts = NULL; - - /* get the direct buffer address */ - if (varray != NULL) { - verts = (jfloat *) env->GetDirectBufferAddress(varray); - } - - if (verts == NULL) { - return; - } - - /* call executeGeometryArray */ - executeGeometryArray(env, obj, ctx, geo, geo_type, - isNonUniformScale, - false, - 0, ignoreVertexColors, startVIndex, - vcount, vformat, texCoordSetCount, - texCoordSetMapArray, - texCoordMapLength, texUnitOffset, - numActiveTexUnit, - verts, carray, NULL, NULL, cDirty,useAlpha); - -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_freeD3DArray( - JNIEnv *env, - jobject obj, - jobject geo, - jboolean deleteVB) -{ - - lockGeometry(); - - jclass geoClass = (jclass) env->GetObjectClass(geo); - // Free VertexBuffer associate with this GeometryArray - jfieldID fieldID = env->GetFieldID(geoClass, "pVertexBuffers", "J"); - - D3dVertexBufferVector *vbVector = - reinterpret_cast<D3dVertexBufferVector*> (env->GetLongField(geo, fieldID)); - - - if (vbVector != NULL) { - // clearLive() invoke this in Renderer thread - for (ITER_LPD3DVERTEXBUFFER s = vbVector->begin(); - s != vbVector->end(); ++s) { - // This notify vb that parent vector is already free - // so there is no need to remove itself from vbVector - (*s)->vbVector = NULL; - (*s)->ctx->freeVB(*s); - } - env->SetLongField(geo, fieldID, 0); - vbVector->clear(); - delete vbVector; - } - - unlockGeometry(); -} - - - -void executeIndexedGeometryArray(JNIEnv *env, - jobject obj, jlong ctx, - jobject geo, jint geo_type, - jboolean isNonUniformScale, - jboolean modAlpha, // buildGA, should alpha be mode - jfloat alpha, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordMapLength, - jintArray texUnitOffset, - jint numActiveTexUnit, - jfloat* verts, jfloatArray carray, - jdoubleArray xform, jdoubleArray nxform, - jint cDirty, - jboolean useAlpha, - jint initialIndexIndex, - jint indexCount, - jintArray indexCoord) // Should alpha be sent down -{ - D3DDRAWPRIMITIVESTRIDEDDATA strideData; - DWORD vertexFormat = 0; - jint stride, coordoff, normoff, coloroff, texoff; - int texStride, ts = 0; - - GetDevice(); - - ZeroMemory(&strideData, sizeof(D3DDRAWPRIMITIVESTRIDEDDATA)); - - strideData.modulateAlpha = modAlpha; - strideData.alpha = alpha; - - /* This matches the code in GeometryArrayRetained.java */ - stride = coordoff = normoff = coloroff = texoff = 0; - - if ((vformat & GA_COORDINATES) != 0) { - stride += 3; - vertexFormat |= D3DFVF_XYZ; - } else { - // nothing worth doing if no coordinates define - return; - } - - if ((vformat & GA_NORMALS) != 0) { - stride += 3; - coordoff += 3; - vertexFormat |= D3DFVF_NORMAL; - } - - if ((vformat & GA_COLOR) != 0) { - if ((vformat & GA_WITH_ALPHA) != 0 ) { - stride += 4; - normoff += 4; - coordoff += 4; - } else { // Handle the case of executeInterleaved 3f - stride += 3; - normoff += 3; - coordoff += 3; - } - vertexFormat |= D3DFVF_DIFFUSE; - } - - // In case of automatic texture generation - ts = 2; - - if (vformat & GA_TEXTURE_COORDINATE) { - if ((vformat & GA_TEXTURE_COORDINATE_2) != 0) { - texStride = texCoordSetCount << 1; - } else if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - ts = 3; - texStride = texCoordSetCount*3; - } else { // GA_TEXTURE_COORDINATE_4 - ts = 4; - texStride = texCoordSetCount << 2; - } - stride += texStride; - normoff += texStride; - coloroff += texStride; - coordoff += texStride; - } - - jfloat *cverts = NULL; - - if (carray != NULL) { - // separate color array is used - coloroff = 0; - } else { - coloroff += texoff; - } - - // setup coordinates pointer - strideData.fpositionPtr = &verts[coordoff]; - strideData.positionStride = stride; - - // setup color pointer - if (((vformat & GA_COLOR) == 0) || ignoreVertexColors) { - // Use Material color - // Assume VertexBuffer will recreate when ignoreVertexColors - // property changed. Otherwise we need to remove - // the following one line - vertexFormat &= ~D3DFVF_DIFFUSE; - } else { - if (carray == NULL) { - strideData.fdiffusePtr = &verts[coloroff]; - strideData.diffuseStride = stride; - strideData.useAlpha = (vformat & GA_WITH_ALPHA); - } else { - cverts = (jfloat*) env->GetPrimitiveArrayCritical(carray, NULL); - strideData.fdiffusePtr = &cverts[coloroff]; - strideData.diffuseStride = 4; - strideData.useAlpha = true; - } - } - - - // setup normal pointer - if ((vformat & GA_NORMALS) != 0) { - strideData.normalPtr = &verts[normoff]; - strideData.normalStride = stride; - } - - - // setup texture pointer - setTextureCoordPointers(env, d3dCtx, device, - &strideData, - texoff, stride, ts, - (vformat & GA_TEXTURE_COORDINATE), - NULL, - texCoordMapLength, - texUnitOffset, - numActiveTexUnit, - &vertexFormat, - verts, NULL, NULL); - - // setup index pointer - strideData.indexPtr = (jint *) env->GetPrimitiveArrayCritical(indexCoord, NULL); - strideData.initialIndexIndex = initialIndexIndex; - - - jdouble* xform_ptr = NULL; - jdouble* nxform_ptr = NULL; - - if (xform != NULL) { - xform_ptr = (jdouble *) env->GetPrimitiveArrayCritical(xform, NULL); - - } - - if (nxform != NULL) { - nxform_ptr = (jdouble *) env->GetPrimitiveArrayCritical(nxform, NULL); - } - - renderIndexGeometry(env, d3dCtx, device, geo, geo_type, &strideData, - vertexFormat, vcount, indexCount, - xform_ptr, nxform_ptr, cDirty); - - - - if (xform_ptr != NULL) { - env->ReleasePrimitiveArrayCritical(xform, xform_ptr, 0); - } - if (nxform_ptr != NULL) { - env->ReleasePrimitiveArrayCritical(nxform, nxform_ptr, 0); - } - - if (cverts != NULL) { - env->ReleasePrimitiveArrayCritical(carray, cverts, NULL); - } - - env->ReleasePrimitiveArrayCritical(indexCoord, - strideData.indexPtr, NULL); - -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeIndexedGeometry( - JNIEnv *env, - jobject obj, jlong ctx, - jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vcount, - jint vformat, - jint vertexAttrCount, jintArray vertexAttrSizes, - jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordMapLength, jintArray texUnitOffset, - jint numActiveTexUnit, - jfloatArray varray, jfloatArray carray, jint cDirty, - jintArray indexCoord) -{ - jfloat *verts = NULL; - - if (varray != NULL) { - verts = (jfloat *) env->GetPrimitiveArrayCritical( varray, NULL); - } - - if (verts == NULL) { - return; - } - - executeIndexedGeometryArray(env, obj, ctx, geo, geo_type, - isNonUniformScale, - false, 0, - ignoreVertexColors, - vcount, - vformat, texCoordSetCount, - texCoordSetMapArray, - texCoordMapLength, - texUnitOffset, - numActiveTexUnit, - verts, - carray, - NULL, NULL, - cDirty, - useAlpha, - initialIndexIndex, - indexCount, - indexCoord); - - env->ReleasePrimitiveArrayCritical( varray, verts, 0); -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeIndexedGeometryBuffer( - JNIEnv *env, - jobject obj, jlong ctx, - jobject geo, jint geo_type, - jboolean isNonUniformScale, jboolean useAlpha, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vcount, - jint vformat, jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordMapLength, jintArray texUnitOffset, - jint numActiveTexUnit, - jobject varray, jfloatArray carray, - jint cDirty, - jintArray indexCoord) -{ - jfloat *verts = NULL; - - /* get the direct buffer address */ - if (varray != NULL) { - verts = (jfloat *) env->GetDirectBufferAddress(varray ); - } - - if (verts == NULL) - return; - - executeIndexedGeometryArray(env, obj, ctx, geo, geo_type, - isNonUniformScale, - false, 0, - ignoreVertexColors, - vcount, - vformat, texCoordSetCount, - texCoordSetMapArray, - texCoordMapLength, - texUnitOffset, - numActiveTexUnit, - verts, - carray, - NULL, NULL, - cDirty, - useAlpha, - initialIndexIndex, - indexCount, - indexCoord); -} - - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_buildIndexedGeometry( - JNIEnv *env, - jobject obj, jlong ctx, jobject geo, - jint geo_type, - jboolean isNonUniformScale, jboolean updateAlpha, float alpha, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vertexCount, - jint vformat, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jint texCoordSetCount, - jintArray texCoordSetMapArray, - jint texCoordMapLength, - jintArray texUnitOffset, - jdoubleArray xform, jdoubleArray nxform, - jfloatArray varray, jintArray indexCoord) -{ - - jfloat *verts = NULL; - - if (varray != NULL) { - verts = (jfloat *) env->GetPrimitiveArrayCritical( varray, NULL); - } - - if (verts == NULL) { - return; - } - - if ((vformat & GA_COLOR) != 0) { - // alpha component is added for buildGA - vformat |= GA_WITH_ALPHA; - } - - executeIndexedGeometryArray(env, obj, ctx, geo, geo_type, - isNonUniformScale, - updateAlpha, alpha, - ignoreVertexColors, - vertexCount, - vformat, - texCoordSetCount, - texCoordSetMapArray, - texCoordMapLength, - texUnitOffset, - texCoordMapLength, - verts, - NULL, - xform, nxform, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED| - javax_media_j3d_GeometryArrayRetained_INDEX_CHANGED, - false, - initialIndexIndex, - indexCount, - indexCoord); - - env->ReleasePrimitiveArrayCritical( varray, verts, 0); - -} - - - -void executeIndexedGeometryArrayVA( - JNIEnv *env, - jobject obj, - jlong ctx, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vertexCount, - jint vformat, - jint vdefined, - jfloat* fverts, - jdouble* dverts, - jfloat* fclrs, - jbyte* bclrs, - jfloat* norms, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jint texStride, - jfloat** texCoordPointer, - jint cDirty, - jintArray indexCoord) -{ - D3DDRAWPRIMITIVESTRIDEDDATA strideData; - DWORD vertexFormat = 0; - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - GetDevice(); - - ZeroMemory(&strideData, sizeof(D3DDRAWPRIMITIVESTRIDEDDATA)); - - // setup coordinate pointers - if (floatCoordDefined || doubleCoordDefined) { - vertexFormat |= D3DFVF_XYZ; - - if (floatCoordDefined ) { - strideData.fpositionPtr = &fverts[0]; - } else if (doubleCoordDefined) { - strideData.dpositionPtr = &dverts[0]; - } - strideData.positionStride = 3; - - } else { - // nothing worth doing if no coordinates define - return; - } - - // setup normal pointers - if (normalsDefined) { - vertexFormat |= D3DFVF_NORMAL; - strideData.normalPtr = &norms[0]; - strideData.normalStride = 3; - } - - // setup color pointers - if (!(floatColorsDefined || byteColorsDefined) - || ignoreVertexColors) { - // Use Material color - // Assume VertexBuffer will recreate when ignoreVertexColors - // property changed. Otherwise we need to remove - // the following one line - vertexFormat &= ~D3DFVF_DIFFUSE; - } else { - if ((vformat & GA_WITH_ALPHA) != 0) { - strideData.diffuseStride = 4; - strideData.useAlpha = true; - } else { - strideData.diffuseStride = 3; - strideData.useAlpha = false; - } - if (floatColorsDefined) { - strideData.fdiffusePtr = &fclrs[0]; - } else { - strideData.bdiffusePtr = &bclrs[0]; - } - - vertexFormat |= D3DFVF_DIFFUSE; - } - - - int ts = 2; // In case of automatic texture generation - - if ((vformat & GA_TEXTURE_COORDINATE_3) != 0) { - ts = 3; - } else if ((vformat & GA_TEXTURE_COORDINATE_4) != 0) { - ts = 4; - } - - // setup texture pointer - setTextureCoordPointers(env, d3dCtx, device, - &strideData, - 0, - texStride, ts, - textureDefined, - tcoordsetmap, - texCoordMapLength, - NULL, - numActiveTexUnit, - &vertexFormat, - NULL, texCoordPointer, - NULL); - - // setup index pointer - strideData.indexPtr = (jint *) env->GetPrimitiveArrayCritical(indexCoord, NULL); - strideData.initialIndexIndex = initialIndexIndex; - - // Construct/update VertexBuffer, render() if not in display list mode - renderIndexGeometry(env, d3dCtx, device, geo, geo_type, &strideData, - vertexFormat, vertexCount, indexCount, - NULL, NULL, cDirty); - - env->ReleasePrimitiveArrayCritical(indexCoord, - strideData.indexPtr, NULL); - - -} -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeIndexedGeometryVA( - JNIEnv *env, - jobject obj, - jlong ctx, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vertexCount, - jint vformat, - jint vdefined, - jfloatArray vfcoords, - jdoubleArray vdcoords, - jfloatArray cfdata, - jbyteArray cbdata, - jfloatArray ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jint texStride, - jobjectArray texCoords, - jint cDirty, - jintArray indexCoord) -{ - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jfloat *fclrs = NULL; - jbyte *bclrs = NULL; - jfloat *norms = NULL; - jfloat* texCoordPointer[D3DDP_MAXTEXCOORD]; - jarray texobjs[D3DDP_MAXTEXCOORD]; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)env->GetObjectArrayElement( texCoords, i); - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts= (jfloat *) env->GetPrimitiveArrayCritical( vfcoords, NULL); - } else if (doubleCoordDefined) { - dverts= (jdouble *) env->GetPrimitiveArrayCritical( vdcoords, NULL); - } - - if ((fverts == NULL) && (dverts == NULL)) { - return; - } - - /* get color array */ - if (floatColorsDefined) { - fclrs = (jfloat *) env->GetPrimitiveArrayCritical( cfdata, NULL); - } else if (byteColorsDefined) { - bclrs = (jbyte *)env->GetPrimitiveArrayCritical( cbdata, NULL); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *) env->GetPrimitiveArrayCritical(ndata, NULL); - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) { - texCoordPointer[i] = - (jfloat*)env->GetPrimitiveArrayCritical(texobjs[i], NULL); - } else { - texCoordPointer[i] = NULL; - } - - } - } - - - executeIndexedGeometryArrayVA(env, - obj, - ctx, - geo, - geo_type, - isNonUniformScale, - ignoreVertexColors, - initialIndexIndex, - indexCount, - vertexCount, - vformat, - vdefined, - fverts, - dverts, - fclrs, - bclrs, - norms, - texCoordMapLength, - tcoordsetmap, - numActiveTexUnit, - texStride, - texCoordPointer, - cDirty, - indexCoord); - - // Free memory - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texCoordPointer[i] != NULL) { - env->ReleasePrimitiveArrayCritical(texobjs[i], texCoordPointer[i], NULL); - } - } - } - - if (floatColorsDefined) { - env->ReleasePrimitiveArrayCritical(cfdata, fclrs, 0); - } else if (byteColorsDefined) { - env->ReleasePrimitiveArrayCritical(cbdata, bclrs, 0); - } - - if (normalsDefined) { - env->ReleasePrimitiveArrayCritical(ndata, norms, 0); - } - - if (floatCoordDefined) { - env->ReleasePrimitiveArrayCritical(vfcoords, fverts, 0); - } else if (doubleCoordDefined) { - env->ReleasePrimitiveArrayCritical(vdcoords, dverts, 0); - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_executeIndexedGeometryVABuffer( - JNIEnv *env, - jobject obj, - jlong ctx, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean ignoreVertexColors, - jint initialIndexIndex, - jint indexCount, - jint vertexCount, - jint vformat, - jint vdefined, - jobject vcoords, - jobject cdataBuffer, - jfloatArray cfdata, - jbyteArray cbdata, - jobject ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jint numActiveTexUnit, - jint texStride, - jobjectArray texCoords, - jint cDirty, - jintArray indexCoord) -{ - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jfloat *fclrs = NULL; - jbyte *bclrs = NULL; - jfloat *norms = NULL; - jfloat* texCoordPointer[D3DDP_MAXTEXCOORD]; - jarray texobjs[D3DDP_MAXTEXCOORD]; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)env->GetObjectArrayElement( texCoords, i); - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts = (jfloat *)env->GetDirectBufferAddress( vcoords ); - } else if (doubleCoordDefined) { - dverts = (jdouble *)env->GetDirectBufferAddress( vcoords ); - } - - if ((fverts == NULL) && (dverts == NULL)) { - return; - } - - /* get color array */ - if (floatColorsDefined) { - if(cfdata != NULL) { - fclrs = (jfloat *) env->GetPrimitiveArrayCritical( cfdata, NULL); - } else { - fclrs = (jfloat *) env->GetDirectBufferAddress (cdataBuffer); - } - } else if (byteColorsDefined) { - if (cbdata != NULL) { - bclrs = (jbyte *) env->GetPrimitiveArrayCritical( cbdata, NULL); - } else { - bclrs = (jbyte *) env->GetDirectBufferAddress(cdataBuffer); - } - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *)env->GetDirectBufferAddress(ndata); - } - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)env->GetDirectBufferAddress(texobjs[i]); - else - texCoordPointer[i] = NULL; - - } - } - - - executeIndexedGeometryArrayVA( - env, - obj, - ctx, - geo, - geo_type, - isNonUniformScale, - ignoreVertexColors, - initialIndexIndex, - indexCount, - vertexCount, - vformat, - vdefined, - fverts, - dverts, - fclrs, - bclrs, - norms, - texCoordMapLength, - tcoordsetmap, - numActiveTexUnit, - texStride, - texCoordPointer, - cDirty, - indexCoord); - - if (floatColorsDefined && cfdata != NULL) { - env->ReleasePrimitiveArrayCritical( cfdata, fclrs, 0); - } else if (byteColorsDefined && cbdata != NULL) { - env->ReleasePrimitiveArrayCritical(cbdata, bclrs, 0); - } -} - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_buildGAForBuffer( - JNIEnv *env, - jobject obj, - jlong ctx, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean updateAlpha, - jfloat alpha, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jobject vcoords, - jint initialColorIndex, - jobject cdataBuffer, - jint initialNormalIndex, - jobject ndata, - jint texCoordMapLength, - jintArray tcoordsetmap, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jdoubleArray xform, - jdoubleArray nxform) -{ - jfloat *fverts = NULL; - jdouble *dverts = NULL ; - jbyte *bclrs = NULL; - jfloat *fclrs = NULL, *norms = NULL; - jfloat* texCoordPointer[D3DDP_MAXTEXCOORD]; - jarray texobjs[D3DDP_MAXTEXCOORD]; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)env->GetObjectArrayElement(texCoords, i); - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts = (jfloat *)env->GetDirectBufferAddress( vcoords ); - } else if (doubleCoordDefined) { - dverts = (jdouble *)env->GetDirectBufferAddress( vcoords ); - } - - if ((fverts == NULL) && (dverts == NULL)) { - return; - } - - /* get color array */ - if (floatColorsDefined) { - fclrs = (jfloat *) env->GetDirectBufferAddress(cdataBuffer); - } else if (byteColorsDefined) { - bclrs = (jbyte *) env->GetDirectBufferAddress(cdataBuffer); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *)env->GetDirectBufferAddress(ndata); - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) - texCoordPointer[i] = (jfloat*)env->GetDirectBufferAddress(texobjs[i]); - else - texCoordPointer[i] = NULL; - - } - } - - executeGeometryArrayVA(env, obj, ctx, geo, geo_type, - isNonUniformScale, updateAlpha, alpha, - ignoreVertexColors, - vcount, vformat, vdefined, initialCoordIndex, - fverts, dverts, initialColorIndex, - fclrs, bclrs, initialNormalIndex, - norms, texCoordMapLength, - tcoordsetmap,texCoordMapLength, - texindices,texStride,texCoordPointer, - xform, nxform, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED); -} - -/* execute geometry array with java array format */ -/* - * Class: javax_media_j3d_NativePipeline - * Method: buildGAForByRef - * Signature: (JLjavax/media/j3d/GeometryArrayRetained;IZZFZIIII[F[DI[F[BI[FI[I[I[[FI[I[II[Ljava/lang/Object;[D[D)V - */ - -extern "C" JNIEXPORT -void JNICALL Java_javax_media_j3d_NativePipeline_buildGAForByRef( - JNIEnv *env, - jobject obj, - jlong ctx, - jobject geo, - jint geo_type, - jboolean isNonUniformScale, - jboolean updateAlpha, - jfloat alpha, - jboolean ignoreVertexColors, - jint vcount, - jint vformat, - jint vdefined, - jint initialCoordIndex, - jfloatArray vfcoords, - jdoubleArray vdcoords, - jint initialColorIndex, - jfloatArray cfdata, - jbyteArray cbdata, - jint initialNormalIndex, - jfloatArray ndata, - jint vertexAttrCount, - jintArray vertexAttrSizes, - jintArray vertexAttrIndices, - jobjectArray vertexAttrData, - jint texCoordMapLength, - jintArray tcoordsetmap, - jintArray texindices, - jint texStride, - jobjectArray texCoords, - jdoubleArray xform, - jdoubleArray nxform) -{ - jfloat *fverts = NULL; - jdouble *dverts = NULL; - jfloat *fclrs = NULL; - jbyte *bclrs = NULL; - jfloat *norms = NULL; - jfloat* texCoordPointer[D3DDP_MAXTEXCOORD]; - jarray texobjs[D3DDP_MAXTEXCOORD]; - int i; - - jboolean floatCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_FLOAT) != 0); - jboolean doubleCoordDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COORD_DOUBLE) != 0); - jboolean floatColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_FLOAT) != 0); - jboolean byteColorsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_COLOR_BYTE) != 0); - jboolean normalsDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_NORMAL_FLOAT) != 0); - jboolean textureDefined = ((vdefined & javax_media_j3d_GeometryArrayRetained_TEXCOORD_FLOAT) != 0); - - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - texobjs[i] = (jarray)env->GetObjectArrayElement( texCoords, i); - } - } - - /* get coordinate array */ - if (floatCoordDefined) { - fverts= (jfloat *) env->GetPrimitiveArrayCritical( vfcoords, NULL); - } else if (doubleCoordDefined) { - dverts= (jdouble *) env->GetPrimitiveArrayCritical( vdcoords, NULL); - } - - if ((fverts == NULL) && (dverts == NULL)) { - return; - } - - /* get color array */ - if (floatColorsDefined) { - fclrs = (jfloat *) env->GetPrimitiveArrayCritical( cfdata, NULL); - } else if (byteColorsDefined) { - bclrs = (jbyte *)env->GetPrimitiveArrayCritical( cbdata, NULL); - } - - /* get normal array */ - if (normalsDefined) { - norms = (jfloat *) env->GetPrimitiveArrayCritical(ndata, NULL); - } - - /* get texture arrays */ - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texobjs[i] != NULL) { - texCoordPointer[i] = (jfloat*)env->GetPrimitiveArrayCritical(texobjs[i], NULL); - } else { - texCoordPointer[i] = NULL; - } - - } - } - - - executeGeometryArrayVA(env, obj, ctx, geo, geo_type, - isNonUniformScale, updateAlpha, alpha, - ignoreVertexColors, - vcount, vformat, vdefined, initialCoordIndex, - fverts, dverts, initialColorIndex, - fclrs, bclrs, initialNormalIndex, - norms, texCoordMapLength, - tcoordsetmap,texCoordMapLength, - texindices,texStride,texCoordPointer, - xform, nxform, - javax_media_j3d_GeometryArrayRetained_VERTEX_CHANGED); - - if (floatCoordDefined) { - env->ReleasePrimitiveArrayCritical( vfcoords, fverts, 0); - } - else if (doubleCoordDefined) { - env->ReleasePrimitiveArrayCritical( vdcoords, dverts, 0); - } - - if (floatColorsDefined) { - env->ReleasePrimitiveArrayCritical( cfdata, fclrs, 0); - } - else if (byteColorsDefined) { - env->ReleasePrimitiveArrayCritical( cbdata, bclrs, 0); - } - - if (normalsDefined) { - env->ReleasePrimitiveArrayCritical( ndata, norms, 0); - } - - if (textureDefined) { - for (i = 0; i < texCoordMapLength; i++) { - if (texCoordPointer[i] != NULL) { - env->ReleasePrimitiveArrayCritical(texobjs[i], texCoordPointer[i], 0); - } - } - } -} |