Am Mittwoch, 2. Januar 2008 12:44:24 schrieb Stefan Dösinger:
> Am Mittwoch, 2. Januar 2008 13:38:57 schrieb Alexander Dorofeyev:
> > In case of colorkey emulation for a texture, if the application wants to
> > select alpha from diffuse color at stage 0, a fixup to modulate with
> > texture alpha more closely matches what the application wants than fixup
> > to just select alpha from texture.
I tested pop3d and Moto Racer 2. Pop3d still works as expected, but moto racer
2 has some missing geometry. It draws some opaque parts of the scene with
color keying on, and a diffuse alpha of 0.0, so the alpha test kicks in and
the geometry is missing.
The moto racer 2 demo is available online, e.g.
http://downloads.gamezone.com/demos/d1576.htm. Note that the installer
refuses to run, unless you set your X server's depth to 16. I also caused a
regression in that game when I fixed some bugs with native d3drm.dll, so you
need the attached hack.
(I didn't have time and energy to write a test to test that, but I think that
BRANCHFORWARD tokens with offset 0 are special, and that the existing
executebuffer test in d3d.c just points out the special case, but the common
case is implemented incorrectly)
diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c
index e74bdb1..059fa25 100644
--- a/dlls/ddraw/executebuffer.c
+++ b/dlls/ddraw/executebuffer.c
@@ -525,11 +525,13 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
if (!ci->bNegate) {
TRACE(" Branch to %d\n", ci->dwOffset);
instr = (char*)current + ci->dwOffset;
- }
+ break;
+ }
} else {
if (ci->bNegate) {
TRACE(" Branch to %d\n", ci->dwOffset);
instr = (char*)current + ci->dwOffset;
+ break;
}
}