/* Assembles atlas from tileset and autotile bitmaps */ void buildAtlas() { updateAutotileInfo(); TileAtlas::BlitVec blits = TileAtlas::calcBlits(atlas.efTilesetH, atlas.size); /* Clear atlas */ FBO::bind(atlas.gl.fbo, FBO::Draw); glState.clearColor.pushSet(Vec4()); glState.scissorTest.pushSet(false); FBO::clear(); glState.scissorTest.pop(); glState.clearColor.pop(); /* Blit autotiles */ for (size_t i = 0; i < atlas.usableATs.size(); ++i) { const uint8_t atInd = atlas.usableATs[i]; Bitmap *autotile = autotiles[atInd]; int blitW = std::min(autotile->width(), atAreaW); int blitH = std::min(autotile->height(), atAreaH); FBO::bind(autotile->getGLTypes().fbo, FBO::Read); if (blitW <= autotileW && tiles.animated) { /* Static autotile */ for (int j = 0; j < 4; ++j) FBO::blit(0, 0, autotileW*j, atInd*autotileH, blitW, blitH); } else { /* Animated autotile */ FBO::blit(0, 0, 0, atInd*autotileH, blitW, blitH); } } /* Blit tileset */ if (tileset->megaSurface()) { /* Mega surface tileset */ FBO::unbind(FBO::Draw); TEX::bind(atlas.gl.tex); SDL_Surface *tsSurf = tileset->megaSurface(); for (size_t i = 0; i < blits.size(); ++i) { const TileAtlas::Blit &blitOp = blits[i]; GLMeta::subRectImageUpload(tsSurf->w, blitOp.src.x, blitOp.src.y, blitOp.dst.x, blitOp.dst.y, tsLaneW, blitOp.h, tsSurf, GL_RGBA); } GLMeta::subRectImageFinish(); } else { /* Regular tileset */ FBO::bind(tileset->getGLTypes().fbo, FBO::Read); for (size_t i = 0; i < blits.size(); ++i) { const TileAtlas::Blit &blitOp = blits[i]; FBO::blit(blitOp.src.x, blitOp.src.y, blitOp.dst.x, blitOp.dst.y, tsLaneW, blitOp.h); } } }
/* Assembles atlas from tileset and autotile bitmaps */ void buildAtlas() { tileset->flush(); updateAutotileInfo(); for (size_t i = 0; i < atlas.usableATs.size(); ++i) autotiles[atlas.usableATs[i]]->flush(); TileAtlas::BlitList blits = TileAtlas::calcBlits(atlas.efTilesetH, atlas.size); /* Clear atlas */ FBO::bind(atlas.gl.fbo, FBO::Draw); glState.clearColor.pushSet(Vec4()); glState.scissorTest.pushSet(false); FBO::clear(); glState.scissorTest.pop(); glState.clearColor.pop(); /* Blit autotiles */ for (size_t i = 0; i < atlas.usableATs.size(); ++i) { const uint8_t atInd = atlas.usableATs[i]; Bitmap *autotile = autotiles[atInd]; int blitW = std::min(autotile->width(), atAreaW); int blitH = std::min(autotile->height(), atAreaH); FBO::bind(autotile->getGLTypes().fbo, FBO::Read); FBO::blit(0, 0, 0, atInd*autotileH, blitW, blitH); } /* Blit tileset */ if (tileset->megaSurface()) { /* Mega surface tileset */ FBO::unbind(FBO::Draw); TEX::bind(atlas.gl.tex); SDL_Surface *tsSurf = tileset->megaSurface(); for (size_t i = 0; i < blits.size(); ++i) { const TileAtlas::Blit &blitOp = blits[i]; PixelStore::setupSubImage(tsSurf->w, blitOp.src.x, blitOp.src.y); TEX::uploadSubImage(blitOp.dst.x, blitOp.dst.y, tsLaneW, blitOp.h, tsSurf->pixels, GL_RGBA); } PixelStore::reset(); } else { /* Regular tileset */ FBO::bind(tileset->getGLTypes().fbo, FBO::Read); for (size_t i = 0; i < blits.size(); ++i) { const TileAtlas::Blit &blitOp = blits[i]; FBO::blit(blitOp.src.x, blitOp.src.y, blitOp.dst.x, blitOp.dst.y, tsLaneW, blitOp.h); } } }