wined3d: Fixed point sprite scaling when size < 1.0f

Vitaly Budovski vbudovsk at cs.rmit.edu.au
Sat Feb 4 05:07:28 CST 2006


wined3d: Fixed point sprite scaling when size < 1.0f

-------------- next part --------------
wined3d: Fixed point sprite scaling when size < 1.0f

---

 dlls/wined3d/device.c |   21 ++++++++++++++++++---
 1 files changed, 18 insertions(+), 3 deletions(-)

b3559fe1f5544122a1d9564119a3f2c23e6db5ed
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index ec7dc60..5337765 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3506,13 +3506,28 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRen
 
         /* Default values */
         GLfloat att[3] = {1.0f, 0.0f, 0.0f};
+        
+        /*
+         * Minium valid point size for OpenGL is 1.0f. For Direct3D it is 0.0f.
+         * This means that OpenGL will clamp really small point sizes to 1.0f.
+         * To correct for this we need to multiply by the scale factor when sizes
+         * are less than 1.0f. scale_factor =  1.0f / point_size.
+         */
+        GLfloat pointSize = *((float*)&This->stateBlock->renderState[D3DRS_POINTSIZE]);
+        GLfloat scaleFactor;
+        if(pointSize < 1.0f) {
+            scaleFactor = pointSize * pointSize;
+        } else {
+            scaleFactor = 1.0f;
+        }
+        
         if(This->stateBlock->renderState[WINED3DRS_POINTSCALEENABLE]) {
             att[0] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_A]) /
-                (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height);
+                (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height * scaleFactor);
             att[1] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_B]) /
-                (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height);
+                (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height * scaleFactor);
             att[2] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_C]) /
-                (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height);
+                (This->stateBlock->viewport.Height * This->stateBlock->viewport.Height * scaleFactor);
         }
 
         if(GL_SUPPORT(ARB_POINT_PARAMETERS)) {
-- 
1.0.4


More information about the wine-patches mailing list