diff --git a/meson.build b/meson.build index 10e2a81a..795d9f18 100644 --- a/meson.build +++ b/meson.build @@ -545,6 +545,7 @@ if is_libretro 'src/audio/soundemitter.cpp', 'src/audio/vorbissource.cpp', 'src/crypto/rgssad.cpp', + 'src/display/autotiles.cpp', 'src/display/bitmap.cpp', 'src/display/plane.cpp', 'src/display/sprite.cpp', @@ -559,6 +560,7 @@ if is_libretro 'src/display/gl/shader.cpp', 'src/display/gl/texpool.cpp', 'src/display/gl/tileatlas.cpp', + 'src/display/gl/tilequad.cpp', 'src/display/gl/vertex.cpp', 'src/display/graphics.cpp', 'src/etc/etc.cpp', diff --git a/src/display/plane.cpp b/src/display/plane.cpp index 9db6b07d..5b834cdc 100644 --- a/src/display/plane.cpp +++ b/src/display/plane.cpp @@ -28,17 +28,13 @@ #include "etc.h" #include "util.h" -#ifndef MKXPZ_RETRO #include "gl-util.h" #include "quad.h" #include "quadarray.h" #include "transform.h" -#endif // MKXPZ_RETRO #include "etc-internal.h" -#ifndef MKXPZ_RETRO #include "shader.h" #include "glstate.h" -#endif // MKXPZ_RETRO #include "sigslot/signal.hpp" @@ -66,9 +62,7 @@ struct PlanePrivate bool quadSourceDirty; -#ifndef MKXPZ_RETRO SimpleQuadArray qArray; -#endif // MKXPZ_RETRO EtcTemps tmp; @@ -87,9 +81,7 @@ struct PlanePrivate prepareCon = shState->prepareDraw.connect (&PlanePrivate::prepare, this); -#ifndef MKXPZ_RETRO qArray.resize(1); -#endif // MKXPZ_RETRO } ~PlanePrivate() @@ -107,7 +99,6 @@ struct PlanePrivate void updateQuadSource() { -#ifndef MKXPZ_RETRO if (gl.npot_repeat) { FloatRect srcRect; @@ -121,7 +112,6 @@ struct PlanePrivate return; } -#endif // MKXPZ_RETRO if (nullOrDisposed(bitmap)) return; @@ -144,7 +134,6 @@ struct PlanePrivate FloatRect tex = bitmap->rect(); -#ifndef MKXPZ_RETRO qArray.resize(tilesX * tilesY); for (size_t y = 0; y < tilesY; ++y) @@ -157,7 +146,6 @@ struct PlanePrivate } qArray.commit(); -#endif // MKXPZ_RETRO } void prepare() @@ -293,7 +281,6 @@ void Plane::draw() if (!p->opacity) return; -#ifndef MKXPZ_RETRO ShaderBase *base; if (p->color->hasEffect() || p->tone->hasEffect() || p->opacity != 255) @@ -333,15 +320,12 @@ void Plane::draw() TEX::setRepeat(false); glState.blendMode.pop(); -#endif // MKXPZ_RETRO } void Plane::onGeometryChange(const Scene::Geometry &geo) { -#ifndef MKXPZ_RETRO if (gl.npot_repeat) Quad::setPosRect(&p->qArray.vertices[0], FloatRect(geo.rect)); -#endif // MKXPZ_RETRO p->sceneGeo = geo; p->quadSourceDirty = true; diff --git a/src/display/tilemap.cpp b/src/display/tilemap.cpp index f433ee5d..8b436939 100644 --- a/src/display/tilemap.cpp +++ b/src/display/tilemap.cpp @@ -28,19 +28,15 @@ #include "sharedstate.h" #include "config.h" #include "debugwriter.h" -#ifndef MKXPZ_RETRO #include "glstate.h" #include "gl-util.h" #include "gl-meta.h" #include "global-ibo.h" -#endif // MKXPZ_RETRO #include "etc-internal.h" -#ifndef MKXPZ_RETRO #include "quadarray.h" #include "texpool.h" #include "quad.h" #include "vertex.h" -#endif // MKXPZ_RETRO #include "tileatlas.h" #include "tilemap-common.h" @@ -51,15 +47,11 @@ #include #include -#ifndef MKXPZ_RETRO #include -#endif // MKXPZ_RETRO extern const StaticRect autotileRects[]; -#ifndef MKXPZ_RETRO typedef std::vector SVVector; -#endif // MKXPZ_RETRO static const int tilesetW = 8 * 32; static const int autotileW = 3 * 32; @@ -195,9 +187,7 @@ static elementsN(flashAlpha); struct GroundLayer : public ViewportElement { -#ifndef MKXPZ_RETRO GLsizei vboCount; -#endif // MKXPZ_RETRO TilemapPrivate *p; GroundLayer(TilemapPrivate *p, Viewport *viewport); @@ -215,21 +205,17 @@ struct GroundLayer : public ViewportElement struct ZLayer : public ViewportElement { size_t index; -#ifndef MKXPZ_RETRO GLintptr vboOffset; GLsizei vboCount; -#endif // MKXPZ_RETRO TilemapPrivate *p; /* If this layer is part of a batch and not * the head, it is 'muted' via this flag */ bool batchedFlag; -#ifndef MKXPZ_RETRO /* If this layer is a batch head, this variable * holds the element count of the entire batch */ GLsizei vboBatchCount; -#endif // MKXPZ_RETRO ZLayer(TilemapPrivate *p, Viewport *viewport); @@ -263,9 +249,7 @@ struct TilemapPrivate /* Tile atlas */ struct { -#ifndef MKXPZ_RETRO TEXFBO gl; -#endif // MKXPZ_RETRO Vec2i size; @@ -290,13 +274,11 @@ struct TilemapPrivate /* Map viewport position */ Vec2i viewpPos; -#ifndef MKXPZ_RETRO /* Ground layer vertices */ SVVector groundVert; /* ZLayer vertices */ SVVector zlayerVert[zlayersMax]; -#endif // MKXPZ_RETRO /* Base quad indices of each zlayer * in the shared buffer */ @@ -305,10 +287,8 @@ struct TilemapPrivate /* Shared buffers for all tiles */ struct { -#ifndef MKXPZ_RETRO GLMeta::VAO vao; VBO::ID vbo; -#endif // MKXPZ_RETRO bool animated; /* Animation state */ @@ -390,7 +370,6 @@ struct TilemapPrivate tiles.animated = false; tiles.aniIdx = 0; -#ifndef MKXPZ_RETRO /* Init tile buffers */ tiles.vbo = VBO::gen(); @@ -399,7 +378,6 @@ struct TilemapPrivate tiles.vao.ibo = shState->globalIBO().ibo; GLMeta::vaoInit(tiles.vao); -#endif // MKXPZ_RETRO elem.ground = new GroundLayer(this, viewport); @@ -419,13 +397,11 @@ struct TilemapPrivate for (size_t i = 0; i < zlayersMax; ++i) delete elem.zlayers[i]; -#ifndef MKXPZ_RETRO shState->releaseAtlasTex(atlas.gl); /* Destroy tile buffers */ GLMeta::vaoFini(tiles.vao); VBO::del(tiles.vbo); -#endif // MKXPZ_RETRO /* Disconnect signal handlers */ tilesetCon.disconnect(); @@ -457,11 +433,7 @@ struct TilemapPrivate int tsH = tileset->height(); atlas.efTilesetH = tsH - (tsH % 32); -#ifdef MKXPZ_RETRO - atlas.size = TileAtlas::minSize(atlas.efTilesetH, 2048); // TODO -#else atlas.size = TileAtlas::minSize(atlas.efTilesetH, glState.caps.maxTexSize); -#endif // MKXPZ_RETRO if (atlas.size.x < 0) throw Exception(Exception::MKXPError, @@ -557,11 +529,9 @@ struct TilemapPrivate { updateAtlasInfo(); -#ifndef MKXPZ_RETRO /* Aquire atlas tex */ shState->releaseAtlasTex(atlas.gl); shState->requestAtlasTex(atlas.size.x, atlas.size.y, atlas.gl); -#endif // MKXPZ_RETRO atlasDirty = true; } @@ -574,7 +544,6 @@ struct TilemapPrivate TileAtlas::BlitVec blits = TileAtlas::calcBlits(atlas.efTilesetH, atlas.size); -#ifndef MKXPZ_RETRO /* Clear atlas */ FBO::bind(atlas.gl.fbo); glState.clearColor.pushSet(Vec4()); @@ -586,7 +555,6 @@ struct TilemapPrivate glState.clearColor.pop(); GLMeta::blitBegin(atlas.gl); -#endif // MKXPZ_RETRO /* Blit autotiles */ for (size_t i = 0; i < atlas.usableATs.size(); ++i) @@ -604,7 +572,6 @@ struct TilemapPrivate Debug() << "BUG: High-res Tilemap blit autotiles not implemented"; } -#ifndef MKXPZ_RETRO GLMeta::blitSource(autotile->getGLTypes()); if (atW <= autotileW && tiles.animated && !atlas.smallATs[atInd]) @@ -630,21 +597,21 @@ struct TilemapPrivate GLMeta::blitRectangle(IntRect(0, 0, blitW, blitH), Vec2i(0, atInd*autotileH)); } -#endif // MKXPZ_RETRO } -#ifndef MKXPZ_RETRO GLMeta::blitEnd(); -#endif // MKXPZ_RETRO /* Blit tileset */ if (tileset->megaSurface()) { -#ifndef MKXPZ_RETRO /* Mega surface tileset */ SDL_Surface *tsSurf = tileset->megaSurface(); +#ifdef MKXPZ_RETRO + if (false) // TODO: get from config +#else if (shState->config().subImageFix) +#endif // MKXPZ_RETRO { /* Implementation for broken GL drivers */ FBO::bind(atlas.gl.fbo); @@ -694,7 +661,6 @@ struct TilemapPrivate GLMeta::subRectImageEnd(); } -#endif // MKXPZ_RETRO } else @@ -703,7 +669,6 @@ struct TilemapPrivate Debug() << "BUG: High-res Tilemap regular tileset not implemented"; } -#ifndef MKXPZ_RETRO /* Regular tileset */ GLMeta::blitBegin(atlas.gl); GLMeta::blitSource(tileset->getGLTypes()); @@ -717,7 +682,6 @@ struct TilemapPrivate } GLMeta::blitEnd(); -#endif // MKXPZ_RETRO } } @@ -737,7 +701,6 @@ struct TilemapPrivate return value; } -#ifndef MKXPZ_RETRO void handleAutotile(int x, int y, int tileInd, SVVector *array) { /* Which autotile [0-7] */ @@ -780,7 +743,6 @@ struct TilemapPrivate array->push_back(v[j]); } } -#endif // MKXPZ_RETRO void handleTile(int x, int y, int z) { @@ -797,7 +759,6 @@ struct TilemapPrivate if (prio == -1) return; -#ifndef MKXPZ_RETRO SVVector *targetArray; /* Prio 0 tiles are all part of the same ground layer */ @@ -833,17 +794,14 @@ struct TilemapPrivate for (size_t i = 0; i < 4; ++i) targetArray->push_back(v[i]); -#endif // MKXPZ_RETRO } void clearQuadArrays() { -#ifndef MKXPZ_RETRO groundVert.clear(); for (size_t i = 0; i < zlayersMax; ++i) zlayerVert[i].clear(); -#endif // MKXPZ_RETRO } void buildQuadArray() @@ -880,11 +838,7 @@ struct TilemapPrivate static size_t quadDataSize(size_t quadCount) { -#ifdef MKXPZ_RETRO - return 0; // TODO -#else return quadCount * sizeof(SVertex) * 4; -#endif } size_t zlayerSize(size_t index) @@ -894,7 +848,6 @@ struct TilemapPrivate void uploadBuffers() { -#ifndef MKXPZ_RETRO /* Calculate total quad count */ size_t groundQuadCount = groundVert.size() / 4; size_t quadCount = groundQuadCount; @@ -925,12 +878,10 @@ struct TilemapPrivate /* Ensure global IBO size */ shState->ensureQuadIBO(quadCount); -#endif // MKXPZ_RETRO } void bindShader(ShaderBase *&shaderVar) { -#ifndef MKXPZ_RETRO if (tiles.animated || color->hasEffect() || tone->hasEffect() || opacity != 255) { TilemapShader &tilemapShader = shState->shaders().tilemap; @@ -950,15 +901,12 @@ struct TilemapPrivate } shaderVar->applyViewportProj(); -#endif // MKXPZ_RETRO } void bindAtlas(ShaderBase &shader) { -#ifndef MKXPZ_RETRO TEX::bind(atlas.gl.tex); shader.setTexSize(atlas.size); -#endif // MKXPZ_RETRO } void updateActiveElements(std::vector &zlayerInd) @@ -986,11 +934,9 @@ struct TilemapPrivate /* Only allocate elements for non-emtpy zlayers */ std::vector zlayerInd; -#ifndef MKXPZ_RETRO for (size_t i = 0; i < zlayersMax; ++i) if (zlayerVert[i].size() > 0) zlayerInd.push_back(i); -#endif // MKXPZ_RETRO updateActiveElements(zlayerInd); elem.activeLayers = zlayerInd.size(); @@ -1042,7 +988,6 @@ struct TilemapPrivate ZLayer *batchHead = zlayers[i]; batchHead->batchedFlag = false; -#ifndef MKXPZ_RETRO GLsizei vboBatchCount = batchHead->vboCount; IntruListLink *iter = &batchHead->link; @@ -1062,7 +1007,6 @@ struct TilemapPrivate } batchHead->vboBatchCount = vboBatchCount; -#endif // MKXPZ_RETRO --i; } } @@ -1135,9 +1079,7 @@ struct TilemapPrivate GroundLayer::GroundLayer(TilemapPrivate *p, Viewport *viewport) : ViewportElement(viewport, 0), -#ifndef MKXPZ_RETRO vboCount(0), -#endif // MKXPZ_RETRO p(p) { onGeometryChange(scene->getGeometry()); @@ -1145,14 +1087,11 @@ GroundLayer::GroundLayer(TilemapPrivate *p, Viewport *viewport) void GroundLayer::updateVboCount() { -#ifndef MKXPZ_RETRO vboCount = p->zlayerBases[0] * 6; -#endif // MKXPZ_RETRO } void GroundLayer::draw() { -#ifndef MKXPZ_RETRO if (p->groundVert.size() == 0) return; @@ -1176,14 +1115,11 @@ void GroundLayer::draw() p->flashMap.draw(flashAlpha[p->flashAlphaIdx] / 255.f, p->dispPos); glState.blendMode.pop(); -#endif // MKXPZ_RETRO } void GroundLayer::drawInt() { -#ifndef MKXPZ_RETRO gl.DrawElements(GL_TRIANGLES, vboCount, _GL_INDEX_TYPE, (GLvoid*) 0); -#endif // MKXPZ_RETRO } void GroundLayer::onGeometryChange(const Scene::Geometry &geo) @@ -1193,15 +1129,11 @@ void GroundLayer::onGeometryChange(const Scene::Geometry &geo) ZLayer::ZLayer(TilemapPrivate *p, Viewport *viewport) : ViewportElement(viewport, 0), -#ifdef MKXPZ_RETRO - index(0) -#else index(0), vboOffset(0), vboCount(0), p(p), vboBatchCount(0) -#endif // MKXPZ_RETRO {} void ZLayer::setIndex(int value) @@ -1211,10 +1143,8 @@ void ZLayer::setIndex(int value) z = calculateZ(p, index); scene->reinsert(*this); -#ifndef MKXPZ_RETRO vboOffset = p->zlayerBases[index] * sizeof(index_t) * 6; vboCount = p->zlayerSize(index) * 6; -#endif // MKXPZ_RETRO } void ZLayer::draw() @@ -1227,7 +1157,6 @@ void ZLayer::draw() p->bindShader(shader); p->bindAtlas(*shader); -#ifndef MKXPZ_RETRO glState.blendMode.pushSet(p->blendType); GLMeta::vaoBind(p->tiles.vao); @@ -1238,14 +1167,11 @@ void ZLayer::draw() GLMeta::vaoUnbind(p->tiles.vao); glState.blendMode.pop(); -#endif // MKXPZ_RETRO } void ZLayer::drawInt() { -#ifndef MKXPZ_RETRO gl.DrawElements(GL_TRIANGLES, vboBatchCount, _GL_INDEX_TYPE, (GLvoid*) vboOffset); -#endif // MKXPZ_RETRO } int ZLayer::calculateZ(TilemapPrivate *p, int index) diff --git a/src/display/window.cpp b/src/display/window.cpp index 438994ee..9320aed7 100644 --- a/src/display/window.cpp +++ b/src/display/window.cpp @@ -26,7 +26,6 @@ #include "bitmap.h" #include "etc.h" #include "etc-internal.h" -#ifndef MKXPZ_RETRO #include "tilequad.h" #include "gl-util.h" @@ -34,7 +33,6 @@ #include "quadarray.h" #include "texpool.h" #include "glstate.h" -#endif // MKXPZ_RETRO #include "sigslot/signal.hpp" @@ -120,7 +118,6 @@ static const uint8_t pauseAniAlpha[] = static elementsN(pauseAniAlpha); -#ifndef MKXPZ_RETRO /* Points to an array of quads which it doesn't own. * Useful for setting alpha of quads stored inside * bigger arrays */ @@ -139,7 +136,6 @@ struct QuadChunk vert[i].color.w = value; } }; -#endif // MKXPZ_RETRO /* Vocabulary: * @@ -200,7 +196,6 @@ struct WindowPrivate bool opacityDirty; bool baseTexDirty; -#ifndef MKXPZ_RETRO ColorQuadArray baseQuadArray; /* Used when opacity < 255 */ @@ -210,7 +205,6 @@ struct WindowPrivate QuadChunk backgroundVert; Quad baseTexQuad; -#endif // MKXPZ_RETRO struct WindowControls : public ViewportElement { @@ -239,7 +233,6 @@ struct WindowPrivate WindowControls controlsElement; -#ifndef MKXPZ_RETRO ColorQuadArray controlsQuadArray; int controlsQuadCount; @@ -247,7 +240,6 @@ struct WindowPrivate QuadChunk pauseAniVert; QuadChunk cursorVert; -#endif // MKXPZ_RETRO uint8_t cursorAniAlphaIdx; uint8_t pauseAniAlphaIdx; @@ -280,11 +272,9 @@ struct WindowPrivate { refreshCursorRectCon(); -#ifndef MKXPZ_RETRO controlsQuadArray.resize(14); cursorVert.count = 9; pauseAniVert.count = 1; -#endif // MKXPZ_RETRO prepareCon = shState->prepareDraw.connect (&WindowPrivate::prepare, this); @@ -292,9 +282,7 @@ struct WindowPrivate ~WindowPrivate() { -#ifndef MKXPZ_RETRO shState->texPool().release(baseTex); -#endif // MKXPZ_RETRO cursorRectCon.disconnect(); prepareCon.disconnect(); @@ -345,7 +333,6 @@ struct WindowPrivate cornerRects.bl = IntRect(0, h-16, 16, 16); cornerRects.br = IntRect(w-16, h-16, 16, 16); -#ifndef MKXPZ_RETRO /* Required quad count */ int count = 0; @@ -402,7 +389,6 @@ struct WindowPrivate FloatRect texRect = FloatRect(0, 0, size.x, size.y); baseTexQuad.setTexPosRect(texRect, texRect); -#endif // MKXPZ_RETRO opacityDirty = true; baseTexDirty = true; @@ -410,12 +396,10 @@ struct WindowPrivate void updateBaseAlpha() { -#ifndef MKXPZ_RETRO /* This is always applied unconditionally */ backgroundVert.setAlpha(backOpacity.norm); baseTexQuad.setColor(Vec4(1, 1, 1, opacity.norm)); -#endif // MKXPZ_RETRO baseTexDirty = true; } @@ -423,7 +407,6 @@ struct WindowPrivate void ensureBaseTexReady() { /* Make sure texture is big enough */ -#ifndef MKXPZ_RETRO int newW = baseTex.width; int newH = baseTex.height; bool resizeNeeded = false; @@ -444,14 +427,12 @@ struct WindowPrivate shState->texPool().release(baseTex); baseTex = shState->texPool().request(newW, newH); -#endif // MKXPZ_RETRO baseTexDirty = true; } void redrawBaseTex() { -#ifndef MKXPZ_RETRO /* Discard old buffer */ TEX::bind(baseTex.tex); TEX::allocEmpty(baseTex.width, baseTex.height); @@ -470,7 +451,9 @@ struct WindowPrivate FBO::clear(); /* Repaint base */ +#ifndef MKXPZ_RETRO // TODO windowskin->bindTex(shader); +#endif // MKXPZ_RETRO TEX::setSmooth(true); /* We need to blit the background without blending, @@ -490,12 +473,10 @@ struct WindowPrivate glState.blendMode.pop(); glState.viewport.pop(); TEX::setSmooth(false); -#endif // MKXPZ_RETRO } void buildControlsVert() { -#ifndef MKXPZ_RETRO int i = 0; Vertex *vert = controlsQuadArray.vertices.data(); @@ -545,7 +526,6 @@ struct WindowPrivate controlsQuadArray.commit(); controlsQuadCount = i; -#endif // MKXPZ_RETRO } void prepare() @@ -569,7 +549,6 @@ struct WindowPrivate updateBaseQuadArray = true; } -#ifndef MKXPZ_RETRO if (updateBaseQuadArray) baseQuadArray.commit(); @@ -587,7 +566,6 @@ struct WindowPrivate baseTexDirty = false; } } -#endif // MKXPZ_RETRO } void drawBase() @@ -598,7 +576,6 @@ struct WindowPrivate if (size == Vec2i(0, 0)) return; -#ifndef MKXPZ_RETRO SimpleAlphaShader &shader = shState->shaders().simpleAlpha; shader.bind(); shader.applyViewportProj(); @@ -620,7 +597,6 @@ struct WindowPrivate TEX::setSmooth(false); } -#endif // MKXPZ_RETRO } void drawControls() @@ -644,7 +620,6 @@ struct WindowPrivate const IntRect windowRect(efPos, size); const IntRect contentsRect(efPos + Vec2i(16), size - Vec2i(32)); -#ifndef MKXPZ_RETRO glState.scissorTest.pushSet(true); glState.scissorBox.push(); glState.scissorBox.setIntersect(windowRect); @@ -679,12 +654,10 @@ struct WindowPrivate glState.scissorBox.pop(); glState.scissorTest.pop(); -#endif // MKXPZ_RETRO } void updateControls() { -#ifndef MKXPZ_RETRO bool updateArray = false; if (active && cursorVert.vert) @@ -709,7 +682,6 @@ struct WindowPrivate if (updateArray) controlsQuadArray.commit(); -#endif // MKXPZ_RETRO } void stepAnimations() @@ -776,9 +748,7 @@ void Window::setWindowskin(Bitmap *value) return; } -#ifndef MKXPZ_RETRO value->ensureNonMega(); -#endif // MKXPZ_RETRO p->windowskinDispCon = value->wasDisposed.connect(&WindowPrivate::windowskinDisposal, p); } @@ -803,11 +773,9 @@ void Window::setContents(Bitmap *value) p->contentsDispCon = value->wasDisposed.connect(&WindowPrivate::contentsDisposal, p); -#ifndef MKXPZ_RETRO value->ensureNonMega(); p->contentsQuad.setTexPosRect(value->rect(), value->rect()); -#endif // MKXPZ_RETRO } void Window::setStretch(bool value) @@ -919,9 +887,7 @@ void Window::setContentsOpacity(int value) return; p->contentsOpacity = value; -#ifndef MKXPZ_RETRO p->contentsQuad.setColor(Vec4(1, 1, 1, p->contentsOpacity.norm)); -#endif // MKXPZ_RETRO } void Window::initDynAttribs()