wined3d: Improve drawStridedSlow a bit.
This commit is contained in:
parent
8137c094fd
commit
71f923a6d2
|
@ -615,9 +615,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
|
|||
const long *pIdxBufL = NULL;
|
||||
LONG vx_index;
|
||||
float x = 0.0f, y = 0.0f, z = 0.0f; /* x,y,z coordinates */
|
||||
float nx = 0.0f, ny = 0.0, nz = 0.0f; /* normal x,y,z coordinates */
|
||||
float rhw = 0.0f; /* rhw */
|
||||
float ptSize = 0.0f; /* Point size */
|
||||
DWORD diffuseColor = 0xFFFFFFFF; /* Diffuse Color */
|
||||
DWORD specularColor = 0; /* Specular Color */
|
||||
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
|
||||
|
@ -635,6 +633,19 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
|
|||
VTRACE(("glBegin(%x)\n", glPrimType));
|
||||
glBegin(glPrimType);
|
||||
|
||||
/* Default settings for data that is not passed */
|
||||
if (sd->u.s.normal.lpData == NULL) {
|
||||
glNormal3f(0, 0, 1);
|
||||
}
|
||||
if(sd->u.s.diffuse.lpData != NULL) {
|
||||
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
if(sd->u.s.specular.lpData != NULL) {
|
||||
if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
|
||||
GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* We shouldn't start this function if any VBO is involved. Should I put a safety check here?
|
||||
* Guess it's not necessary(we crash then anyway) and would only eat CPU time
|
||||
*/
|
||||
|
@ -645,6 +656,10 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
|
|||
/* Initialize diffuse color */
|
||||
diffuseColor = 0xFFFFFFFF;
|
||||
|
||||
/* Blending data and Point sizes are not supported by this function. They are not supported by the fixed
|
||||
* function pipeline at all. A Fixme for them is printed after decoding the vertex declaration
|
||||
*/
|
||||
|
||||
/* For indexed data, we need to go a few more strides in */
|
||||
if (idxData != NULL) {
|
||||
|
||||
|
@ -658,68 +673,6 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
|
|||
}
|
||||
}
|
||||
|
||||
/* Position Information ------------------ */
|
||||
if (sd->u.s.position.lpData != NULL) {
|
||||
|
||||
float *ptrToCoords = (float *)(sd->u.s.position.lpData + (SkipnStrides * sd->u.s.position.dwStride));
|
||||
x = ptrToCoords[0];
|
||||
y = ptrToCoords[1];
|
||||
z = ptrToCoords[2];
|
||||
rhw = 1.0;
|
||||
VTRACE(("x,y,z=%f,%f,%f\n", x,y,z));
|
||||
|
||||
/* RHW follows, only if transformed, ie 4 floats were provided */
|
||||
if (sd->u.s.position_transformed) {
|
||||
rhw = ptrToCoords[3];
|
||||
VTRACE(("rhw=%f\n", rhw));
|
||||
}
|
||||
}
|
||||
|
||||
/* Blending data -------------------------- */
|
||||
if (sd->u.s.blendWeights.lpData != NULL) {
|
||||
/* float *ptrToCoords = (float *)(sd->u.s.blendWeights.lpData + (SkipnStrides * sd->u.s.blendWeights.dwStride)); */
|
||||
FIXME("Blending not supported yet\n");
|
||||
|
||||
if (sd->u.s.blendMatrixIndices.lpData != NULL) {
|
||||
/*DWORD *ptrToCoords = (DWORD *)(sd->u.s.blendMatrixIndices.lpData + (SkipnStrides * sd->u.s.blendMatrixIndices.dwStride));*/
|
||||
}
|
||||
}
|
||||
|
||||
/* Vertex Normal Data (untransformed only)- */
|
||||
if (sd->u.s.normal.lpData != NULL) {
|
||||
|
||||
float *ptrToCoords = (float *)(sd->u.s.normal.lpData + (SkipnStrides * sd->u.s.normal.dwStride));
|
||||
nx = ptrToCoords[0];
|
||||
ny = ptrToCoords[1];
|
||||
nz = ptrToCoords[2];
|
||||
VTRACE(("nx,ny,nz=%f,%f,%f\n", nx, ny, nz));
|
||||
}
|
||||
|
||||
/* Point Size ----------------------------- */
|
||||
if (sd->u.s.pSize.lpData != NULL) {
|
||||
|
||||
float *ptrToCoords = (float *)(sd->u.s.pSize.lpData + (SkipnStrides * sd->u.s.pSize.dwStride));
|
||||
ptSize = ptrToCoords[0];
|
||||
VTRACE(("ptSize=%f\n", ptSize));
|
||||
FIXME("No support for ptSize yet\n");
|
||||
}
|
||||
|
||||
/* Diffuse -------------------------------- */
|
||||
if (sd->u.s.diffuse.lpData != NULL) {
|
||||
|
||||
DWORD *ptrToCoords = (DWORD *)(sd->u.s.diffuse.lpData + (SkipnStrides * sd->u.s.diffuse.dwStride));
|
||||
diffuseColor = ptrToCoords[0];
|
||||
VTRACE(("diffuseColor=%lx\n", diffuseColor));
|
||||
}
|
||||
|
||||
/* Specular -------------------------------- */
|
||||
if (sd->u.s.specular.lpData != NULL) {
|
||||
|
||||
DWORD *ptrToCoords = (DWORD *)(sd->u.s.specular.lpData + (SkipnStrides * sd->u.s.specular.dwStride));
|
||||
specularColor = ptrToCoords[0];
|
||||
VTRACE(("specularColor=%lx\n", specularColor));
|
||||
}
|
||||
|
||||
/* Texture coords --------------------------- */
|
||||
for (textureNo = 0, texture_idx = 0; textureNo < GL_LIMITS(texture_stages); ++textureNo) {
|
||||
|
||||
|
@ -835,7 +788,11 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
|
|||
|
||||
/* Diffuse -------------------------------- */
|
||||
if (sd->u.s.diffuse.lpData != NULL) {
|
||||
glColor4ub(D3DCOLOR_B_R(diffuseColor),
|
||||
DWORD *ptrToCoords = (DWORD *)(sd->u.s.diffuse.lpData + (SkipnStrides * sd->u.s.diffuse.dwStride));
|
||||
diffuseColor = ptrToCoords[0];
|
||||
VTRACE(("diffuseColor=%lx\n", diffuseColor));
|
||||
|
||||
glColor4ub(D3DCOLOR_B_R(diffuseColor),
|
||||
D3DCOLOR_B_G(diffuseColor),
|
||||
D3DCOLOR_B_B(diffuseColor),
|
||||
D3DCOLOR_B_A(diffuseColor));
|
||||
|
@ -844,12 +801,14 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
|
|||
D3DCOLOR_B_G(diffuseColor),
|
||||
D3DCOLOR_B_B(diffuseColor),
|
||||
D3DCOLOR_B_A(diffuseColor)));
|
||||
} else {
|
||||
if (vx_index == 0) glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
|
||||
/* Specular ------------------------------- */
|
||||
if (sd->u.s.specular.lpData != NULL) {
|
||||
DWORD *ptrToCoords = (DWORD *)(sd->u.s.specular.lpData + (SkipnStrides * sd->u.s.specular.dwStride));
|
||||
specularColor = ptrToCoords[0];
|
||||
VTRACE(("specularColor=%lx\n", specularColor));
|
||||
|
||||
/* special case where the fog density is stored in the diffuse alpha channel */
|
||||
if(This->stateBlock->renderState[WINED3DRS_FOGENABLE] &&
|
||||
(This->stateBlock->renderState[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE || sd->u.s.position.dwType == WINED3DDECLTYPE_FLOAT4 )&&
|
||||
|
@ -879,27 +838,31 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
|
|||
/* Do not worry if specular colour missing and disable request */
|
||||
VTRACE(("Specular color extensions not supplied\n"));
|
||||
}
|
||||
} else {
|
||||
if (vx_index == 0) {
|
||||
if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
|
||||
GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0);
|
||||
} else {
|
||||
/* Do not worry if specular colour missing and disable request */
|
||||
VTRACE(("Specular color extensions not supplied\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Normal -------------------------------- */
|
||||
if (sd->u.s.normal.lpData != NULL) {
|
||||
VTRACE(("glNormal:nx,ny,nz=%f,%f,%f\n", nx,ny,nz));
|
||||
glNormal3f(nx, ny, nz);
|
||||
} else {
|
||||
if (vx_index == 0) glNormal3f(0, 0, 1);
|
||||
float *ptrToCoords = (float *)(sd->u.s.normal.lpData + (SkipnStrides * sd->u.s.normal.dwStride));
|
||||
|
||||
VTRACE(("glNormal:nx,ny,nz=%f,%f,%f\n", ptrToCoords[0], ptrToCoords[1], ptrToCoords[2]));
|
||||
glNormal3f(ptrToCoords[0], ptrToCoords[1], ptrToCoords[2]);
|
||||
}
|
||||
|
||||
/* Position -------------------------------- */
|
||||
if (sd->u.s.position.lpData != NULL) {
|
||||
float *ptrToCoords = (float *)(sd->u.s.position.lpData + (SkipnStrides * sd->u.s.position.dwStride));
|
||||
x = ptrToCoords[0];
|
||||
y = ptrToCoords[1];
|
||||
z = ptrToCoords[2];
|
||||
rhw = 1.0;
|
||||
VTRACE(("x,y,z=%f,%f,%f\n", x,y,z));
|
||||
|
||||
/* RHW follows, only if transformed, ie 4 floats were provided */
|
||||
if (sd->u.s.position_transformed) {
|
||||
rhw = ptrToCoords[3];
|
||||
VTRACE(("rhw=%f\n", rhw));
|
||||
}
|
||||
|
||||
if (1.0f == rhw || ((rhw < eps) && (rhw > -eps))) {
|
||||
VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f\n", x,y,z));
|
||||
glVertex3f(x, y, z);
|
||||
|
|
Loading…
Reference in New Issue