📄 stateblock.c
字号:
This->renderState[This->contained_render_states[i]]);
}
/* Texture states */
for (i = 0; i < This->num_contained_tss_states; i++) {
DWORD stage = This->contained_tss_states[i].stage;
DWORD state = This->contained_tss_states[i].state;
((IWineD3DDeviceImpl *)pDevice)->stateBlock->textureState[stage][state] = This->textureState[stage][state];
((IWineD3DDeviceImpl *)pDevice)->stateBlock->changed.textureState[stage][state] = TRUE;
/* TODO: Record a display list to apply all gl states. For now apply by brute force */
IWineD3DDeviceImpl_MarkStateDirty((IWineD3DDeviceImpl *)pDevice, STATE_TEXTURESTAGE(stage, state));
}
/* Sampler states */
for (i = 0; i < This->num_contained_sampler_states; i++) {
DWORD stage = This->contained_sampler_states[i].stage;
DWORD state = This->contained_sampler_states[i].state;
((IWineD3DDeviceImpl *)pDevice)->stateBlock->samplerState[stage][state] = This->samplerState[stage][state];
((IWineD3DDeviceImpl *)pDevice)->stateBlock->changed.samplerState[stage][state] = TRUE;
IWineD3DDeviceImpl_MarkStateDirty((IWineD3DDeviceImpl *)pDevice, STATE_SAMPLER(stage));
}
for (i = 0; i < This->num_contained_transform_states; i++) {
IWineD3DDevice_SetTransform(pDevice, This->contained_transform_states[i],
&This->transforms[This->contained_transform_states[i]]);
}
if (This->changed.indices) {
IWineD3DDevice_SetIndices(pDevice, This->pIndexData);
IWineD3DDevice_SetBaseVertexIndex(pDevice, This->baseVertexIndex);
}
if (This->changed.fvf) {
IWineD3DDevice_SetFVF(pDevice, This->fvf);
}
if (This->changed.vertexDecl) {
IWineD3DDevice_SetVertexDeclaration(pDevice, This->vertexDecl);
}
if (This->changed.material ) {
IWineD3DDevice_SetMaterial(pDevice, &This->material);
}
if (This->changed.viewport) {
IWineD3DDevice_SetViewport(pDevice, &This->viewport);
}
if (This->changed.scissorRect) {
IWineD3DDevice_SetScissorRect(pDevice, &This->scissorRect);
}
/* TODO: Proper implementation using SetStreamSource offset (set to 0 for the moment)\n") */
for (i=0; i<MAX_STREAMS; i++) {
if (This->changed.streamSource[i])
IWineD3DDevice_SetStreamSource(pDevice, i, This->streamSource[i], 0, This->streamStride[i]);
if (This->changed.streamFreq[i])
IWineD3DDevice_SetStreamSourceFreq(pDevice, i, This->streamFreq[i] | This->streamFlags[i]);
}
for (j = 0 ; j < MAX_COMBINED_SAMPLERS; j++){
if (This->changed.textures[j]) {
if (j < MAX_FRAGMENT_SAMPLERS) {
IWineD3DDevice_SetTexture(pDevice, j, This->textures[j]);
} else {
IWineD3DDevice_SetTexture(pDevice, WINED3DVERTEXTEXTURESAMPLER0 + j - MAX_FRAGMENT_SAMPLERS, This->textures[j]);
}
}
}
for (i = 0; i < GL_LIMITS(clipplanes); i++) {
if (This->changed.clipplane[i]) {
float clip[4];
clip[0] = This->clipplane[i][0];
clip[1] = This->clipplane[i][1];
clip[2] = This->clipplane[i][2];
clip[3] = This->clipplane[i][3];
IWineD3DDevice_SetClipPlane(pDevice, i, clip);
}
}
} else if(This->blockType == WINED3DSBT_VERTEXSTATE) {
IWineD3DDevice_SetVertexShader(pDevice, This->vertexShader);
for (i = 0; i < GL_LIMITS(vshader_constantsF); i++) {
IWineD3DDevice_SetVertexShaderConstantF(pDevice, i,
This->vertexShaderConstantF + i * 4, 1);
}
for (i = 0; i < MAX_CONST_I; i++) {
IWineD3DDevice_SetVertexShaderConstantI(pDevice, i,
This->vertexShaderConstantI + i * 4, 1);
}
for (i = 0; i < MAX_CONST_B; i++) {
IWineD3DDevice_SetVertexShaderConstantB(pDevice, i,
This->vertexShaderConstantB + i, 1);
}
apply_lights(pDevice, This);
for(i = 0; i < NUM_SAVEDVERTEXSTATES_R; i++) {
IWineD3DDevice_SetRenderState(pDevice, SavedVertexStates_R[i], This->renderState[SavedVertexStates_R[i]]);
}
for(j = 0; j < MAX_TEXTURES; j++) {
for(i = 0; i < NUM_SAVEDVERTEXSTATES_T; i++) {
IWineD3DDevice_SetTextureStageState(pDevice, j, SavedVertexStates_T[i],
This->textureState[j][SavedVertexStates_T[i]]);
}
}
for(j = 0; j < MAX_FRAGMENT_SAMPLERS; j++) {
for(i = 0; i < NUM_SAVEDVERTEXSTATES_S; i++) {
IWineD3DDevice_SetSamplerState(pDevice, j, SavedVertexStates_S[i],
This->samplerState[j][SavedVertexStates_S[i]]);
}
}
for(j = MAX_FRAGMENT_SAMPLERS; j < MAX_COMBINED_SAMPLERS; j++) {
for(i = 0; i < NUM_SAVEDVERTEXSTATES_S; i++) {
IWineD3DDevice_SetSamplerState(pDevice,
WINED3DVERTEXTEXTURESAMPLER0 + j - MAX_FRAGMENT_SAMPLERS,
SavedVertexStates_S[i],
This->samplerState[j][SavedVertexStates_S[i]]);
}
}
} else if(This->blockType == WINED3DSBT_PIXELSTATE) {
IWineD3DDevice_SetPixelShader(pDevice, This->pixelShader);
for (i = 0; i < GL_LIMITS(pshader_constantsF); i++) {
IWineD3DDevice_SetPixelShaderConstantF(pDevice, i,
This->pixelShaderConstantF + i * 4, 1);
}
for (i = 0; i < MAX_CONST_I; i++) {
IWineD3DDevice_SetPixelShaderConstantI(pDevice, i,
This->pixelShaderConstantI + i * 4, 1);
}
for (i = 0; i < MAX_CONST_B; i++) {
IWineD3DDevice_SetPixelShaderConstantB(pDevice, i,
This->pixelShaderConstantB + i, 1);
}
for(i = 0; i < NUM_SAVEDPIXELSTATES_R; i++) {
IWineD3DDevice_SetRenderState(pDevice, SavedPixelStates_R[i], This->renderState[SavedPixelStates_R[i]]);
}
for(j = 0; j < MAX_TEXTURES; j++) {
for(i = 0; i < NUM_SAVEDPIXELSTATES_T; i++) {
IWineD3DDevice_SetTextureStageState(pDevice, j, SavedPixelStates_T[i],
This->textureState[j][SavedPixelStates_T[i]]);
}
}
for(j = 0; j < MAX_FRAGMENT_SAMPLERS; j++) {
for(i = 0; i < NUM_SAVEDPIXELSTATES_S; i++) {
IWineD3DDevice_SetSamplerState(pDevice, j, SavedPixelStates_S[i],
This->samplerState[j][SavedPixelStates_S[i]]);
}
}
for(j = MAX_FRAGMENT_SAMPLERS; j < MAX_COMBINED_SAMPLERS; j++) {
for(i = 0; i < NUM_SAVEDPIXELSTATES_S; i++) {
IWineD3DDevice_SetSamplerState(pDevice,
WINED3DVERTEXTEXTURESAMPLER0 + j - MAX_FRAGMENT_SAMPLERS,
SavedPixelStates_S[i],
This->samplerState[j][SavedPixelStates_S[i]]);
}
}
} else if(This->blockType == WINED3DSBT_ALL) {
IWineD3DDevice_SetVertexShader(pDevice, This->vertexShader);
for (i = 0; i < GL_LIMITS(vshader_constantsF); i++) {
IWineD3DDevice_SetVertexShaderConstantF(pDevice, i,
This->vertexShaderConstantF + i * 4, 1);
}
for (i = 0; i < MAX_CONST_I; i++) {
IWineD3DDevice_SetVertexShaderConstantI(pDevice, i,
This->vertexShaderConstantI + i * 4, 1);
}
for (i = 0; i < MAX_CONST_B; i++) {
IWineD3DDevice_SetVertexShaderConstantB(pDevice, i,
This->vertexShaderConstantB + i, 1);
}
IWineD3DDevice_SetPixelShader(pDevice, This->pixelShader);
for (i = 0; i < GL_LIMITS(pshader_constantsF); i++) {
IWineD3DDevice_SetPixelShaderConstantF(pDevice, i,
This->pixelShaderConstantF + i * 4, 1);
}
for (i = 0; i < MAX_CONST_I; i++) {
IWineD3DDevice_SetPixelShaderConstantI(pDevice, i,
This->pixelShaderConstantI + i * 4, 1);
}
for (i = 0; i < MAX_CONST_B; i++) {
IWineD3DDevice_SetPixelShaderConstantB(pDevice, i,
This->pixelShaderConstantB + i, 1);
}
apply_lights(pDevice, This);
for(i = 1; i <= WINEHIGHEST_RENDER_STATE; i++) {
IWineD3DDevice_SetRenderState(pDevice, i, This->renderState[i]);
}
for(j = 0; j < MAX_TEXTURES; j++) {
for(i = 1; i <= WINED3D_HIGHEST_TEXTURE_STATE; i++) {
IWineD3DDevice_SetTextureStageState(pDevice, j, i, This->textureState[j][i]);
}
}
/* Skip unused values between TEXTURE8 and WORLD0 ? */
for(i = 1; i <= HIGHEST_TRANSFORMSTATE; i++) {
IWineD3DDevice_SetTransform(pDevice, i, &This->transforms[i]);
}
IWineD3DDevice_SetIndices(pDevice, This->pIndexData);
IWineD3DDevice_SetBaseVertexIndex(pDevice, This->baseVertexIndex);
IWineD3DDevice_SetFVF(pDevice, This->fvf);
IWineD3DDevice_SetVertexDeclaration(pDevice, This->vertexDecl);
IWineD3DDevice_SetMaterial(pDevice, &This->material);
IWineD3DDevice_SetViewport(pDevice, &This->viewport);
IWineD3DDevice_SetScissorRect(pDevice, &This->scissorRect);
/* TODO: Proper implementation using SetStreamSource offset (set to 0 for the moment)\n") */
for (i=0; i<MAX_STREAMS; i++) {
IWineD3DDevice_SetStreamSource(pDevice, i, This->streamSource[i], 0, This->streamStride[i]);
IWineD3DDevice_SetStreamSourceFreq(pDevice, i, This->streamFreq[i] | This->streamFlags[i]);
}
for (j = 0 ; j < MAX_COMBINED_SAMPLERS; j++){
UINT sampler = j < MAX_FRAGMENT_SAMPLERS ? j : WINED3DVERTEXTEXTURESAMPLER0 + j - MAX_FRAGMENT_SAMPLERS;
IWineD3DDevice_SetTexture(pDevice, sampler, This->textures[j]);
for(i = 1; i < WINED3D_HIGHEST_SAMPLER_STATE; i++) {
IWineD3DDevice_SetSamplerState(pDevice, sampler, i, This->samplerState[j][i]);
}
}
for (i = 0; i < GL_LIMITS(clipplanes); i++) {
float clip[4];
clip[0] = This->clipplane[i][0];
clip[1] = This->clipplane[i][1];
clip[2] = This->clipplane[i][2];
clip[3] = This->clipplane[i][3];
IWineD3DDevice_SetClipPlane(pDevice, i, clip);
}
}
((IWineD3DDeviceImpl *)pDevice)->stateBlock->lowest_disabled_stage = MAX_TEXTURES - 1;
for(j = 0; j < MAX_TEXTURES - 1; j++) {
if(((IWineD3DDeviceImpl *)pDevice)->stateBlock->textureState[j][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) {
((IWineD3DDeviceImpl *)pDevice)->stateBlock->lowest_disabled_stage = j;
break;
}
}
TRACE("(%p) : Applied state block %p ------------------^\n", This, pDevice);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -