opengl_fontstashcallbacks.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #ifndef NO_OPENGL3
  2. #include "opengl_fontstashcallbacks.h"
  3. #include "../OpenGLWindow/GLPrimitiveRenderer.h"
  4. #include "../OpenGLWindow/GLPrimInternalData.h"
  5. #include "fontstash.h"
  6. #include "../OpenGLWindow/OpenGLInclude.h"
  7. #include <assert.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #define STB_IMAGE_WRITE_IMPLEMENTATION
  12. #include "stb_image_write.h"
  13. static unsigned int s_indexData[INDEX_COUNT];
  14. GLuint s_indexArrayObject, s_indexBuffer;
  15. GLuint s_vertexArrayObject,s_vertexBuffer;
  16. OpenGL2RenderCallbacks::OpenGL2RenderCallbacks(GLPrimitiveRenderer* primRender)
  17. :m_primRender2(primRender)
  18. {
  19. }
  20. OpenGL2RenderCallbacks::~OpenGL2RenderCallbacks()
  21. {
  22. }
  23. PrimInternalData* OpenGL2RenderCallbacks::getData()
  24. {
  25. return m_primRender2->getData();
  26. }
  27. InternalOpenGL2RenderCallbacks::~InternalOpenGL2RenderCallbacks()
  28. {
  29. }
  30. void InternalOpenGL2RenderCallbacks::display2()
  31. {
  32. assert(glGetError()==GL_NO_ERROR);
  33. // glViewport(0,0,10,10);
  34. //const float timeScale = 0.008f;
  35. PrimInternalData* data = getData();
  36. glUseProgram(data->m_shaderProg);
  37. glBindBuffer(GL_ARRAY_BUFFER, s_vertexBuffer);
  38. glBindVertexArray(s_vertexArrayObject);
  39. assert(glGetError()==GL_NO_ERROR);
  40. // glBindTexture(GL_TEXTURE_2D,m_texturehandle);
  41. assert(glGetError()==GL_NO_ERROR);
  42. vec2 p( 0.f,0.f);//?b?0.5f * sinf(timeValue), 0.5f * cosf(timeValue) );
  43. glUniform2fv(data->m_positionUniform, 1, (const GLfloat *)&p);
  44. assert(glGetError()==GL_NO_ERROR);
  45. glEnableVertexAttribArray(data->m_positionAttribute);
  46. assert(glGetError()==GL_NO_ERROR);
  47. glEnableVertexAttribArray(data->m_colourAttribute);
  48. assert(glGetError()==GL_NO_ERROR);
  49. glEnableVertexAttribArray(data->m_textureAttribute);
  50. glVertexAttribPointer(data->m_positionAttribute, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)0);
  51. glVertexAttribPointer(data->m_colourAttribute , 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)sizeof(vec4));
  52. glVertexAttribPointer(data->m_textureAttribute , 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)(sizeof(vec4)+sizeof(vec4)));
  53. assert(glGetError()==GL_NO_ERROR);
  54. /*
  55. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
  56. //glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  57. int indexCount = 6;
  58. err = glGetError();
  59. assert(err==GL_NO_ERROR);
  60. glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
  61. err = glGetError();
  62. assert(err==GL_NO_ERROR);
  63. */
  64. // glutSwapBuffers();
  65. }
  66. void InternalOpenGL2RenderCallbacks::updateTexture(sth_texture* texture, sth_glyph* glyph, int textureWidth, int textureHeight)
  67. {
  68. assert(glGetError()==GL_NO_ERROR);
  69. if (glyph)
  70. {
  71. // Update texture (entire texture, could use glyph to update partial texture using glTexSubImage2D)
  72. GLuint* gltexture = (GLuint*) texture->m_userData;
  73. glBindTexture(GL_TEXTURE_2D, *gltexture);
  74. glPixelStorei(GL_UNPACK_ALIGNMENT,1);
  75. assert(glGetError()==GL_NO_ERROR);
  76. glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, textureWidth, textureHeight, 0, GL_RED, GL_UNSIGNED_BYTE, texture->m_texels);
  77. assert(glGetError()==GL_NO_ERROR);
  78. } else
  79. {
  80. if (textureWidth && textureHeight)
  81. {
  82. GLuint* texId = new GLuint;
  83. texture->m_userData = texId;
  84. //create new texture
  85. glGenTextures(1, texId);
  86. assert(glGetError()==GL_NO_ERROR);
  87. glBindTexture(GL_TEXTURE_2D, *texId);
  88. texture->m_texels = (unsigned char*)malloc(textureWidth*textureHeight);
  89. memset(texture->m_texels,0,textureWidth*textureHeight);
  90. glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, textureWidth, textureHeight, 0, GL_RED, GL_UNSIGNED_BYTE, texture->m_texels);
  91. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  92. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  93. assert(glGetError()==GL_NO_ERROR);
  94. ////////////////////////////
  95. //create the other data
  96. {
  97. glGenVertexArrays(1, &s_vertexArrayObject);
  98. glBindVertexArray(s_vertexArrayObject);
  99. glGenBuffers(1, &s_vertexBuffer);
  100. glBindBuffer(GL_ARRAY_BUFFER, s_vertexBuffer);
  101. glBufferData(GL_ARRAY_BUFFER, VERT_COUNT * sizeof(Vertex), texture->newverts, GL_DYNAMIC_DRAW);
  102. assert(glGetError()==GL_NO_ERROR);
  103. for (int i=0;i<INDEX_COUNT;i++)
  104. {
  105. s_indexData[i] = i;
  106. }
  107. glGenBuffers(1, &s_indexBuffer);
  108. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s_indexBuffer);
  109. glBufferData(GL_ELEMENT_ARRAY_BUFFER,INDEX_COUNT*sizeof(int), s_indexData,GL_STATIC_DRAW);
  110. assert(glGetError()==GL_NO_ERROR);
  111. }
  112. } else
  113. {
  114. //delete texture
  115. if (texture->m_userData)
  116. {
  117. GLuint* id = (GLuint*)texture->m_userData;
  118. glDeleteTextures(1, id);
  119. //delete id;
  120. delete id;//texture->m_userData;
  121. texture->m_userData = 0;
  122. }
  123. }
  124. }
  125. }
  126. void InternalOpenGL2RenderCallbacks::render(sth_texture* texture)
  127. {
  128. display2();
  129. GLuint* texId = (GLuint*) texture->m_userData;
  130. assert(glGetError()==GL_NO_ERROR);
  131. glActiveTexture(GL_TEXTURE0);
  132. assert(glGetError()==GL_NO_ERROR);
  133. glBindTexture(GL_TEXTURE_2D, *texId);
  134. bool useFiltering = false;
  135. if (useFiltering)
  136. {
  137. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  138. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  139. } else
  140. {
  141. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  142. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  143. }
  144. assert(glGetError()==GL_NO_ERROR);
  145. glBindBuffer(GL_ARRAY_BUFFER, s_vertexBuffer);
  146. glBindVertexArray(s_vertexArrayObject);
  147. glBufferData(GL_ARRAY_BUFFER, texture->nverts * sizeof(Vertex), &texture->newverts[0].position.p[0], GL_DYNAMIC_DRAW);
  148. assert(glGetError()==GL_NO_ERROR);
  149. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s_indexBuffer);
  150. //glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  151. int indexCount = texture->nverts;
  152. assert(glGetError()==GL_NO_ERROR);
  153. glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
  154. assert(glGetError()==GL_NO_ERROR);
  155. glBindVertexArray(0);
  156. glBindBuffer(GL_ARRAY_BUFFER, 0);
  157. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  158. // glDisableVertexAttribArray(m_textureAttribute);
  159. glUseProgram(0);
  160. }
  161. void dumpTextureToPng(int textureWidth, int textureHeight, const char* fileName)
  162. {
  163. glPixelStorei(GL_PACK_ALIGNMENT,1);
  164. unsigned char* pixels = (unsigned char*)malloc(textureWidth*textureHeight);
  165. glReadPixels(0,0,textureWidth, textureHeight, GL_RED, GL_UNSIGNED_BYTE, pixels);
  166. //swap the pixels
  167. unsigned char* tmp = (unsigned char*)malloc(textureWidth);
  168. for (int j=0;j<textureHeight;j++)
  169. {
  170. pixels[j*textureWidth+j]=255;
  171. }
  172. if (0)
  173. {
  174. for (int j=0;j<textureHeight/2;j++)
  175. {
  176. for (int i=0;i<textureWidth;i++)
  177. {
  178. tmp[i] = pixels[j*textureWidth+i];
  179. pixels[j*textureWidth+i]=pixels[(textureHeight-j-1)*textureWidth+i];
  180. pixels[(textureHeight-j-1)*textureWidth+i] = tmp[i];
  181. }
  182. }
  183. }
  184. int comp=1;//1=Y
  185. stbi_write_png(fileName, textureWidth,textureHeight, comp, pixels, textureWidth);
  186. free(pixels);
  187. }
  188. #endif