EMI: Update shader for actors and sprites [OpenGLS]

This commit is contained in:
Dries Harnie 2014-02-10 00:59:51 +01:00 committed by Christian Krause
parent f12647cdca
commit 32a232fd3e
2 changed files with 28 additions and 27 deletions

View file

@ -418,24 +418,22 @@ void GfxOpenGLS::startActorDraw(const Actor *actor) {
const Math::Quaternion &quat = actor->getRotationQuat(); const Math::Quaternion &quat = actor->getRotationQuat();
const float scale = actor->getScale(); const float scale = actor->getScale();
const float alpha = actor->getEffectiveAlpha(); const float alpha = actor->getEffectiveAlpha();
Math::Matrix4 modelMatrix = quat.toMatrix();
if (g_grim->getGameType() == GType_MONKEY4) { if (g_grim->getGameType() == GType_MONKEY4) {
Math::Matrix4 viewMatrix = _currentQuat.toMatrix(); const Math::Matrix4 &viewMatrix = _currentQuat.toMatrix();
Math::Matrix4 modelMatrix = actor->getFinalMatrix();
Math::Matrix4 extraMatrix; modelMatrix.transpose();
// _mvpMatrix = _projMatrix * viewMatrix * modelMatrix;
_actorProgram->setUniform("modelMatrix", modelMatrix); _actorProgram->setUniform("modelMatrix", modelMatrix);
_actorProgram->setUniform("projMatrix", _projMatrix);
_actorProgram->setUniform("viewMatrix", viewMatrix); _actorProgram->setUniform("viewMatrix", viewMatrix);
_actorProgram->setUniform("extraMatrix", extraMatrix); _actorProgram->setUniform("projMatrix", _projMatrix);
_actorProgram->setUniform("cameraPos", _currentPos); _actorProgram->setUniform("cameraPos", _currentPos);
_actorProgram->setUniform("actorPos", pos); _actorProgram->setUniform("actorPos", pos);
_actorProgram->setUniform("isBillboard", GL_FALSE); _actorProgram->setUniform("isBillboard", GL_FALSE);
_actorProgram->setUniform1f("alpha", alpha); _actorProgram->setUniform1f("alpha", alpha);
} else { } else {
Math::Matrix4 modelMatrix = quat.toMatrix();
bool hasZBuffer = g_grim->getCurrSet()->getCurrSetup()->_bkgndZBm; bool hasZBuffer = g_grim->getCurrSet()->getCurrSetup()->_bkgndZBm;
Math::Matrix4 extraMatrix; Math::Matrix4 extraMatrix;
@ -446,8 +444,8 @@ void GfxOpenGLS::startActorDraw(const Actor *actor) {
_mvpMatrix.transpose(); _mvpMatrix.transpose();
_actorProgram->setUniform("modelMatrix", modelMatrix); _actorProgram->setUniform("modelMatrix", modelMatrix);
_actorProgram->setUniform("projMatrix", _projMatrix);
_actorProgram->setUniform("viewMatrix", _viewMatrix); _actorProgram->setUniform("viewMatrix", _viewMatrix);
_actorProgram->setUniform("projMatrix", _projMatrix);
_actorProgram->setUniform("extraMatrix", extraMatrix); _actorProgram->setUniform("extraMatrix", extraMatrix);
_actorProgram->setUniform("mvpMatrix", _mvpMatrix); _actorProgram->setUniform("mvpMatrix", _mvpMatrix);
_actorProgram->setUniform("tex", 0); _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("textured", face->_hasTexture ? GL_TRUE : GL_FALSE);
mud->_shader->setUniform("lightsEnabled", _lightsEnabled); mud->_shader->setUniform("lightsEnabled", _lightsEnabled);
Math::Matrix4 extraMatrix;
mud->_shader->setUniform("extraMatrix", extraMatrix);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, face->_indicesEBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, face->_indicesEBO);
glDrawElements(GL_TRIANGLES, 3 * face->_faceLength, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, 3 * face->_faceLength, GL_UNSIGNED_INT, 0);
@ -694,12 +689,18 @@ void GfxOpenGLS::drawSprite(const Sprite *sprite) {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
_spriteProgram->use(); _spriteProgram->use();
const Math::Quaternion quat = Math::Quaternion::fromEuler(0, 0, _currentActor->getYaw());
const Math::Matrix4 &rotateMatrix = quat.toMatrix();
Math::Matrix4 extraMatrix; Math::Matrix4 extraMatrix;
extraMatrix.setPosition(sprite->_pos); extraMatrix.setPosition(sprite->_pos);
extraMatrix(0,0) *= sprite->_width; extraMatrix(0,0) = sprite->_width;
extraMatrix(1,1) *= sprite->_height; extraMatrix(1,1) = sprite->_height;
_spriteProgram->setUniform("extraMatrix", extraMatrix);
extraMatrix = extraMatrix * rotateMatrix;
extraMatrix.transpose();
_spriteProgram->setUniform("extraMatrix", extraMatrix);
_spriteProgram->setUniform("textured", GL_TRUE); _spriteProgram->setUniform("textured", GL_TRUE);
_spriteProgram->setUniform("isBillboard", GL_TRUE); _spriteProgram->setUniform("isBillboard", GL_TRUE);
_spriteProgram->setUniform("lightsEnabled", false); _spriteProgram->setUniform("lightsEnabled", false);

View file

@ -18,29 +18,29 @@ void main()
{ {
vec4 pos = vec4(position, 1.0); vec4 pos = vec4(position, 1.0);
if (isBillboard) { if (isBillboard) {
vec4 scaled = extraMatrix * pos; vec4 offset = modelMatrix * vec4(0.0, 0.0, 0.0, 1.0);
vec3 camToPos = normalize(actorPos - cameraPos); offset -= vec4(cameraPos * offset.w, 0.0);
vec3 up = vec3(0.0, 1.0, 0.0); offset = viewMatrix * offset;
vec3 right = cross(camToPos, up);
pos.xyz = scaled.x * right + scaled.y * up; pos = extraMatrix * pos;
pos = modelMatrix * pos; pos += vec4(offset.xyz * pos.w, 0.0);
} else { } else {
pos = modelMatrix * extraMatrix * pos; pos = modelMatrix * pos;
pos -= vec4(cameraPos * pos.w, 0.0);
pos = viewMatrix * pos;
} }
pos /= pos.w; pos /= pos.w;
pos = viewMatrix * pos;
pos += viewMatrix * vec4(actorPos - cameraPos, 0.0);
pos.z *= -1.0; pos.z *= -1.0;
gl_Position = projMatrix * pos; pos = projMatrix * pos;
if (isBillboard) if (isBillboard)
gl_Position.z = round(gl_Position.z); pos.z = round(pos.z);
gl_Position = pos;
Color = color; Color = color;
if (textured) { if (textured) {
Texcoord = texcoord; Texcoord = texcoord;
if (isBillboard)
Texcoord.x = 1.0 - Texcoord.x;
} else { } else {
Texcoord = vec2(0.0, 0.0); Texcoord = vec2(0.0, 0.0);
} }