Tidy up some formatting, improve error handling and error logging and

fix a couple of spelling mistakes.
This commit is contained in:
Oliver Stieber 2005-08-22 09:13:49 +00:00 committed by Alexandre Julliard
parent 6c2eae254f
commit 45033446bb
1 changed files with 265 additions and 202 deletions

View File

@ -450,8 +450,6 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, WINED3
return D3D_OK; return D3D_OK;
} }
/* Otherwise, might as well set the whole state block to the appropriate values */
IWineD3DDevice_AddRef(iface);
/* Otherwise, might as well set the whole state block to the appropriate values */ /* Otherwise, might as well set the whole state block to the appropriate values */
if ( This->stateBlock != NULL) { if ( This->stateBlock != NULL) {
memcpy(object, This->stateBlock, sizeof(IWineD3DStateBlockImpl)); memcpy(object, This->stateBlock, sizeof(IWineD3DStateBlockImpl));
@ -467,10 +465,12 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, WINED3
TRACE("Updating changed flags appropriate for type %d\n", Type); TRACE("Updating changed flags appropriate for type %d\n", Type);
if (Type == WINED3DSBT_ALL) { if (Type == WINED3DSBT_ALL) {
TRACE("ALL => Pretend everything has changed\n"); TRACE("ALL => Pretend everything has changed\n");
memset(&object->changed, TRUE, sizeof(This->stateBlock->changed)); memset(&object->changed, TRUE, sizeof(This->stateBlock->changed));
} else if (Type == WINED3DSBT_PIXELSTATE) { } else if (Type == WINED3DSBT_PIXELSTATE) {
TRACE("PIXELSTATE => Pretend all pixel shates have changed\n");
memset(&object->changed, FALSE, sizeof(This->stateBlock->changed)); memset(&object->changed, FALSE, sizeof(This->stateBlock->changed));
/* TODO: Pixel Shader Constants */ /* TODO: Pixel Shader Constants */
object->changed.pixelShader = TRUE; object->changed.pixelShader = TRUE;
@ -480,6 +480,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, WINED3
} else if (Type == WINED3DSBT_VERTEXSTATE) { } else if (Type == WINED3DSBT_VERTEXSTATE) {
TRACE("VERTEXSTATE => Pretend all vertex shates have changed\n");
memset(&object->changed, FALSE, sizeof(This->stateBlock->changed)); memset(&object->changed, FALSE, sizeof(This->stateBlock->changed));
/* TODO: Vertex Shader Constants */ /* TODO: Vertex Shader Constants */
object->changed.vertexShader = TRUE; object->changed.vertexShader = TRUE;
@ -755,15 +756,15 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface, UINT Wid
{ {
/* use the callback to create the texture surface */ /* use the callback to create the texture surface */
hr = D3DCB_CreateSurface(This->parent, tmpW, tmpH, Format, Usage, Pool, i, &object->surfaces[i],NULL); hr = D3DCB_CreateSurface(This->parent, tmpW, tmpH, Format, Usage, Pool, i, &object->surfaces[i],NULL);
if(hr!= D3D_OK) { if (hr!= D3D_OK) {
int j; int j;
FIXME("Failed to create surface %p \n",object); FIXME("Failed to create surface %p \n",object);
/* clean up */ /* clean up */
for(j = 0 ; j < i ; j++) { for (j = 0 ; j < i ; j++) {
IWineD3DSurface_Release(object->surfaces[j]); IWineD3DSurface_Release(object->surfaces[j]);
} }
/* heap free object */ /* heap free object */
HeapFree(GetProcessHeap(),0,object); HeapFree(GetProcessHeap(), 0, object);
*ppTexture = NULL; *ppTexture = NULL;
return hr; return hr;
@ -784,8 +785,8 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *iface,
UINT Width, UINT Height, UINT Depth, UINT Width, UINT Height, UINT Depth,
UINT Levels, DWORD Usage, UINT Levels, DWORD Usage,
WINED3DFORMAT Format, D3DPOOL Pool, WINED3DFORMAT Format, D3DPOOL Pool,
IWineD3DVolumeTexture** ppVolumeTexture, IWineD3DVolumeTexture **ppVolumeTexture,
HANDLE* pSharedHandle, IUnknown *parent, HANDLE *pSharedHandle, IUnknown *parent,
D3DCB_CREATEVOLUMEFN D3DCB_CreateVolume) { D3DCB_CREATEVOLUMEFN D3DCB_CreateVolume) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
@ -877,13 +878,13 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface,
HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT EdgeLength, HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT EdgeLength,
UINT Levels, DWORD Usage, UINT Levels, DWORD Usage,
WINED3DFORMAT Format, D3DPOOL Pool, WINED3DFORMAT Format, D3DPOOL Pool,
IWineD3DCubeTexture** ppCubeTexture, IWineD3DCubeTexture **ppCubeTexture,
HANDLE* pSharedHandle, IUnknown *parent, HANDLE *pSharedHandle, IUnknown *parent,
D3DCB_CREATESURFACEFN D3DCB_CreateSurface) { D3DCB_CREATESURFACEFN D3DCB_CreateSurface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DCubeTextureImpl *object; /** NOTE: impl ref allowed since this is a create function **/ IWineD3DCubeTextureImpl *object; /** NOTE: impl ref allowed since this is a create function **/
unsigned int i,j; unsigned int i, j;
UINT tmpW; UINT tmpW;
HRESULT hr; HRESULT hr;
unsigned int pow2EdgeLength = EdgeLength; unsigned int pow2EdgeLength = EdgeLength;
@ -893,14 +894,13 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT
TRACE("(%p) Create Cube Texture \n", This); TRACE("(%p) Create Cube Texture \n", This);
object->edgeLength = EdgeLength;
/** Non-power2 support **/ /** Non-power2 support **/
/* Find the nearest pow2 match */ /* Find the nearest pow2 match */
pow2EdgeLength = 1; pow2EdgeLength = 1;
while (pow2EdgeLength < EdgeLength) pow2EdgeLength <<= 1; while (pow2EdgeLength < EdgeLength) pow2EdgeLength <<= 1;
object->edgeLength = EdgeLength;
/* TODO: support for native non-power 2 */ /* TODO: support for native non-power 2 */
/* Precalculated scaling for 'faked' non power of two texture coords */ /* Precalculated scaling for 'faked' non power of two texture coords */
object->pow2scalingFactor = ((float)EdgeLength) / ((float)pow2EdgeLength); object->pow2scalingFactor = ((float)EdgeLength) / ((float)pow2EdgeLength);
@ -910,7 +910,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT
object->baseTexture.levels++; object->baseTexture.levels++;
tmpW = EdgeLength; tmpW = EdgeLength;
while (tmpW > 1) { while (tmpW > 1) {
tmpW = max(1, tmpW / 2); tmpW = max(1, tmpW >> 1);
object->baseTexture.levels++; object->baseTexture.levels++;
} }
TRACE("Calculated levels = %d\n", object->baseTexture.levels); TRACE("Calculated levels = %d\n", object->baseTexture.levels);
@ -930,11 +930,11 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT
/* clean up */ /* clean up */
int k; int k;
int l; int l;
for (l=0;l<j;l++) { for (l = 0; l < j; l++) {
IWineD3DSurface_Release(object->surfaces[j][i]); IWineD3DSurface_Release(object->surfaces[j][i]);
} }
for (k=0;k<i;k++) { for (k = 0; k < i; k++) {
for (l=0;l<6;l++) { for (l = 0; l < 6; l++) {
IWineD3DSurface_Release(object->surfaces[l][j]); IWineD3DSurface_Release(object->surfaces[l][j]);
} }
} }
@ -959,7 +959,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINED3DQUER
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DQueryImpl *object; /*NOTE: impl ref allowed since this is a create function */ IWineD3DQueryImpl *object; /*NOTE: impl ref allowed since this is a create function */
if(NULL == ppQuery) { if (NULL == ppQuery) {
/* Just a check to see if we support this type of query */ /* Just a check to see if we support this type of query */
HRESULT hr = D3DERR_NOTAVAILABLE; HRESULT hr = D3DERR_NOTAVAILABLE;
/* Lie and say everything is good (we can return ok fake data from a stub) */ /* Lie and say everything is good (we can return ok fake data from a stub) */
@ -1074,7 +1074,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac
TRACE("Using x visual ID : %ld\n", template.visualid); TRACE("Using x visual ID : %ld\n", template.visualid);
TRACE(" visual info: %p\n", object->visInfo); TRACE(" visual info: %p\n", object->visInfo);
TRACE(" num items : %d\n", num); TRACE(" num items : %d\n", num);
for(n = 0;n < num; n++) { for (n = 0;n < num; n++) {
TRACE("=====item=====: %d\n", n + 1); TRACE("=====item=====: %d\n", n + 1);
TRACE(" visualid : %ld\n", object->visInfo[n].visualid); TRACE(" visualid : %ld\n", object->visInfo[n].visualid);
TRACE(" screen : %d\n", object->visInfo[n].screen); TRACE(" screen : %d\n", object->visInfo[n].screen);
@ -1255,7 +1255,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac
&object->backBuffer, &object->backBuffer,
NULL /* pShared (always null)*/); NULL /* pShared (always null)*/);
if (object->backBuffer != NULL) if (object->backBuffer != NULL)
IWineD3DSurface_SetContainer(object->backBuffer, (IUnknown *)object); IWineD3DSurface_SetContainer(object->backBuffer, (IUnknown *)object);
/* Under directX swapchains share the depth stencil, so only create one depth-stencil */ /* Under directX swapchains share the depth stencil, so only create one depth-stencil */
if (pPresentationParameters->EnableAutoDepthStencil) { if (pPresentationParameters->EnableAutoDepthStencil) {
@ -1291,14 +1291,14 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac
object->drawable = object->win; object->drawable = object->win;
object->render_ctx = object->glCtx; object->render_ctx = object->glCtx;
if(hr == D3D_OK) { if (hr == D3D_OK) {
/********************* /*********************
* Setup some defaults and clear down the buffers * Setup some defaults and clear down the buffers
*******************/ *******************/
ENTER_GL(); ENTER_GL();
/** save current context and drawable **/ /** save current context and drawable **/
oldContext = glXGetCurrentContext(); oldContext = glXGetCurrentContext();
oldDrawable = glXGetCurrentDrawable(); oldDrawable = glXGetCurrentDrawable();
TRACE("Activating context (display %p context %p drawable %ld)!\n", object->display, object->glCtx, object->win); TRACE("Activating context (display %p context %p drawable %ld)!\n", object->display, object->glCtx, object->win);
if (glXMakeCurrent(object->display, object->win, object->glCtx) == False) { if (glXMakeCurrent(object->display, object->win, object->glCtx) == False) {
@ -1332,7 +1332,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
checkGLcall("glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);"); checkGLcall("glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);");
/* switch back to the original context (unless it was zero)*/ /* switch back to the original context (if there was one)*/
if (This->swapchains != NULL) { if (This->swapchains != NULL) {
/** TODO: restore the context and drawable **/ /** TODO: restore the context and drawable **/
glXMakeCurrent(object->display, oldDrawable, oldContext); glXMakeCurrent(object->display, oldDrawable, oldContext);
@ -1343,7 +1343,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac
{ /* Finally add the swapchain to the end of the devices' swapchain list */ { /* Finally add the swapchain to the end of the devices' swapchain list */
SwapChainList **nextSwapchain; SwapChainList **nextSwapchain;
nextSwapchain = &This->swapchains; nextSwapchain = &This->swapchains;
while(*nextSwapchain != NULL) { while (*nextSwapchain != NULL) {
nextSwapchain = &((*nextSwapchain)->next); nextSwapchain = &((*nextSwapchain)->next);
} }
(*nextSwapchain) = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->swapchains)); (*nextSwapchain) = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->swapchains));
@ -1355,14 +1355,14 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac
if (object->frontBuffer) { if (object->frontBuffer) {
IWineD3DSurface_GetParent(object->frontBuffer, &bufferParent); IWineD3DSurface_GetParent(object->frontBuffer, &bufferParent);
IUnknown_Release(bufferParent); /* once for the get parent */ IUnknown_Release(bufferParent); /* once for the get parent */
if(IUnknown_Release(bufferParent) > 0) { if (IUnknown_Release(bufferParent) > 0) {
FIXME("(%p) Something's still holding the front buffer\n",This); FIXME("(%p) Something's still holding the front buffer\n",This);
} }
} }
if (object->backBuffer) { if (object->backBuffer) {
IWineD3DSurface_GetParent(object->backBuffer, &bufferParent); IWineD3DSurface_GetParent(object->backBuffer, &bufferParent);
IUnknown_Release(bufferParent); /* once for the get parent */ IUnknown_Release(bufferParent); /* once for the get parent */
if(IUnknown_Release(bufferParent) > 0) { if (IUnknown_Release(bufferParent) > 0) {
FIXME("(%p) Something's still holding the back buffer\n",This); FIXME("(%p) Something's still holding the back buffer\n",This);
} }
} }
@ -1378,6 +1378,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* ifac
HeapFree(GetProcessHeap(), 0, object); HeapFree(GetProcessHeap(), 0, object);
} }
return hr; return hr;
} }
@ -1732,29 +1733,44 @@ HRESULT WINAPI IWineD3DDeviceImpl_MultiplyTransform(IWineD3DDevice *iface, D3DTR
} }
/* Copied from ddraw code: */ /* Copied from ddraw code: */
temp.u.s._11 = (mat->u.s._11 * pMatrix->u.s._11) + (mat->u.s._21 * pMatrix->u.s._12) + (mat->u.s._31 * pMatrix->u.s._13) + (mat->u.s._41 * pMatrix->u.s._14); temp.u.s._11 = (mat->u.s._11 * pMatrix->u.s._11) + (mat->u.s._21 * pMatrix->u.s._12) +
temp.u.s._21 = (mat->u.s._11 * pMatrix->u.s._21) + (mat->u.s._21 * pMatrix->u.s._22) + (mat->u.s._31 * pMatrix->u.s._23) + (mat->u.s._41 * pMatrix->u.s._24); (mat->u.s._31 * pMatrix->u.s._13) + (mat->u.s._41 * pMatrix->u.s._14);
temp.u.s._31 = (mat->u.s._11 * pMatrix->u.s._31) + (mat->u.s._21 * pMatrix->u.s._32) + (mat->u.s._31 * pMatrix->u.s._33) + (mat->u.s._41 * pMatrix->u.s._34); temp.u.s._21 = (mat->u.s._11 * pMatrix->u.s._21) + (mat->u.s._21 * pMatrix->u.s._22) +
temp.u.s._41 = (mat->u.s._11 * pMatrix->u.s._41) + (mat->u.s._21 * pMatrix->u.s._42) + (mat->u.s._31 * pMatrix->u.s._43) + (mat->u.s._41 * pMatrix->u.s._44); (mat->u.s._31 * pMatrix->u.s._23) + (mat->u.s._41 * pMatrix->u.s._24);
temp.u.s._31 = (mat->u.s._11 * pMatrix->u.s._31) + (mat->u.s._21 * pMatrix->u.s._32) +
(mat->u.s._31 * pMatrix->u.s._33) + (mat->u.s._41 * pMatrix->u.s._34);
temp.u.s._41 = (mat->u.s._11 * pMatrix->u.s._41) + (mat->u.s._21 * pMatrix->u.s._42) +
(mat->u.s._31 * pMatrix->u.s._43) + (mat->u.s._41 * pMatrix->u.s._44);
temp.u.s._12 = (mat->u.s._12 * pMatrix->u.s._11) + (mat->u.s._22 * pMatrix->u.s._12) + (mat->u.s._32 * pMatrix->u.s._13) + (mat->u.s._42 * pMatrix->u.s._14); temp.u.s._12 = (mat->u.s._12 * pMatrix->u.s._11) + (mat->u.s._22 * pMatrix->u.s._12) +
temp.u.s._22 = (mat->u.s._12 * pMatrix->u.s._21) + (mat->u.s._22 * pMatrix->u.s._22) + (mat->u.s._32 * pMatrix->u.s._23) + (mat->u.s._42 * pMatrix->u.s._24); (mat->u.s._32 * pMatrix->u.s._13) + (mat->u.s._42 * pMatrix->u.s._14);
temp.u.s._32 = (mat->u.s._12 * pMatrix->u.s._31) + (mat->u.s._22 * pMatrix->u.s._32) + (mat->u.s._32 * pMatrix->u.s._33) + (mat->u.s._42 * pMatrix->u.s._34); temp.u.s._22 = (mat->u.s._12 * pMatrix->u.s._21) + (mat->u.s._22 * pMatrix->u.s._22) +
temp.u.s._42 = (mat->u.s._12 * pMatrix->u.s._41) + (mat->u.s._22 * pMatrix->u.s._42) + (mat->u.s._32 * pMatrix->u.s._43) + (mat->u.s._42 * pMatrix->u.s._44); (mat->u.s._32 * pMatrix->u.s._23) + (mat->u.s._42 * pMatrix->u.s._24);
temp.u.s._32 = (mat->u.s._12 * pMatrix->u.s._31) + (mat->u.s._22 * pMatrix->u.s._32) +
(mat->u.s._32 * pMatrix->u.s._33) + (mat->u.s._42 * pMatrix->u.s._34);
temp.u.s._42 = (mat->u.s._12 * pMatrix->u.s._41) + (mat->u.s._22 * pMatrix->u.s._42) +
(mat->u.s._32 * pMatrix->u.s._43) + (mat->u.s._42 * pMatrix->u.s._44);
temp.u.s._13 = (mat->u.s._13 * pMatrix->u.s._11) + (mat->u.s._23 * pMatrix->u.s._12) + (mat->u.s._33 * pMatrix->u.s._13) + (mat->u.s._43 * pMatrix->u.s._14); temp.u.s._13 = (mat->u.s._13 * pMatrix->u.s._11) + (mat->u.s._23 * pMatrix->u.s._12) +
temp.u.s._23 = (mat->u.s._13 * pMatrix->u.s._21) + (mat->u.s._23 * pMatrix->u.s._22) + (mat->u.s._33 * pMatrix->u.s._23) + (mat->u.s._43 * pMatrix->u.s._24); (mat->u.s._33 * pMatrix->u.s._13) + (mat->u.s._43 * pMatrix->u.s._14);
temp.u.s._33 = (mat->u.s._13 * pMatrix->u.s._31) + (mat->u.s._23 * pMatrix->u.s._32) + (mat->u.s._33 * pMatrix->u.s._33) + (mat->u.s._43 * pMatrix->u.s._34); temp.u.s._23 = (mat->u.s._13 * pMatrix->u.s._21) + (mat->u.s._23 * pMatrix->u.s._22) +
temp.u.s._43 = (mat->u.s._13 * pMatrix->u.s._41) + (mat->u.s._23 * pMatrix->u.s._42) + (mat->u.s._33 * pMatrix->u.s._43) + (mat->u.s._43 * pMatrix->u.s._44); (mat->u.s._33 * pMatrix->u.s._23) + (mat->u.s._43 * pMatrix->u.s._24);
temp.u.s._33 = (mat->u.s._13 * pMatrix->u.s._31) + (mat->u.s._23 * pMatrix->u.s._32) +
(mat->u.s._33 * pMatrix->u.s._33) + (mat->u.s._43 * pMatrix->u.s._34);
temp.u.s._43 = (mat->u.s._13 * pMatrix->u.s._41) + (mat->u.s._23 * pMatrix->u.s._42) +
(mat->u.s._33 * pMatrix->u.s._43) + (mat->u.s._43 * pMatrix->u.s._44);
temp.u.s._14 = (mat->u.s._14 * pMatrix->u.s._11) + (mat->u.s._24 * pMatrix->u.s._12) + (mat->u.s._34 * pMatrix->u.s._13) + (mat->u.s._44 * pMatrix->u.s._14); temp.u.s._14 = (mat->u.s._14 * pMatrix->u.s._11) + (mat->u.s._24 * pMatrix->u.s._12) +
temp.u.s._24 = (mat->u.s._14 * pMatrix->u.s._21) + (mat->u.s._24 * pMatrix->u.s._22) + (mat->u.s._34 * pMatrix->u.s._23) + (mat->u.s._44 * pMatrix->u.s._24); (mat->u.s._34 * pMatrix->u.s._13) + (mat->u.s._44 * pMatrix->u.s._14);
temp.u.s._34 = (mat->u.s._14 * pMatrix->u.s._31) + (mat->u.s._24 * pMatrix->u.s._32) + (mat->u.s._34 * pMatrix->u.s._33) + (mat->u.s._44 * pMatrix->u.s._34); temp.u.s._24 = (mat->u.s._14 * pMatrix->u.s._21) + (mat->u.s._24 * pMatrix->u.s._22) +
temp.u.s._44 = (mat->u.s._14 * pMatrix->u.s._41) + (mat->u.s._24 * pMatrix->u.s._42) + (mat->u.s._34 * pMatrix->u.s._43) + (mat->u.s._44 * pMatrix->u.s._44); (mat->u.s._34 * pMatrix->u.s._23) + (mat->u.s._44 * pMatrix->u.s._24);
temp.u.s._34 = (mat->u.s._14 * pMatrix->u.s._31) + (mat->u.s._24 * pMatrix->u.s._32) +
(mat->u.s._34 * pMatrix->u.s._33) + (mat->u.s._44 * pMatrix->u.s._34);
temp.u.s._44 = (mat->u.s._14 * pMatrix->u.s._41) + (mat->u.s._24 * pMatrix->u.s._42) +
(mat->u.s._34 * pMatrix->u.s._43) + (mat->u.s._44 * pMatrix->u.s._44);
/* Apply change via set transform - will reapply to eg. lights this way */ /* Apply change via set transform - will reapply to eg. lights this way */
IWineD3DDeviceImpl_SetTransform(iface, State, &temp); return IWineD3DDeviceImpl_SetTransform(iface, State, &temp);
return D3D_OK;
} }
/***** /*****
@ -1973,32 +1989,32 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, DWORD In
/* Warning - untested code :-) Prob safe to change fixme to a trace but /* Warning - untested code :-) Prob safe to change fixme to a trace but
wait until someone confirms it seems to work! */ wait until someone confirms it seems to work! */
TRACE("Light enabled requested but light not defined, so defining one!\n"); TRACE("Light enabled requested but light not defined, so defining one!\n");
lightParms.Type = D3DLIGHT_DIRECTIONAL; lightParms.Type = D3DLIGHT_DIRECTIONAL;
lightParms.Diffuse.r = 1.0; lightParms.Diffuse.r = 1.0;
lightParms.Diffuse.g = 1.0; lightParms.Diffuse.g = 1.0;
lightParms.Diffuse.b = 1.0; lightParms.Diffuse.b = 1.0;
lightParms.Diffuse.a = 0.0; lightParms.Diffuse.a = 0.0;
lightParms.Specular.r = 0.0; lightParms.Specular.r = 0.0;
lightParms.Specular.g = 0.0; lightParms.Specular.g = 0.0;
lightParms.Specular.b = 0.0; lightParms.Specular.b = 0.0;
lightParms.Specular.a = 0.0; lightParms.Specular.a = 0.0;
lightParms.Ambient.r = 0.0; lightParms.Ambient.r = 0.0;
lightParms.Ambient.g = 0.0; lightParms.Ambient.g = 0.0;
lightParms.Ambient.b = 0.0; lightParms.Ambient.b = 0.0;
lightParms.Ambient.a = 0.0; lightParms.Ambient.a = 0.0;
lightParms.Position.x = 0.0; lightParms.Position.x = 0.0;
lightParms.Position.y = 0.0; lightParms.Position.y = 0.0;
lightParms.Position.z = 0.0; lightParms.Position.z = 0.0;
lightParms.Direction.x = 0.0; lightParms.Direction.x = 0.0;
lightParms.Direction.y = 0.0; lightParms.Direction.y = 0.0;
lightParms.Direction.z = 1.0; lightParms.Direction.z = 1.0;
lightParms.Range = 0.0; lightParms.Range = 0.0;
lightParms.Falloff = 0.0; lightParms.Falloff = 0.0;
lightParms.Attenuation0 = 0.0; lightParms.Attenuation0 = 0.0;
lightParms.Attenuation1 = 0.0; lightParms.Attenuation1 = 0.0;
lightParms.Attenuation2 = 0.0; lightParms.Attenuation2 = 0.0;
lightParms.Theta = 0.0; lightParms.Theta = 0.0;
lightParms.Phi = 0.0; lightParms.Phi = 0.0;
IWineD3DDeviceImpl_SetLight(iface, Index, &lightParms); IWineD3DDeviceImpl_SetLight(iface, Index, &lightParms);
/* Search for it again! Should be fairly quick as near head of list */ /* Search for it again! Should be fairly quick as near head of list */
@ -2291,30 +2307,34 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetMaterial(IWineD3DDevice *iface, CONST WINED
} }
ENTER_GL(); ENTER_GL();
TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g, pMaterial->Diffuse.b, pMaterial->Diffuse.a); TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g,
TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g, pMaterial->Ambient.b, pMaterial->Ambient.a); pMaterial->Diffuse.b, pMaterial->Diffuse.a);
TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g, pMaterial->Specular.b, pMaterial->Specular.a); TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g,
TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, pMaterial->Emissive.b, pMaterial->Emissive.a); pMaterial->Ambient.b, pMaterial->Ambient.a);
TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g,
pMaterial->Specular.b, pMaterial->Specular.a);
TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g,
pMaterial->Emissive.b, pMaterial->Emissive.a);
TRACE("(%p) : Power (%f)\n", This, pMaterial->Power); TRACE("(%p) : Power (%f)\n", This, pMaterial->Power);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*) &This->updateStateBlock->material.Ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*) &This->updateStateBlock->material.Ambient);
checkGLcall("glMaterialfv"); checkGLcall("glMaterialfv(GL_AMBIENT)");
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*) &This->updateStateBlock->material.Diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*) &This->updateStateBlock->material.Diffuse);
checkGLcall("glMaterialfv"); checkGLcall("glMaterialfv(GL_DIFFUSE)");
/* Only change material color if specular is enabled, otherwise it is set to black */ /* Only change material color if specular is enabled, otherwise it is set to black */
if (This->stateBlock->renderState[WINED3DRS_SPECULARENABLE]) { if (This->stateBlock->renderState[WINED3DRS_SPECULARENABLE]) {
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &This->updateStateBlock->material.Specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &This->updateStateBlock->material.Specular);
checkGLcall("glMaterialfv"); checkGLcall("glMaterialfv(GL_SPECULAR");
} else { } else {
float black[4] = {0.0f, 0.0f, 0.0f, 0.0f}; float black[4] = {0.0f, 0.0f, 0.0f, 0.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]);
checkGLcall("glMaterialfv"); checkGLcall("glMaterialfv(GL_SPECULAR");
} }
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float*) &This->updateStateBlock->material.Emissive); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float*) &This->updateStateBlock->material.Emissive);
checkGLcall("glMaterialfv"); checkGLcall("glMaterialfv(GL_EMISSION)");
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, This->updateStateBlock->material.Power); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, This->updateStateBlock->material.Power);
checkGLcall("glMaterialf"); checkGLcall("glMaterialf(GL_SHININESS");
LEAVE_GL(); LEAVE_GL();
return D3D_OK; return D3D_OK;
@ -2323,11 +2343,16 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetMaterial(IWineD3DDevice *iface, CONST WINED
HRESULT WINAPI IWineD3DDeviceImpl_GetMaterial(IWineD3DDevice *iface, WINED3DMATERIAL* pMaterial) { HRESULT WINAPI IWineD3DDeviceImpl_GetMaterial(IWineD3DDevice *iface, WINED3DMATERIAL* pMaterial) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
memcpy(pMaterial, &This->updateStateBlock->material, sizeof (WINED3DMATERIAL)); memcpy(pMaterial, &This->updateStateBlock->material, sizeof (WINED3DMATERIAL));
TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g, pMaterial->Diffuse.b, pMaterial->Diffuse.a); TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g,
TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g, pMaterial->Ambient.b, pMaterial->Ambient.a); pMaterial->Diffuse.b, pMaterial->Diffuse.a);
TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g, pMaterial->Specular.b, pMaterial->Specular.a); TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g,
TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, pMaterial->Emissive.b, pMaterial->Emissive.a); pMaterial->Ambient.b, pMaterial->Ambient.a);
TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g,
pMaterial->Specular.b, pMaterial->Specular.a);
TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g,
pMaterial->Emissive.b, pMaterial->Emissive.a);
TRACE("(%p) : Power (%f)\n", This, pMaterial->Power); TRACE("(%p) : Power (%f)\n", This, pMaterial->Power);
return D3D_OK; return D3D_OK;
} }
@ -2373,8 +2398,14 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetIndices(IWineD3DDevice *iface, IWineD3DInde
*ppIndexData = This->stateBlock->pIndexData; *ppIndexData = This->stateBlock->pIndexData;
/* up ref count on ppindexdata */ /* up ref count on ppindexdata */
if (*ppIndexData) IWineD3DIndexBuffer_AddRef(*ppIndexData); if (*ppIndexData) {
*pBaseVertexIndex = This->stateBlock->baseVertexIndex; IWineD3DIndexBuffer_AddRef(*ppIndexData);
*pBaseVertexIndex = This->stateBlock->baseVertexIndex;
TRACE("(%p) index data set to %p + %u\n", This, ppIndexData, This->stateBlock->baseVertexIndex);
}else{
TRACE("(%p) No index data set\n", This);
}
TRACE("Returning %p %d \n",*ppIndexData, *pBaseVertexIndex);
return D3D_OK; return D3D_OK;
} }
@ -3132,7 +3163,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, D3DRENDE
} }
break; break;
case WINED3DRS_ZBIAS : case WINED3DRS_ZBIAS : /* D3D8 only */
{ {
if (Value) { if (Value) {
tmpvalue.d = Value; tmpvalue.d = Value;
@ -3283,6 +3314,17 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, D3DRENDE
case WINED3DRS_WRAP5 : case WINED3DRS_WRAP5 :
case WINED3DRS_WRAP6 : case WINED3DRS_WRAP6 :
case WINED3DRS_WRAP7 : case WINED3DRS_WRAP7 :
/**
http://www.cosc.brocku.ca/Offerings/3P98/course/lectures/texture/
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/programmingguide/FixedFunction/Textures/texturewrapping.asp
http://www.gamedev.net/reference/programming/features/rendererdll3/page2.asp
Descussion that ways to turn on WRAPing to solve an opengl conversion problem.
http://www.flipcode.org/cgi-bin/fcmsg.cgi?thread_show=10248
so far as I can tell, wrapping and texture-coordinate generate go hand in hand,
*/
TRACE("(%p)->(%d,%ld) Texture wraping not yet supported\n",This, State, Value);
break;
case WINED3DRS_POINTSPRITEENABLE : case WINED3DRS_POINTSPRITEENABLE :
case WINED3DRS_MULTISAMPLEANTIALIAS : case WINED3DRS_MULTISAMPLEANTIALIAS :
case WINED3DRS_MULTISAMPLEMASK : case WINED3DRS_MULTISAMPLEMASK :
@ -3450,9 +3492,14 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface, IWineD3
HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader** ppShader) { HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader** ppShader) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
*ppShader = This->updateStateBlock->vertexShader;
if(*ppShader != NULL) if (NULL == ppShader) {
return D3DERR_INVALIDCALL;
}
*ppShader = This->stateBlock->vertexShader;
if( NULL != *ppShader)
IWineD3DVertexShader_AddRef(*ppShader); IWineD3DVertexShader_AddRef(*ppShader);
TRACE("(%p) : returning %p\n", This, *ppShader); TRACE("(%p) : returning %p\n", This, *ppShader);
return D3D_OK; return D3D_OK;
} }
@ -3799,117 +3846,117 @@ static void WINAPI IWineD3DDeviceImpl_ApplyTextureUnitState(IWineD3DDevice *ifac
*/ */
switch (Value & 0xFFFF0000) { switch (Value & 0xFFFF0000) {
case D3DTSS_TCI_PASSTHRU: case D3DTSS_TCI_PASSTHRU:
/*Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/ /*Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/
glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q); glDisable(GL_TEXTURE_GEN_Q);
checkGLcall("glDisable(GL_TEXTURE_GEN_S,T,R)"); checkGLcall("glDisable(GL_TEXTURE_GEN_S,T,R,Q)");
break; break;
case D3DTSS_TCI_CAMERASPACEPOSITION: case D3DTSS_TCI_CAMERASPACEPOSITION:
/* CameraSpacePosition means use the vertex position, transformed to camera space, /* CameraSpacePosition means use the vertex position, transformed to camera space,
as the input texture coordinates for this stage's texture transformation. This as the input texture coordinates for this stage's texture transformation. This
equates roughly to EYE_LINEAR */ equates roughly to EYE_LINEAR */
{ {
float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n");
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
glPopMatrix(); glPopMatrix();
TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n"); TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n");
glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_S);
checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_T);
checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_GEN_R);
checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
} }
break; break;
case D3DTSS_TCI_CAMERASPACENORMAL: case D3DTSS_TCI_CAMERASPACENORMAL:
{ {
if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) { if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) {
float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); TRACE("WINED3DTSS_TCI_CAMERASPACENORMAL - Set eye plane\n");
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
glPopMatrix(); glPopMatrix();
glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_S);
checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV);
checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)");
glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_T);
checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV);
checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)");
glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_GEN_R);
checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV);
checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)");
}
} }
} break;
break;
case D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR: case D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR:
{ {
if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) { if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) {
float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); TRACE("WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR - Set eye plane\n");
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
glPopMatrix(); glPopMatrix();
glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_S);
checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV);
checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)");
glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_T);
checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV);
checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)");
glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_GEN_R);
checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV);
checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)");
}
} }
} break;
break;
/* Unhandled types: */ /* Unhandled types: */
default: default:
@ -3961,6 +4008,10 @@ static void WINAPI IWineD3DDeviceImpl_ApplyTextureUnitState(IWineD3DDevice *ifac
return; return;
} }
/*****
* Get / Set Texture Stage States
* TODO: Verify against dx9 definitions
*****/
HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) { HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
@ -4004,6 +4055,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, DWORD Stage,
} }
#endif #endif
/* Reject invalid texture units */
if (Stage >= GL_LIMITS(textures) || Stage < 0) { if (Stage >= GL_LIMITS(textures) || Stage < 0) {
WARN("Attempt to access invalid texture rejected\n"); WARN("Attempt to access invalid texture rejected\n");
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
@ -4047,10 +4099,18 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, DWORD Stage,
HRESULT WINAPI IWineD3DDeviceImpl_GetTexture(IWineD3DDevice *iface, DWORD Stage, IWineD3DBaseTexture** ppTexture) { HRESULT WINAPI IWineD3DDeviceImpl_GetTexture(IWineD3DDevice *iface, DWORD Stage, IWineD3DBaseTexture** ppTexture) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
TRACE("(%p) : returning %p for stage %ld\n", This, This->updateStateBlock->textures[Stage], Stage); TRACE("(%p) : (%ld /* Stage */,%p /* ppTexture */) \n", This, Stage, ppTexture);
*ppTexture = (IWineD3DBaseTexture *) This->updateStateBlock->textures[Stage];
/* Reject invalid texture units */
if (Stage >= GL_LIMITS(textures)) {
TRACE("Attempt to access invalid texture rejected\n");
return D3DERR_INVALIDCALL;
}
*ppTexture=This->updateStateBlock->textures[Stage];
if (*ppTexture) if (*ppTexture)
IWineD3DBaseTexture_AddRef(*ppTexture); IWineD3DBaseTexture_AddRef(*ppTexture);
else
return D3DERR_INVALIDCALL;
return D3D_OK; return D3D_OK;
} }
@ -4058,7 +4118,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetTexture(IWineD3DDevice *iface, DWORD Stage,
* Get Back Buffer * Get Back Buffer
*****/ *****/
HRESULT WINAPI IWineD3DDeviceImpl_GetBackBuffer(IWineD3DDevice *iface, UINT iSwapChain, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, HRESULT WINAPI IWineD3DDeviceImpl_GetBackBuffer(IWineD3DDevice *iface, UINT iSwapChain, UINT BackBuffer, D3DBACKBUFFER_TYPE Type,
IWineD3DSurface** ppBackBuffer) { IWineD3DSurface **ppBackBuffer) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DSwapChain *swapChain; IWineD3DSwapChain *swapChain;
HRESULT hr; HRESULT hr;
@ -4066,10 +4126,10 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetBackBuffer(IWineD3DDevice *iface, UINT iSwa
TRACE("(%p) : BackBuf %d Type %d SwapChain %d returning %p\n", This, BackBuffer, Type, iSwapChain, *ppBackBuffer); TRACE("(%p) : BackBuf %d Type %d SwapChain %d returning %p\n", This, BackBuffer, Type, iSwapChain, *ppBackBuffer);
hr = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, &swapChain); hr = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, &swapChain);
if(hr == D3D_OK) { if (hr == D3D_OK) {
hr = IWineD3DSwapChain_GetBackBuffer(swapChain, BackBuffer, Type, ppBackBuffer); hr = IWineD3DSwapChain_GetBackBuffer(swapChain, BackBuffer, Type, ppBackBuffer);
IWineD3DSwapChain_Release(swapChain); IWineD3DSwapChain_Release(swapChain);
}else{ } else {
*ppBackBuffer = NULL; *ppBackBuffer = NULL;
} }
return hr; return hr;
@ -4090,7 +4150,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetDisplayMode(IWineD3DDevice *iface, UINT iSw
if (hr == D3D_OK) { if (hr == D3D_OK) {
hr = IWineD3DSwapChain_GetDisplayMode(swapChain, pMode); hr = IWineD3DSwapChain_GetDisplayMode(swapChain, pMode);
IWineD3DSwapChain_Release(swapChain); IWineD3DSwapChain_Release(swapChain);
}else{ } else {
FIXME("(%p) Error getting display mode\n", This); FIXME("(%p) Error getting display mode\n", This);
} }
return hr; return hr;
@ -4099,12 +4159,12 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetDisplayMode(IWineD3DDevice *iface, UINT iSw
* Stateblock related functions * Stateblock related functions
*****/ *****/
HRESULT WINAPI IWineD3DDeviceImpl_BeginStateBlock(IWineD3DDevice *iface) { HRESULT WINAPI IWineD3DDeviceImpl_BeginStateBlock(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DStateBlockImpl *object; IWineD3DStateBlockImpl *object;
TRACE("(%p)", This); TRACE("(%p)", This);
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DStateBlockImpl)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DStateBlockImpl));
if(NULL == object ) { if (NULL == object ) {
FIXME("(%p)Error allocating memory for stateblock\n", This); FIXME("(%p)Error allocating memory for stateblock\n", This);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
@ -4188,7 +4248,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_EndScene(IWineD3DDevice *iface) {
HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface, HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface,
CONST RECT* pSourceRect, CONST RECT* pDestRect, CONST RECT* pSourceRect, CONST RECT* pDestRect,
HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion) { HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DSwapChain *swapChain = NULL; IWineD3DSwapChain *swapChain = NULL;
int i; int i;
int swapchains = IWineD3DDeviceImpl_GetNumberOfSwapChains(iface); int swapchains = IWineD3DDeviceImpl_GetNumberOfSwapChains(iface);
@ -4281,7 +4341,8 @@ HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count, CONS
checkGLcall("glScissor"); checkGLcall("glScissor");
} else { } else {
glScissor(This->stateBlock->viewport.X, glScissor(This->stateBlock->viewport.X,
(((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - (This->stateBlock->viewport.Y + This->stateBlock->viewport.Height)), (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height -
(This->stateBlock->viewport.Y + This->stateBlock->viewport.Height)),
This->stateBlock->viewport.Width, This->stateBlock->viewport.Width,
This->stateBlock->viewport.Height); This->stateBlock->viewport.Height);
checkGLcall("glScissor"); checkGLcall("glScissor");
@ -4536,6 +4597,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface, DWORD*
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
/* return a sensible default */ /* return a sensible default */
*pNumPasses = 1; *pNumPasses = 1;
/* TODO: If the window is minimized then validate device shold return something other than d3d_ok */
FIXME("(%p) : stub\n", This); FIXME("(%p) : stub\n", This);
return D3D_OK; return D3D_OK;
} }
@ -4869,6 +4931,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface, IWineD3DSurfa
unsigned int u, v; unsigned int u, v;
DWORD *data; DWORD *data;
TRACE("(%p) Colour fill Surface: %p rect: %p color: %ld\n", This, pSurface, pRect, color); TRACE("(%p) Colour fill Surface: %p rect: %p color: %ld\n", This, pSurface, pRect, color);
if (surface->resource.pool != D3DPOOL_DEFAULT) { if (surface->resource.pool != D3DPOOL_DEFAULT) {
FIXME("call to colorfill with non D3DPOOL_DEFAULT surface\n"); FIXME("call to colorfill with non D3DPOOL_DEFAULT surface\n");
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
@ -5115,6 +5178,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_CleanRender(IWineD3DDevice* iface, IWineD3DSwa
} }
return D3D_OK; return D3D_OK;
} }
/* TODO: move this off into a context manager so that GLX_ATI_render_texture and other types of surface can be used. */ /* TODO: move this off into a context manager so that GLX_ATI_render_texture and other types of surface can be used. */
HRESULT WINAPI IWineD3DDeviceImpl_FindGLContext(IWineD3DDevice *iface, IWineD3DSurface *pSurface, glContext **context) { HRESULT WINAPI IWineD3DDeviceImpl_FindGLContext(IWineD3DDevice *iface, IWineD3DSurface *pSurface, glContext **context) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
@ -5338,7 +5402,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_ActiveRender(IWineD3DDevice* iface,
* In many cases I would expect that we can 'skip' some functions, such as preserving states, * In many cases I would expect that we can 'skip' some functions, such as preserving states,
* and gain a good performance increase at the cost of compatibility. * and gain a good performance increase at the cost of compatibility.
* I would suggest that, when this is the case, a user configurable flag be made * I would suggest that, when this is the case, a user configurable flag be made
* available, allowing the user to choose the best emmulated experience for them. * available, allowing the user to choose the best emulated experience for them.
*********************************************************************/ *********************************************************************/
XVisualInfo *visinfo; XVisualInfo *visinfo;
@ -5823,7 +5887,6 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
IWineD3DDeviceImpl_CreateVertexDeclaration, IWineD3DDeviceImpl_CreateVertexDeclaration,
IWineD3DDeviceImpl_CreateVertexShader, IWineD3DDeviceImpl_CreateVertexShader,
IWineD3DDeviceImpl_CreatePixelShader, IWineD3DDeviceImpl_CreatePixelShader,
/*** Odd functions **/ /*** Odd functions **/
IWineD3DDeviceImpl_EvictManagedResources, IWineD3DDeviceImpl_EvictManagedResources,
IWineD3DDeviceImpl_GetAvailableTextureMem, IWineD3DDeviceImpl_GetAvailableTextureMem,
@ -5933,8 +5996,8 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
IWineD3DDeviceImpl_GetFrontBufferData, IWineD3DDeviceImpl_GetFrontBufferData,
/*** Internal use IWineD3DDevice methods ***/ /*** Internal use IWineD3DDevice methods ***/
IWineD3DDeviceImpl_SetupTextureStates, IWineD3DDeviceImpl_SetupTextureStates,
IWineD3DDeviceImpl_SwapChainReleased,
/*** object tracking ***/ /*** object tracking ***/
IWineD3DDeviceImpl_SwapChainReleased,
IWineD3DDeviceImpl_ResourceReleased IWineD3DDeviceImpl_ResourceReleased
}; };