Index: ddraw/glDirect3DDevice.cpp |
— | — | @@ -287,11 +287,16 @@ |
288 | 288 | ZeroMemory(viewports,32*sizeof(glDirect3DViewport3*));
|
289 | 289 | vertices = normals = NULL;
|
290 | 290 | diffuse = specular = NULL;
|
| 291 | + ebBuffer = NULL;
|
| 292 | + ebBufferSize = 0;
|
| 293 | + outbuffer = NULL;
|
| 294 | + outbuffersize = 0;
|
291 | 295 | ZeroMemory(texcoords,8*sizeof(GLfloat*));
|
292 | 296 | memcpy(renderstate,renderstate_default,153*sizeof(DWORD));
|
293 | 297 | __gluMakeIdentityf(matWorld);
|
294 | 298 | __gluMakeIdentityf(matView);
|
295 | 299 | __gluMakeIdentityf(matProjection);
|
| 300 | + transform_dirty = true;
|
296 | 301 | matrices = NULL;
|
297 | 302 | matrixcount = 0;
|
298 | 303 | texstages[0] = texstagedefault0;
|
— | — | @@ -1436,14 +1441,17 @@ |
1437 | 1442 | case D3DTRANSFORMSTATE_WORLD:
|
1438 | 1443 | memcpy(&matWorld,lpD3DMatrix,sizeof(D3DMATRIX));
|
1439 | 1444 | modelview_dirty = true;
|
| 1445 | + transform_dirty = true;
|
1440 | 1446 | return D3D_OK;
|
1441 | 1447 | case D3DTRANSFORMSTATE_VIEW:
|
1442 | 1448 | memcpy(&matView,lpD3DMatrix,sizeof(D3DMATRIX));
|
1443 | 1449 | modelview_dirty = true;
|
| 1450 | + transform_dirty = true;
|
1444 | 1451 | return D3D_OK;
|
1445 | 1452 | case D3DTRANSFORMSTATE_PROJECTION:
|
1446 | 1453 | memcpy(&matProjection,lpD3DMatrix,sizeof(D3DMATRIX));
|
1447 | 1454 | projection_dirty = true;
|
| 1455 | + transform_dirty = true;
|
1448 | 1456 | return D3D_OK;
|
1449 | 1457 | default:
|
1450 | 1458 | ERR(DDERR_INVALIDPARAMS);
|
— | — | @@ -1453,6 +1461,7 @@ |
1454 | 1462 | {
|
1455 | 1463 | if(!this) return DDERR_INVALIDOBJECT;
|
1456 | 1464 | memcpy(&viewport,lpViewport,sizeof(D3DVIEWPORT7));
|
| 1465 | + transform_dirty = true;
|
1457 | 1466 | return D3D_OK;
|
1458 | 1467 | }
|
1459 | 1468 | HRESULT WINAPI glDirect3DDevice7::ValidateDevice(LPDWORD lpdwPasses)
|
— | — | @@ -1882,7 +1891,11 @@ |
1883 | 1892 | HRESULT glDirect3DDevice7::GetMatrix(D3DMATRIXHANDLE lpD3DMatHandle, LPD3DMATRIX lpD3DMatrix)
|
1884 | 1893 | {
|
1885 | 1894 | if(!this) return DDERR_INVALIDOBJECT;
|
1886 | | - if(!lpD3DMatHandle) return DDERR_INVALIDPARAMS;
|
| 1895 | + if(!lpD3DMatHandle)
|
| 1896 | + {
|
| 1897 | + __gluMakeIdentityf((GLfloat*)lpD3DMatrix);
|
| 1898 | + return D3D_OK;
|
| 1899 | + }
|
1887 | 1900 | if(lpD3DMatHandle >= matrixcount) return DDERR_INVALIDPARAMS;
|
1888 | 1901 | if(!matrices[lpD3DMatHandle].active) return D3DERR_MATRIX_GETDATA_FAILED;
|
1889 | 1902 | memcpy(lpD3DMatrix,&matrices[lpD3DMatHandle].matrix,sizeof(D3DMATRIX));
|
— | — | @@ -1913,13 +1926,392 @@ |
1914 | 1927 | return D3D_OK;
|
1915 | 1928 | }
|
1916 | 1929 |
|
| 1930 | +BOOL ExpandBuffer(void **buffer, DWORD *size, DWORD increment)
|
| 1931 | +{
|
| 1932 | + void *ptr = realloc(*buffer,*size+increment);
|
| 1933 | + if(!ptr) return FALSE;
|
| 1934 | + *buffer = ptr;
|
| 1935 | + *size += increment;
|
| 1936 | + return TRUE;
|
| 1937 | +}
|
| 1938 | +
|
| 1939 | +INT AddTriangle(unsigned char **buffer, DWORD *buffersize, DWORD *offset, const D3DTRIANGLE *triangle)
|
| 1940 | +{
|
| 1941 | + if(*buffersize < (*offset + sizeof(D3DTRIANGLE)))
|
| 1942 | + {
|
| 1943 | + if(!ExpandBuffer((void**)buffer,buffersize,1024)) return -1;
|
| 1944 | + }
|
| 1945 | + // FIXME: Process triangle strips and fans.
|
| 1946 | + memcpy(*buffer+*offset,triangle,3*sizeof(WORD));
|
| 1947 | + *offset += 3*sizeof(WORD);
|
| 1948 | + return 0;
|
| 1949 | +}
|
| 1950 | +
|
| 1951 | +void glDirect3DDevice7::UpdateTransform()
|
| 1952 | +{
|
| 1953 | + GLfloat mat1[16];
|
| 1954 | + GLfloat mat2[16];
|
| 1955 | + GLfloat matViewport[16];
|
| 1956 | + __gluMultMatricesf(matWorld,matView,mat1);
|
| 1957 | + __gluMultMatricesf(mat1,matProjection,mat2);
|
| 1958 | + matViewport[1] = matViewport[2] = matViewport[3] = matViewport[4] = matViewport[6] = matViewport[7] =
|
| 1959 | + matViewport[8] = matViewport[9] = matViewport[11] = matViewport[15] = 0;
|
| 1960 | + matViewport[0] = (GLfloat)viewport.dwWidth / 2.0f;
|
| 1961 | + matViewport[5] = (GLfloat)viewport.dwHeight / 2.0f;
|
| 1962 | + matViewport[10] = (viewport.dvMaxZ - viewport.dvMinZ) / 2.0f;
|
| 1963 | + matViewport[12] = (GLfloat)viewport.dwX + ((GLfloat)viewport.dwWidth / 2.0f);
|
| 1964 | + matViewport[13] = (GLfloat)viewport.dwY + ((GLfloat)viewport.dwHeight / 2.0f);
|
| 1965 | + matViewport[14] = (viewport.dvMinZ + viewport.dvMaxZ) / 2.0f;
|
| 1966 | + __gluMultMatricesf(mat2,matViewport,matTransform);
|
| 1967 | + transform_dirty = false;
|
| 1968 | +}
|
| 1969 | +
|
| 1970 | +void CalculateExtents(D3DRECT *extents, D3DTLVERTEX *vertices, DWORD count)
|
| 1971 | +{
|
| 1972 | + if(!count) return;
|
| 1973 | + D3DVALUE minX,minY,maxX,maxY;
|
| 1974 | + minX = maxX = vertices[0].dvSX;
|
| 1975 | + minY = maxY = vertices[0].dvSY;
|
| 1976 | + for(int i = 0; i < count; i++)
|
| 1977 | + {
|
| 1978 | + if(vertices[i].dvSX < minX) minX = vertices[i].dvSX;
|
| 1979 | + if(vertices[i].dvSX > maxX) maxX = vertices[i].dvSX;
|
| 1980 | + if(vertices[i].dvSY < minY) minY = vertices[i].dvSY;
|
| 1981 | + if(vertices[i].dvSY > maxY) maxY = vertices[i].dvSY;
|
| 1982 | + }
|
| 1983 | + if((LONG)minX < extents->x1) extents->x1 = (LONG)minX;
|
| 1984 | + if((LONG)maxX > extents->x2) extents->x2 = (LONG)maxX;
|
| 1985 | + if((LONG)minY < extents->y1) extents->y1 = (LONG)minY;
|
| 1986 | + if((LONG)maxY > extents->y2) extents->y2 = (LONG)maxY;
|
| 1987 | +}
|
| 1988 | +
|
| 1989 | +INT glDirect3DDevice7::TransformAndLight(D3DTLVERTEX **output, DWORD *outsize, D3DVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents)
|
| 1990 | +{
|
| 1991 | + GLfloat in[4];
|
| 1992 | + in[3] = 1.0f;
|
| 1993 | + if(transform_dirty) UpdateTransform();
|
| 1994 | + if(*outsize < (dest+count)*sizeof(D3DTLVERTEX))
|
| 1995 | + {
|
| 1996 | + D3DTLVERTEX *tmpptr = (D3DTLVERTEX*)realloc(*output,(dest+count)*sizeof(D3DTLVERTEX));
|
| 1997 | + if(!tmpptr) return -1;
|
| 1998 | + *output = tmpptr;
|
| 1999 | + *outsize = (dest+count)*sizeof(D3DTLVERTEX);
|
| 2000 | + }
|
| 2001 | + for(int i = 0; i < count; i++)
|
| 2002 | + {
|
| 2003 | + in[0] = input[i+start].dvX;
|
| 2004 | + in[1] = input[i+start].dvY;
|
| 2005 | + in[2] = input[i+start].dvZ;
|
| 2006 | + __gluMultMatrixVecf(matTransform,in,&(*output)[i+dest].dvSX);
|
| 2007 | + (*output)[i+dest].dvRHW = 1.0f/(*output)[i+dest].dvRHW;
|
| 2008 | + // Do lighting
|
| 2009 | + (*output)[i+dest].dvTU = input[i+start].dvTU;
|
| 2010 | + (*output)[i+dest].dvTV = input[i+start].dvTV;
|
| 2011 | + }
|
| 2012 | + if(extents) CalculateExtents(extents,*output,count);
|
| 2013 | + return 0;
|
| 2014 | +}
|
| 2015 | +INT glDirect3DDevice7::TransformOnly(D3DTLVERTEX **output, DWORD *outsize, D3DVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents)
|
| 2016 | +{
|
| 2017 | + GLfloat in[4];
|
| 2018 | + in[3] = 1.0f;
|
| 2019 | + if(transform_dirty) UpdateTransform();
|
| 2020 | + if(*outsize < (dest+count)*sizeof(D3DTLVERTEX))
|
| 2021 | + {
|
| 2022 | + D3DTLVERTEX *tmpptr = (D3DTLVERTEX*)realloc(*output,(dest+count)*sizeof(D3DTLVERTEX));
|
| 2023 | + if(!tmpptr) return -1;
|
| 2024 | + *output = tmpptr;
|
| 2025 | + *outsize = (dest+count)*sizeof(D3DTLVERTEX);
|
| 2026 | + }
|
| 2027 | + for(int i = 0; i < count; i++)
|
| 2028 | + {
|
| 2029 | + in[0] = input[i+start].dvX;
|
| 2030 | + in[1] = input[i+start].dvY;
|
| 2031 | + in[2] = input[i+start].dvZ;
|
| 2032 | + __gluMultMatrixVecf(matTransform,in,&(*output)[i+dest].dvSX);
|
| 2033 | + (*output)[i+dest].dvRHW = 1.0f/(*output)[i+dest].dvRHW;
|
| 2034 | + (*output)[i+dest].dcColor = 0xFFFFFFFF;
|
| 2035 | + (*output)[i+dest].dcSpecular = 0;
|
| 2036 | + (*output)[i+dest].dvTU = input[i+start].dvTU;
|
| 2037 | + (*output)[i+dest].dvTV = input[i+start].dvTV;
|
| 2038 | + }
|
| 2039 | + if(extents) CalculateExtents(extents,*output,count);
|
| 2040 | + return 0;
|
| 2041 | +}
|
| 2042 | +INT glDirect3DDevice7::TransformOnly(D3DTLVERTEX **output, DWORD *outsize, D3DLVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents)
|
| 2043 | +{
|
| 2044 | + GLfloat in[4];
|
| 2045 | + in[3] = 1.0f;
|
| 2046 | + if(transform_dirty) UpdateTransform();
|
| 2047 | + if(*outsize < (dest+count)*sizeof(D3DTLVERTEX))
|
| 2048 | + {
|
| 2049 | + D3DTLVERTEX *tmpptr = (D3DTLVERTEX*)realloc(*output,(dest+count)*sizeof(D3DTLVERTEX));
|
| 2050 | + if(!tmpptr) return -1;
|
| 2051 | + *output = tmpptr;
|
| 2052 | + *outsize = (dest+count)*sizeof(D3DTLVERTEX);
|
| 2053 | + }
|
| 2054 | + for(int i = 0; i < count; i++)
|
| 2055 | + {
|
| 2056 | + in[0] = input[i+start].dvX;
|
| 2057 | + in[1] = input[i+start].dvY;
|
| 2058 | + in[2] = input[i+start].dvZ;
|
| 2059 | + __gluMultMatrixVecf(matTransform,in,&(*output)[i+dest].dvSX);
|
| 2060 | + (*output)[i+dest].dvRHW = 1.0f/(*output)[i+dest].dvRHW;
|
| 2061 | + (*output)[i+dest].dcColor = input[i+start].dcColor;
|
| 2062 | + (*output)[i+dest].dcSpecular = input[i+start].dcSpecular;
|
| 2063 | + (*output)[i+dest].dvTU = input[i+start].dvTU;
|
| 2064 | + (*output)[i+dest].dvTV = input[i+start].dvTV;
|
| 2065 | + }
|
| 2066 | + if(extents) CalculateExtents(extents,*output,count);
|
| 2067 | + return 0;
|
| 2068 | +}
|
| 2069 | +INT glDirect3DDevice7::CopyVertices(D3DTLVERTEX **output, DWORD *outsize, D3DTLVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents)
|
| 2070 | +{
|
| 2071 | + if(transform_dirty) UpdateTransform();
|
| 2072 | + if(*outsize < (dest+count)*sizeof(D3DTLVERTEX))
|
| 2073 | + {
|
| 2074 | + D3DTLVERTEX *tmpptr = (D3DTLVERTEX*)realloc(*output,(dest+count)*sizeof(D3DTLVERTEX));
|
| 2075 | + if(!tmpptr) return -1;
|
| 2076 | + *output = tmpptr;
|
| 2077 | + *outsize = (dest+count)*sizeof(D3DTLVERTEX);
|
| 2078 | + }
|
| 2079 | + memcpy(&(*output)[dest],&input[start],count*sizeof(D3DTLVERTEX));
|
| 2080 | + if(extents) CalculateExtents(extents,*output,count);
|
| 2081 | + return 0;
|
| 2082 | +}
|
| 2083 | +
|
1917 | 2084 | HRESULT glDirect3DDevice7::Execute(LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags)
|
1918 | 2085 | {
|
1919 | 2086 | if(!this) return DDERR_INVALIDOBJECT;
|
1920 | 2087 | if(!lpDirect3DExecuteBuffer) return DDERR_INVALIDPARAMS;
|
1921 | 2088 | if(!lpDirect3DViewport) return DDERR_INVALIDPARAMS;
|
1922 | | - FIXME("glDirect3DDevice1::Execute: stub");
|
1923 | | - ERR(DDERR_GENERIC);
|
| 2089 | + D3DEXECUTEBUFFERDESC desc;
|
| 2090 | + D3DEXECUTEDATA data;
|
| 2091 | + HRESULT err = ((glDirect3DExecuteBuffer*)lpDirect3DExecuteBuffer)->ExecuteLock(&desc,&data);
|
| 2092 | + if(FAILED(err)) return err;
|
| 2093 | + unsigned char *opptr = (unsigned char *)desc.lpData + data.dwInstructionOffset;
|
| 2094 | + unsigned char *in_vertptr = (unsigned char *)desc.lpData + data.dwVertexOffset;
|
| 2095 | + DWORD offset;
|
| 2096 | + INT result;
|
| 2097 | + D3DMATRIX mat1,mat2,mat3;
|
| 2098 | + bool ebExit = false;
|
| 2099 | + int i;
|
| 2100 | + if(outbuffersize < desc.dwBufferSize)
|
| 2101 | + {
|
| 2102 | + unsigned char *tmpbuffer = (unsigned char *)realloc(outbuffer,desc.dwBufferSize);
|
| 2103 | + if(!tmpbuffer) return DDERR_OUTOFMEMORY;
|
| 2104 | + outbuffer = tmpbuffer;
|
| 2105 | + outbuffersize = desc.dwBufferSize;
|
| 2106 | + }
|
| 2107 | + D3DVERTEX *vert_ptr = (D3DVERTEX*)outbuffer;
|
| 2108 | + while(1)
|
| 2109 | + {
|
| 2110 | + D3DINSTRUCTION *instruction = (D3DINSTRUCTION*) opptr;
|
| 2111 | + offset = 0;
|
| 2112 | + switch(instruction->bOpcode)
|
| 2113 | + {
|
| 2114 | + case D3DOP_POINT:
|
| 2115 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2116 | + if(instruction->bSize < sizeof(D3DPOINT))
|
| 2117 | + {
|
| 2118 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2119 | + break;
|
| 2120 | + }
|
| 2121 | + for(i = 0; i < instruction->wCount; i++)
|
| 2122 | + {
|
| 2123 | + if(ebBufferSize < (offset + ((D3DPOINT*)opptr)->wCount*sizeof(D3DVERTEX)))
|
| 2124 | + {
|
| 2125 | + if(!ExpandBuffer((void**)&ebBuffer,&ebBufferSize,(((D3DPOINT*)opptr)->wCount*sizeof(D3DVERTEX) > 1024) ?
|
| 2126 | + ((D3DPOINT*)opptr)->wCount*sizeof(D3DVERTEX) : 1024))
|
| 2127 | + return DDERR_OUTOFMEMORY;
|
| 2128 | + }
|
| 2129 | + memcpy(&ebBuffer+offset,&vert_ptr[((D3DPOINT*)opptr)->wFirst],((D3DPOINT*)opptr)->wCount*sizeof(D3DVERTEX));
|
| 2130 | + offset+=((D3DPOINT*)opptr)->wCount;
|
| 2131 | + opptr += instruction->bSize;
|
| 2132 | + }
|
| 2133 | + DrawPrimitive(D3DPT_POINTLIST,D3DFVF_TLVERTEX,ebBuffer,offset/sizeof(D3DVERTEX),0);
|
| 2134 | + break;
|
| 2135 | + case D3DOP_LINE:
|
| 2136 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2137 | + if(instruction->bSize < sizeof(D3DLINE))
|
| 2138 | + {
|
| 2139 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2140 | + break;
|
| 2141 | + }
|
| 2142 | + for(i = 0; i < instruction->wCount; i++)
|
| 2143 | + {
|
| 2144 | + if(ebBufferSize < (offset + sizeof(D3DLINE)))
|
| 2145 | + {
|
| 2146 | + if(!ExpandBuffer((void**)&ebBuffer,&ebBufferSize,1024)) return DDERR_OUTOFMEMORY;
|
| 2147 | + }
|
| 2148 | + memcpy(&ebBuffer+offset,opptr,sizeof(D3DLINE));
|
| 2149 | + offset += sizeof(D3DLINE);
|
| 2150 | + opptr += instruction->bSize;
|
| 2151 | + }
|
| 2152 | + DrawIndexedPrimitive(D3DPT_LINELIST,D3DFVF_TLVERTEX,vert_ptr,(desc.dwBufferSize-data.dwVertexOffset)/sizeof(D3DVERTEX),
|
| 2153 | + (WORD*)ebBuffer,instruction->wCount*2,0);
|
| 2154 | + break;
|
| 2155 | + case D3DOP_TRIANGLE:
|
| 2156 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2157 | + if(instruction->bSize < sizeof(D3DTRIANGLE))
|
| 2158 | + {
|
| 2159 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2160 | + break;
|
| 2161 | + }
|
| 2162 | + for(i = 0; i < instruction->wCount; i++)
|
| 2163 | + {
|
| 2164 | + result = AddTriangle(&ebBuffer,&ebBufferSize,&offset,(D3DTRIANGLE*)opptr);
|
| 2165 | + if(result == -1) return DDERR_OUTOFMEMORY;
|
| 2166 | + opptr += instruction->bSize;
|
| 2167 | + }
|
| 2168 | + DrawIndexedPrimitive(D3DPT_TRIANGLELIST,D3DFVF_TLVERTEX,vert_ptr,(desc.dwBufferSize-data.dwVertexOffset)/sizeof(D3DVERTEX),
|
| 2169 | + (WORD*)ebBuffer,instruction->wCount*3,0);
|
| 2170 | + break;
|
| 2171 | + case D3DOP_MATRIXLOAD:
|
| 2172 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2173 | + if(instruction->bSize < sizeof(D3DMATRIXLOAD))
|
| 2174 | + {
|
| 2175 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2176 | + break;
|
| 2177 | + }
|
| 2178 | + for(i = 0; i < instruction->wCount; i++)
|
| 2179 | + {
|
| 2180 | + GetMatrix(((D3DMATRIXLOAD*)opptr)->hSrcMatrix,&mat1);
|
| 2181 | + SetMatrix(((D3DMATRIXLOAD*)opptr)->hDestMatrix,&mat1);
|
| 2182 | + opptr += instruction->bSize;
|
| 2183 | + }
|
| 2184 | + break;
|
| 2185 | + case D3DOP_MATRIXMULTIPLY:
|
| 2186 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2187 | + if(instruction->bSize < sizeof(D3DMATRIXMULTIPLY))
|
| 2188 | + {
|
| 2189 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2190 | + break;
|
| 2191 | + }
|
| 2192 | + for(i = 0; i < instruction->wCount; i++)
|
| 2193 | + {
|
| 2194 | + GetMatrix(((D3DMATRIXMULTIPLY*)opptr)->hSrcMatrix1,&mat1);
|
| 2195 | + GetMatrix(((D3DMATRIXMULTIPLY*)opptr)->hSrcMatrix2,&mat2);
|
| 2196 | + __gluMultMatricesf((GLfloat*)&mat1,(GLfloat*)&mat2,(GLfloat*)&mat3);
|
| 2197 | + SetMatrix(((D3DMATRIXMULTIPLY*)opptr)->hDestMatrix,&mat3);
|
| 2198 | + opptr += instruction->bSize;
|
| 2199 | + }
|
| 2200 | + break;
|
| 2201 | + case D3DOP_STATETRANSFORM:
|
| 2202 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2203 | + if(instruction->bSize < sizeof(D3DSTATE))
|
| 2204 | + {
|
| 2205 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2206 | + break;
|
| 2207 | + }
|
| 2208 | + for(i = 0; i < instruction->wCount; i++)
|
| 2209 | + {
|
| 2210 | + GetMatrix(((D3DSTATE*)opptr)->dwArg[0],&mat1);
|
| 2211 | + SetTransform(((D3DSTATE*)opptr)->dtstTransformStateType,&mat1);
|
| 2212 | + opptr += instruction->bSize;
|
| 2213 | + }
|
| 2214 | + break;
|
| 2215 | + case D3DOP_STATELIGHT:
|
| 2216 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2217 | + if(instruction->bSize < sizeof(D3DSTATE))
|
| 2218 | + {
|
| 2219 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2220 | + break;
|
| 2221 | + }
|
| 2222 | + for(i = 0; i < instruction->wCount; i++)
|
| 2223 | + {
|
| 2224 | + SetLightState(((D3DSTATE*)opptr)->dlstLightStateType,((D3DSTATE*)opptr)->dwArg[0]);
|
| 2225 | + opptr += instruction->bSize;
|
| 2226 | + }
|
| 2227 | + break;
|
| 2228 | + case D3DOP_STATERENDER:
|
| 2229 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2230 | + if(instruction->bSize < sizeof(D3DSTATE))
|
| 2231 | + {
|
| 2232 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2233 | + break;
|
| 2234 | + }
|
| 2235 | + for(i = 0; i < instruction->wCount; i++)
|
| 2236 | + {
|
| 2237 | + SetRenderState(((D3DSTATE*)opptr)->drstRenderStateType,((D3DSTATE*)opptr)->dwArg[0]);
|
| 2238 | + opptr += instruction->bSize;
|
| 2239 | + }
|
| 2240 | + break;
|
| 2241 | + case D3DOP_PROCESSVERTICES:
|
| 2242 | + opptr += sizeof(D3DINSTRUCTION);
|
| 2243 | + if(instruction->bSize < sizeof(D3DPROCESSVERTICES))
|
| 2244 | + {
|
| 2245 | + opptr += (instruction->bSize*instruction->wCount);
|
| 2246 | + break;
|
| 2247 | + }
|
| 2248 | + for(i = 0; i < instruction->wCount; i++)
|
| 2249 | + {
|
| 2250 | + switch(((D3DPROCESSVERTICES*)opptr)->dwFlags & D3DPROCESSVERTICES_OPMASK)
|
| 2251 | + {
|
| 2252 | + case D3DPROCESSVERTICES_TRANSFORM:
|
| 2253 | + if(((D3DPROCESSVERTICES*)opptr)->dwFlags & D3DPROCESSVERTICES_UPDATEEXTENTS)
|
| 2254 | + TransformOnly((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DLVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2255 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2256 | + else TransformOnly((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DLVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2257 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2258 | + break;
|
| 2259 | + case D3DPROCESSVERTICES_TRANSFORMLIGHT:
|
| 2260 | + if(((D3DPROCESSVERTICES*)opptr)->dwFlags & D3DPROCESSVERTICES_NOCOLOR)
|
| 2261 | + {
|
| 2262 | + if(((D3DPROCESSVERTICES*)opptr)->dwFlags & D3DPROCESSVERTICES_UPDATEEXTENTS)
|
| 2263 | + TransformOnly((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2264 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2265 | + else TransformOnly((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2266 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2267 | + }
|
| 2268 | + else
|
| 2269 | + {
|
| 2270 | + if(((D3DPROCESSVERTICES*)opptr)->dwFlags & D3DPROCESSVERTICES_UPDATEEXTENTS)
|
| 2271 | + TransformAndLight((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2272 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2273 | + else TransformAndLight((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2274 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2275 | + }
|
| 2276 | + case D3DPROCESSVERTICES_COPY:
|
| 2277 | + if(((D3DPROCESSVERTICES*)opptr)->dwFlags & D3DPROCESSVERTICES_UPDATEEXTENTS)
|
| 2278 | + CopyVertices((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DTLVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2279 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2280 | + else CopyVertices((D3DTLVERTEX**)&outbuffer,&outbuffersize,(D3DTLVERTEX*)in_vertptr,((D3DPROCESSVERTICES*)opptr)->wStart,
|
| 2281 | + ((D3DPROCESSVERTICES*)opptr)->wDest,((D3DPROCESSVERTICES*)opptr)->dwCount,&data.dsStatus.drExtent);
|
| 2282 | + break;
|
| 2283 | + default:
|
| 2284 | + break;
|
| 2285 | + }
|
| 2286 | + opptr += instruction->bSize;
|
| 2287 | + }
|
| 2288 | + break;
|
| 2289 | + case D3DOP_TEXTURELOAD:
|
| 2290 | + opptr += sizeof(D3DINSTRUCTION)+(instruction->bSize*instruction->wCount);
|
| 2291 | + FIXME("D3DOP_TEXTURELOAD: stub");
|
| 2292 | + break;
|
| 2293 | + case D3DOP_EXIT:
|
| 2294 | + ebExit = true;
|
| 2295 | + break;
|
| 2296 | + case D3DOP_BRANCHFORWARD:
|
| 2297 | + opptr += sizeof(D3DINSTRUCTION)+(instruction->bSize*instruction->wCount);
|
| 2298 | + FIXME("D3DOP_BRANCHFORWARD: stub");
|
| 2299 | + break;
|
| 2300 | + case D3DOP_SPAN:
|
| 2301 | + opptr += sizeof(D3DINSTRUCTION)+(instruction->bSize*instruction->wCount);
|
| 2302 | + FIXME("D3DOP_SPAN: stub");
|
| 2303 | + break;
|
| 2304 | + case D3DOP_SETSTATUS:
|
| 2305 | + opptr += sizeof(D3DINSTRUCTION)+(instruction->bSize*instruction->wCount);
|
| 2306 | + FIXME("D3DOP_SETSTATUS: stub");
|
| 2307 | + break;
|
| 2308 | + default:
|
| 2309 | + opptr += sizeof(D3DINSTRUCTION)+(instruction->bSize*instruction->wCount);
|
| 2310 | + break;
|
| 2311 | + }
|
| 2312 | + if(ebExit) break;
|
| 2313 | + }
|
| 2314 | + ((glDirect3DExecuteBuffer*)lpDirect3DExecuteBuffer)->ExecuteUnlock(&data);
|
| 2315 | + return D3D_OK;
|
1924 | 2316 | }
|
1925 | 2317 |
|
1926 | 2318 | HRESULT glDirect3DDevice7::GetPickRecords(LPDWORD lpCount, LPD3DPICKRECORD lpD3DPickRec)
|
Index: ddraw/glDirect3DDevice.h |
— | — | @@ -162,11 +162,18 @@ |
163 | 163 | HRESULT GetPickRecords(LPDWORD lpCount, LPD3DPICKRECORD lpD3DPickRec);
|
164 | 164 | HRESULT Pick(LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags,
|
165 | 165 | LPD3DRECT lpRect);
|
| 166 | + INT TransformAndLight(D3DTLVERTEX **output, DWORD *outsize, D3DVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents);
|
| 167 | + INT TransformOnly(D3DTLVERTEX **output, DWORD *outsize, D3DVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents);
|
| 168 | + INT TransformOnly(D3DTLVERTEX **output, DWORD *outsize, D3DLVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents);
|
| 169 | + INT CopyVertices(D3DTLVERTEX **output, DWORD *outsize, D3DTLVERTEX *input, WORD start, WORD dest, DWORD count, D3DRECT *extents);
|
| 170 | + void UpdateTransform();
|
166 | 171 | void InitDX5();
|
167 | 172 | __int64 SelectShader(GLVERTEX *VertexType);
|
168 | 173 | GLfloat matWorld[16];
|
169 | 174 | GLfloat matView[16];
|
170 | 175 | GLfloat matProjection[16];
|
| 176 | + GLfloat matTransform[16];
|
| 177 | + bool transform_dirty;
|
171 | 178 | D3D1MATRIX *matrices;
|
172 | 179 | int matrixcount;
|
173 | 180 | D3DMATERIAL7 material;
|
— | — | @@ -211,6 +218,10 @@ |
212 | 219 | glDirect3DViewport3 *currentviewport;
|
213 | 220 | int viewportcount;
|
214 | 221 | int maxviewports;
|
| 222 | + unsigned char *ebBuffer;
|
| 223 | + DWORD ebBufferSize;
|
| 224 | + unsigned char *outbuffer;
|
| 225 | + DWORD outbuffersize;
|
215 | 226 | };
|
216 | 227 |
|
217 | 228 | #endif //__GLDIRECT3DDEVICE_H
|
Index: ddraw/glDirect3DExecuteBuffer.cpp |
— | — | @@ -154,11 +154,13 @@ |
155 | 155 | return D3D_OK;
|
156 | 156 | }
|
157 | 157 |
|
158 | | -HRESULT glDirect3DExecuteBuffer::ExecuteUnlock()
|
| 158 | +HRESULT glDirect3DExecuteBuffer::ExecuteUnlock(LPD3DEXECUTEDATA lpData)
|
159 | 159 | {
|
160 | 160 | if(!this) return DDERR_INVALIDOBJECT;
|
| 161 | + if(!lpData) return DDERR_INVALIDPARAMS;
|
161 | 162 | if(!inuse) return D3DERR_EXECUTE_NOT_LOCKED;
|
162 | 163 | inuse = false;
|
163 | 164 | locked = false;
|
| 165 | + memcpy(&datadesc,lpData,sizeof(D3DEXECUTEDATA));
|
164 | 166 | return D3D_OK;
|
165 | 167 | } |
\ No newline at end of file |
Index: ddraw/glDirect3DExecuteBuffer.h |
— | — | @@ -32,7 +32,7 @@ |
33 | 33 | HRESULT WINAPI Unlock();
|
34 | 34 | HRESULT WINAPI Validate(LPDWORD lpdwOffset, LPD3DVALIDATECALLBACK lpFunc, LPVOID lpUserArg, DWORD dwReserved);
|
35 | 35 | HRESULT ExecuteLock(LPD3DEXECUTEBUFFERDESC lpDesc,LPD3DEXECUTEDATA lpData);
|
36 | | - HRESULT ExecuteUnlock();
|
| 36 | + HRESULT ExecuteUnlock(LPD3DEXECUTEDATA lpData);
|
37 | 37 | private:
|
38 | 38 | ULONG refcount;
|
39 | 39 | D3DEXECUTEBUFFERDESC desc;
|
Index: ddraw/matrix.cpp |
— | — | @@ -127,4 +127,17 @@ |
128 | 128 | m[1+4*0] = 0; m[1+4*1] = 1; m[1+4*2] = 0; m[1+4*3] = 0;
|
129 | 129 | m[2+4*0] = 0; m[2+4*1] = 0; m[2+4*2] = 1; m[2+4*3] = 0;
|
130 | 130 | m[3+4*0] = 0; m[3+4*1] = 0; m[3+4*2] = 0; m[3+4*3] = 1;
|
131 | | -} |
\ No newline at end of file |
| 131 | +}
|
| 132 | +
|
| 133 | +void __gluMultMatrixVecf(const GLfloat matrix[16], const GLfloat in[4], GLfloat out[4])
|
| 134 | +{
|
| 135 | + int i;
|
| 136 | +
|
| 137 | + for (i=0; i<4; i++) {
|
| 138 | + out[i] =
|
| 139 | + in[0] * matrix[0*4+i] +
|
| 140 | + in[1] * matrix[1*4+i] +
|
| 141 | + in[2] * matrix[2*4+i] +
|
| 142 | + in[3] * matrix[3*4+i];
|
| 143 | + }
|
| 144 | +}
|
Index: ddraw/matrix.h |
— | — | @@ -54,5 +54,6 @@ |
55 | 55 | void __gluMultMatricesf(const GLfloat a[16], const GLfloat b[16],
|
56 | 56 | GLfloat r[16]);
|
57 | 57 | void __gluMakeIdentityf(GLfloat m[16]);
|
| 58 | +void __gluMultMatrixVecf(const GLfloat matrix[16], const GLfloat in[4], GLfloat out[4]);
|
58 | 59 |
|
59 | 60 | #endif //_MATRIX_H |
\ No newline at end of file |