wined3d: Fixed render states
Vitaly Budovski
vbudovsk at cs.rmit.edu.au
Tue Jan 31 06:36:18 CST 2006
wined3d: Fixed up render states POINTSCALEENABLE, POINTSPRITENABLE,
EDGEANTIALIAS, MULTISAMPLEANTIALIAS
*---*
dlls/wined3d/device.c | 132 +++++++++++++++++++++++++++++++------------------
1 files changed, 83 insertions(+), 49 deletions(-)
*73c8e223a3401d0a82c8839833fbd615e4b2350e*
*diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c*
index 2ffeb1a..535b0b9 100644
*--- a/dlls/wined3d/device.c*
*+++ b/dlls/wined3d/device.c*
@@ -3495,35 +3495,38 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRen
case WINED3DRS_POINTSCALE_B :
case WINED3DRS_POINTSCALE_C :
case WINED3DRS_POINTSCALEENABLE :
- {
- /* If enabled, supply the parameters, otherwise fall back to defaults */
- if (This->stateBlock->renderState[WINED3DRS_POINTSCALEENABLE]) {
- GLfloat att[3] = {1.0f, 0.0f, 0.0f};
- /* TODO: Correct the scaling (this hack seems to be good enough for every demo that uses point sprites!) */
- att[0] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_A])/ This->stateBlock->viewport.Width;
- att[1] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_B])/ This->stateBlock->viewport.Height;
- att[2] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_C]) *
- 2.0f /(This->stateBlock->viewport.Width * This->stateBlock->viewport.Height);
-
- if (GL_SUPPORT(EXT_POINT_PARAMETERS)) {
- TRACE("glPointParameterfvARB %f %f %f\n", att[0], att[1], att[2]);
- GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att);
- checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);");
- } else {
- TRACE("WINED3DRS_POINTSCALEENABLE not supported on this opengl\n");
- }
- } else {
- GLfloat att[3] = {1.0f, 0.0f, 0.0f};
- if (GL_SUPPORT(EXT_POINT_PARAMETERS)) {
- GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att);
- checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);");
- } else {
- TRACE("WINED3DRS_POINTSCALEENABLE not supported, but not on either\n");
- }
- }
- break;
+ {
+ /*
+ * POINTSCALEENABLE controls how point size value is treated. If set to
+ * true, the point size is scaled with repsect to height of viewport.
+ * When set to false point size is in pixels.
+ *
+ * http://msdn.microsoft.com/library/en-us/directx9_c/point_sprites.asp
+ */
+
+ /* Default values */
+ GLfloat att[3] = {1.0f, 0.0f, 0.0f};
+ if(This->stateBlock->renderState[D3DRS_POINTSCALEENABLE]) {
+ att[0] = *((float*)&This->stateBlock->renderState[D3DRS_POINTSCALE_A]) /
+ (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height);
+ att[1] = *((float*)&This->stateBlock->renderState[D3DRS_POINTSCALE_B]) /
+ (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height);
+ att[2] = *((float*)&This->stateBlock->renderState[D3DRS_POINTSCALE_C]) /
+ (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height);
+ }
+
+ if(GL_SUPPORT(ARB_POINT_PARAMETERS)) {
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, att);
+ checkGLcall("glPointParameterfvARB(GL_DISTANCE_ATTENUATION_ARB, ...");
+ }
+ else if(GL_SUPPORT(EXT_POINT_PARAMETERS)) {
+ GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att);
+ checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...");
+ } else {
+ TRACE("POINT_PARAMETERS not supported in this version of opengl\n");
}
-
+ break;
+ }
case WINED3DRS_COLORWRITEENABLE :
{
TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n",
@@ -3574,30 +3577,46 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRen
return D3DERR_INVALIDCALL;
}
case WINED3DRS_POINTSPRITEENABLE :
+ {
/* TODO: NV_POINT_SPRITE */
- if (GL_SUPPORT(ARB_POINT_SPRITE)) {
- if (Value != FALSE) {
- /* Doesn't work with GL_POINT_SMOOTH on on my ATI 9600, but then ATI drivers are buggered! */
- glDisable(GL_POINT_SMOOTH);
- /* Centre the texture on the vertex */
- VTRACE("glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)\n");
- glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
-
- VTRACE("glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)\n");
- glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
- checkGLcall("glTexEnvf(...)");
- VTRACE("glEnable( GL_POINT_SPRITE_ARB )\n");
- glEnable( GL_POINT_SPRITE_ARB );
- checkGLcall("glEnable(...)");
- } else {
- VTRACE("glDisable( GL_POINT_SPRITE_ARB )\n");
- glDisable( GL_POINT_SPRITE_ARB );
- checkGLcall("glEnable(...)");
- }
+ if (!GL_SUPPORT(ARB_POINT_SPRITE)) {
+ TRACE("Point sprites not supported\n");
+ break;
}
- break;
- /* Unhandled yet...! */
+
+ /*
+ * Point sprites are always enabled. Value controls texture coordinate
+ * replacement mode. Must be set true for point sprites to use
+ * textures.
+ */
+ glEnable(GL_POINT_SPRITE_ARB);
+ checkGLcall("glEnable(GL_POINT_SPRITE_ARB)");
+
+ if (Value) {
+ glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, TRUE);
+ checkGLcall("glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, TRUE)");
+ } else {
+ glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, FALSE);
+ checkGLcall("glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, FALSE)");
+ }
+ break;
+ }
case WINED3DRS_EDGEANTIALIAS :
+ {
+ if(Value) {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ checkGLcall("glEnable(GL_BLEND)");
+ glEnable(GL_LINE_SMOOTH);
+ checkGLcall("glEnable(Gl_LINE_SMOOTH)");
+ } else {
+ glDisable(GL_BLEND);
+ checkGLcall("glDisable(GL_BLEND)");
+ glDisable(GL_LINE_SMOOTH);
+ checkGLcall("glDisable(Gl_LINE_SMOOTH)");
+ }
+ break;
+ }
case WINED3DRS_WRAP0 :
case WINED3DRS_WRAP1 :
case WINED3DRS_WRAP2 :
@@ -3618,6 +3637,21 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRen
TRACE("(%p)->(%d,%ld) Texture wraping not yet supported\n",This, State, Value);
break;
case WINED3DRS_MULTISAMPLEANTIALIAS :
+ {
+ if (!GL_SUPPORT(ARB_MULTISAMPLE)) {
+ TRACE("Multisample antialiasing not supported\n");
+ break;
+ }
+
+ if(Value) {
+ glEnable(GL_MULTISAMPLE_ARB);
+ checkGLcall("glEnable(GL_MULTISAMPLE_ARB)");
+ } else {
+ glDisable(GL_MULTISAMPLE_ARB);
+ checkGLcall("glDisable(GL_MULTISAMPLE_ARB)");
+ }
+ break;
+ }
case WINED3DRS_MULTISAMPLEMASK :
case WINED3DRS_PATCHEDGESTYLE :
case WINED3DRS_PATCHSEGMENTS :
--
*1.0.4*
More information about the wine-patches
mailing list