diff --git a/engines/grim/gfx_opengl.cpp b/engines/grim/gfx_opengl.cpp index 55821341541..d6dbef8fcec 100644 --- a/engines/grim/gfx_opengl.cpp +++ b/engines/grim/gfx_opengl.cpp @@ -851,7 +851,7 @@ void GfxOpenGL::drawSprite(const Sprite *sprite) { glLoadMatrixd(modelview); } - if (sprite->_blendMode == Sprite::BlendAdditive) { + if (sprite->_flags1 & Sprite::BlendAdditive) { glBlendFunc(GL_SRC_ALPHA, GL_ONE); } else { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -859,14 +859,14 @@ void GfxOpenGL::drawSprite(const Sprite *sprite) { glDisable(GL_LIGHTING); - if (sprite->_alphaTest) { + if (sprite->_flags2 & Sprite::AlphaTest) { glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, g_grim->getGameType() == GType_MONKEY4 ? 0.1f : 0.5f); } else { glDisable(GL_ALPHA_TEST); } - if (sprite->_writeDepth) { + if (sprite->_flags2 & Sprite::DepthTest) { glEnable(GL_DEPTH_TEST); } else { glDisable(GL_DEPTH_TEST); diff --git a/engines/grim/gfx_opengl_shaders.cpp b/engines/grim/gfx_opengl_shaders.cpp index 945863a90d4..79557599233 100644 --- a/engines/grim/gfx_opengl_shaders.cpp +++ b/engines/grim/gfx_opengl_shaders.cpp @@ -970,7 +970,7 @@ void GfxOpenGLS::drawSprite(const Sprite *sprite) { glDepthMask(GL_FALSE); } - if (sprite->_blendMode == Sprite::BlendAdditive) { + if (sprite->_flags1 & Sprite::BlendAdditive) { glBlendFunc(GL_SRC_ALPHA, GL_ONE); } else { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -978,7 +978,7 @@ void GfxOpenGLS::drawSprite(const Sprite *sprite) { // FIXME: depth test does not work yet because final z coordinates // for Sprites and actor textures are inconsistently calculated - if (sprite->_writeDepth || _currentActor->isInOverworld()) { + if (sprite->_flags2 & Sprite::DepthTest || _currentActor->isInOverworld()) { glEnable(GL_DEPTH_TEST); } else { glDisable(GL_DEPTH_TEST); @@ -1000,7 +1000,7 @@ void GfxOpenGLS::drawSprite(const Sprite *sprite) { _spriteProgram->setUniform("textured", GL_TRUE); _spriteProgram->setUniform("isBillboard", GL_TRUE); _spriteProgram->setUniform("lightsEnabled", false); - if (sprite->_alphaTest) { + if (sprite->_flags2 & Sprite::AlphaTest) { _spriteProgram->setUniform("alphaRef", g_grim->getGameType() == GType_MONKEY4 ? 0.1f : 0.5f); } else { _spriteProgram->setUniform("alphaRef", 0.0f); diff --git a/engines/grim/gfx_tinygl.cpp b/engines/grim/gfx_tinygl.cpp index e64b1d8d4ee..fc4949df9e7 100644 --- a/engines/grim/gfx_tinygl.cpp +++ b/engines/grim/gfx_tinygl.cpp @@ -849,7 +849,7 @@ void GfxTinyGL::drawSprite(const Sprite *sprite) { tglLoadMatrixf(modelview); } - if (sprite->_blendMode == Sprite::BlendAdditive) { + if (sprite->_flags1 & Sprite::BlendAdditive) { tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE); } else { tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE_MINUS_SRC_ALPHA); @@ -857,14 +857,14 @@ void GfxTinyGL::drawSprite(const Sprite *sprite) { tglDisable(TGL_LIGHTING); - if (sprite->_alphaTest) { + if (sprite->_flags2 & Sprite::AlphaTest) { tglEnable(TGL_ALPHA_TEST); tglAlphaFunc(TGL_GEQUAL, g_grim->getGameType() == GType_MONKEY4 ? 0.1f : 0.5f); } else { tglDisable(TGL_ALPHA_TEST); } - if (sprite->_writeDepth) { + if (sprite->_flags2 & Sprite::DepthTest) { tglEnable(TGL_DEPTH_TEST); } else { tglDisable(TGL_DEPTH_TEST); diff --git a/engines/grim/sprite.cpp b/engines/grim/sprite.cpp index e68de633c6f..d294ee109f9 100644 --- a/engines/grim/sprite.cpp +++ b/engines/grim/sprite.cpp @@ -31,8 +31,8 @@ namespace Grim { Sprite::Sprite() : - _width(0), _height(0), _visible(false), _material(nullptr), _next(nullptr), _blendMode(BlendNormal), - _writeDepth(true), _alphaTest(true) { + _width(0), _height(0), _visible(false), _material(nullptr), _next(nullptr), + _flags1(0), _flags2(0) { } @@ -65,13 +65,7 @@ void Sprite::loadBinary(Common::SeekableReadStream *stream, EMICostume *costume) uint32 texnamelength = stream->readUint32LE(); char *texname = new char[texnamelength]; stream->read(texname, texnamelength); - stream->readByte(); // Unknown - byte blendMode = stream->readByte(); - if (blendMode == 4) - _blendMode = BlendAdditive; - else if (blendMode != 0) - warning("Unknown blend mode value %d for sprite %s", blendMode, name); - stream->skip(2); // Unknown + _flags1 = stream->readUint32LE(); char data[20]; stream->read(data, sizeof(data)); _width = get_float(data); @@ -90,11 +84,7 @@ void Sprite::loadBinary(Common::SeekableReadStream *stream, EMICostume *costume) stream->read(f, 4); _texCoordY[i] = get_float(f); } - stream->readByte(); // Unknown (seems to always be 4) - if (stream->readByte() == 2) - _writeDepth = false; - if (stream->readByte() < 2) - _alphaTest = false; + _flags2 = stream->readUint32LE(); _material = costume->loadMaterial(texname, true); _next = nullptr; diff --git a/engines/grim/sprite.h b/engines/grim/sprite.h index 51890962826..c431c1153a7 100644 --- a/engines/grim/sprite.h +++ b/engines/grim/sprite.h @@ -38,9 +38,12 @@ class EMICostume; class Sprite { public: - enum BlendMode { - BlendNormal = 0, - BlendAdditive = 1 + enum SpriteFlags1 { + BlendAdditive = 0x400 + }; + enum SpriteFlags2 { + DepthTest = 0x100, + AlphaTest = 0x20000 }; Sprite(); @@ -54,15 +57,14 @@ public: bool _visible; Material *_material; Sprite *_next; - BlendMode _blendMode; + uint32 _flags1; int _red[4]; int _green[4]; int _blue[4]; int _alpha[4]; float _texCoordX[4]; float _texCoordY[4]; - bool _writeDepth; - bool _alphaTest; + uint32 _flags2; }; } // end of namespace Grim