From d607fc8b853adb02827c10cef32d15f5f152a09d Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Fri, 13 Jun 2014 13:19:19 +0300 Subject: In modernopengl add support for draw cached tile vertexes. --- src/render/modernopenglgraphics.cpp | 57 +++++++++++++++++++++++++++++++++++++ src/test/testlauncher.cpp | 11 ++++++- 2 files changed, 67 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/render/modernopenglgraphics.cpp b/src/render/modernopenglgraphics.cpp index f37e3336a..ea8447c33 100644 --- a/src/render/modernopenglgraphics.cpp +++ b/src/render/modernopenglgraphics.cpp @@ -698,10 +698,67 @@ void ModernOpenGLGraphics::calcTileVertexesInline(ImageVertexes *const vert, const Image *const image, int dstX, int dstY) const { + if (!vert || !image) + return; + + const SDL_Rect &imageRect = image->mBounds; + const int srcX = imageRect.x; + const int srcY = imageRect.y; + const int w = imageRect.w; + const int h = imageRect.h; + + if (w == 0 || h == 0) + return; + + const float tw = static_cast(image->mTexWidth); + const float th = static_cast(image->mTexHeight); + const ClipRect &clipArea = mClipStack.top(); + const int x2 = dstX + clipArea.xOffset; + const int y2 = dstY + clipArea.yOffset; + + const unsigned int vLimit = mMaxVertices * 4; + + OpenGLGraphicsVertexes &ogl = vert->ogl; + + unsigned int vp = ogl.continueVp(); + + float texX1 = static_cast(srcX) / tw; + float texY1 = static_cast(srcY) / th; + float texX2 = static_cast(srcX + w) / tw; + float texY2 = static_cast(srcY + h) / th; + + GLfloat *const floatArray = ogl.continueFloatTexArray(); + + vertFill2D(floatArray, + texX1, texY1, texX2, texY2, + x2, y2, w, h); + + vp += 24; + if (vp >= vLimit) + { + ogl.switchFloatTexArray(); + ogl.switchVp(vp); + vp = 0; + } + + ogl.switchVp(vp); } void ModernOpenGLGraphics::drawTileVertexes(const ImageVertexes *const vert) { + if (!vert) + return; + const Image *const image = vert->image; + + setColorAlpha(image->mAlpha); +#ifdef DEBUG_BIND_TEXTURE + debugBindTexture(image); +#endif + bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); + setTexturingAndBlending(true); + bindArrayBufferAndAttributes(mVbo); + + drawVertexes(vert->ogl); } void ModernOpenGLGraphics::calcWindow(ImageCollection *const vertCol, diff --git a/src/test/testlauncher.cpp b/src/test/testlauncher.cpp index 86d2be370..d3bb5d571 100644 --- a/src/test/testlauncher.cpp +++ b/src/test/testlauncher.cpp @@ -370,10 +370,13 @@ int TestLauncher::testDye() int TestLauncher::testDraw() { - Image *img[2]; + Image *img[3]; img[0] = Theme::getImageFromTheme("graphics/sprites/arrow_left.png"); img[1] = Theme::getImageFromTheme("graphics/sprites/arrow_right.png"); + img[2] = Theme::getImageFromTheme("graphics/sprites/arrow_up.png"); ImageCollection *const col = new ImageCollection; + ImageVertexes *const vert = new ImageVertexes; + vert->image = img[2]; mainGraphics->pushClipArea(Rect(10, 20, 790, 580)); mainGraphics->setColor(Color(0xFFU, 0xFFU, 0x00U, 0xFFU)); @@ -384,6 +387,10 @@ int TestLauncher::testDraw() mainGraphics->drawImage(img[0], 190, 383); img[0]->setAlpha(1.0f); + mainGraphics->calcTileVertexes(vert, img[2], 10, 10); + mainGraphics->calcTileVertexes(vert, img[2], 40, 10); + mainGraphics->finalize(vert); + mainGraphics->setColor(Color(0x80U, 0x00U, 0xA0U, 0x90U)); mainGraphics->fillRectangle(Rect(200, 100, 300, 300)); mainGraphics->popClipArea(); @@ -398,6 +405,8 @@ int TestLauncher::testDraw() mainGraphics->calcPattern(col, img[1], 500, 400, 150, 100); mainGraphics->finalize(col); + mainGraphics->drawTileVertexes(vert); + mainGraphics->drawRescaledImage(img[0], 250, 350, 35, 90); mainGraphics->setColor(Color(0x00U, 0xFFU, 0x00U, 0x90U)); -- cgit v1.2.3-60-g2f50