Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add generic VBO drawing class called GFX (for lack of better name).

  • Loading branch information...
commit b235b4e92b05012f92543d5451c1354d540feaeb 1 parent 17de2b4
@perim perim authored
Showing with 113 additions and 1 deletion.
  1. +75 −0 lib/ivis_opengl/pieblitfunc.cpp
  2. +38 −1 lib/ivis_opengl/pieblitfunc.h
View
75 lib/ivis_opengl/pieblitfunc.cpp
@@ -67,6 +67,81 @@ struct PIERECT ///< Screen rectangle.
*/
/***************************************************************************/
+GFX::GFX(GLenum drawType, int coordsPerVertex) : mdrawType(drawType), mCoordsPerVertex(coordsPerVertex), mSize(0)
+{
+ glGenBuffers(VBO_MINIMAL, mBuffers);
+ glGenTextures(1, &mTexture);
+}
+
+void GFX::loadTexture(const char *filename, GLenum filter)
+{
+ const char *extension = strrchr(filename, '.'); // determine the filetype
+ iV_Image image;
+ if (!extension || strcmp(extension, ".png") != 0)
+ {
+ debug(LOG_ERROR, "Bad image filename: %s", filename);
+ return;
+ }
+ if (iV_loadImage_PNG(filename, &image))
+ {
+ makeTexture(image.width, image.height, filter, iV_getPixelFormat(&image), image.bmp);
+ iV_unloadImage(&image);
+ }
+}
+
+void GFX::makeTexture(int width, int height, GLenum filter, GLenum format, const GLvoid *image)
+{
+ pie_SetTexturePage(TEXPAGE_EXTERN);
+ glBindTexture(GL_TEXTURE_2D, mTexture);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, image);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ mWidth = width;
+ mHeight = height;
+ mFormat = format;
+}
+
+void GFX::updateTexture(const void *image, int width, int height)
+{
+ if (width == -1) width = mWidth;
+ if (height == -1) height = mHeight;
+ pie_SetTexturePage(TEXPAGE_EXTERN);
+ glBindTexture(GL_TEXTURE_2D, mTexture);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, mFormat, GL_UNSIGNED_BYTE, image);
+}
+
+void GFX::buffers(int vertices, const GLvoid *vertBuf, const GLvoid *texBuf)
+{
+ glBindBuffer(GL_ARRAY_BUFFER, mBuffers[VBO_TEXCOORD]);
+ glBufferData(GL_ARRAY_BUFFER, vertices * 2 * sizeof(GLfloat), texBuf, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, mBuffers[VBO_VERTEX]);
+ glBufferData(GL_ARRAY_BUFFER, vertices * mCoordsPerVertex * sizeof(GLfloat), vertBuf, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ mSize = vertices;
+}
+
+void GFX::draw()
+{
+ pie_SetTexturePage(TEXPAGE_EXTERN);
+ glBindTexture(GL_TEXTURE_2D, mTexture);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glBindBuffer(GL_ARRAY_BUFFER, mBuffers[VBO_TEXCOORD]); glTexCoordPointer(2, GL_FLOAT, 0, NULL);
+ glBindBuffer(GL_ARRAY_BUFFER, mBuffers[VBO_VERTEX]); glVertexPointer(mCoordsPerVertex, GL_FLOAT, 0, NULL);
+ glDrawArrays(mdrawType, 0, mSize);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+}
+
+GFX::~GFX()
+{
+ glDeleteBuffers(VBO_MINIMAL, mBuffers);
+ glDeleteTextures(1, &mTexture);
+}
+
void iV_Line(int x0, int y0, int x1, int y1, PIELIGHT colour)
{
pie_SetTexturePage(TEXPAGE_NONE);
View
39 lib/ivis_opengl/pieblitfunc.h
@@ -49,10 +49,47 @@
/***************************************************************************/
/*
- * Global Variables
+ * Global Classes
*/
/***************************************************************************/
+/// Generic graphics using VBOs drawing class
+class GFX
+{
+public:
+ /// Initialize class and allocate GPU resources
+ GFX(GLenum drawType = GL_TRIANGLES, int coordsPerVertex = 3);
+
+ /// Destroy GPU held resources
+ ~GFX();
+
+ /// Load texture data from file, allocate space for it, and put it on the GPU
+ void loadTexture(const char *filename, GLenum filter = GL_LINEAR);
+
+ /// Allocate space on the GPU for texture of given parameters. If image is non-NULL,
+ /// then that memory buffer is uploaded to the GPU.
+ void makeTexture(int width, int height, GLenum filter = GL_LINEAR, GLenum format = GL_RGBA, const GLvoid *image = NULL);
+
+ /// Upload given memory buffer to already allocated texture space on the GPU
+ void updateTexture(const GLvoid *image, int width = -1, int height = -1);
+
+ /// Upload vertex and texture buffer data to the GPU
+ void buffers(int vertices, const GLvoid *vertBuf, const GLvoid *texBuf);
+
+ /// Draw everything
+ void draw();
+
+private:
+ GLenum mFormat;
+ int mWidth;
+ int mHeight;
+ GLenum mdrawType;
+ int mCoordsPerVertex;
+ GLuint mBuffers[VBO_COUNT];
+ GLuint mTexture;
+ int mSize;
+};
+
/***************************************************************************/
/*
* Global ProtoTypes
Please sign in to comment.
Something went wrong with that request. Please try again.