diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 0a2ec8e4476..c115f2e81e0 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -403,137 +403,6 @@ void primitiveConvertToStridedData(IWineD3DDevice *iface, WineDirect3DVertexStri } } -#if 0 /* TODO: Software Shaders */ -/* Draw a single vertex using this information */ -static void draw_vertex(IWineD3DDevice *iface, /* interface */ - BOOL isXYZ, float x, float y, float z, float rhw, /* xyzn position*/ - BOOL isNormal, float nx, float ny, float nz, /* normal */ - BOOL isDiffuse, float *dRGBA, /* 1st colors */ - BOOL isSpecular, float *sRGB, /* 2ndry colors */ - BOOL isPtSize, float ptSize, /* pointSize */ - WINED3DVECTOR_4 *texcoords, int *numcoords) /* texture info */ -{ - unsigned int textureNo; - float s, t, r, q; - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - /* Diffuse -------------------------------- */ - if (isDiffuse) { - glColor4fv(dRGBA); - VTRACE(("glColor4f: r,g,b,a=%f,%f,%f,%f\n", dRGBA[0], dRGBA[1], dRGBA[2], dRGBA[3])); - } - - /* Specular Colour ------------------------------------------*/ - if (isSpecular) { - if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { - GL_EXTCALL(glSecondaryColor3fvEXT(sRGB)); - VTRACE(("glSecondaryColor4f: r,g,b=%f,%f,%f\n", sRGB[0], sRGB[1], sRGB[2])); - } else { - VTRACE(("Specular color extensions not supplied\n")); - } - } - - /* Normal -------------------------------- */ - if (isNormal) { - VTRACE(("glNormal:nx,ny,nz=%f,%f,%f\n", nx,ny,nz)); - glNormal3f(nx, ny, nz); - } - - /* Point Size ----------------------------------------------*/ - if (isPtSize) { - - /* no such functionality in the fixed function GL pipeline */ - FIXME("Cannot change ptSize here in openGl\n"); - } - - /* Texture coords --------------------------- */ - for (textureNo = 0; textureNo < GL_LIMITS(textures); ++textureNo) { - - if (!GL_SUPPORT(ARB_MULTITEXTURE) && textureNo > 0) { - FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n"); - continue ; - } - - /* Query tex coords */ - if (This->stateBlock->textures[textureNo] != NULL) { - - int coordIdx = This->stateBlock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX]; - if (coordIdx >= MAX_TEXTURES) { - VTRACE(("tex: %d - Skip tex coords, as being system generated\n", textureNo)); - continue; - } else if (numcoords[coordIdx] == 0) { - TRACE("tex: %d - Skipping tex coords, as no data supplied or no coords supplied\n", textureNo); - continue; - } else { - - /* Initialize vars */ - s = 0.0f; - t = 0.0f; - r = 0.0f; - q = 0.0f; - - switch (numcoords[coordIdx]) { - case 4: q = texcoords[coordIdx].w; /* drop through */ - case 3: r = texcoords[coordIdx].z; /* drop through */ - case 2: t = texcoords[coordIdx].y; /* drop through */ - case 1: s = texcoords[coordIdx].x; - } - - switch (numcoords[coordIdx]) { /* Supply the provided texture coords */ - case WINED3DTTFF_COUNT1: - VTRACE(("tex:%d, s=%f\n", textureNo, s)); - if (GL_SUPPORT(ARB_MULTITEXTURE)) { - GLMULTITEXCOORD1F(textureNo, s); - } else { - glTexCoord1f(s); - } - break; - case WINED3DTTFF_COUNT2: - VTRACE(("tex:%d, s=%f, t=%f\n", textureNo, s, t)); - if (GL_SUPPORT(ARB_MULTITEXTURE)) { - GLMULTITEXCOORD2F(textureNo, s, t); - } else { - glTexCoord2f(s, t); - } - break; - case WINED3DTTFF_COUNT3: - VTRACE(("tex:%d, s=%f, t=%f, r=%f\n", textureNo, s, t, r)); - if (GL_SUPPORT(ARB_MULTITEXTURE)) { - GLMULTITEXCOORD3F(textureNo, s, t, r); - } else { - glTexCoord3f(s, t, r); - } - break; - case WINED3DTTFF_COUNT4: - VTRACE(("tex:%d, s=%f, t=%f, r=%f, q=%f\n", textureNo, s, t, r, q)); - if (GL_SUPPORT(ARB_MULTITEXTURE)) { - GLMULTITEXCOORD4F(textureNo, s, t, r, q); - } else { - glTexCoord4f(s, t, r, q); - } - break; - default: - FIXME("Should not get here as numCoords should be 0->4 (%x)!\n", numcoords[coordIdx]); - } - } - } - } /* End of textures */ - - /* Position -------------------------------- */ - if (isXYZ) { - if (1.0f == rhw || rhw < 0.00001f) { - VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f\n", x,y,z)); - glVertex3f(x, y, z); - } else { - /* Cannot optimize by dividing through by rhw as rhw is required - later for perspective in the GL pipeline for vertex shaders */ - VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f / rhw=%f\n", x,y,z,rhw)); - glVertex4f(x,y,z,rhw); - } - } -} -#endif /* TODO: Software shaders */ - static void drawStridedFast(IWineD3DDevice *iface,UINT numberOfVertices, GLenum glPrimitiveType, const void *idxData, short idxSize, ULONG minIndex, ULONG startIdx, ULONG startVertex) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; @@ -542,10 +411,6 @@ static void drawStridedFast(IWineD3DDevice *iface,UINT numberOfVertices, GLenum TRACE("(%p) : glElements(%x, %d, %d, ...)\n", This, glPrimitiveType, numberOfVertices, minIndex); idxData = idxData == (void *)-1 ? NULL : idxData; #if 1 -#if 0 - glIndexPointer(idxSize == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idxSize, startIdx); - glEnableClientState(GL_INDEX_ARRAY); -#endif glDrawElements(glPrimitiveType, numberOfVertices, idxSize == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (const char *)idxData+(idxSize * startIdx)); #else /* using drawRangeElements may be faster */ @@ -886,149 +751,6 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData checkGLcall("glEnd and previous calls"); } -#if 0 /* TODO: Software/Hardware vertex blending support */ -/* - * Draw with emulated vertex shaders - * Note: strided data is uninitialized, as we need to pass the vertex - * shader directly as ordering irs yet - */ -void drawStridedSoftwareVS(IWineD3DDevice *iface, WineDirect3DVertexStridedData *sd, - int PrimitiveType, ULONG NumPrimitives, - const void *idxData, short idxSize, ULONG minIndex, ULONG startIdx) { - - unsigned int textureNo = 0; - GLenum glPrimType = GL_POINTS; - int NumVertexes = NumPrimitives; - const short *pIdxBufS = NULL; - const long *pIdxBufL = NULL; - LONG SkipnStrides = 0; - LONG vx_index; - float x = 0.0f, y = 0.0f, z = 0.0f; /* x,y,z coordinates */ - float rhw = 0.0f; /* rhw */ - float ptSize = 0.0f; /* Point size */ - D3DVECTOR_4 texcoords[8]; /* Texture Coords */ - int numcoords[8]; /* Number of coords */ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - IDirect3DVertexShaderImpl* vertexShader = NULL; - - TRACE("Using slow software vertex shader code\n"); - - /* Variable Initialization */ - if (idxData != NULL) { - if (idxSize == 2) pIdxBufS = (const short *) idxData; - else pIdxBufL = (const long *) idxData; - } - - /* Ok, Work out which primitive is requested and how many vertexes that will be */ - NumVertexes = primitiveToGl(PrimitiveType, NumPrimitives, &glPrimType); - - /* Retrieve the VS information */ - vertexShader = (IWineD3DVertexShaderImp *)This->stateBlock->VertexShader; - - /* Start drawing in GL */ - VTRACE(("glBegin(%x)\n", glPrimType)); - glBegin(glPrimType); - - /* For each primitive */ - for (vx_index = 0; vx_index < NumVertexes; ++vx_index) { - - /* For indexed data, we need to go a few more strides in */ - if (idxData != NULL) { - - /* Indexed so work out the number of strides to skip */ - if (idxSize == 2) { - VTRACE(("Idx for vertex %d = %d\n", vx_index, pIdxBufS[startIdx+vx_index])); - SkipnStrides = pIdxBufS[startIdx+vx_index]; - } else { - VTRACE(("Idx for vertex %d = %d\n", vx_index, pIdxBufL[startIdx+vx_index])); - SkipnStrides = pIdxBufL[startIdx+vx_index]; - } - } - - /* Fill the vertex shader input */ - IDirect3DDeviceImpl_FillVertexShaderInputSW(This, vertexShader, SkipnStrides); - - /* Initialize the output fields to the same defaults as it would normally have */ - memset(&vertexShader->output, 0, sizeof(VSHADEROUTPUTDATA8)); - vertexShader->output.oD[0].x = 1.0; - vertexShader->output.oD[0].y = 1.0; - vertexShader->output.oD[0].z = 1.0; - vertexShader->output.oD[0].w = 1.0; - - /* Now execute the vertex shader */ - IDirect3DVertexShaderImpl_ExecuteSW(vertexShader, &vertexShader->input, &vertexShader->output); - - /* - TRACE_VECTOR(vertexShader->output.oPos); - TRACE_VECTOR(vertexShader->output.oD[0]); - TRACE_VECTOR(vertexShader->output.oD[1]); - TRACE_VECTOR(vertexShader->output.oT[0]); - TRACE_VECTOR(vertexShader->output.oT[1]); - TRACE_VECTOR(vertexShader->input.V[0]); - TRACE_VECTOR(vertexShader->data->C[0]); - TRACE_VECTOR(vertexShader->data->C[1]); - TRACE_VECTOR(vertexShader->data->C[2]); - TRACE_VECTOR(vertexShader->data->C[3]); - TRACE_VECTOR(vertexShader->data->C[4]); - TRACE_VECTOR(vertexShader->data->C[5]); - TRACE_VECTOR(vertexShader->data->C[6]); - TRACE_VECTOR(vertexShader->data->C[7]); - */ - - /* Extract out the output */ - /* FIXME: Fog coords? */ - x = vertexShader->output.oPos.x; - y = vertexShader->output.oPos.y; - z = vertexShader->output.oPos.z; - rhw = vertexShader->output.oPos.w; - ptSize = vertexShader->output.oPts.x; /* Fixme - Is this right? */ - - /** Update textures coords using vertexShader->output.oT[0->7] */ - memset(texcoords, 0x00, sizeof(texcoords)); - memset(numcoords, 0x00, sizeof(numcoords)); - for (textureNo = 0; textureNo < GL_LIMITS(textures); ++textureNo) { - if (This->stateBlock->textures[textureNo] != NULL) { - texcoords[textureNo].x = vertexShader->output.oT[textureNo].x; - texcoords[textureNo].y = vertexShader->output.oT[textureNo].y; - texcoords[textureNo].z = vertexShader->output.oT[textureNo].z; - texcoords[textureNo].w = vertexShader->output.oT[textureNo].w; - if (This->stateBlock->texture_state[textureNo][WINED3DTSS_TEXTURETRANSFORMFLAGS] != WINED3DTTFF_DISABLE) { - numcoords[textureNo] = This->stateBlock->texture_state[textureNo][WINED3DTSS_TEXTURETRANSFORMFLAGS] & ~WINED3DTTFF_PROJECTED; - } else { - switch (IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) This->stateBlock->textures[textureNo])) { - case WINED3DRTYPE_TEXTURE: numcoords[textureNo] = 2; break; - case WINED3DRTYPE_VOLUMETEXTURE: numcoords[textureNo] = 3; break; - default: numcoords[textureNo] = 4; - } - } - } else { - numcoords[textureNo] = 0; - } - } - - /* Draw using this information */ - draw_vertex(iface, - TRUE, x, y, z, rhw, - TRUE, 0.0f, 0.0f, 1.0f, - TRUE, (float*) &vertexShader->output.oD[0], - TRUE, (float*) &vertexShader->output.oD[1], - FALSE, ptSize, /* FIXME: Change back when supported */ - texcoords, numcoords); - - /* For non indexed mode, step onto next parts */ - if (idxData == NULL) { - ++SkipnStrides; - } - - } /* for each vertex */ - - glEnd(); - checkGLcall("glEnd and previous calls"); -} - -#endif - static void check_fbo_status(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;