wined3d: Move the functionality of primitiveInitState to the state table.
This commit is contained in:
parent
a48bbc3611
commit
20de200fa3
|
@ -2366,21 +2366,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTransform(IWineD3DDevice *iface, W
|
||||||
/* Capture the times we can just ignore the change for now */
|
/* Capture the times we can just ignore the change for now */
|
||||||
if (d3dts == WINED3DTS_WORLDMATRIX(0)) {
|
if (d3dts == WINED3DTS_WORLDMATRIX(0)) {
|
||||||
This->modelview_valid = FALSE;
|
This->modelview_valid = FALSE;
|
||||||
return WINED3D_OK;
|
|
||||||
|
|
||||||
} else if (d3dts == WINED3DTS_PROJECTION) {
|
|
||||||
This->proj_valid = FALSE;
|
|
||||||
return WINED3D_OK;
|
|
||||||
|
|
||||||
} else if (d3dts >= WINED3DTS_WORLDMATRIX(1) && d3dts <= WINED3DTS_WORLDMATRIX(255)) {
|
|
||||||
/* Indexed Vertex Blending Matrices 256 -> 511 */
|
|
||||||
/* Use arb_vertex_blend or NV_VERTEX_WEIGHTING? */
|
|
||||||
FIXME("WINED3DTS_WORLDMATRIX(1..255) not handled\n");
|
|
||||||
return WINED3D_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d3dts >= WINED3DTS_TEXTURE0 && d3dts <= WINED3DTS_TEXTURE7) { /* handle texture matrices */
|
|
||||||
/* This is now set with the texture unit states, it may be a good idea to flag the change though! */
|
|
||||||
} else if (d3dts == WINED3DTS_VIEW) { /* handle the VIEW matrice */
|
} else if (d3dts == WINED3DTS_VIEW) { /* handle the VIEW matrice */
|
||||||
This->view_ident = !memcmp(lpmatrix, identity, 16 * sizeof(float));
|
This->view_ident = !memcmp(lpmatrix, identity, 16 * sizeof(float));
|
||||||
/* Handled by the state manager */
|
/* Handled by the state manager */
|
||||||
|
|
|
@ -227,116 +227,6 @@ void d3ddevice_set_ortho(IWineD3DDeviceImpl *This) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Setup views - Transformed & lit if RHW, else untransformed.
|
|
||||||
Only unlit if Normals are supplied
|
|
||||||
Returns: Whether to restore lighting afterwards */
|
|
||||||
static void primitiveInitState(
|
|
||||||
IWineD3DDevice *iface,
|
|
||||||
WineDirect3DVertexStridedData* strided,
|
|
||||||
BOOL useVS,
|
|
||||||
BOOL* lighting_changed,
|
|
||||||
BOOL* lighting_original) {
|
|
||||||
|
|
||||||
BOOL fixed_vtx_transformed =
|
|
||||||
(strided->u.s.position.lpData != NULL || strided->u.s.position.VBO != 0 ||
|
|
||||||
strided->u.s.position2.lpData != NULL || strided->u.s.position2.VBO != 0) &&
|
|
||||||
strided->u.s.position_transformed;
|
|
||||||
|
|
||||||
BOOL fixed_vtx_lit =
|
|
||||||
strided->u.s.normal.lpData == NULL && strided->u.s.normal.VBO == 0 &&
|
|
||||||
strided->u.s.normal2.lpData == NULL && strided->u.s.normal2.VBO == 0;
|
|
||||||
|
|
||||||
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
|
|
||||||
|
|
||||||
*lighting_changed = FALSE;
|
|
||||||
|
|
||||||
/* If no normals, DISABLE lighting otherwise, don't touch lighing as it is
|
|
||||||
set by the appropriate render state. Note Vertex Shader output is already lit */
|
|
||||||
if (fixed_vtx_lit || useVS) {
|
|
||||||
*lighting_changed = TRUE;
|
|
||||||
*lighting_original = glIsEnabled(GL_LIGHTING);
|
|
||||||
glDisable(GL_LIGHTING);
|
|
||||||
checkGLcall("glDisable(GL_LIGHTING);");
|
|
||||||
TRACE("Disabled lighting, old state = %d\n", *lighting_original);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!useVS && fixed_vtx_transformed) {
|
|
||||||
d3ddevice_set_ortho(This);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
/* Untransformed, so relies on the view and projection matrices */
|
|
||||||
This->untransformed = TRUE;
|
|
||||||
|
|
||||||
if (!useVS && (This->last_was_rhw || !This->modelview_valid)) {
|
|
||||||
/* Only reapply when have to */
|
|
||||||
This->modelview_valid = TRUE;
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
checkGLcall("glMatrixMode");
|
|
||||||
|
|
||||||
/* In the general case, the view matrix is the identity matrix */
|
|
||||||
if (This->view_ident) {
|
|
||||||
glLoadMatrixf((float *) &This->stateBlock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
|
|
||||||
checkGLcall("glLoadMatrixf");
|
|
||||||
} else {
|
|
||||||
glLoadMatrixf((float *) &This->stateBlock->transforms[WINED3DTS_VIEW].u.m[0][0]);
|
|
||||||
checkGLcall("glLoadMatrixf");
|
|
||||||
glMultMatrixf((float *) &This->stateBlock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
|
|
||||||
checkGLcall("glMultMatrixf");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!useVS && (This->last_was_rhw || !This->proj_valid)) {
|
|
||||||
/* Only reapply when have to */
|
|
||||||
This->proj_valid = TRUE;
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
checkGLcall("glMatrixMode");
|
|
||||||
|
|
||||||
/* The rule is that the window coordinate 0 does not correspond to the
|
|
||||||
beginning of the first pixel, but the center of the first pixel.
|
|
||||||
As a consequence if you want to correctly draw one line exactly from
|
|
||||||
the left to the right end of the viewport (with all matrices set to
|
|
||||||
be identity), the x coords of both ends of the line would be not
|
|
||||||
-1 and 1 respectively but (-1-1/viewport_widh) and (1-1/viewport_width)
|
|
||||||
instead. */
|
|
||||||
glLoadIdentity();
|
|
||||||
|
|
||||||
glTranslatef(0.9 / This->stateBlock->viewport.Width, -0.9 / This->stateBlock->viewport.Height, 0);
|
|
||||||
checkGLcall("glTranslatef (0.9 / width, -0.9 / height, 0)");
|
|
||||||
|
|
||||||
/* D3D texture coordinates are flipped compared to OpenGL ones, so
|
|
||||||
* render everything upside down when rendering offscreen. */
|
|
||||||
if (This->render_offscreen) {
|
|
||||||
glMultMatrixf(invymat);
|
|
||||||
checkGLcall("glMultMatrixf(invymat)");
|
|
||||||
}
|
|
||||||
glMultMatrixf((float *) &This->stateBlock->transforms[WINED3DTS_PROJECTION].u.m[0][0]);
|
|
||||||
checkGLcall("glLoadMatrixf");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Vertex Shader output is already transformed, so set up identity matrices */
|
|
||||||
if (useVS) {
|
|
||||||
This->posFixup[1] = This->render_offscreen ? -1.0 : 1.0;
|
|
||||||
This->posFixup[2] = 0.9 / This->stateBlock->viewport.Width;
|
|
||||||
This->posFixup[3] = -0.9 / This->stateBlock->viewport.Height;
|
|
||||||
}
|
|
||||||
This->last_was_rhw = FALSE;
|
|
||||||
|
|
||||||
/* Setup fogging */
|
|
||||||
if (useVS && ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->usesFog) {
|
|
||||||
/* In D3D vertex shader return the 'final' fog value, while in OpenGL it is the 'input' fog value.
|
|
||||||
* The code below 'disables' the OpenGL postprocessing by setting the formula to '1'. */
|
|
||||||
glFogi(GL_FOG_MODE, GL_LINEAR);
|
|
||||||
glFogf(GL_FOG_START, 1.0f);
|
|
||||||
glFogf(GL_FOG_END, 0.0f);
|
|
||||||
|
|
||||||
} else if(This->stateBlock->renderState[WINED3DRS_FOGENABLE]
|
|
||||||
&& This->stateBlock->renderState[WINED3DRS_FOGVERTEXMODE] != WINED3DFOG_NONE) {
|
|
||||||
/* Reapply the fog */
|
|
||||||
StateTable[STATE_RENDER(WINED3DRS_FOGENABLE)].apply(STATE_RENDER(WINED3DRS_FOGSTART), This->stateBlock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL fixed_get_input(
|
static BOOL fixed_get_input(
|
||||||
BYTE usage, BYTE usage_idx,
|
BYTE usage, BYTE usage_idx,
|
||||||
|
@ -1947,11 +1837,9 @@ void drawPrimitive(IWineD3DDevice *iface,
|
||||||
DWORD dirtyState, idx;
|
DWORD dirtyState, idx;
|
||||||
BYTE shift;
|
BYTE shift;
|
||||||
|
|
||||||
BOOL lighting_changed, lighting_original = FALSE;
|
/* Shaders can be implemented using ARB_PROGRAM, GLSL, or software -
|
||||||
|
|
||||||
/* Shaders can be implemented using ARB_PROGRAM, GLSL, or software -
|
|
||||||
* here simply check whether a shader was set, or the user disabled shaders */
|
* here simply check whether a shader was set, or the user disabled shaders */
|
||||||
if (This->vs_selected_mode != SHADER_NONE && This->stateBlock->vertexShader &&
|
if (This->vs_selected_mode != SHADER_NONE && This->stateBlock->vertexShader &&
|
||||||
((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.function != NULL)
|
((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.function != NULL)
|
||||||
useVertexShaderFunction = TRUE;
|
useVertexShaderFunction = TRUE;
|
||||||
|
|
||||||
|
@ -1991,9 +1879,6 @@ void drawPrimitive(IWineD3DDevice *iface,
|
||||||
}
|
}
|
||||||
This->depth_copy_state = WINED3D_DCS_INITIAL;
|
This->depth_copy_state = WINED3D_DCS_INITIAL;
|
||||||
|
|
||||||
/* Setup transform matrices and sort out */
|
|
||||||
primitiveInitState(iface, &This->strided_streams, useVertexShaderFunction, &lighting_changed, &lighting_original);
|
|
||||||
|
|
||||||
/* Now initialize the materials state */
|
/* Now initialize the materials state */
|
||||||
init_materials(iface, (This->strided_streams.u.s.diffuse.lpData != NULL || This->strided_streams.u.s.diffuse.VBO != 0));
|
init_materials(iface, (This->strided_streams.u.s.diffuse.lpData != NULL || This->strided_streams.u.s.diffuse.VBO != 0));
|
||||||
|
|
||||||
|
@ -2010,13 +1895,6 @@ void drawPrimitive(IWineD3DDevice *iface,
|
||||||
idxData, idxSize, minIndex, StartIdx, fixup);
|
idxData, idxSize, minIndex, StartIdx, fixup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If vertex shaders or no normals, restore previous lighting state */
|
|
||||||
if (lighting_changed) {
|
|
||||||
if (lighting_original) glEnable(GL_LIGHTING);
|
|
||||||
else glDisable(GL_LIGHTING);
|
|
||||||
TRACE("Restored lighting to original state\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Finshed updating the screen, restore lock */
|
/* Finshed updating the screen, restore lock */
|
||||||
LEAVE_GL();
|
LEAVE_GL();
|
||||||
TRACE("Done all gl drawing\n");
|
TRACE("Done all gl drawing\n");
|
||||||
|
|
|
@ -71,6 +71,8 @@ static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* if 0ed because it will be revived later */
|
||||||
static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
|
|
||||||
/* TODO: Lighting is only enabled if Vertex normals are passed by the application,
|
/* TODO: Lighting is only enabled if Vertex normals are passed by the application,
|
||||||
|
@ -85,6 +87,7 @@ static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
checkGLcall("glDisable GL_LIGHTING");
|
checkGLcall("glDisable GL_LIGHTING");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
switch ((WINED3DZBUFFERTYPE) stateblock->renderState[WINED3DRS_ZENABLE]) {
|
switch ((WINED3DZBUFFERTYPE) stateblock->renderState[WINED3DRS_ZENABLE]) {
|
||||||
|
@ -646,7 +649,6 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
tmpvalue.d = stateblock->renderState[WINED3DRS_FOGEND];
|
tmpvalue.d = stateblock->renderState[WINED3DRS_FOGEND];
|
||||||
fogend = tmpvalue.f;
|
fogend = tmpvalue.f;
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* Activate when vertex shaders are in the state table */
|
/* Activate when vertex shaders are in the state table */
|
||||||
if(stateblock->vertexShader && ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function &&
|
if(stateblock->vertexShader && ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function &&
|
||||||
((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->usesFog) {
|
((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->usesFog) {
|
||||||
|
@ -656,17 +658,14 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
fogend = 0.0;
|
fogend = 0.0;
|
||||||
stateblock->wineD3DDevice->last_was_foggy_shader = TRUE;
|
stateblock->wineD3DDevice->last_was_foggy_shader = TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes,
|
/* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes,
|
||||||
* the system will apply only pixel(=table) fog effects."
|
* the system will apply only pixel(=table) fog effects."
|
||||||
*/
|
*/
|
||||||
/* else */ if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] == D3DFOG_NONE) {
|
else if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] == D3DFOG_NONE) {
|
||||||
glHint(GL_FOG_HINT, GL_FASTEST);
|
glHint(GL_FOG_HINT, GL_FASTEST);
|
||||||
checkGLcall("glHint(GL_FOG_HINT, GL_FASTEST)");
|
checkGLcall("glHint(GL_FOG_HINT, GL_FASTEST)");
|
||||||
#if 0
|
|
||||||
stateblock->wineD3DDevice->last_was_foggy_shader = FALSE;
|
stateblock->wineD3DDevice->last_was_foggy_shader = FALSE;
|
||||||
#endif
|
|
||||||
switch (stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) {
|
switch (stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) {
|
||||||
/* Processed vertices have their fog factor stored in the specular value. Fall too the none case.
|
/* Processed vertices have their fog factor stored in the specular value. Fall too the none case.
|
||||||
* If we are drawing untransformed vertices atm, d3ddevice_set_ortho will update the fog
|
* If we are drawing untransformed vertices atm, d3ddevice_set_ortho will update the fog
|
||||||
|
@ -727,9 +726,8 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
} else {
|
} else {
|
||||||
glHint(GL_FOG_HINT, GL_NICEST);
|
glHint(GL_FOG_HINT, GL_NICEST);
|
||||||
checkGLcall("glHint(GL_FOG_HINT, GL_NICEST)");
|
checkGLcall("glHint(GL_FOG_HINT, GL_NICEST)");
|
||||||
#if 0
|
|
||||||
stateblock->wineD3DDevice->last_was_foggy_shader = FALSE;
|
stateblock->wineD3DDevice->last_was_foggy_shader = FALSE;
|
||||||
#endif
|
|
||||||
switch (stateblock->renderState[WINED3DRS_FOGTABLEMODE]) {
|
switch (stateblock->renderState[WINED3DRS_FOGTABLEMODE]) {
|
||||||
case D3DFOG_EXP:
|
case D3DFOG_EXP:
|
||||||
glFogi(GL_FOG_MODE, GL_EXP);
|
glFogi(GL_FOG_MODE, GL_EXP);
|
||||||
|
@ -1851,29 +1849,48 @@ static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
checkGLcall("glPopMatrix()");
|
checkGLcall("glPopMatrix()");
|
||||||
|
|
||||||
|
/* Call the vdecl update. Will be tidied up later */
|
||||||
|
StateTable[STATE_VDECL].apply(STATE_VDECL, stateblock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateBlock) {
|
static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateBlock) {
|
||||||
WARN("World matrix 1 - 255 not supported yet\n");
|
WARN("World matrix 1 - 255 not supported yet\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const GLfloat invymat[16] = {
|
||||||
|
1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, -1.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
BOOL useVertexShaderFunction = FALSE;
|
BOOL useVertexShaderFunction = FALSE, updateFog = FALSE;
|
||||||
stateblock->wineD3DDevice->streamFixedUp = FALSE;
|
BOOL transformed, lit;
|
||||||
|
/* Some stuff is in the device until we have per context tracking */
|
||||||
/* Shaders can be implemented using ARB_PROGRAM, GLSL, or software -
|
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
|
||||||
|
|
||||||
|
device->streamFixedUp = FALSE;
|
||||||
|
|
||||||
|
/* Shaders can be implemented using ARB_PROGRAM, GLSL, or software -
|
||||||
* here simply check whether a shader was set, or the user disabled shaders
|
* here simply check whether a shader was set, or the user disabled shaders
|
||||||
*/
|
*/
|
||||||
if (stateblock->wineD3DDevice->vs_selected_mode != SHADER_NONE && stateblock->vertexShader &&
|
if (device->vs_selected_mode != SHADER_NONE && stateblock->vertexShader &&
|
||||||
((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function != NULL)
|
((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function != NULL) {
|
||||||
useVertexShaderFunction = TRUE;
|
useVertexShaderFunction = TRUE;
|
||||||
|
|
||||||
if(stateblock->wineD3DDevice->up_strided) {
|
if(((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->usesFog != device->last_was_foggy_shader) {
|
||||||
|
updateFog = TRUE;
|
||||||
|
}
|
||||||
|
} else if(device->last_was_foggy_shader) {
|
||||||
|
updateFog = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(device->up_strided) {
|
||||||
|
|
||||||
/* Note: this is a ddraw fixed-function code path */
|
/* Note: this is a ddraw fixed-function code path */
|
||||||
TRACE("================ Strided Input ===================\n");
|
TRACE("================ Strided Input ===================\n");
|
||||||
memcpy(&stateblock->wineD3DDevice->strided_streams, stateblock->wineD3DDevice->up_strided, sizeof(stateblock->wineD3DDevice->strided_streams));
|
memcpy(&device->strided_streams, device->up_strided, sizeof(device->strided_streams));
|
||||||
stateblock->wineD3DDevice->streamFixedUp = FALSE;
|
|
||||||
}
|
}
|
||||||
else if (stateblock->vertexDecl || stateblock->vertexShader) {
|
else if (stateblock->vertexDecl || stateblock->vertexShader) {
|
||||||
/* Note: This is a fixed function or shader codepath.
|
/* Note: This is a fixed function or shader codepath.
|
||||||
|
@ -1882,13 +1899,13 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
* don't set any declaration at all
|
* don't set any declaration at all
|
||||||
*/
|
*/
|
||||||
TRACE("================ Vertex Declaration ===================\n");
|
TRACE("================ Vertex Declaration ===================\n");
|
||||||
memset(&stateblock->wineD3DDevice->strided_streams, 0, sizeof(stateblock->wineD3DDevice->strided_streams));
|
memset(&device->strided_streams, 0, sizeof(device->strided_streams));
|
||||||
|
|
||||||
if (stateblock->vertexDecl != NULL ||
|
if (stateblock->vertexDecl != NULL ||
|
||||||
((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->vertexDeclaration != NULL) {
|
((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->vertexDeclaration != NULL) {
|
||||||
|
|
||||||
primitiveDeclarationConvertToStridedData((IWineD3DDevice *) stateblock->wineD3DDevice, useVertexShaderFunction,
|
primitiveDeclarationConvertToStridedData((IWineD3DDevice *) device, useVertexShaderFunction,
|
||||||
&stateblock->wineD3DDevice->strided_streams, &stateblock->wineD3DDevice->streamFixedUp);
|
&device->strided_streams, &device->streamFixedUp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Note: This codepath is not reachable from d3d9 (see fvf->decl9 conversion)
|
/* Note: This codepath is not reachable from d3d9 (see fvf->decl9 conversion)
|
||||||
|
@ -1896,10 +1913,97 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock) {
|
||||||
* It will not work properly for shaders.
|
* It will not work properly for shaders.
|
||||||
*/
|
*/
|
||||||
TRACE("================ FVF ===================\n");
|
TRACE("================ FVF ===================\n");
|
||||||
memset(&stateblock->wineD3DDevice->strided_streams, 0, sizeof(stateblock->wineD3DDevice->strided_streams));
|
memset(&device->strided_streams, 0, sizeof(device->strided_streams));
|
||||||
primitiveConvertToStridedData((IWineD3DDevice *) stateblock->wineD3DDevice, &stateblock->wineD3DDevice->strided_streams,
|
primitiveConvertToStridedData((IWineD3DDevice *) device, &device->strided_streams,
|
||||||
&stateblock->wineD3DDevice->streamFixedUp);
|
&device->streamFixedUp);
|
||||||
}
|
}
|
||||||
|
/* Do I have to use ? TRUE : FALSE ? Or can I rely on 15==15 beeing equal to TRUE(=1)? */
|
||||||
|
transformed = ((device->strided_streams.u.s.position.lpData != NULL ||
|
||||||
|
device->strided_streams.u.s.position.VBO != 0) &&
|
||||||
|
device->strided_streams.u.s.position_transformed) ? TRUE : FALSE;
|
||||||
|
lit = device->strided_streams.u.s.normal.lpData == NULL &&
|
||||||
|
device->strided_streams.u.s.normal.VBO == 0;
|
||||||
|
|
||||||
|
if(transformed != device->last_was_rhw && !useVertexShaderFunction) {
|
||||||
|
updateFog = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: The vertex declaration changes lighting, but lighting doesn't affect the vertex declaration and the
|
||||||
|
* stream sources. This can be handled nicer
|
||||||
|
*/
|
||||||
|
if(stateblock->renderState[WINED3DRS_LIGHTING] && !lit) {
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
checkGLcall("glEnable(GL_LIGHTING)");
|
||||||
|
} else {
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
checkGLcall("glDisable(GL_LIGHTING");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!useVertexShaderFunction && transformed) {
|
||||||
|
d3ddevice_set_ortho(device);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* Untransformed, so relies on the view and projection matrices */
|
||||||
|
device->untransformed = TRUE;
|
||||||
|
|
||||||
|
if (!useVertexShaderFunction) {
|
||||||
|
device->modelview_valid = TRUE;
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
checkGLcall("glMatrixMode");
|
||||||
|
|
||||||
|
/* In the general case, the view matrix is the identity matrix */
|
||||||
|
if (device->view_ident) {
|
||||||
|
glLoadMatrixf((float *) &stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
|
||||||
|
checkGLcall("glLoadMatrixf");
|
||||||
|
} else {
|
||||||
|
glLoadMatrixf((float *) &stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
|
||||||
|
checkGLcall("glLoadMatrixf");
|
||||||
|
glMultMatrixf((float *) &stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
|
||||||
|
checkGLcall("glMultMatrixf");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!useVertexShaderFunction) {
|
||||||
|
device->proj_valid = TRUE;
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
checkGLcall("glMatrixMode");
|
||||||
|
|
||||||
|
/* The rule is that the window coordinate 0 does not correspond to the
|
||||||
|
beginning of the first pixel, but the center of the first pixel.
|
||||||
|
As a consequence if you want to correctly draw one line exactly from
|
||||||
|
the left to the right end of the viewport (with all matrices set to
|
||||||
|
be identity), the x coords of both ends of the line would be not
|
||||||
|
-1 and 1 respectively but (-1-1/viewport_widh) and (1-1/viewport_width)
|
||||||
|
instead. */
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
glTranslatef(0.9 / stateblock->viewport.Width, -0.9 / stateblock->viewport.Height, 0);
|
||||||
|
checkGLcall("glTranslatef (0.9 / width, -0.9 / height, 0)");
|
||||||
|
|
||||||
|
/* D3D texture coordinates are flipped compared to OpenGL ones, so
|
||||||
|
* render everything upside down when rendering offscreen. */
|
||||||
|
if (device->render_offscreen) {
|
||||||
|
glMultMatrixf(invymat);
|
||||||
|
checkGLcall("glMultMatrixf(invymat)");
|
||||||
|
}
|
||||||
|
glMultMatrixf((float *) &stateblock->transforms[WINED3DTS_PROJECTION].u.m[0][0]);
|
||||||
|
checkGLcall("glLoadMatrixf");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vertex Shader output is already transformed, so set up identity matrices */
|
||||||
|
if (useVertexShaderFunction) {
|
||||||
|
device->posFixup[1] = device->render_offscreen ? -1.0 : 1.0;
|
||||||
|
device->posFixup[2] = 0.9 / stateblock->viewport.Width;
|
||||||
|
device->posFixup[3] = -0.9 / stateblock->viewport.Height;
|
||||||
|
}
|
||||||
|
device->last_was_rhw = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup fogging */
|
||||||
|
if(updateFog) {
|
||||||
|
state_fog(STATE_RENDER(WINED3DRS_FOGENABLE), stateblock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct StateEntry StateTable[] =
|
const struct StateEntry StateTable[] =
|
||||||
|
@ -2043,7 +2147,7 @@ const struct StateEntry StateTable[] =
|
||||||
{ /*134, WINED3DRS_WRAP6 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
|
{ /*134, WINED3DRS_WRAP6 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
|
||||||
{ /*135, WINED3DRS_WRAP7 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
|
{ /*135, WINED3DRS_WRAP7 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
|
||||||
{ /*136, WINED3DRS_CLIPPING */ STATE_RENDER(WINED3DRS_CLIPPING), state_clipping },
|
{ /*136, WINED3DRS_CLIPPING */ STATE_RENDER(WINED3DRS_CLIPPING), state_clipping },
|
||||||
{ /*137, WINED3DRS_LIGHTING */ STATE_RENDER(WINED3DRS_LIGHTING) /* Vertex decl! */,state_lighting },
|
{ /*137, WINED3DRS_LIGHTING */ STATE_VDECL, vertexdeclaration },
|
||||||
{ /*138, WINED3DRS_EXTENTS */ STATE_RENDER(WINED3DRS_EXTENTS), state_extents },
|
{ /*138, WINED3DRS_EXTENTS */ STATE_RENDER(WINED3DRS_EXTENTS), state_extents },
|
||||||
{ /*139, WINED3DRS_AMBIENT */ STATE_RENDER(WINED3DRS_AMBIENT), state_ambient },
|
{ /*139, WINED3DRS_AMBIENT */ STATE_RENDER(WINED3DRS_AMBIENT), state_ambient },
|
||||||
{ /*140, WINED3DRS_FOGVERTEXMODE */ STATE_RENDER(WINED3DRS_FOGENABLE), state_fog },
|
{ /*140, WINED3DRS_FOGVERTEXMODE */ STATE_RENDER(WINED3DRS_FOGENABLE), state_fog },
|
||||||
|
@ -2404,7 +2508,7 @@ const struct StateEntry StateTable[] =
|
||||||
/* Transform states follow */
|
/* Transform states follow */
|
||||||
{ /* 1, undefined */ 0, state_undefined },
|
{ /* 1, undefined */ 0, state_undefined },
|
||||||
{ /* 2, WINED3DTS_VIEW */ STATE_TRANSFORM(WINED3DTS_VIEW), transform_view },
|
{ /* 2, WINED3DTS_VIEW */ STATE_TRANSFORM(WINED3DTS_VIEW), transform_view },
|
||||||
{ /* 3, WINED3DTS_PROJECTION */ STATE_TRANSFORM(WINED3DTS_PROJECTION), state_undefined },
|
{ /* 3, WINED3DTS_PROJECTION */ STATE_VDECL, vertexdeclaration },
|
||||||
{ /* 4, undefined */ 0, state_undefined },
|
{ /* 4, undefined */ 0, state_undefined },
|
||||||
{ /* 5, undefined */ 0, state_undefined },
|
{ /* 5, undefined */ 0, state_undefined },
|
||||||
{ /* 6, undefined */ 0, state_undefined },
|
{ /* 6, undefined */ 0, state_undefined },
|
||||||
|
@ -2659,7 +2763,7 @@ const struct StateEntry StateTable[] =
|
||||||
{ /*254, undefined */ 0, state_undefined },
|
{ /*254, undefined */ 0, state_undefined },
|
||||||
{ /*255, undefined */ 0, state_undefined },
|
{ /*255, undefined */ 0, state_undefined },
|
||||||
/* End huge gap */
|
/* End huge gap */
|
||||||
{ /*256, WINED3DTS_WORLDMATRIX(0) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), state_undefined },
|
{ /*256, WINED3DTS_WORLDMATRIX(0) */ STATE_VDECL, vertexdeclaration },
|
||||||
{ /*257, WINED3DTS_WORLDMATRIX(1) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(1)), transform_worldex },
|
{ /*257, WINED3DTS_WORLDMATRIX(1) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(1)), transform_worldex },
|
||||||
{ /*258, WINED3DTS_WORLDMATRIX(2) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(2)), transform_worldex },
|
{ /*258, WINED3DTS_WORLDMATRIX(2) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(2)), transform_worldex },
|
||||||
{ /*259, WINED3DTS_WORLDMATRIX(3) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(3)), transform_worldex },
|
{ /*259, WINED3DTS_WORLDMATRIX(3) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(3)), transform_worldex },
|
||||||
|
|
|
@ -581,6 +581,7 @@ typedef struct IWineD3DDeviceImpl
|
||||||
BOOL last_was_notclipped;
|
BOOL last_was_notclipped;
|
||||||
BOOL untransformed;
|
BOOL untransformed;
|
||||||
BOOL last_was_pshader;
|
BOOL last_was_pshader;
|
||||||
|
BOOL last_was_foggy_shader;
|
||||||
|
|
||||||
/* State block related */
|
/* State block related */
|
||||||
BOOL isRecordingState;
|
BOOL isRecordingState;
|
||||||
|
|
Loading…
Reference in New Issue