diff options
Diffstat (limited to 'src/render/modernopenglgraphics.cpp')
-rw-r--r-- | src/render/modernopenglgraphics.cpp | 806 |
1 files changed, 7 insertions, 799 deletions
diff --git a/src/render/modernopenglgraphics.cpp b/src/render/modernopenglgraphics.cpp index 553a864e3..2b771a2bb 100644 --- a/src/render/modernopenglgraphics.cpp +++ b/src/render/modernopenglgraphics.cpp @@ -22,7 +22,7 @@ #include "main.h" -#ifdef USE_OPENGL +#if defined USE_OPENGL && !defined ANDROID #include "render/modernopenglgraphics.h" @@ -41,32 +41,6 @@ #include "debug.h" -#define vertFill2D(tVar, vVar, x1, y1, x2, y2, dstX, dstY, w, h) \ - tVar[vp + 0] = x1; \ - tVar[vp + 1] = y1; \ - tVar[vp + 2] = x2; \ - tVar[vp + 3] = y1; \ - tVar[vp + 4] = x2; \ - tVar[vp + 5] = y2; \ - tVar[vp + 6] = x1; \ - tVar[vp + 7] = y1; \ - tVar[vp + 8] = x1; \ - tVar[vp + 9] = y2; \ - tVar[vp + 10] = x2; \ - tVar[vp + 11] = y2; \ - vVar[vp + 0] = static_cast<GLshort>(dstX); \ - vVar[vp + 1] = static_cast<GLshort>(dstY); \ - vVar[vp + 2] = static_cast<GLshort>(dstX + w); \ - vVar[vp + 3] = static_cast<GLshort>(dstY); \ - vVar[vp + 4] = static_cast<GLshort>(dstX + w); \ - vVar[vp + 5] = static_cast<GLshort>(dstY + h); \ - vVar[vp + 6] = static_cast<GLshort>(dstX); \ - vVar[vp + 7] = static_cast<GLshort>(dstY); \ - vVar[vp + 8] = static_cast<GLshort>(dstX); \ - vVar[vp + 9] = static_cast<GLshort>(dstY + h); \ - vVar[vp + 10] = static_cast<GLshort>(dstX + w); \ - vVar[vp + 11] = static_cast<GLshort>(dstY + h); - GLuint ModernOpenGLGraphics::mLastImage = 0; #ifdef DEBUG_DRAW_CALLS unsigned int ModernOpenGLGraphics::mDrawCalls = 0; @@ -158,41 +132,6 @@ static inline void drawQuad(const Image *const image, const int dstX, const int dstY, const int width, const int height) { -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) - { - const float tw = static_cast<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - // Find OpenGL normalized texture coordinates. - const float texX1 = static_cast<float>(srcX) / tw; - const float texY1 = static_cast<float>(srcY) / th; - const float texX2 = static_cast<float>(srcX + width) / tw; - const float texY2 = static_cast<float>(srcY + height) / th; - - GLfloat tex[] = - { - texX1, texY1, - texX2, texY1, - texX1, texY2, - texX2, texY2 - }; - - GLshort vert[] = - { - static_cast<GLshort>(dstX), static_cast<GLshort>(dstY), - static_cast<GLshort>(dstX + width), static_cast<GLshort>(dstY), - static_cast<GLshort>(dstX), static_cast<GLshort>(dstY + height), - static_cast<GLshort>(dstX + width), - static_cast<GLshort>(dstY + height) - }; - - glVertexPointer(2, GL_SHORT, 0, &vert); - glTexCoordPointer(2, GL_FLOAT, 0, &tex); - -#ifdef DEBUG_DRAW_CALLS - ModernOpenGLGraphics::mDrawCalls ++; -#endif - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } } static inline void drawRescaledQuad(const Image *const image, @@ -202,42 +141,6 @@ static inline void drawRescaledQuad(const Image *const image, const int desiredWidth, const int desiredHeight) { -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) - { - const float tw = static_cast<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - // Find OpenGL normalized texture coordinates. - const float texX1 = static_cast<float>(srcX) / tw; - const float texY1 = static_cast<float>(srcY) / th; - const float texX2 = static_cast<float>(srcX + width) / tw; - const float texY2 = static_cast<float>(srcY + height) / th; - - GLfloat tex[] = - { - texX1, texY1, - texX2, texY1, - texX1, texY2, - texX2, texY2 - }; - - GLshort vert[] = - { - static_cast<GLshort>(dstX), static_cast<GLshort>(dstY), - static_cast<GLshort>(dstX + desiredWidth), - static_cast<GLshort>(dstY), - static_cast<GLshort>(dstX), static_cast<GLshort>( - dstY + desiredHeight), - static_cast<GLshort>(dstX + desiredWidth), - static_cast<GLshort>(dstY + desiredHeight) - }; - glVertexPointer(2, GL_SHORT, 0, &vert); - glTexCoordPointer(2, GL_FLOAT, 0, &tex); - -#ifdef DEBUG_DRAW_CALLS - ModernOpenGLGraphics::mDrawCalls ++; -#endif - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } } bool ModernOpenGLGraphics::drawImage(const Image *const image, @@ -249,154 +152,22 @@ bool ModernOpenGLGraphics::drawImage(const Image *const image, bool ModernOpenGLGraphics::drawImageInline(const Image *const image, int dstX, int dstY) { - FUNC_BLOCK("Graphics::drawImage", 1) - if (!image) - return false; - - setColorAlpha(image->mAlpha); -#ifdef DEBUG_BIND_TEXTURE - debugBindTexture(image); -#endif - bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); - setTexturingAndBlending(true); - - const SDL_Rect &imageRect = image->mBounds; - drawQuad(image, imageRect.x, imageRect.y, - dstX, dstY, imageRect.w, imageRect.h); - return true; } void ModernOpenGLGraphics::drawImageCached(const Image *const image, int x, int y) { - if (!image) - return; - - if (image->mGLImage != mImageCached) - { - completeCache(); - mImageCached = image->mGLImage; - mAlphaCached = image->mAlpha; - } - - 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<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - - const unsigned int vLimit = mMaxVertices * 4; - - unsigned int vp = mVpCached; - - // Draw a set of textured rectangles -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) - { - float texX1 = static_cast<float>(srcX) / tw; - float texY1 = static_cast<float>(srcY) / th; - float texX2 = static_cast<float>(srcX + w) / tw; - float texY2 = static_cast<float>(srcY + h) / th; - - vertFill2D(mFloatTexArrayCached, mShortVertArrayCached, - texX1, texY1, texX2, texY2, - x, y, w, h); - - vp += 12; - if (vp >= vLimit) - { - completeCache(); - vp = 0; - } - else - { - mVpCached = vp; - } - } } void ModernOpenGLGraphics::drawPatternCached(const Image *const image, const int x, const int y, const int w, const int h) { - if (!image) - return; - - if (image->mGLImage != mImageCached) - { - completeCache(); - mImageCached = image->mGLImage; - } - - const SDL_Rect &imageRect = image->mBounds; - const int srcX = imageRect.x; - const int srcY = imageRect.y; - const int iw = imageRect.w; - const int ih = imageRect.h; - - if (iw == 0 || ih == 0) - return; - - const float tw = static_cast<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - - unsigned int vp = mVpCached; - const unsigned int vLimit = mMaxVertices * 4; - // Draw a set of textured rectangles -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) -// { - const float texX1 = static_cast<float>(srcX) / tw; - const float texY1 = static_cast<float>(srcY) / th; - - for (int py = 0; py < h; py += ih) - { - const int height = (py + ih >= h) ? h - py : ih; - const float texY2 = static_cast<float>(srcY + height) / th; - const int dstY = y + py; - for (int px = 0; px < w; px += iw) - { - const int width = (px + iw >= w) ? w - px : iw; - const int dstX = x + px; - - const float texX2 = static_cast<float>(srcX + width) / tw; - - vertFill2D(mFloatTexArrayCached, mShortVertArrayCached, - texX1, texY1, texX2, texY2, - dstX, dstY, width, height); - - vp += 12; - if (vp >= vLimit) - { - completeCache(); - vp = 0; - } - } - } -// } - mVpCached = vp; } void ModernOpenGLGraphics::completeCache() { - if (!mImageCached) - return; - - setColorAlpha(mAlphaCached); -#ifdef DEBUG_BIND_TEXTURE -// debugBindTexture(image); -#endif - bindTexture(OpenGLImageHelper::mTextureType, mImageCached); - setTexturingAndBlending(true); - - drawTriangleArrayfsCached(mVpCached); - mImageCached = 0; - mVpCached = 0; } bool ModernOpenGLGraphics::drawRescaledImage(const Image *const image, @@ -404,27 +175,6 @@ bool ModernOpenGLGraphics::drawRescaledImage(const Image *const image, const int desiredWidth, const int desiredHeight) { - FUNC_BLOCK("Graphics::drawRescaledImage", 1) - if (!image) - return false; - - const SDL_Rect &imageRect = image->mBounds; - - // Just draw the image normally when no resizing is necessary, - if (imageRect.w == desiredWidth && imageRect.h == desiredHeight) - return drawImageInline(image, dstX, dstY); - - setColorAlpha(image->mAlpha); -#ifdef DEBUG_BIND_TEXTURE - debugBindTexture(image); -#endif - bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); - setTexturingAndBlending(true); - - // Draw a textured quad. - drawRescaledQuad(image, imageRect.x, imageRect.y, dstX, dstY, - imageRect.w, imageRect.h, desiredWidth, desiredHeight); - return true; } @@ -439,66 +189,6 @@ void ModernOpenGLGraphics::drawPatternInline(const Image *const image, const int x, const int y, const int w, const int h) { - FUNC_BLOCK("Graphics::drawPattern", 1) - if (!image) - return; - - const SDL_Rect &imageRect = image->mBounds; - const int srcX = imageRect.x; - const int srcY = imageRect.y; - const int iw = imageRect.w; - const int ih = imageRect.h; - - if (iw == 0 || ih == 0) - return; - - const float tw = static_cast<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - - setColorAlpha(image->mAlpha); - -#ifdef DEBUG_BIND_TEXTURE - debugBindTexture(image); -#endif - bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); - - setTexturingAndBlending(true); - - unsigned int vp = 0; - const unsigned int vLimit = mMaxVertices * 4; - // Draw a set of textured rectangles -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) -// { - const float texX1 = static_cast<float>(srcX) / tw; - const float texY1 = static_cast<float>(srcY) / th; - - for (int py = 0; py < h; py += ih) - { - const int height = (py + ih >= h) ? h - py : ih; - const float texY2 = static_cast<float>(srcY + height) / th; - const int dstY = y + py; - for (int px = 0; px < w; px += iw) - { - const int width = (px + iw >= w) ? w - px : iw; - const int dstX = x + px; - - const float texX2 = static_cast<float>(srcX + width) / tw; - - vertFill2D(mFloatTexArray, mShortVertArray, - texX1, texY1, texX2, texY2, - dstX, dstY, width, height); - - vp += 12; - if (vp >= vLimit) - { - drawTriangleArrayfs(vp); - vp = 0; - } - } - } - if (vp > 0) - drawTriangleArrayfs(vp); -// } } void ModernOpenGLGraphics::drawRescaledPattern(const Image *const image, @@ -507,105 +197,12 @@ void ModernOpenGLGraphics::drawRescaledPattern(const Image *const image, const int scaledWidth, const int scaledHeight) { - if (!image) - return; - - if (scaledWidth == 0 || scaledHeight == 0) - return; - - const SDL_Rect &imageRect = image->mBounds; - const int srcX = imageRect.x; - const int srcY = imageRect.y; - const int iw = imageRect.w; - const int ih = imageRect.h; - if (iw == 0 || ih == 0) - return; - - setColorAlpha(image->mAlpha); - -#ifdef DEBUG_BIND_TEXTURE - debugBindTexture(image); -#endif - bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); - - setTexturingAndBlending(true); - - unsigned int vp = 0; - const unsigned int vLimit = mMaxVertices * 4; - - // Draw a set of textured rectangles -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) -// { - const float tw = static_cast<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - - const float texX1 = static_cast<float>(srcX) / tw; - const float texY1 = static_cast<float>(srcY) / th; - - const float tFractionW = iw / tw; - const float tFractionH = ih / th; - - for (int py = 0; py < h; py += scaledHeight) - { - const int height = (py + scaledHeight >= h) - ? h - py : scaledHeight; - const int dstY = y + py; - const float visibleFractionH = static_cast<float>(height) - / scaledHeight; - const float texY2 = texY1 + tFractionH * visibleFractionH; - for (int px = 0; px < w; px += scaledWidth) - { - const int width = (px + scaledWidth >= w) - ? w - px : scaledWidth; - const int dstX = x + px; - const float visibleFractionW = static_cast<float>(width) - / scaledWidth; - const float texX2 = texX1 + tFractionW * visibleFractionW; - - vertFill2D(mFloatTexArray, mShortVertArray, - texX1, texY1, texX2, texY2, - dstX, dstY, width, height); - - vp += 12; - if (vp >= vLimit) - { - drawTriangleArrayfs(vp); - vp = 0; - } - } - } - if (vp > 0) - drawTriangleArrayfs(vp); -// } } inline void ModernOpenGLGraphics::drawVertexes(const NormalOpenGLGraphicsVertexes &ogl) { - const std::vector<GLshort*> &shortVertPool = ogl.mShortVertPool; - std::vector<GLshort*>::const_iterator iv; - const std::vector<GLshort*>::const_iterator iv_end = shortVertPool.end(); - const std::vector<int> &vp = ogl.mVp; - std::vector<int>::const_iterator ivp; - const std::vector<int>::const_iterator ivp_end = vp.end(); - - // Draw a set of textured rectangles -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) - { - const std::vector<GLfloat*> &floatTexPool = ogl.mFloatTexPool; - std::vector<GLfloat*>::const_iterator ft; - const std::vector<GLfloat*>::const_iterator - ft_end = floatTexPool.end(); - - for (iv = shortVertPool.begin(), ft = floatTexPool.begin(), - ivp = vp.begin(); - iv != iv_end && ft != ft_end && ivp != ivp_end; - ++ iv, ++ ft, ++ ivp) - { - drawTriangleArrayfs(*iv, *ft, *ivp); - } - } } void ModernOpenGLGraphics::calcPattern(ImageVertexes *const vert, @@ -621,62 +218,6 @@ void ModernOpenGLGraphics::calcPatternInline(ImageVertexes *const vert, const int x, const int y, const int w, const int h) const { - if (!image || !vert) - return; - - const SDL_Rect &imageRect = image->mBounds; - const int srcX = imageRect.x; - const int srcY = imageRect.y; - const int iw = imageRect.w; - const int ih = imageRect.h; - - if (iw == 0 || ih == 0) - return; - - const float tw = static_cast<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - - const unsigned int vLimit = mMaxVertices * 4; - - NormalOpenGLGraphicsVertexes &ogl = vert->ogl; - unsigned int vp = ogl.continueVp(); - - // Draw a set of textured rectangles -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) - { - const float texX1 = static_cast<float>(srcX) / tw; - const float texY1 = static_cast<float>(srcY) / th; - - GLfloat *floatTexArray = ogl.continueFloatTexArray(); - GLshort *shortVertArray = ogl.continueShortVertArray(); - - for (int py = 0; py < h; py += ih) - { - const int height = (py + ih >= h) ? h - py : ih; - const int dstY = y + py; - const float texY2 = static_cast<float>(srcY + height) / th; - for (int px = 0; px < w; px += iw) - { - const int width = (px + iw >= w) ? w - px : iw; - const int dstX = x + px; - const float texX2 = static_cast<float>(srcX + width) / tw; - - vertFill2D(floatTexArray, shortVertArray, - texX1, texY1, texX2, texY2, - dstX, dstY, width, height); - - vp += 12; - if (vp >= vLimit) - { - floatTexArray = ogl.switchFloatTexArray(); - shortVertArray = ogl.switchShortVertArray(); - ogl.switchVp(vp); - vp = 0; - } - } - } - } - ogl.switchVp(vp); } void ModernOpenGLGraphics::calcTileCollection(ImageCollection *const vertCol, @@ -701,21 +242,6 @@ void ModernOpenGLGraphics::calcTileCollection(ImageCollection *const vertCol, void ModernOpenGLGraphics::drawTileCollection(const ImageCollection *const vertCol) { - const ImageVertexesVector &draws = vertCol->draws; - const ImageCollectionCIter it_end = draws.end(); - for (ImageCollectionCIter it = draws.begin(); it != it_end; ++ it) - { - const ImageVertexes *const vert = *it; - const Image *const image = vert->image; - - setColorAlpha(image->mAlpha); -#ifdef DEBUG_BIND_TEXTURE - debugBindTexture(image); -#endif - bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); - setTexturingAndBlending(true); - drawVertexes(vert->ogl); - } } void ModernOpenGLGraphics::calcPattern(ImageCollection* const vertCol, @@ -751,68 +277,10 @@ 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<float>(image->mTexWidth); - const float th = static_cast<float>(image->mTexHeight); - - const unsigned int vLimit = mMaxVertices * 4; - - NormalOpenGLGraphicsVertexes &ogl = vert->ogl; - -// std::vector<int> *vps = ogl.getVp(); - unsigned int vp = ogl.continueVp(); - - // Draw a set of textured rectangles -// if (OpenGLImageHelper::mTextureType == GL_TEXTURE_2D) - { - float texX1 = static_cast<float>(srcX) / tw; - float texY1 = static_cast<float>(srcY) / th; - float texX2 = static_cast<float>(srcX + w) / tw; - float texY2 = static_cast<float>(srcY + h) / th; - - GLfloat *const floatTexArray = ogl.continueFloatTexArray(); - GLshort *const shortVertArray = ogl.continueShortVertArray(); - - vertFill2D(floatTexArray, shortVertArray, - texX1, texY1, texX2, texY2, - dstX, dstY, w, h); - - vp += 12; - if (vp >= vLimit) - { - ogl.switchFloatTexArray(); - ogl.switchShortVertArray(); - 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); - drawVertexes(vert->ogl); } void ModernOpenGLGraphics::calcWindow(ImageCollection *const vertCol, @@ -840,8 +308,6 @@ void ModernOpenGLGraphics::calcWindow(ImageCollection *const vertCol, void ModernOpenGLGraphics::updateScreen() { BLOCK_START("Graphics::updateScreen") -// glFlush(); -// glFinish(); #ifdef DEBUG_DRAW_CALLS mLastDrawCalls = mDrawCalls; mDrawCalls = 0; @@ -862,25 +328,6 @@ void ModernOpenGLGraphics::updateScreen() void ModernOpenGLGraphics::beginDraw() { - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - -#ifdef ANDROID - glOrthof(0.0, static_cast<float>(mRect.w), - static_cast<float>(mRect.h), - 0.0, -1.0, 1.0); -#else - glOrtho(0.0, static_cast<double>(mRect.w), - static_cast<double>(mRect.h), - 0.0, -1.0, 1.0); -#endif - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glEnable(GL_SCISSOR_TEST); glDisable(GL_DITHER); glDisable(GL_LIGHTING); @@ -889,26 +336,20 @@ void ModernOpenGLGraphics::beginDraw() glDisable(GL_COLOR_LOGIC_OP); glDisable(GL_COLOR_MATERIAL); glDisable(GL_STENCIL_TEST); + glEnable(GL_TEXTURE_2D); glShadeModel(GL_FLAT); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - #ifndef ANDROID glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); - glHint(GL_POINT_SMOOTH_HINT, GL_FASTEST); glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST); #ifndef __MINGW32__ glHint(GL_TEXTURE_COMPRESSION_HINT, GL_FASTEST); #endif #endif -// glScalef(0.5F, 0.5F, 0.5F); - pushClipArea(Rect(0, 0, mRect.w, mRect.h)); } @@ -976,31 +417,16 @@ SDL_Surface* ModernOpenGLGraphics::getScreenshot() bool ModernOpenGLGraphics::pushClipArea(const Rect &area) { - int transX = 0; - int transY = 0; - - if (!mClipStack.empty()) - { - const ClipRect &clipArea = mClipStack.top(); - transX = -clipArea.xOffset; - transY = -clipArea.yOffset; - } - const bool result = Graphics::pushClipArea(area); const ClipRect &clipArea = mClipStack.top(); - transX += clipArea.xOffset; - transY += clipArea.yOffset; - if (transX || transY) - { - glTranslatef(static_cast<GLfloat>(transX), - static_cast<GLfloat>(transY), 0); - } +/* glScissor(clipArea.x * mScale, (mRect.h - clipArea.y - clipArea.height) * mScale, clipArea.width * mScale, clipArea.height * mScale); +*/ return result; } @@ -1008,59 +434,25 @@ void ModernOpenGLGraphics::popClipArea() { if (mClipStack.empty()) return; - - const ClipRect &clipArea1 = mClipStack.top(); - int transX = -clipArea1.xOffset; - int transY = -clipArea1.yOffset; - Graphics::popClipArea(); - if (mClipStack.empty()) return; const ClipRect &clipArea = mClipStack.top(); - transX += clipArea.xOffset; - transY += clipArea.yOffset; - if (transX || transY) - { - glTranslatef(static_cast<GLfloat>(transX), - static_cast<GLfloat>(transY), 0); - } +/* glScissor(clipArea.x * mScale, (mRect.h - clipArea.y - clipArea.height) * mScale, clipArea.width * mScale, clipArea.height * mScale); +*/ } -#ifdef ANDROID -void ModernOpenGLGraphics::drawPoint(int x A_UNUSED, int y A_UNUSED) -#else void ModernOpenGLGraphics::drawPoint(int x, int y) -#endif { - setTexturingAndBlending(false); - restoreColor(); - -#ifdef ANDROID - // TODO need fix -#else - glBegin(GL_POINTS); - glVertex2i(x, y); - glEnd(); -#endif } void ModernOpenGLGraphics::drawLine(int x1, int y1, int x2, int y2) { - setTexturingAndBlending(false); - restoreColor(); - - mShortVertArray[0] = static_cast<GLshort>(x1); - mShortVertArray[1] = static_cast<GLshort>(y1); - mShortVertArray[2] = static_cast<GLshort>(x2); - mShortVertArray[3] = static_cast<GLshort>(y2); - - drawLineArrays(4); } void ModernOpenGLGraphics::drawRectangle(const Rect& rect) @@ -1077,13 +469,6 @@ void ModernOpenGLGraphics::setTexturingAndBlending(const bool enable) { if (enable) { - if (!mTexture) - { - glEnable(OpenGLImageHelper::mTextureType); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - mTexture = true; - } - if (!mAlpha) { glEnable(GL_BLEND); @@ -1092,128 +477,23 @@ void ModernOpenGLGraphics::setTexturingAndBlending(const bool enable) } else { - mLastImage = 0; - if (mAlpha && !mColorAlpha) + if (mAlpha) { glDisable(GL_BLEND); mAlpha = false; } - else if (!mAlpha && mColorAlpha) - { - glEnable(GL_BLEND); - mAlpha = true; - } - - if (mTexture) - { - glDisable(OpenGLImageHelper::mTextureType); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - mTexture = false; - } } } void ModernOpenGLGraphics::drawRectangle(const Rect& rect, const bool filled) { - BLOCK_START("Graphics::drawRectangle") - setTexturingAndBlending(false); - restoreColor(); - - const GLshort x = static_cast<GLshort>(rect.x); - const GLshort y = static_cast<GLshort>(rect.y); - const GLshort width = static_cast<GLshort>(rect.width); - const GLshort height = static_cast<GLshort>(rect.height); - const GLshort xw = static_cast<GLshort>(rect.x + width); - const GLshort yh = static_cast<GLshort>(rect.y + height); - - if (filled) - { - GLshort vert[] = - { - x, y, - xw, y, - x, yh, - xw, yh - }; - - glVertexPointer(2, GL_SHORT, 0, &vert); -#ifdef DEBUG_DRAW_CALLS - mDrawCalls ++; -#endif - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } - else - { - GLshort vert[] = - { - x, y, - xw, y, - xw, yh, - x, yh - }; - - glVertexPointer(2, GL_SHORT, 0, &vert); -#ifdef DEBUG_DRAW_CALLS - mDrawCalls ++; -#endif - glDrawArrays(GL_LINE_LOOP, 0, 4); - } - BLOCK_END("Graphics::drawRectangle") } bool ModernOpenGLGraphics::drawNet(const int x1, const int y1, const int x2, const int y2, const int width, const int height) { - unsigned int vp = 0; - const unsigned int vLimit = mMaxVertices * 4; - - setTexturingAndBlending(false); - restoreColor(); - - const GLshort xs1 = static_cast<GLshort>(x1); - const GLshort xs2 = static_cast<GLshort>(x2); - const GLshort ys1 = static_cast<GLshort>(y1); - const GLshort ys2 = static_cast<GLshort>(y2); - const int16_t width1 = static_cast<int16_t>(width); - const int16_t height1 = static_cast<int16_t>(height); - - for (int16_t y = static_cast<int16_t>(y1); y < y2; y += height1) - { - mShortVertArray[vp + 0] = xs1; - mShortVertArray[vp + 1] = y; - - mShortVertArray[vp + 2] = xs2; - mShortVertArray[vp + 3] = y; - - vp += 4; - if (vp >= vLimit) - { - drawLineArrays(vp); - vp = 0; - } - } - - for (int16_t x = static_cast<int16_t>(x1); x < x2; x += width1) - { - mShortVertArray[vp + 0] = x; - mShortVertArray[vp + 1] = ys1; - - mShortVertArray[vp + 2] = x; - mShortVertArray[vp + 3] = ys2; - - vp += 4; - if (vp >= vLimit) - { - drawLineArrays(vp); - vp = 0; - } - } - - if (vp > 0) - drawLineArrays(vp); - return true; } @@ -1227,53 +507,6 @@ void ModernOpenGLGraphics::bindTexture(const GLenum target, } } -inline void ModernOpenGLGraphics::drawTriangleArrayfs(const int size) -{ - glVertexPointer(2, GL_SHORT, 0, mShortVertArray); - glTexCoordPointer(2, GL_FLOAT, 0, mFloatTexArray); - -#ifdef DEBUG_DRAW_CALLS - mDrawCalls ++; -#endif - glDrawArrays(GL_TRIANGLES, 0, size / 2); -} - -inline void ModernOpenGLGraphics::drawTriangleArrayfsCached(const int size) -{ - glVertexPointer(2, GL_SHORT, 0, mShortVertArrayCached); - glTexCoordPointer(2, GL_FLOAT, 0, mFloatTexArrayCached); - -#ifdef DEBUG_DRAW_CALLS - mDrawCalls ++; -#endif - glDrawArrays(GL_TRIANGLES, 0, size / 2); -} - -inline void ModernOpenGLGraphics::drawTriangleArrayfs(const GLshort *const - shortVertArray, - const GLfloat *const - floatTexArray, - const int size) -{ - glVertexPointer(2, GL_SHORT, 0, shortVertArray); - glTexCoordPointer(2, GL_FLOAT, 0, floatTexArray); - -#ifdef DEBUG_DRAW_CALLS - mDrawCalls ++; -#endif - glDrawArrays(GL_TRIANGLES, 0, size / 2); -} - -inline void ModernOpenGLGraphics::drawLineArrays(const int size) -{ - glVertexPointer(2, GL_SHORT, 0, mShortVertArray); - -#ifdef DEBUG_DRAW_CALLS - mDrawCalls ++; -#endif - glDrawArrays(GL_LINES, 0, size / 2); -} - void ModernOpenGLGraphics::dumpSettings() { GLint test[1000]; @@ -1294,34 +527,10 @@ void ModernOpenGLGraphics::dumpSettings() } } -void ModernOpenGLGraphics::setColorAlpha(const float alpha) -{ - if (!mIsByteColor && mFloatColor == alpha) - return; - - glColor4f(1.0F, 1.0F, 1.0F, alpha); - mIsByteColor = false; - mFloatColor = alpha; -} - -void ModernOpenGLGraphics::restoreColor() -{ - if (mIsByteColor && mByteColor == mColor) - return; - - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); - mIsByteColor = true; - mByteColor = mColor; -} - void ModernOpenGLGraphics::drawImageRect(const int x, const int y, const int w, const int h, const ImageRect &imgRect) { - #include "render/graphics_drawImageRect.hpp" } void ModernOpenGLGraphics::calcImageRect(ImageVertexes *const vert, @@ -1329,7 +538,6 @@ void ModernOpenGLGraphics::calcImageRect(ImageVertexes *const vert, const int w, const int h, const ImageRect &imgRect) { - #include "render/graphics_calcImageRect.hpp" } void ModernOpenGLGraphics::clearScreen() const |