D3D8: Fixed D3DRS fixes

Vitaly Budovski vbudovsk at cs.rmit.edu.au
Sun Jan 29 23:57:12 CST 2006


Changelog:

d3d8: fixed POINTSCALEENABLE
d3d8: fixed POINTSPRITEENABLE

---

 dlls/d3d8/device.c |   69 
+++++++++++++++++++++++++++++++---------------------
 1 files changed, 41 insertions(+), 28 deletions(-)

-------------- next part --------------
a25830e5332491c95d89bb1051a7d83e9190e049
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 4952d6e..a0b419b 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -2976,32 +2976,39 @@ HRESULT  WINAPI  IDirect3DDevice8Impl_Se
     case D3DRS_POINTSCALE_B              :
     case D3DRS_POINTSCALE_C              :
     case D3DRS_POINTSCALEENABLE          :
-        {
-            /* If enabled, supply the parameters, otherwise fall back to defaults */
-            if (This->StateBlock->renderstate[D3DRS_POINTSCALEENABLE]) {
-                GLfloat att[3] = {1.0f, 0.0f, 0.0f};
-                att[0] = *((float*)&This->StateBlock->renderstate[D3DRS_POINTSCALE_A]);
-                att[1] = *((float*)&This->StateBlock->renderstate[D3DRS_POINTSCALE_B]);
-                att[2] = *((float*)&This->StateBlock->renderstate[D3DRS_POINTSCALE_C]);
-
-		if (GL_SUPPORT(EXT_POINT_PARAMETERS)) {
-                  GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att);
-		  checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);");
-		} else {
-		  TRACE("D3DRS_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("D3DRS_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 D3DRS_COLORWRITEENABLE          :
       {
         TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n", 
@@ -3088,12 +3095,18 @@ HRESULT  WINAPI  IDirect3DDevice8Impl_Se
             break;
         }
 
+        /*
+         * 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) {
-            glEnable(GL_POINT_SPRITE_ARB);
-            checkGLcall("glEnable GL_POINT_SPRITE_ARB");
+            glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, TRUE);
         } else {
-            glDisable(GL_POINT_SPRITE_ARB);
-            checkGLcall("glDisable GL_POINT_SPRITE_ARB");
+            glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, FALSE);
         }
         break;
     }
-- 
1.0.4


More information about the wine-patches mailing list