GLRenderer.cpp 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031
  1. /*
  2. Copyright (c) 2013 Daniele Bartolini, Michele Rossi
  3. Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
  4. Permission is hereby granted, free of charge, to any person
  5. obtaining a copy of this software and associated documentation
  6. files (the "Software"), to deal in the Software without
  7. restriction, including without limitation the rights to use,
  8. copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. copies of the Software, and to permit persons to whom the
  10. Software is furnished to do so, subject to the following
  11. conditions:
  12. The above copyright notice and this permission notice shall be
  13. included in all copies or substantial portions of the Software.
  14. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  15. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  16. OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  17. NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18. HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  19. WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21. OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. #include <GL/glew.h>
  24. #include <algorithm>
  25. #include "Config.h"
  26. #include "Allocator.h"
  27. #include "Assert.h"
  28. #include "Types.h"
  29. #include "GLRenderer.h"
  30. #include "GLUtils.h"
  31. #include "Log.h"
  32. #include "Material.h"
  33. #include "Vec2.h"
  34. #include "Vec3.h"
  35. #include "Vec4.h"
  36. #include "Mat3.h"
  37. #include "Mat4.h"
  38. #include "Device.h"
  39. namespace crown
  40. {
  41. //-----------------------------------------------------------------------------
  42. static const char* gl_error_to_string(GLenum error)
  43. {
  44. switch (error)
  45. {
  46. case GL_INVALID_ENUM: return "GL_INVALID_ENUM";
  47. case GL_INVALID_VALUE: return "GL_INVALID_VALUE";
  48. case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
  49. case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
  50. default: return "UNKNOWN_GL_ERROR";
  51. }
  52. }
  53. //-----------------------------------------------------------------------------
  54. #ifdef CROWN_DEBUG
  55. #define GL_CHECK(function)\
  56. function;\
  57. do { GLenum error; CE_ASSERT((error = glGetError()) == GL_NO_ERROR,\
  58. "OpenGL error: %s", gl_error_to_string(error)); } while (0)
  59. #else
  60. #define GL_CHECK(function)\
  61. function;
  62. #endif
  63. //-----------------------------------------------------------------------------
  64. GLRenderer::GLRenderer() :
  65. m_max_texture_size(0),
  66. m_max_texture_units(0),
  67. m_max_vertex_indices(0),
  68. m_max_vertex_vertices(0),
  69. m_max_anisotropy(0.0f),
  70. m_ambient_light_color(Color4::GRAY),
  71. m_textures_id_table(m_allocator, MAX_TEXTURES),
  72. m_active_texture_unit(0),
  73. m_vertex_buffers_id_table(m_allocator, MAX_VERTEX_BUFFERS),
  74. m_index_buffers_id_table(m_allocator, MAX_INDEX_BUFFERS),
  75. m_vertex_shaders_id_table(m_allocator, MAX_VERTEX_SHADERS),
  76. m_pixel_shaders_id_table(m_allocator, MAX_PIXEL_SHADERS),
  77. m_gpu_programs_id_table(m_allocator, 128)
  78. //m_render_buffers_id_table(m_allocator, MAX_RENDER_BUFFERS)
  79. {
  80. m_min_max_point_size[0] = 0.0f;
  81. m_min_max_point_size[1] = 0.0f;
  82. m_min_max_line_width[0] = 0.0f;
  83. m_min_max_line_width[1] = 0.0f;
  84. // Initialize viewport and scissor
  85. m_viewport[0] = 0;
  86. m_viewport[1] = 0;
  87. m_viewport[2] = 0;
  88. m_viewport[3] = 0;
  89. m_scissor[0] = 0;
  90. m_scissor[1] = 0;
  91. m_scissor[2] = 0;
  92. m_scissor[3] = 0;
  93. // Initialize texture units
  94. for (uint32_t i = 0; i < MAX_TEXTURE_UNITS; i++)
  95. {
  96. m_texture_unit[i] = 0;
  97. m_texture_unit_target[i] = GL_TEXTURE_2D;
  98. }
  99. // Initialize the matrices
  100. for (uint32_t i = 0; i < MT_COUNT; i++)
  101. {
  102. m_matrix[i].load_identity();
  103. }
  104. m_model_view_matrix.load_identity();
  105. m_model_view_projection_matrix.load_identity();
  106. }
  107. //-----------------------------------------------------------------------------
  108. GLRenderer::~GLRenderer()
  109. {
  110. }
  111. //-----------------------------------------------------------------------------
  112. void GLRenderer::init()
  113. {
  114. m_context.create_context();
  115. GLenum err = glewInit();
  116. CE_ASSERT(err == GLEW_OK, "Failed to initialize GLEW");
  117. GL_CHECK(glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_max_texture_size));
  118. GL_CHECK(glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &m_max_texture_units));
  119. GL_CHECK(glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &m_max_vertex_indices));
  120. GL_CHECK(glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &m_max_vertex_vertices));
  121. // Check for anisotropic filter support
  122. if (GLEW_EXT_texture_filter_anisotropic)
  123. {
  124. GL_CHECK(glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_max_anisotropy));
  125. }
  126. GL_CHECK(glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, &m_min_max_point_size[0]));
  127. GL_CHECK(glGetFloatv(GL_LINE_WIDTH_RANGE, &m_min_max_line_width[0]));
  128. Log::i("OpenGL Vendor\t: %s", glGetString(GL_VENDOR));
  129. Log::i("OpenGL Renderer\t: %s", glGetString(GL_RENDERER));
  130. Log::i("OpenGL Version\t: %s", glGetString(GL_VERSION));
  131. Log::d("Min Point Size\t: %f", m_min_max_point_size[0]);
  132. Log::d("Max Point Size\t: %f", m_min_max_point_size[1]);
  133. Log::d("Min Line Width\t: %f", m_min_max_line_width[0]);
  134. Log::d("Max Line Width\t: %f", m_min_max_line_width[1]);
  135. Log::d("Max Texture Size\t: %dx%d", m_max_texture_size, m_max_texture_size);
  136. Log::d("Max Texture Units\t: %d", m_max_texture_units);
  137. Log::d("Max Vertex Indices\t: %d", m_max_vertex_indices);
  138. Log::d("Max Vertex Vertices\t: %d", m_max_vertex_vertices);
  139. Log::d("Max Anisotropy\t: %f", m_max_anisotropy);
  140. GL_CHECK(glDisable(GL_TEXTURE_2D));
  141. GL_CHECK(glDisable(GL_BLEND));
  142. GL_CHECK(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
  143. GL_CHECK(glBlendEquation(GL_FUNC_ADD));
  144. GL_CHECK(glFrontFace(GL_CCW));
  145. GL_CHECK(glEnable(GL_CULL_FACE));
  146. GL_CHECK(glShadeModel(GL_SMOOTH));
  147. // Set the default framebuffer clear color
  148. GL_CHECK(glClearColor(0.5f, 0.5f, 0.5f, 0.5f));
  149. // Enable depth test
  150. GL_CHECK(glEnable(GL_DEPTH_TEST));
  151. GL_CHECK(glDepthFunc(GL_LEQUAL));
  152. GL_CHECK(glClearDepth(1.0));
  153. // Enable scissor test
  154. GL_CHECK(glEnable(GL_SCISSOR_TEST));
  155. // Disable dithering
  156. GL_CHECK(glDisable(GL_DITHER));
  157. // Point sprites enabled by default
  158. GL_CHECK(glEnable(GL_POINT_SPRITE));
  159. GL_CHECK(glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE));
  160. Log::i("OpenGL Renderer initialized.");
  161. load_default_shaders();
  162. }
  163. //-----------------------------------------------------------------------------
  164. void GLRenderer::shutdown()
  165. {
  166. unload_default_shaders();
  167. m_context.destroy_context();
  168. }
  169. //-----------------------------------------------------------------------------
  170. VertexBufferId GLRenderer::create_vertex_buffer(size_t count, VertexFormat format, const void* vertices)
  171. {
  172. const VertexBufferId id = m_vertex_buffers_id_table.create();
  173. VertexBuffer& buffer = m_vertex_buffers[id.index];
  174. GL_CHECK(glGenBuffers(1, &buffer.gl_object));
  175. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffer.gl_object));
  176. GL_CHECK(glBufferData(GL_ARRAY_BUFFER, count * Vertex::bytes_per_vertex(format), vertices, GL_STATIC_DRAW));
  177. buffer.count = count;
  178. buffer.format = format;
  179. return id;
  180. }
  181. //-----------------------------------------------------------------------------
  182. VertexBufferId GLRenderer::create_dynamic_vertex_buffer(size_t count, VertexFormat format, const void* vertices)
  183. {
  184. const VertexBufferId id = m_vertex_buffers_id_table.create();
  185. VertexBuffer& buffer = m_vertex_buffers[id.index];
  186. GL_CHECK(glGenBuffers(1, &buffer.gl_object));
  187. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffer.gl_object));
  188. GL_CHECK(glBufferData(GL_ARRAY_BUFFER, count * Vertex::bytes_per_vertex(format), vertices, GL_STREAM_DRAW));
  189. buffer.count = count;
  190. buffer.format = format;
  191. return id;
  192. }
  193. //-----------------------------------------------------------------------------
  194. void GLRenderer::update_vertex_buffer(VertexBufferId id, size_t offset, size_t count, const void* vertices)
  195. {
  196. CE_ASSERT(m_vertex_buffers_id_table.has(id), "Vertex buffer does not exist");
  197. VertexBuffer& buffer = m_vertex_buffers[id.index];
  198. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffer.gl_object));
  199. GL_CHECK(glBufferSubData(GL_ARRAY_BUFFER, offset * Vertex::bytes_per_vertex(buffer.format),
  200. count * Vertex::bytes_per_vertex(buffer.format), vertices));
  201. }
  202. //-----------------------------------------------------------------------------
  203. void GLRenderer::destroy_vertex_buffer(VertexBufferId id)
  204. {
  205. CE_ASSERT(m_vertex_buffers_id_table.has(id), "Vertex buffer does not exist");
  206. VertexBuffer& buffer = m_vertex_buffers[id.index];
  207. GL_CHECK(glDeleteBuffers(1, &buffer.gl_object));
  208. m_vertex_buffers_id_table.destroy(id);
  209. }
  210. //-----------------------------------------------------------------------------
  211. IndexBufferId GLRenderer::create_index_buffer(size_t count, const void* indices)
  212. {
  213. const IndexBufferId id = m_index_buffers_id_table.create();
  214. IndexBuffer& buffer = m_index_buffers[id.index];
  215. GL_CHECK(glGenBuffers(1, &buffer.gl_object));
  216. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer.gl_object));
  217. GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(GLushort), indices, GL_STATIC_DRAW));
  218. buffer.index_count = count;
  219. return id;
  220. }
  221. //-----------------------------------------------------------------------------
  222. void GLRenderer::destroy_index_buffer(IndexBufferId id)
  223. {
  224. CE_ASSERT(m_index_buffers_id_table.has(id), "Index buffer does not exist");
  225. IndexBuffer& buffer = m_index_buffers[id.index];
  226. GL_CHECK(glDeleteBuffers(1, &buffer.gl_object));
  227. m_index_buffers_id_table.destroy(id);
  228. }
  229. //-----------------------------------------------------------------------------
  230. TextureId GLRenderer::create_texture(uint32_t width, uint32_t height, PixelFormat format, const void* data)
  231. {
  232. const TextureId id = m_textures_id_table.create();
  233. Texture& gl_texture = m_textures[id.index];
  234. GL_CHECK(glGenTextures(1, &gl_texture.gl_object));
  235. GL_CHECK(glBindTexture(GL_TEXTURE_2D, gl_texture.gl_object));
  236. GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE));
  237. // FIXME
  238. GL_CHECK(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
  239. GL::pixel_format(format), GL_UNSIGNED_BYTE, data));
  240. gl_texture.format = format;
  241. return id;
  242. }
  243. //-----------------------------------------------------------------------------
  244. void GLRenderer::update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data)
  245. {
  246. CE_ASSERT(m_textures_id_table.has(id), "Texture does not exist");
  247. Texture& gl_texture = m_textures[id.index];
  248. GL_CHECK(glBindTexture(GL_TEXTURE_2D, gl_texture.gl_object));
  249. GL_CHECK(glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL::pixel_format(gl_texture.format),
  250. GL_UNSIGNED_BYTE, data));
  251. }
  252. //-----------------------------------------------------------------------------
  253. void GLRenderer::destroy_texture(TextureId id)
  254. {
  255. CE_ASSERT(m_textures_id_table.has(id), "Texture does not exist");
  256. Texture& gl_texture = m_textures[id.index];
  257. GL_CHECK(glDeleteTextures(1, &gl_texture.gl_object));
  258. }
  259. //-----------------------------------------------------------------------------
  260. VertexShaderId GLRenderer::create_vertex_shader(const char* program)
  261. {
  262. CE_ASSERT(program != NULL, "Program must be != NULL");
  263. const VertexShaderId& id = m_vertex_shaders_id_table.create();
  264. VertexShader& gl_shader = m_vertex_shaders[id.index];
  265. gl_shader.gl_object = GL_CHECK(glCreateShader(GL_VERTEX_SHADER));
  266. GL_CHECK(glShaderSource(gl_shader.gl_object, 1, &program, NULL));
  267. GL_CHECK(glCompileShader(gl_shader.gl_object));
  268. GLint success;
  269. GL_CHECK(glGetShaderiv(gl_shader.gl_object, GL_COMPILE_STATUS, &success));
  270. if (!success)
  271. {
  272. GLchar info_log[256];
  273. GL_CHECK(glGetShaderInfoLog(gl_shader.gl_object, 256, NULL, info_log));
  274. Log::e("Vertex shader compilation failed.");
  275. Log::e("Log: %s", info_log);
  276. CE_ASSERT(0, "");
  277. }
  278. return id;
  279. }
  280. //-----------------------------------------------------------------------------
  281. void GLRenderer::destroy_vertex_shader(VertexShaderId id)
  282. {
  283. CE_ASSERT(m_vertex_shaders_id_table.has(id), "Vertex shader does not exist");
  284. VertexShader& gl_shader = m_vertex_shaders[id.index];
  285. GL_CHECK(glDeleteShader(gl_shader.gl_object));
  286. }
  287. //-----------------------------------------------------------------------------
  288. PixelShaderId GLRenderer::create_pixel_shader(const char* program)
  289. {
  290. CE_ASSERT(program != NULL, "Program must be != NULL");
  291. const PixelShaderId& id = m_pixel_shaders_id_table.create();
  292. PixelShader& gl_shader = m_pixel_shaders[id.index];
  293. gl_shader.gl_object = GL_CHECK(glCreateShader(GL_FRAGMENT_SHADER));
  294. GL_CHECK(glShaderSource(gl_shader.gl_object, 1, &program, NULL));
  295. GL_CHECK(glCompileShader(gl_shader.gl_object));
  296. GLint success;
  297. GL_CHECK(glGetShaderiv(gl_shader.gl_object, GL_COMPILE_STATUS, &success));
  298. if (!success)
  299. {
  300. GLchar info_log[256];
  301. GL_CHECK(glGetShaderInfoLog(gl_shader.gl_object, 256, NULL, info_log));
  302. Log::e("Pixel shader compilation failed.");
  303. Log::e("Log: %s", info_log);
  304. CE_ASSERT(0, "");
  305. }
  306. return id;
  307. }
  308. //-----------------------------------------------------------------------------
  309. void GLRenderer::destroy_pixel_shader(PixelShaderId id)
  310. {
  311. CE_ASSERT(m_pixel_shaders_id_table.has(id), "Pixel shader does not exist");
  312. PixelShader& gl_shader = m_pixel_shaders[id.index];
  313. GL_CHECK(glDeleteShader(gl_shader.gl_object));
  314. }
  315. //-----------------------------------------------------------------------------
  316. GPUProgramId GLRenderer::create_gpu_program(VertexShaderId vs, PixelShaderId ps)
  317. {
  318. CE_ASSERT(m_vertex_shaders_id_table.has(vs), "Vertex shader does not exist");
  319. CE_ASSERT(m_pixel_shaders_id_table.has(ps), "Pixel shader does not exist");
  320. const GPUProgramId id = m_gpu_programs_id_table.create();
  321. GPUProgram& gl_program = m_gpu_programs[id.index];
  322. gl_program.gl_object = GL_CHECK(glCreateProgram());
  323. GL_CHECK(glAttachShader(gl_program.gl_object, m_vertex_shaders[id.index].gl_object));
  324. GL_CHECK(glAttachShader(gl_program.gl_object, m_pixel_shaders[id.index].gl_object));
  325. GL_CHECK(glBindAttribLocation(gl_program.gl_object, SA_VERTEX, "vertex"));
  326. GL_CHECK(glBindAttribLocation(gl_program.gl_object, SA_COORDS, "coords"));
  327. GL_CHECK(glBindAttribLocation(gl_program.gl_object, SA_NORMAL, "normal"));
  328. GL_CHECK(glLinkProgram(gl_program.gl_object));
  329. GLint success;
  330. GL_CHECK(glGetProgramiv(gl_program.gl_object, GL_LINK_STATUS, &success));
  331. if (!success)
  332. {
  333. GLchar info_log[256];
  334. GL_CHECK(glGetProgramInfoLog(gl_program.gl_object, 256, NULL, info_log));
  335. Log::e("GPU program compilation failed.\n");
  336. Log::e("Log: %s", info_log);
  337. }
  338. return id;
  339. }
  340. //-----------------------------------------------------------------------------
  341. void GLRenderer::destroy_gpu_program(GPUProgramId id)
  342. {
  343. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  344. GPUProgram& gl_program = m_gpu_programs[id.index];
  345. GL_CHECK(glDeleteProgram(gl_program.gl_object));
  346. }
  347. //-----------------------------------------------------------------------------
  348. void GLRenderer::set_gpu_program_bool_uniform(GPUProgramId id, const char* name, bool value)
  349. {
  350. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  351. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  352. GL_CHECK(glUniform1i(uniform, (GLint) value));
  353. }
  354. //-----------------------------------------------------------------------------
  355. void GLRenderer::set_gpu_program_int_uniform(GPUProgramId id, const char* name, int value)
  356. {
  357. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  358. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  359. GL_CHECK(glUniform1i(uniform, (GLint) value));
  360. }
  361. //-----------------------------------------------------------------------------
  362. void GLRenderer::set_gpu_program_vec2_uniform(GPUProgramId id, const char* name, const Vec2& value)
  363. {
  364. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  365. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  366. GL_CHECK(glUniform2fv(uniform, 1, value.to_float_ptr()));
  367. }
  368. //-----------------------------------------------------------------------------
  369. void GLRenderer::set_gpu_program_vec3_uniform(GPUProgramId id, const char* name, const Vec3& value)
  370. {
  371. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  372. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  373. GL_CHECK(glUniform3fv(uniform, 1, value.to_float_ptr()));
  374. }
  375. //-----------------------------------------------------------------------------
  376. void GLRenderer::set_gpu_program_vec4_uniform(GPUProgramId id, const char* name, const Vec4& value)
  377. {
  378. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  379. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  380. GL_CHECK(glUniform4fv(uniform, 1, value.to_float_ptr()));
  381. }
  382. //-----------------------------------------------------------------------------
  383. void GLRenderer::set_gpu_porgram_mat3_uniform(GPUProgramId id, const char* name, const Mat3& value)
  384. {
  385. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  386. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  387. GL_CHECK(glUniformMatrix3fv(uniform, 1, GL_FALSE, value.to_float_ptr()));
  388. }
  389. //-----------------------------------------------------------------------------
  390. void GLRenderer::set_gpu_program_mat4_uniform(GPUProgramId id, const char* name, const Mat4& value)
  391. {
  392. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  393. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  394. GL_CHECK(glUniformMatrix4fv(uniform, 1, GL_FALSE, value.to_float_ptr()));
  395. }
  396. //-----------------------------------------------------------------------------
  397. void GLRenderer::set_gpu_program_sampler_uniform(GPUProgramId id, const char* name, uint32_t value)
  398. {
  399. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  400. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  401. GL_CHECK(glUniform1i(uniform, (GLint) value));
  402. }
  403. //-----------------------------------------------------------------------------
  404. void GLRenderer::bind_gpu_program(GPUProgramId id) const
  405. {
  406. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  407. const GPUProgram& gl_program = m_gpu_programs[id.index];
  408. GL_CHECK(glUseProgram(gl_program.gl_object));
  409. }
  410. //-----------------------------------------------------------------------------
  411. // RenderBufferId GLRenderer::create_render_buffer(uint32_t width, uint32_t height, PixelFormat format)
  412. // {
  413. // const RenderBufferId id = m_render_buffers_id_table.create();
  414. // GLRenderBuffer& buffer = m_render_buffers[id.index];
  415. // if (GLEW_EXT_framebuffer_object)
  416. // {
  417. // GL_CHECK(glGenFramebuffersEXT(1, &buffer.GL_CHECK(gl_frame_buffer));
  418. // GL_CHECK(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, buffer.GL_CHECK(gl_frame_buffer));
  419. // GL_CHECK(glGenRenderbuffersEXT(1, &buffer.GL_CHECK(gl_render_buffer));
  420. // GL_CHECK(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, buffer.GL_CHECK(gl_render_buffer));
  421. // GL_CHECK(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height));
  422. // GL_CHECK(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, buffer.GL_CHECK(gl_render_buffer));
  423. // GL_CHECK(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
  424. // }
  425. // return id;
  426. // }
  427. //-----------------------------------------------------------------------------
  428. // void GLRenderer::destroy_render_buffer(RenderBufferId id)
  429. // {
  430. // GLRenderBuffer& buffer = m_render_buffers[id.index];
  431. // if (GLEW_EXT_framebuffer_object)
  432. // {
  433. // GL_CHECK(glDeleteFramebuffersEXT(1, &buffer.GL_CHECK(gl_frame_buffer));
  434. // GL_CHECK(glDeleteRenderbuffersEXT(1, &buffer.GL_CHECK(gl_render_buffer));
  435. // }
  436. // m_render_buffers_id_table.destroy(id);
  437. // }
  438. //-----------------------------------------------------------------------------
  439. void GLRenderer::set_clear_color(const Color4& color)
  440. {
  441. GL_CHECK(glClearColor(color.r, color.g, color.b, color.a));
  442. }
  443. //-----------------------------------------------------------------------------
  444. void GLRenderer::set_ambient_light(const Color4& color)
  445. {
  446. m_ambient_light_color = color;
  447. }
  448. //-----------------------------------------------------------------------------
  449. void GLRenderer::bind_texture(uint32_t unit, TextureId texture)
  450. {
  451. CE_ASSERT(m_textures_id_table.has(texture), "Texture does not exist");
  452. if (!activate_texture_unit(unit))
  453. {
  454. return;
  455. }
  456. m_texture_unit_target[unit] = GL_TEXTURE_2D;
  457. m_texture_unit[unit] = m_textures[texture.index].gl_object;
  458. GL_CHECK(glEnable(m_texture_unit_target[unit]));
  459. GL_CHECK(glBindTexture(m_texture_unit_target[unit], m_texture_unit[unit]));
  460. }
  461. //-----------------------------------------------------------------------------
  462. void GLRenderer::set_texturing(uint32_t unit, bool texturing)
  463. {
  464. if (!activate_texture_unit(unit))
  465. return;
  466. if (texturing)
  467. {
  468. GL_CHECK(glEnable(m_texture_unit_target[unit]));
  469. }
  470. else
  471. {
  472. GL_CHECK(glDisable(m_texture_unit_target[unit]));
  473. }
  474. }
  475. //-----------------------------------------------------------------------------
  476. void GLRenderer::set_texture_wrap(uint32_t unit, TextureWrap wrap)
  477. {
  478. GLenum gl_wrap = GL::texture_wrap(wrap);
  479. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_WRAP_S, gl_wrap));
  480. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_WRAP_T, gl_wrap));
  481. }
  482. //-----------------------------------------------------------------------------
  483. void GLRenderer::set_texture_filter(uint32_t unit, TextureFilter filter)
  484. {
  485. if (!activate_texture_unit(unit))
  486. return;
  487. GLint min_filter;
  488. GLint mag_filter;
  489. GL::texture_filter(filter, min_filter, mag_filter);
  490. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_MIN_FILTER, min_filter));
  491. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_MAG_FILTER, mag_filter));
  492. }
  493. //-----------------------------------------------------------------------------
  494. void GLRenderer::set_backface_culling(bool culling)
  495. {
  496. if (culling)
  497. {
  498. GL_CHECK(glEnable(GL_CULL_FACE));
  499. }
  500. else
  501. {
  502. GL_CHECK(glDisable(GL_CULL_FACE));
  503. }
  504. }
  505. //-----------------------------------------------------------------------------
  506. void GLRenderer::set_depth_test(bool test)
  507. {
  508. if (test)
  509. {
  510. GL_CHECK(glEnable(GL_DEPTH_TEST));
  511. }
  512. else
  513. {
  514. GL_CHECK(glDisable(GL_DEPTH_TEST));
  515. }
  516. }
  517. //-----------------------------------------------------------------------------
  518. void GLRenderer::set_depth_write(bool write)
  519. {
  520. GL_CHECK(glDepthMask((GLboolean) write));
  521. }
  522. //-----------------------------------------------------------------------------
  523. void GLRenderer::set_depth_func(CompareFunction func)
  524. {
  525. GLenum gl_func = GL::compare_function(func);
  526. GL_CHECK(glDepthFunc(gl_func));
  527. }
  528. //-----------------------------------------------------------------------------
  529. void GLRenderer::set_blending(bool blending)
  530. {
  531. if (blending)
  532. {
  533. GL_CHECK(glEnable(GL_BLEND));
  534. }
  535. else
  536. {
  537. GL_CHECK(glDisable(GL_BLEND));
  538. }
  539. }
  540. //-----------------------------------------------------------------------------
  541. void GLRenderer::set_blending_params(BlendEquation equation, BlendFunction src, BlendFunction dst, const Color4& color)
  542. {
  543. GLenum gl_equation = GL::blend_equation(equation);
  544. GL_CHECK(glBlendEquation(gl_equation));
  545. GLenum gl_src_factor = GL::blend_function(src);
  546. GLenum gl_dst_factor = GL::blend_function(dst);
  547. GL_CHECK(glBlendFunc(gl_src_factor, gl_dst_factor));
  548. GL_CHECK(glBlendColor(color.r, color.g, color.b, color.a));
  549. }
  550. //-----------------------------------------------------------------------------
  551. void GLRenderer::set_color_write(bool write)
  552. {
  553. if (write)
  554. {
  555. GL_CHECK(glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE));
  556. }
  557. else
  558. {
  559. GL_CHECK(glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE));
  560. }
  561. }
  562. //-----------------------------------------------------------------------------
  563. void GLRenderer::set_front_face(FrontFace face)
  564. {
  565. const GLenum gl_face = (face == FF_CCW) ? GL_CCW : GL_CW;
  566. GL_CHECK(glFrontFace(gl_face));
  567. }
  568. //-----------------------------------------------------------------------------
  569. void GLRenderer::set_viewport_params(int32_t x, int32_t y, int32_t width, int32_t height)
  570. {
  571. m_viewport[0] = x;
  572. m_viewport[1] = y;
  573. m_viewport[2] = width;
  574. m_viewport[3] = height;
  575. GL_CHECK(glViewport(x, y, width, height));
  576. }
  577. //-----------------------------------------------------------------------------
  578. void GLRenderer::get_viewport_params(int32_t& x, int32_t& y, int32_t& width, int32_t& height)
  579. {
  580. x = m_viewport[0];
  581. y = m_viewport[1];
  582. width = m_viewport[2];
  583. height = m_viewport[3];
  584. }
  585. //-----------------------------------------------------------------------------
  586. void GLRenderer::set_scissor(bool scissor)
  587. {
  588. if (scissor)
  589. {
  590. GL_CHECK(glEnable(GL_SCISSOR_TEST));
  591. }
  592. else
  593. {
  594. GL_CHECK(glDisable(GL_SCISSOR_TEST));
  595. }
  596. }
  597. //-----------------------------------------------------------------------------
  598. void GLRenderer::set_scissor_params(int32_t x, int32_t y, int32_t width, int32_t height)
  599. {
  600. m_scissor[0] = x;
  601. m_scissor[1] = y;
  602. m_scissor[2] = width;
  603. m_scissor[3] = height;
  604. GL_CHECK(glScissor(x, y, width, height));
  605. }
  606. //-----------------------------------------------------------------------------
  607. void GLRenderer::get_scissor_params(int32_t& x, int32_t& y, int32_t& width, int32_t& height)
  608. {
  609. x = m_scissor[0];
  610. y = m_scissor[1];
  611. width = m_scissor[2];
  612. height = m_scissor[3];
  613. }
  614. //-----------------------------------------------------------------------------
  615. void GLRenderer::frame()
  616. {
  617. // Clear frame/depth buffer
  618. GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
  619. // Bind the default gpu program
  620. bind_gpu_program(m_default_gpu_program);
  621. set_gpu_program_mat4_uniform(m_default_gpu_program, "mvp_matrix", m_model_view_projection_matrix);
  622. set_gpu_program_vec3_uniform(m_default_gpu_program, "color", Vec3(0, 1, 0));
  623. GL_CHECK(glFinish());
  624. m_context.swap_buffers();
  625. }
  626. //-----------------------------------------------------------------------------
  627. Mat4 GLRenderer::get_matrix(MatrixType type) const
  628. {
  629. return m_matrix[type];
  630. }
  631. //-----------------------------------------------------------------------------
  632. void GLRenderer::set_matrix(MatrixType type, const Mat4& matrix)
  633. {
  634. m_matrix[type] = matrix;
  635. switch (type)
  636. {
  637. case MT_VIEW:
  638. case MT_MODEL:
  639. {
  640. m_model_view_matrix = m_matrix[MT_VIEW] * m_matrix[MT_MODEL];
  641. break;
  642. }
  643. case MT_PROJECTION:
  644. {
  645. m_model_view_projection_matrix = m_matrix[MT_PROJECTION] * m_model_view_matrix;
  646. break;
  647. }
  648. default:
  649. {
  650. break;
  651. CE_ASSERT(0, "");
  652. }
  653. }
  654. }
  655. //-----------------------------------------------------------------------------
  656. void GLRenderer::bind_vertex_buffer(VertexBufferId vb) const
  657. {
  658. CE_ASSERT(m_vertex_buffers_id_table.has(vb), "Vertex buffer does not exist");
  659. const VertexBuffer& vertex_buffer = m_vertex_buffers[vb.index];
  660. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer.gl_object));
  661. switch (vertex_buffer.format)
  662. {
  663. case VF_XY_FLOAT_32:
  664. {
  665. GL_CHECK(glEnableVertexAttribArray(SA_VERTEX));
  666. GL_CHECK(glVertexAttribPointer(SA_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, 0));
  667. break;
  668. }
  669. case VF_XYZ_FLOAT_32:
  670. {
  671. GL_CHECK(glEnableVertexAttribArray(SA_VERTEX));
  672. GL_CHECK(glVertexAttribPointer(SA_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, 0));
  673. break;
  674. }
  675. case VF_UV_FLOAT_32:
  676. {
  677. GL_CHECK(glEnableVertexAttribArray(SA_COORDS));
  678. GL_CHECK(glVertexAttribPointer(SA_COORDS, 2, GL_FLOAT, GL_FALSE, 0, 0));
  679. break;
  680. }
  681. case VF_UVT_FLOAT_32:
  682. {
  683. GL_CHECK(glEnableVertexAttribArray(SA_COORDS));
  684. GL_CHECK(glVertexAttribPointer(SA_COORDS, 3, GL_FLOAT, GL_FALSE, 0, 0));
  685. break;
  686. }
  687. case VF_XYZ_NORMAL_FLOAT_32:
  688. {
  689. GL_CHECK(glEnableVertexAttribArray(SA_NORMAL));
  690. GL_CHECK(glVertexAttribPointer(SA_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0));
  691. break;
  692. }
  693. case VF_XYZ_UV_XYZ_NORMAL_FLOAT_32:
  694. {
  695. break;
  696. }
  697. default:
  698. {
  699. CE_ASSERT(0, "Vertex format unknown");
  700. break;
  701. }
  702. }
  703. }
  704. //-----------------------------------------------------------------------------
  705. void GLRenderer::draw_triangles(IndexBufferId id) const
  706. {
  707. CE_ASSERT(m_index_buffers_id_table.has(id), "Index buffer does not exist");
  708. const IndexBuffer& index_buffer = m_index_buffers[id.index];
  709. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer.gl_object));
  710. GL_CHECK(glDrawElements(GL_TRIANGLES, index_buffer.index_count, GL_UNSIGNED_SHORT, 0));
  711. }
  712. //-----------------------------------------------------------------------------
  713. // void GLRenderer::bind_render_buffer(RenderBufferId id) const
  714. // {
  715. // CE_ASSERT(m_render_buffers_id_table.has(id), "Render buffer does not exist");
  716. // const GLRenderBuffer& render_buffer = m_render_buffers[id.index];
  717. // }
  718. //-----------------------------------------------------------------------------
  719. void GLRenderer::draw_lines(const float* vertices, const float* colors, uint32_t count)
  720. {
  721. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0));
  722. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
  723. GL_CHECK(glEnableClientState(GL_VERTEX_ARRAY));
  724. GL_CHECK(glEnableClientState(GL_COLOR_ARRAY));
  725. GL_CHECK(glVertexPointer(3, GL_FLOAT, 0, vertices));
  726. GL_CHECK(glColorPointer(4, GL_FLOAT, 0, colors));
  727. GL_CHECK(glDrawArrays(GL_LINES, 0, count));
  728. GL_CHECK(glDisableClientState(GL_COLOR_ARRAY));
  729. GL_CHECK(glDisableClientState(GL_VERTEX_ARRAY));
  730. }
  731. //-----------------------------------------------------------------------------
  732. void GLRenderer::load_default_shaders()
  733. {
  734. static const char* vs_text =
  735. "in vec4 vertex;"
  736. "in vec2 coords;"
  737. "uniform mat4 mvp_matrix;"
  738. "uniform vec3 color;"
  739. "void main(void)"
  740. "{"
  741. " gl_Position = mvp_matrix * vertex;"
  742. " gl_FrontColor = vec4(color, 1.0);"
  743. "}";
  744. static const char* ps_text =
  745. "void main(void)"
  746. "{"
  747. " gl_FragColor = gl_Color;"
  748. "}";
  749. m_default_vertex_shader = create_vertex_shader(vs_text);
  750. m_default_pixel_shader = create_pixel_shader(ps_text);
  751. // Create and bind the default program
  752. m_default_gpu_program = create_gpu_program(m_default_vertex_shader, m_default_pixel_shader);
  753. }
  754. //-----------------------------------------------------------------------------
  755. void GLRenderer::unload_default_shaders()
  756. {
  757. destroy_pixel_shader(m_default_pixel_shader);
  758. destroy_vertex_shader(m_default_vertex_shader);
  759. destroy_gpu_program(m_default_gpu_program);
  760. }
  761. //-----------------------------------------------------------------------------
  762. void GLRenderer::reload_default_shaders()
  763. {
  764. }
  765. //-----------------------------------------------------------------------------
  766. bool GLRenderer::activate_texture_unit(uint32_t unit)
  767. {
  768. if (unit >= (uint32_t) m_max_texture_units)
  769. {
  770. return false;
  771. }
  772. GL_CHECK(glActiveTexture(GL_TEXTURE0 + unit));
  773. m_active_texture_unit = unit;
  774. return true;
  775. }
  776. //-----------------------------------------------------------------------------
  777. GLint GLRenderer::find_gpu_program_uniform(GLuint program, const char* name) const
  778. {
  779. GLint uniform = GL_CHECK(glGetUniformLocation(program, name));
  780. CE_ASSERT(uniform != -1, "Uniform does not exist");
  781. return uniform;
  782. }
  783. //-----------------------------------------------------------------------------
  784. Renderer* Renderer::create(Allocator& a)
  785. {
  786. return CE_NEW(a, GLRenderer);
  787. }
  788. //-----------------------------------------------------------------------------
  789. void Renderer::destroy(Allocator& a, Renderer* renderer)
  790. {
  791. CE_DELETE(a, renderer);
  792. }
  793. } // namespace crown