mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
fix DrawPrim bugs
This commit is contained in:
parent
a45b96ac3f
commit
091f352fa5
@ -64,6 +64,32 @@
|
|||||||
#include "dxGraphicsStateGuardian8.h"
|
#include "dxGraphicsStateGuardian8.h"
|
||||||
#include "d3dx8.h"
|
#include "d3dx8.h"
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
// defns for print formatting in debugger
|
||||||
|
typedef struct {
|
||||||
|
float x,y,z;
|
||||||
|
float nx,ny,nz;
|
||||||
|
D3DCOLOR diffuse;
|
||||||
|
float u,v;
|
||||||
|
} POS_NORM_COLOR_TEX_VERTEX;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float x,y,z;
|
||||||
|
D3DCOLOR diffuse;
|
||||||
|
float u,v;
|
||||||
|
} POS_COLOR_TEX_VERTEX;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float x,y,z;
|
||||||
|
float u,v;
|
||||||
|
} POS_TEX_VERTEX;
|
||||||
|
|
||||||
|
// define junk vars so symbols are included in dbginfo
|
||||||
|
POS_TEX_VERTEX junk11;
|
||||||
|
POS_COLOR_TEX_VERTEX junk22;
|
||||||
|
POS_NORM_COLOR_TEX_VERTEX junk33;
|
||||||
|
#endif
|
||||||
|
|
||||||
// disable nameless struct 'warning'
|
// disable nameless struct 'warning'
|
||||||
#pragma warning (disable : 4201)
|
#pragma warning (disable : 4201)
|
||||||
|
|
||||||
@ -2191,17 +2217,6 @@ draw_line(GeomLine* geom, GeomContext *gc) {
|
|||||||
_perPrim = 0x0;
|
_perPrim = 0x0;
|
||||||
_perComp = 0x0;
|
_perComp = 0x0;
|
||||||
|
|
||||||
switch(geom->get_binding(G_NORMAL)) {
|
|
||||||
case G_PER_VERTEX:
|
|
||||||
_perVertex |= PER_NORMAL;
|
|
||||||
break;
|
|
||||||
case G_PER_COMPONENT:
|
|
||||||
_perComp |= PER_NORMAL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
_perPrim |= PER_NORMAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(geom->get_binding(G_COLOR)) {
|
switch(geom->get_binding(G_COLOR)) {
|
||||||
case G_PER_VERTEX:
|
case G_PER_VERTEX:
|
||||||
_perVertex |= PER_COLOR;
|
_perVertex |= PER_COLOR;
|
||||||
@ -2213,6 +2228,17 @@ draw_line(GeomLine* geom, GeomContext *gc) {
|
|||||||
_perPrim |= PER_COLOR;
|
_perPrim |= PER_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch(geom->get_binding(G_NORMAL)) {
|
||||||
|
case G_PER_VERTEX:
|
||||||
|
_perVertex |= PER_NORMAL;
|
||||||
|
break;
|
||||||
|
case G_PER_COMPONENT:
|
||||||
|
_perComp |= PER_NORMAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_perPrim |= PER_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
size_t vertex_size = draw_prim_setup(geom);
|
size_t vertex_size = draw_prim_setup(geom);
|
||||||
|
|
||||||
BYTE *_tmp_fvfOverrunBuf = NULL;
|
BYTE *_tmp_fvfOverrunBuf = NULL;
|
||||||
@ -2240,10 +2266,10 @@ draw_line(GeomLine* geom, GeomContext *gc) {
|
|||||||
if(!_bDrawPrimDoSetupVertexBuffer) {
|
if(!_bDrawPrimDoSetupVertexBuffer) {
|
||||||
if (_tmp_fvfOverrunBuf == NULL) {
|
if (_tmp_fvfOverrunBuf == NULL) {
|
||||||
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
||||||
hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, nVerts, _pFvfBufBasePtr, vertex_size);
|
hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, nPrims, _pFvfBufBasePtr, vertex_size);
|
||||||
} else {
|
} else {
|
||||||
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_tmp_fvfOverrunBuf));
|
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_tmp_fvfOverrunBuf));
|
||||||
hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, nVerts, _tmp_fvfOverrunBuf, vertex_size);
|
hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, nPrims, _tmp_fvfOverrunBuf, vertex_size);
|
||||||
delete [] _tmp_fvfOverrunBuf;
|
delete [] _tmp_fvfOverrunBuf;
|
||||||
}
|
}
|
||||||
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,0);
|
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,0);
|
||||||
@ -2298,17 +2324,6 @@ draw_linestrip_base(Geom* geom, GeomContext *gc, bool bConnectEnds) {
|
|||||||
_perPrim = 0x0;
|
_perPrim = 0x0;
|
||||||
_perComp = 0x0;
|
_perComp = 0x0;
|
||||||
|
|
||||||
switch(geom->get_binding(G_NORMAL)) {
|
|
||||||
case G_PER_VERTEX:
|
|
||||||
_perVertex |= PER_NORMAL;
|
|
||||||
break;
|
|
||||||
case G_PER_COMPONENT:
|
|
||||||
_perComp |= PER_NORMAL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
_perPrim |= PER_NORMAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(geom->get_binding(G_COLOR)) {
|
switch(geom->get_binding(G_COLOR)) {
|
||||||
case G_PER_VERTEX:
|
case G_PER_VERTEX:
|
||||||
_perVertex |= PER_COLOR;
|
_perVertex |= PER_COLOR;
|
||||||
@ -2320,6 +2335,17 @@ draw_linestrip_base(Geom* geom, GeomContext *gc, bool bConnectEnds) {
|
|||||||
_perPrim |= PER_COLOR;
|
_perPrim |= PER_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch(geom->get_binding(G_NORMAL)) {
|
||||||
|
case G_PER_VERTEX:
|
||||||
|
_perVertex |= PER_NORMAL;
|
||||||
|
break;
|
||||||
|
case G_PER_COMPONENT:
|
||||||
|
_perComp |= PER_NORMAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_perPrim |= PER_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
size_t vertex_size = draw_prim_setup(geom);
|
size_t vertex_size = draw_prim_setup(geom);
|
||||||
ushort perFlags = _perVertex | _perComp;
|
ushort perFlags = _perVertex | _perComp;
|
||||||
|
|
||||||
@ -2361,7 +2387,7 @@ draw_linestrip_base(Geom* geom, GeomContext *gc, bool bConnectEnds) {
|
|||||||
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
||||||
|
|
||||||
if(!_bDrawPrimDoSetupVertexBuffer) {
|
if(!_bDrawPrimDoSetupVertexBuffer) {
|
||||||
HRESULT hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, nVerts, _pFvfBufBasePtr, vertex_size);
|
HRESULT hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, nVerts-1, _pFvfBufBasePtr, vertex_size);
|
||||||
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,0);
|
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,0);
|
||||||
} else {
|
} else {
|
||||||
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_LINESTRIP,nVerts);
|
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_LINESTRIP,nVerts);
|
||||||
@ -2757,14 +2783,16 @@ draw_sprite(GeomSprite *geom, GeomContext *gc) {
|
|||||||
CurVertCount+=4;
|
CurVertCount+=4;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD nVerts= nPrims << 2; // 4*nPrims
|
DWORD nVerts= nPrims << 2; // 4*nPrims verts in vert array
|
||||||
|
DWORD numTris = nPrims << 1; // 2*nPrims
|
||||||
|
|
||||||
// cant do tristrip/fan since multiple quads arent connected
|
// cant do tristrip/fan since multiple quads arent connected
|
||||||
// best we can do is indexed primitive, which sends 2 redundant indices instead of sending 2 redundant full verts
|
// best we can do is indexed primitive, which sends 2 redundant indices instead of sending 2 redundant full verts
|
||||||
HRESULT hr = scrn.pD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, // start index in array
|
HRESULT hr = scrn.pD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, // start index in array
|
||||||
nVerts, nPrims, _index_buf, D3DFMT_INDEX16,
|
nVerts, numTris,
|
||||||
|
_index_buf, D3DFMT_INDEX16,
|
||||||
_pFvfBufBasePtr, vertex_size);
|
_pFvfBufBasePtr, vertex_size);
|
||||||
TestDrawPrimFailure(DrawIndexedPrim,hr,scrn.pD3DDevice,QUADVERTLISTLEN*nPrims,nPrims);
|
TestDrawPrimFailure(DrawIndexedPrim,hr,scrn.pD3DDevice,QUADVERTLISTLEN*nPrims,numTris);
|
||||||
|
|
||||||
_pCurFvfBufPtr = NULL;
|
_pCurFvfBufPtr = NULL;
|
||||||
delete [] SpriteArray;
|
delete [] SpriteArray;
|
||||||
@ -2875,6 +2903,12 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
|
|
||||||
bool bPerPrimNormal;
|
bool bPerPrimNormal;
|
||||||
|
|
||||||
|
bool bPerPrimColor=(ColorBinding == G_PER_PRIM);
|
||||||
|
if(bPerPrimColor)
|
||||||
|
_perPrim = PER_COLOR;
|
||||||
|
else if(ColorBinding == G_PER_VERTEX)
|
||||||
|
_perVertex = PER_COLOR;
|
||||||
|
|
||||||
if(bUseTexCoordOnlyLoop) {
|
if(bUseTexCoordOnlyLoop) {
|
||||||
_perVertex |= PER_TEXCOORD; // TexCoords are either G_OFF or G_PER_VERTEX
|
_perVertex |= PER_TEXCOORD; // TexCoords are either G_OFF or G_PER_VERTEX
|
||||||
} else {
|
} else {
|
||||||
@ -2889,12 +2923,6 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
_perVertex |= PER_TEXCOORD;
|
_perVertex |= PER_TEXCOORD;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bPerPrimColor=(ColorBinding == G_PER_PRIM);
|
|
||||||
if(bPerPrimColor)
|
|
||||||
_perPrim |= PER_COLOR;
|
|
||||||
else if(ColorBinding == G_PER_VERTEX)
|
|
||||||
_perVertex |= PER_COLOR;
|
|
||||||
|
|
||||||
size_t vertex_size = draw_prim_setup(geom);
|
size_t vertex_size = draw_prim_setup(geom);
|
||||||
|
|
||||||
nassertv(_pCurFvfBufPtr == NULL); // make sure the storage pointer is clean.
|
nassertv(_pCurFvfBufPtr == NULL); // make sure the storage pointer is clean.
|
||||||
@ -2923,7 +2951,7 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
nassertv((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
||||||
|
|
||||||
if(!_bDrawPrimDoSetupVertexBuffer) {
|
if(!_bDrawPrimDoSetupVertexBuffer) {
|
||||||
hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, nVerts, _pFvfBufBasePtr, vertex_size);
|
hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, nPrims, _pFvfBufBasePtr, vertex_size);
|
||||||
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,nPrims);
|
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,nPrims);
|
||||||
} else {
|
} else {
|
||||||
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_TRIANGLELIST,nVerts);
|
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_TRIANGLELIST,nVerts);
|
||||||
@ -2947,8 +2975,8 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
|
|
||||||
DWORD FVFType = D3DFVF_XYZ | (D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0)) ;
|
DWORD FVFType = D3DFVF_XYZ | (D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0)) ;
|
||||||
set_vertex_format(FVFType);
|
set_vertex_format(FVFType);
|
||||||
HRESULT hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, vert_buf, nPrims*3, 5*sizeof(float));
|
HRESULT hr = scrn.pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, vert_buf, 1, 5*sizeof(float));
|
||||||
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nPrims*3,nPrims);
|
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,3,1);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3036,9 +3064,21 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
|
|
||||||
if(bUseTexCoordOnlyLoop) {
|
if(bUseTexCoordOnlyLoop) {
|
||||||
if(bPerPrimColor) {
|
if(bPerPrimColor) {
|
||||||
_perPrim |= PER_COLOR;
|
_perPrim = PER_COLOR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
switch (ColorBinding) {
|
||||||
|
case G_PER_PRIM:
|
||||||
|
_perPrim = PER_COLOR;
|
||||||
|
break;
|
||||||
|
case G_PER_COMPONENT:
|
||||||
|
_perComp = PER_COLOR;
|
||||||
|
break;
|
||||||
|
case G_PER_VERTEX:
|
||||||
|
_perVertex = PER_COLOR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (NormalBinding) {
|
switch (NormalBinding) {
|
||||||
case G_PER_VERTEX:
|
case G_PER_VERTEX:
|
||||||
_perVertex |= PER_NORMAL;
|
_perVertex |= PER_NORMAL;
|
||||||
@ -3055,18 +3095,6 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
|
|
||||||
if (TexCoordBinding == G_PER_VERTEX)
|
if (TexCoordBinding == G_PER_VERTEX)
|
||||||
_perVertex |= PER_TEXCOORD;
|
_perVertex |= PER_TEXCOORD;
|
||||||
|
|
||||||
switch (ColorBinding) {
|
|
||||||
case G_PER_PRIM:
|
|
||||||
_perPrim |= PER_COLOR;
|
|
||||||
break;
|
|
||||||
case G_PER_COMPONENT:
|
|
||||||
_perComp |= PER_COLOR;
|
|
||||||
break;
|
|
||||||
case G_PER_VERTEX:
|
|
||||||
_perVertex |= PER_COLOR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t vertex_size = draw_prim_setup(geom);
|
size_t vertex_size = draw_prim_setup(geom);
|
||||||
@ -3131,10 +3159,11 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
assert((nVerts*vertex_size) == (_pCurFvfBufPtr-_pFvfBufBasePtr));
|
||||||
|
DWORD numTris=nVerts-2;
|
||||||
|
|
||||||
if(!_bDrawPrimDoSetupVertexBuffer) {
|
if(!_bDrawPrimDoSetupVertexBuffer) {
|
||||||
hr = scrn.pD3DDevice->DrawPrimitiveUP(trilisttype, nVerts, _pFvfBufBasePtr, vertex_size);
|
hr = scrn.pD3DDevice->DrawPrimitiveUP(trilisttype, numTris, _pFvfBufBasePtr, vertex_size);
|
||||||
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,nVerts-2);
|
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,numTris);
|
||||||
} else {
|
} else {
|
||||||
COPYVERTDATA_2_VERTEXBUFFER(trilisttype,nVerts);
|
COPYVERTDATA_2_VERTEXBUFFER(trilisttype,nVerts);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user