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