From 32a232fd3eb7f6bb9c70d454a62d2c7c7ce9a609 Mon Sep 17 00:00:00 2001 From: Dries Harnie Date: Mon, 10 Feb 2014 00:59:51 +0100 Subject: [PATCH] EMI: Update shader for actors and sprites [OpenGLS] --- engines/grim/gfx_opengl_shaders.cpp | 29 ++++++++++++++------------- engines/grim/shaders/emi_actor.vertex | 26 ++++++++++++------------ 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/engines/grim/gfx_opengl_shaders.cpp b/engines/grim/gfx_opengl_shaders.cpp index 97812d661fe..e7800357136 100644 --- a/engines/grim/gfx_opengl_shaders.cpp +++ b/engines/grim/gfx_opengl_shaders.cpp @@ -418,24 +418,22 @@ void GfxOpenGLS::startActorDraw(const Actor *actor) { const Math::Quaternion &quat = actor->getRotationQuat(); const float scale = actor->getScale(); const float alpha = actor->getEffectiveAlpha(); - Math::Matrix4 modelMatrix = quat.toMatrix(); if (g_grim->getGameType() == GType_MONKEY4) { - Math::Matrix4 viewMatrix = _currentQuat.toMatrix(); - - Math::Matrix4 extraMatrix; -// _mvpMatrix = _projMatrix * viewMatrix * modelMatrix; + const Math::Matrix4 &viewMatrix = _currentQuat.toMatrix(); + Math::Matrix4 modelMatrix = actor->getFinalMatrix(); + modelMatrix.transpose(); _actorProgram->setUniform("modelMatrix", modelMatrix); - _actorProgram->setUniform("projMatrix", _projMatrix); _actorProgram->setUniform("viewMatrix", viewMatrix); - _actorProgram->setUniform("extraMatrix", extraMatrix); + _actorProgram->setUniform("projMatrix", _projMatrix); _actorProgram->setUniform("cameraPos", _currentPos); _actorProgram->setUniform("actorPos", pos); _actorProgram->setUniform("isBillboard", GL_FALSE); _actorProgram->setUniform1f("alpha", alpha); } else { + Math::Matrix4 modelMatrix = quat.toMatrix(); bool hasZBuffer = g_grim->getCurrSet()->getCurrSetup()->_bkgndZBm; Math::Matrix4 extraMatrix; @@ -446,8 +444,8 @@ void GfxOpenGLS::startActorDraw(const Actor *actor) { _mvpMatrix.transpose(); _actorProgram->setUniform("modelMatrix", modelMatrix); - _actorProgram->setUniform("projMatrix", _projMatrix); _actorProgram->setUniform("viewMatrix", _viewMatrix); + _actorProgram->setUniform("projMatrix", _projMatrix); _actorProgram->setUniform("extraMatrix", extraMatrix); _actorProgram->setUniform("mvpMatrix", _mvpMatrix); _actorProgram->setUniform("tex", 0); @@ -641,9 +639,6 @@ void GfxOpenGLS::drawEMIModelFace(const EMIModel* model, const EMIMeshFace* face mud->_shader->setUniform("textured", face->_hasTexture ? GL_TRUE : GL_FALSE); mud->_shader->setUniform("lightsEnabled", _lightsEnabled); - Math::Matrix4 extraMatrix; - mud->_shader->setUniform("extraMatrix", extraMatrix); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, face->_indicesEBO); glDrawElements(GL_TRIANGLES, 3 * face->_faceLength, GL_UNSIGNED_INT, 0); @@ -694,12 +689,18 @@ void GfxOpenGLS::drawSprite(const Sprite *sprite) { glDisable(GL_DEPTH_TEST); _spriteProgram->use(); + + const Math::Quaternion quat = Math::Quaternion::fromEuler(0, 0, _currentActor->getYaw()); + const Math::Matrix4 &rotateMatrix = quat.toMatrix(); + Math::Matrix4 extraMatrix; extraMatrix.setPosition(sprite->_pos); - extraMatrix(0,0) *= sprite->_width; - extraMatrix(1,1) *= sprite->_height; - _spriteProgram->setUniform("extraMatrix", extraMatrix); + extraMatrix(0,0) = sprite->_width; + extraMatrix(1,1) = sprite->_height; + extraMatrix = extraMatrix * rotateMatrix; + extraMatrix.transpose(); + _spriteProgram->setUniform("extraMatrix", extraMatrix); _spriteProgram->setUniform("textured", GL_TRUE); _spriteProgram->setUniform("isBillboard", GL_TRUE); _spriteProgram->setUniform("lightsEnabled", false); diff --git a/engines/grim/shaders/emi_actor.vertex b/engines/grim/shaders/emi_actor.vertex index 2d18bc300f3..2e11e11e036 100644 --- a/engines/grim/shaders/emi_actor.vertex +++ b/engines/grim/shaders/emi_actor.vertex @@ -18,29 +18,29 @@ void main() { vec4 pos = vec4(position, 1.0); if (isBillboard) { - vec4 scaled = extraMatrix * pos; - vec3 camToPos = normalize(actorPos - cameraPos); - vec3 up = vec3(0.0, 1.0, 0.0); - vec3 right = cross(camToPos, up); - pos.xyz = scaled.x * right + scaled.y * up; - pos = modelMatrix * pos; + vec4 offset = modelMatrix * vec4(0.0, 0.0, 0.0, 1.0); + offset -= vec4(cameraPos * offset.w, 0.0); + offset = viewMatrix * offset; + + pos = extraMatrix * pos; + pos += vec4(offset.xyz * pos.w, 0.0); } else { - pos = modelMatrix * extraMatrix * pos; + pos = modelMatrix * pos; + pos -= vec4(cameraPos * pos.w, 0.0); + pos = viewMatrix * pos; } pos /= pos.w; - pos = viewMatrix * pos; - pos += viewMatrix * vec4(actorPos - cameraPos, 0.0); pos.z *= -1.0; - gl_Position = projMatrix * pos; + pos = projMatrix * pos; if (isBillboard) - gl_Position.z = round(gl_Position.z); + pos.z = round(pos.z); + + gl_Position = pos; Color = color; if (textured) { Texcoord = texcoord; - if (isBillboard) - Texcoord.x = 1.0 - Texcoord.x; } else { Texcoord = vec2(0.0, 0.0); }