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