diff options
author | Simei Yin | 2017-07-16 13:19:25 +0200 |
---|---|---|
committer | Simei Yin | 2017-07-16 14:39:31 +0200 |
commit | 17dd32f3db3f138bb8689dc489dbf05b484a8a10 (patch) | |
tree | e9effe75ba27e8a197a9718ecbc31a23a71c63a7 | |
parent | ebd36a8df25d8ef8fcd58603a1b89aec61ce02a8 (diff) | |
download | scummvm-rg350-17dd32f3db3f138bb8689dc489dbf05b484a8a10.tar.gz scummvm-rg350-17dd32f3db3f138bb8689dc489dbf05b484a8a10.tar.bz2 scummvm-rg350-17dd32f3db3f138bb8689dc489dbf05b484a8a10.zip |
SLUDGE: Complete pasteCharacter to backdrop
-rw-r--r-- | engines/sludge/sprites.cpp | 210 |
1 files changed, 31 insertions, 179 deletions
diff --git a/engines/sludge/sprites.cpp b/engines/sludge/sprites.cpp index c35b2a37e6..798514d4d2 100644 --- a/engines/sludge/sprites.cpp +++ b/engines/sludge/sprites.cpp @@ -390,6 +390,8 @@ bool scaleSprite(sprite &single, const spritePalette &fontPal, onScreenPerson *t y2 = y1 + diffY; } + // TODO: lightmap + // Use Transparent surface to scale and blit if (!zBuffer.numPanels) { Graphics::TransparentSurface tmp(single.surface, false); @@ -458,202 +460,52 @@ void killSpriteLayers() { // Paste a scaled sprite onto the backdrop void fixScaleSprite(int x, int y, sprite &single, const spritePalette &fontPal, onScreenPerson *thisPerson, int camX, int camY, bool mirror) { -#if 0 - float scale = thisPerson-> scale; - bool useZB = !(thisPerson->extra & EXTRA_NOZB); - bool light = !(thisPerson->extra & EXTRA_NOLITE); - if (scale <= 0.05) return; + float scale = thisPerson->scale; + bool useZB = !(thisPerson->extra & EXTRA_NOZB); + //bool light = !(thisPerson->extra & EXTRA_NOLITE); - float tx1 = (float)(single.tex_x) / fontPal.tex_w[single.texNum]; - float ty1 = (float) 1.0 / fontPal.tex_h[single.texNum]; //0.0; - float tx2 = (float)(single.tex_x + single.width) / fontPal.tex_w[single.texNum]; - float ty2 = (float)(single.height + 1) / fontPal.tex_h[single.texNum]; + if (scale <= 0.05) + return; - int diffX = (int)(((float)single.width) * scale); - int diffY = (int)(((float)single.height) * scale); + int diffX = (int)(((float)single.surface.w) * scale); + int diffY = (int)(((float)single.surface.h) * scale); int x1; if (single.xhot < 0) - x1 = x - (int)((mirror ? (float)(single.width - single.xhot) : (float)(single.xhot + 1)) * scale); + x1 = x - (int)((mirror ? (float)(single.surface.w - single.xhot) : (float)(single.xhot + 1)) * scale); else - x1 = x - (int)((mirror ? (float)(single.width - (single.xhot + 1)) : (float)single.xhot) * scale); + x1 = x - (int)((mirror ? (float)(single.surface.w - (single.xhot + 1)) : (float)single.xhot) * scale); int y1 = y - (int)((single.yhot - thisPerson->floaty) * scale); - float spriteWidth = diffX; - float spriteHeight = diffY; - if (x1 < 0) diffX += x1; - if (y1 < 0) diffY += y1; - if (x1 + diffX > sceneWidth) diffX = sceneWidth - x1; - if (y1 + diffY > sceneHeight) diffY = sceneHeight - y1; - if (diffX < 0) return; - if (diffY < 0) return; - - GLfloat z; - - if (useZB && zBuffer.numPanels) { - int i; - for (i = 1; i < zBuffer.numPanels; i++) { - if (zBuffer.panel[i] >= y + cameraY) { - i--; - break; - } - } - z = 0.999 - (double) i * (1.0 / 128.0); - } else { - z = -0.5; - } + // TODO: lightmap - float ltx1, btx1; - float ltx2, btx2; - float lty1, bty1; - float lty2, bty2; - if (! NPOT_textures) { - ltx1 = lightMap.texW * x1 / sceneWidth; - ltx2 = lightMap.texW * (x1 + spriteWidth) / sceneWidth; - lty1 = lightMap.texH * y1 / sceneHeight; - lty2 = lightMap.texH * (y1 + spriteHeight) / sceneHeight; - btx1 = backdropTexW * x1 / sceneWidth; - btx2 = backdropTexW * (x1 + spriteWidth) / sceneWidth; - bty1 = backdropTexH * y1 / sceneHeight; - bty2 = backdropTexH * (y1 + spriteHeight) / sceneHeight; - } else { - btx1 = ltx1 = (float) x1 / sceneWidth; - btx2 = ltx2 = (float)(x1 + spriteWidth) / sceneWidth; - bty1 = lty1 = (float) y1 / sceneHeight; - bty2 = lty2 = (float)(y1 + spriteHeight) / sceneHeight; - } + // draw backdrop + drawBackDrop(); - const GLfloat ltexCoords[] = { - ltx1, lty1, - ltx2, lty1, - ltx1, lty2, - ltx2, lty2 - }; - - const GLfloat btexCoords[] = { - btx1, bty1, - btx2, bty1, - btx1, bty2, - btx2, bty2 - }; - - if (light && lightMap.data) { - if (lightMapMode == LIGHTMAPMODE_HOTSPOT) { - int lx = x + cameraX; - int ly = y + cameraY; - if (lx < 0 || ly < 0 || lx >= sceneWidth || ly >= sceneHeight) { - curLight[0] = curLight[1] = curLight[2] = 255; - } else { - GLubyte *target = lightMap.data + (ly * sceneWidth + lx) * 4; - curLight[0] = target[0]; - curLight[1] = target[1]; - curLight[2] = target[2]; - } - } else if (lightMapMode == LIGHTMAPMODE_PIXEL) { - curLight[0] = curLight[1] = curLight[2] = 255; - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, lightMap.name); + // draw zBuffer + if (zBuffer.numPanels) { + drawZBuffer((int)(x1 + camX), (int)(y1 + camY), false); + } - } + // draw sprite + if (!zBuffer.numPanels) { + Graphics::TransparentSurface tmp(single.surface, false); + tmp.blit(renderSurface, x1, y1, (mirror ? Graphics::FLIP_H : Graphics::FLIP_NONE), nullptr, TS_ARGB(255, 255, 255, 255), diffX, diffY); } else { - curLight[0] = curLight[1] = curLight[2] = 255; + int d = useZB ? y + cameraY : sceneHeight + 1; + addSpriteDepth(&single.surface, d, x1, y1, (mirror ? Graphics::FLIP_H : Graphics::FLIP_NONE), diffX, diffY); } - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, backdropTextureName); - glActiveTexture(GL_TEXTURE0); - - setPixelCoords(true); - GLfloat xoffset = 0.0f; - while (xoffset < diffX) { - int w = (diffX - xoffset < viewportWidth) ? (int)(diffX - xoffset) : viewportWidth; - - GLfloat yoffset = 0.0f; - while (yoffset < diffY) { - - int h = (diffY - yoffset < viewportHeight) ? (int)(diffY - yoffset) : viewportHeight; - - // Render the scene - first the old backdrop (so that it'll show through when the z-buffer is active - //glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glBindTexture(GL_TEXTURE_2D, backdropTextureName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - const GLfloat vertices[] = { - -x1 - xoffset, -y1 - yoffset, 0.0f, - sceneWidth - x1 - xoffset, -y1 - yoffset, 0.0f, - -x1 - xoffset, sceneHeight - y1 - yoffset, 0.0f, - sceneWidth - x1 - xoffset, sceneHeight - y1 - yoffset, 0.0f - }; - - const GLfloat texCoords[] = { - 0.0f, 0.0f, - backdropTexW, 0.0f, - 0.0f, backdropTexH, - backdropTexW, backdropTexH - }; - - glUseProgram(shader.texture); - setPMVMatrix(shader.texture); - - drawQuad(shader.texture, vertices, 1, texCoords); - - // The z-buffer - if (useZB) { - glDepthMask(GL_TRUE); - glClear(GL_DEPTH_BUFFER_BIT); - drawZBuffer((int)(x1 + xoffset + camX), (int)(y1 + yoffset + camY), false); - - glDepthMask(GL_FALSE); - glEnable(GL_DEPTH_TEST); - } + // draw all + displaySpriteLayers(); - // Then the sprite - glUseProgram(shader.paste); - GLint uniform = glGetUniformLocation(shader.paste, "useLightTexture"); - if (uniform >= 0) glUniform1i(uniform, light && lightMapMode == LIGHTMAPMODE_PIXEL && lightMap.data); - setPMVMatrix(shader.paste); + // copy screen to backdrop + backdropSurface.copyFrom(renderSurface); - setDrawMode(thisPerson); - - glBindTexture(GL_TEXTURE_2D, fontPal.tex_names[single.texNum]); - - const GLfloat vertices2[] = { - -xoffset, -yoffset, z, - spriteWidth - xoffset, -yoffset, z, - -xoffset, spriteHeight - yoffset, z, - spriteWidth - xoffset, spriteHeight - yoffset, z - }; - - if (! mirror) { - GLfloat tx3 = tx1; - tx1 = tx2; - tx2 = tx3; - } - const GLfloat texCoords2[] = { - tx2, ty1, - tx1, ty1, - tx2, ty2, - tx1, ty2 - }; - - drawQuad(shader.paste, vertices2, 3, texCoords2, ltexCoords, btexCoords); - - setSecondaryColor(0., 0., 0., 1.); - //glDisable(GL_COLOR_SUM); FIXME: replace line? - // Copy Our ViewPort To The Texture - glUseProgram(0); - copyTexSubImage2D(GL_TEXTURE_2D, 0, (int)((x1 < 0) ? xoffset : x1 + xoffset), (int)((y1 < 0) ? yoffset : y1 + yoffset), (int)((x1 < 0) ? viewportOffsetX - x1 : viewportOffsetX), (int)((y1 < 0) ? viewportOffsetY - y1 : viewportOffsetY), w, h, backdropTextureName); - - yoffset += viewportHeight; - } - xoffset += viewportWidth; + // reset zBuffer with the new backdrop + if (zBuffer.numPanels) { + setZBuffer(zBuffer.originalNum); } - - setPixelCoords(false); - glUseProgram(0); -#endif } } // End of namespace Sludge |