summaryrefslogtreecommitdiff
path: root/src/render/modernopenglgraphics.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2014-06-14 02:17:38 +0300
committerAndrei Karas <akaras@inbox.ru>2014-06-14 11:41:50 +0300
commiteecd33fff488d54d038d84d8676000fad826e940 (patch)
tree9eb6c12810579d52c8df16e43d294852ba5613bb /src/render/modernopenglgraphics.cpp
parent4b8a6d93c5a785c673ec6c9f8a09880c48dee065 (diff)
downloadmanaplus-eecd33fff488d54d038d84d8676000fad826e940.tar.gz
manaplus-eecd33fff488d54d038d84d8676000fad826e940.tar.bz2
manaplus-eecd33fff488d54d038d84d8676000fad826e940.tar.xz
manaplus-eecd33fff488d54d038d84d8676000fad826e940.zip
fix modernoepngl drawing.
Add simple draw test in most renders.
Diffstat (limited to 'src/render/modernopenglgraphics.cpp')
-rw-r--r--src/render/modernopenglgraphics.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/render/modernopenglgraphics.cpp b/src/render/modernopenglgraphics.cpp
index 6ab804e2b..fde4ff6cb 100644
--- a/src/render/modernopenglgraphics.cpp
+++ b/src/render/modernopenglgraphics.cpp
@@ -118,7 +118,10 @@ ModernOpenGLGraphics::~ModernOpenGLGraphics()
if (mProgram)
mProgram->decRef();
if (mVbo)
+ {
+// logger->log("delete buffer: %u", mVbo);
mglDeleteBuffers(1, &mVbo);
+ }
if (mVao)
mglDeleteVertexArrays(1, &mVao);
}
@@ -145,6 +148,7 @@ void ModernOpenGLGraphics::postInit()
mglGenVertexArrays(1, &mVao);
mglBindVertexArray(mVao);
mglGenBuffers(1, &mVbo);
+ //logger->log("gen buffer: %u", mVbo);
bindArrayBuffer(mVbo);
logger->log("Compiling shaders");
@@ -263,6 +267,7 @@ void ModernOpenGLGraphics::drawQuad(const Image *const image,
x2, y2, texX2, texY2
};
+ //logger->log("allocate: %d, %ld", mVboCached, sizeof(vertices));
mglBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -299,6 +304,7 @@ void ModernOpenGLGraphics::drawRescaledQuad(const Image *const image,
x2, y2, texX2, texY2
};
+ //logger->log("allocate: %d, %ld", mVboCached, sizeof(vertices));
mglBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -337,6 +343,25 @@ bool ModernOpenGLGraphics::drawImageInline(const Image *const image,
return true;
}
+void ModernOpenGLGraphics::testDraw()
+{
+ GLfloat vertices[] =
+ {
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 800.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 600.0f, 0.0f, 1.0f,
+ 800.0f, 600.0f, 1.0f, 1.0f
+ };
+
+ //logger->log("allocate: %d, %ld", mVboCached, sizeof(vertices));
+ mglBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
+ vertices, GL_STREAM_DRAW);
+#ifdef DEBUG_DRAW_CALLS
+ mDrawCalls ++;
+#endif
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+}
+
void ModernOpenGLGraphics::drawImageCached(const Image *const image A_UNUSED,
int A_UNUSED x, int y A_UNUSED)
{
@@ -545,6 +570,11 @@ inline void ModernOpenGLGraphics::drawVertexes(const
std::vector<GLuint>::const_iterator ivbo;
const std::vector<int>::const_iterator ivp_end = vp.end();
+/*
+ if (vp.size() != vbos.size())
+ logger->log("different size in vp and vbos");
+*/
+
for (ivp = vp.begin(), ivbo = vbos.begin();
ivp != ivp_end;
++ ivp, ++ ivbo)
@@ -553,6 +583,7 @@ inline void ModernOpenGLGraphics::drawVertexes(const
#ifdef DEBUG_DRAW_CALLS
mDrawCalls ++;
#endif
+ //logger->log("draw from array: %u", *ivbo);
glDrawArrays(GL_TRIANGLES, 0, *ivp / 4);
}
}
@@ -649,6 +680,13 @@ void ModernOpenGLGraphics::drawTileCollection(const ImageCollection
{
setTexturingAndBlending(true);
// bindArrayBuffer(vbo);
+/*
+ if (!vertCol)
+ {
+ logger->log("ModernOpenGLGraphics::drawTileCollection"
+ " vertCol is nullptr");
+ }
+*/
const ImageVertexesVector &draws = vertCol->draws;
const ImageCollectionCIter it_end = draws.end();
for (ImageCollectionCIter it = draws.begin(); it != it_end; ++ it)
@@ -929,6 +967,7 @@ void ModernOpenGLGraphics::drawPoint(int x, int y)
{
x + clipArea.xOffset, y + clipArea.yOffset, 0.0f, 0.0f
};
+ //logger->log("allocate: %d, %ld", mVboCached, sizeof(vertices));
mglBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -947,6 +986,7 @@ void ModernOpenGLGraphics::drawLine(int x1, int y1, int x2, int y2)
x1 + clipArea.xOffset, y1 + clipArea.yOffset, 0.0f, 0.0f,
x2 + clipArea.xOffset, y2 + clipArea.yOffset, 0.0f, 0.0f
};
+ //logger->log("allocate: %d, %ld", mVboCached, sizeof(vertices));
mglBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -972,6 +1012,7 @@ void ModernOpenGLGraphics::drawRectangle(const Rect& rect)
x2, y1, 0.0f, 0.0f
};
+ //logger->log("allocate: %d, %ld", mVboCached, sizeof(vertices));
mglBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -997,6 +1038,7 @@ void ModernOpenGLGraphics::fillRectangle(const Rect& rect)
x2, y2, 0.0f, 0.0f
};
+ //logger->log("allocate: %d, %ld", mVboCached, sizeof(vertices));
mglBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -1119,12 +1161,29 @@ void ModernOpenGLGraphics::bindTexture(const GLenum target,
}
}
+void ModernOpenGLGraphics::removeArray(const uint32_t sz,
+ uint32_t *const arr)
+{
+ mglDeleteBuffers(sz, arr);
+ for (int f = 0; f < sz; f ++)
+ {
+ if (arr[f] == mVboCached)
+ mVboCached = 0;
+ //logger->log("delete buffers: %u", arr[f]);
+ }
+}
+
void ModernOpenGLGraphics::bindArrayBuffer(const GLuint vbo)
{
if (mVboCached != vbo)
{
mVboCached = vbo;
+ //logger->log("bind array: %u", vbo);
mglBindBuffer(GL_ARRAY_BUFFER, vbo);
+/*
+ if (mglIsBuffer(vbo) != GL_TRUE)
+ logger->log("bind wrong buffer: %u", vbo);
+*/
mAttributesCached = 0U;
}
}
@@ -1134,15 +1193,22 @@ void ModernOpenGLGraphics::bindArrayBufferAndAttributes(const GLuint vbo)
if (mVboCached != vbo)
{
mVboCached = vbo;
+// logger->log("bind array: %u", vbo);
mglBindBuffer(GL_ARRAY_BUFFER, vbo);
+/*
+ if (mglIsBuffer(vbo) != GL_TRUE)
+ logger->log("bind wrong buffer: %u", vbo);
+*/
mAttributesCached = mVboCached;
+// logger->log("bind vertex buffer: %u", mVboCached);
mglBindVertexBuffer(0, mVboCached, 0, 4 * sizeof(GLfloat));
// mglVertexAttribBinding(mPosAttrib, 0);
}
else if (mAttributesCached != mVboCached)
{
mAttributesCached = mVboCached;
+// logger->log("bind vertex buffer: %u", mVboCached);
mglBindVertexBuffer(0, mVboCached, 0, 4 * sizeof(GLfloat));
// mglVertexAttribBinding(mPosAttrib, 0);
}
@@ -1221,12 +1287,20 @@ void ModernOpenGLGraphics::finalize(ImageVertexes *const vert)
const int sz = floatTexPool.size();
vbos.resize(sz);
mglGenBuffers(sz, &vbos[0]);
+/*
+ for (int f = 0; f < sz; f ++)
+ logger->log("gen buffers: %u", vbos[f]);
+*/
for (ft = floatTexPool.begin(), ivp = vp.begin(), ivbo = vbos.begin();
ft != ft_end && ivp != ivp_end;
++ ft, ++ ivp, ++ ivbo)
{
bindArrayBuffer(*ivbo);
+/*
+ logger->log("allocate: %d, %ld", mVboCached,
+ (*ivp) * sizeof(GLfloat));
+*/
mglBufferData(GL_ARRAY_BUFFER, (*ivp) * sizeof(GLfloat),
*ft, GL_STATIC_DRAW);
}
@@ -1241,6 +1315,7 @@ void ModernOpenGLGraphics::finalize(ImageVertexes *const vert)
void ModernOpenGLGraphics::drawTriangleArray(const int size)
{
+ //logger->log("allocate: %d, %ld", mVboCached, size * sizeof(GLfloat));
mglBufferData(GL_ARRAY_BUFFER, size * sizeof(GLfloat),
mFloatArray, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -1252,6 +1327,7 @@ void ModernOpenGLGraphics::drawTriangleArray(const int size)
void ModernOpenGLGraphics::drawTriangleArray(const GLfloat *const array,
const int size)
{
+ //logger->log("allocate: %d, %ld", mVboCached, size * sizeof(GLfloat));
mglBufferData(GL_ARRAY_BUFFER, size * sizeof(GLfloat),
array, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS
@@ -1262,6 +1338,7 @@ void ModernOpenGLGraphics::drawTriangleArray(const GLfloat *const array,
void ModernOpenGLGraphics::drawLineArrays(const int size)
{
+ //logger->log("allocate: %d, %ld", mVboCached, size * sizeof(GLfloat));
mglBufferData(GL_ARRAY_BUFFER, size * sizeof(GLfloat),
mFloatArray, GL_STREAM_DRAW);
#ifdef DEBUG_DRAW_CALLS