diff options
Diffstat (limited to 'src/libjin')
-rw-r--r-- | src/libjin/Graphics/Bitmap.cpp | 2 | ||||
-rw-r--r-- | src/libjin/Graphics/Bitmap.h | 2 | ||||
-rw-r--r-- | src/libjin/Graphics/Drawable.cpp | 4 | ||||
-rw-r--r-- | src/libjin/Graphics/Font.cpp | 4 | ||||
-rw-r--r-- | src/libjin/Graphics/Shader.cpp | 21 | ||||
-rw-r--r-- | src/libjin/Graphics/Shader.h | 1 | ||||
-rw-r--r-- | src/libjin/Graphics/Shapes.cpp | 29 | ||||
-rw-r--r-- | src/libjin/Graphics/Window.cpp | 4 |
8 files changed, 35 insertions, 32 deletions
diff --git a/src/libjin/Graphics/Bitmap.cpp b/src/libjin/Graphics/Bitmap.cpp index 28b59af..acfde58 100644 --- a/src/libjin/Graphics/Bitmap.cpp +++ b/src/libjin/Graphics/Bitmap.cpp @@ -60,7 +60,7 @@ namespace graphics stbi_image_free(pixels); } - void Bitmap::bindPixels(Color* p, int w, int h) + void Bitmap::bind(Color* p, int w, int h) { if (pixels != nullptr) delete[] pixels; diff --git a/src/libjin/Graphics/Bitmap.h b/src/libjin/Graphics/Bitmap.h index 53b374b..ab84388 100644 --- a/src/libjin/Graphics/Bitmap.h +++ b/src/libjin/Graphics/Bitmap.h @@ -20,7 +20,7 @@ namespace graphics ~Bitmap(); /* init pixels */ - void bindPixels(Color* pixels, int w, int h); + void bind(Color* pixels, int w, int h); void resetPixels(const Color* pixels, int w, int h); void resetPixels(const Color& pixels, int w, int h); /* modify pixels */ diff --git a/src/libjin/Graphics/Drawable.cpp b/src/libjin/Graphics/Drawable.cpp index 008d54e..675c54d 100644 --- a/src/libjin/Graphics/Drawable.cpp +++ b/src/libjin/Graphics/Drawable.cpp @@ -42,9 +42,13 @@ namespace graphics glPushMatrix(); glMultMatrixf((const GLfloat*)t.getElements()); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, textCoord); glVertexPointer(2, GL_FLOAT, 0, vertCoord); glDrawArrays(GL_QUADS, 0, 4); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); /* pop the model matrix */ glPopMatrix(); diff --git a/src/libjin/Graphics/Font.cpp b/src/libjin/Graphics/Font.cpp index 4988702..b95f78b 100644 --- a/src/libjin/Graphics/Font.cpp +++ b/src/libjin/Graphics/Font.cpp @@ -133,9 +133,13 @@ namespace graphics // forward to next character xc += xadvance + spacing; + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, texCoord); glVertexPointer(2, GL_FLOAT, 0, verCoord); glDrawArrays(GL_QUADS, 0, 4); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); } glBindTexture(GL_TEXTURE_2D, 0); diff --git a/src/libjin/Graphics/Shader.cpp b/src/libjin/Graphics/Shader.cpp index 7f849a6..12d4db0 100644 --- a/src/libjin/Graphics/Shader.cpp +++ b/src/libjin/Graphics/Shader.cpp @@ -11,9 +11,15 @@ namespace graphics using namespace jin::filesystem; + /** + * default_texture + * base_shader + * SHADER_FORMAT_SIZE + * formatShader + */ #include "base.shader.h" - /* + /** * https://stackoverflow.com/questions/27941496/use-sampler-without-passing-through-value * The default value of a sampler variable is 0. From the GLSL 3.30 spec, * section "4.3.5 Uniforms": @@ -57,8 +63,7 @@ namespace graphics JSLProgram::JSLProgram(const char* program) : currentTextureUnit(DEFAULT_TEXTURE_UNIT) { - int size = strlen(program) + SHADER_FORMAT_SIZE; - Buffer b = Buffer(size); + Buffer b = Buffer(strlen(program) + SHADER_FORMAT_SIZE); formatShader((char*)b.data, program); GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(shader, 1, (const GLchar**)&b.data, NULL); @@ -92,7 +97,9 @@ namespace graphics { glUseProgram(pid); currentJSLProgram = this; - bindDefaultTexture(); + /* bind default texture */ + int loc = glGetUniformLocation(pid, default_texture); + glUniform1i(loc, DEFAULT_TEXTURE_UNIT); } /*static*/ void JSLProgram::unuse() @@ -101,12 +108,6 @@ namespace graphics currentJSLProgram = nullptr; } - void JSLProgram::bindDefaultTexture() - { - int loc = glGetUniformLocation(pid, default_texture); - glUniform1i(loc, DEFAULT_TEXTURE_UNIT); - } - GLint JSLProgram::claimTextureUnit(const std::string& name) { std::map<std::string, GLint>::iterator unit = textureUnits.find(name); diff --git a/src/libjin/Graphics/Shader.h b/src/libjin/Graphics/Shader.h index 70e6c1d..83a2831 100644 --- a/src/libjin/Graphics/Shader.h +++ b/src/libjin/Graphics/Shader.h @@ -39,7 +39,6 @@ namespace graphics GLint claimTextureUnit(const std::string& name); JSLProgram(const char* program); - void bindDefaultTexture(); GLuint pid; GLint currentTextureUnit; diff --git a/src/libjin/Graphics/Shapes.cpp b/src/libjin/Graphics/Shapes.cpp index 13935d2..6cf0af1 100644 --- a/src/libjin/Graphics/Shapes.cpp +++ b/src/libjin/Graphics/Shapes.cpp @@ -14,14 +14,18 @@ namespace graphics void point(int x, int y) { float vers[] = { x + 0.5f , y + 0.5f }; + glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, (GLvoid*)vers); glDrawArrays(GL_POINTS, 0, 1); + glDisableClientState(GL_VERTEX_ARRAY); } void points(int n, GLshort* p) { + glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_SHORT, 0, (GLvoid*)p); glDrawArrays(GL_POINTS, 0, n); + glDisableClientState(GL_VERTEX_ARRAY); } void line(int x1, int y1, int x2, int y2) @@ -31,8 +35,10 @@ namespace graphics x2, y2 }; - glVertexPointer(2, GL_FLOAT, 0, (GLvoid*)verts); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, (const GLvoid*)verts); glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); } void circle(RenderMode mode, int x, int y, int r) @@ -72,22 +78,13 @@ namespace graphics polygon(mode, coords, 3); } + /* TODO: 内存占用很多 */ void polygon_line(float* p, int count) { - float* verts = new float[count * 4]; - for (int i = 0; i < count; ++i) - { - // each line has two point n,n+1 - verts[i * 4] = p[i * 2]; - verts[i * 4 + 1] = p[i * 2 + 1]; - verts[i * 4 + 2] = p[(i + 1) % count * 2]; - verts[i * 4 + 3] = p[(i + 1) % count * 2 + 1]; - } - - glVertexPointer(2, GL_FLOAT, 0, (GLvoid*)verts); - glDrawArrays(GL_LINES, 0, count * 2); - - delete[] verts; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, (const GLvoid*)p); + glDrawArrays(GL_LINE_LOOP, 0, count); + glDisableClientState(GL_VERTEX_ARRAY); } void polygon(RenderMode mode, float* p, int count) @@ -98,8 +95,10 @@ namespace graphics } else if (mode == FILL) { + glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, (const GLvoid*)p); glDrawArrays(GL_POLYGON, 0, count); + glDisableClientState(GL_VERTEX_ARRAY); } } diff --git a/src/libjin/Graphics/Window.cpp b/src/libjin/Graphics/Window.cpp index 68ebe47..1fb60cc 100644 --- a/src/libjin/Graphics/Window.cpp +++ b/src/libjin/Graphics/Window.cpp @@ -73,8 +73,6 @@ namespace graphics glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); /* avoid white screen blink on windows */ swapBuffers(); /* bind to default canvas */ @@ -87,8 +85,6 @@ namespace graphics /* disable opengl */ glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); /* close window */ SDL_DestroyWindow(wnd); SDL_Quit(); |