#include "ecglrenderer.h" #include "GL/glew.h" #include "glshaderprogram.h" #include "cjblog.h" void ECGLRenderer::preLoop() { m_stateManager = new GLStateManager(); m_stateManager->init(); IECRenderer::preLoop(); } void ECGLRenderer::shutdown() { if (m_stateManager) { delete m_stateManager; m_stateManager = NULL; } IECRenderer::shutdown(); } void ECGLRenderer::clearBuffers(CJB_UINT32 buffers) { GLuint clearBuffers = 0; clearBuffers |= (clearBuffers & CJB_COLOR_BUFFER) ? 0 : GL_COLOR_BUFFER_BIT; clearBuffers |= (clearBuffers & CJB_DEPTH_BUFFER) ? 0 : GL_DEPTH_BUFFER_BIT; clearBuffers |= (clearBuffers & CJB_STENCIL_BUFFER) ? 0 : GL_STENCIL_BUFFER_BIT; glClear(clearBuffers); } void ECGLRenderer::setClearColor(float red, float green, float blue, float alpha) { glClearColor(red,green,blue,alpha); } ITexture* ECGLRenderer::createTextureWithImage(const char* imageFile) { GLTexture* newTexture = new GLTexture(imageFile); return newTexture; } void ECGLRenderer::bindTexture(ITexture* texture) { glBindTexture(GL_TEXTURE_2D,((GLTexture*)texture)->getTextureID()); } IShaderProgram* ECGLRenderer::createShaderProgram(const char* vertexShader, const char* fragmentShader) { GLShaderProgram* ret = new GLShaderProgram(vertexShader,fragmentShader); if (ret == NULL) { CJBLOG_WARNING("Failed to create shader program with %s %s\n",vertexShader, fragmentShader); return NULL; } return ret; } void ECGLRenderer::deleteShaderProgram(IShaderProgram* program) { glDeleteProgram(((GLShaderProgram*)program)->getProgramID()); } void ECGLRenderer::useShaderProgram(IShaderProgram* program) { glUseProgram(((GLShaderProgram*)program)->getProgramID()); } IVertexBufferObject* ECGLRenderer::generateVBO() { GLVertexBufferObject* newVBO = new GLVertexBufferObject; glGenBuffers(1,&newVBO->bufferID); return newVBO; } IVertexArrayObject* ECGLRenderer::generateVAO() { GLVertexArrayObject* newVAO = new GLVertexArrayObject; glGenVertexArrays(1,&newVAO->arrayID); return newVAO; } void ECGLRenderer::bindVBO(CJB_UINT32 bufferType, IVertexBufferObject* pVBO) { if (bufferType == VBO_ARRAY) glBindBuffer(GL_ARRAY_BUFFER,((GLVertexBufferObject*)pVBO)->bufferID); else glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,((GLVertexBufferObject*)pVBO)->bufferID); } void ECGLRenderer::bindVAO(IVertexArrayObject* pVAO) { glBindVertexArray(((GLVertexArrayObject*)pVAO)->arrayID); } void ECGLRenderer::deleteVBO(IVertexBufferObject*& pVBO) { glDeleteBuffers(1,&((GLVertexBufferObject*)pVBO)->bufferID); delete pVBO; pVBO = NULL; } void ECGLRenderer::deleteVAO(IVertexArrayObject*& pVAO) { glDeleteVertexArrays(1,&((GLVertexArrayObject*)pVAO)->arrayID); delete pVAO; pVAO = NULL; } void ECGLRenderer::setBufferData(CJB_UINT32 target,size_t size, void* data, CJB_UINT32 usage) { CJB_UINT32 glTarget = (target == VBO_ARRAY) ? GL_ARRAY_BUFFER : GL_ELEMENT_ARRAY_BUFFER; CJB_UINT32 glUsage = (usage == VBO_STATIC_DRAW) ? GL_STATIC_DRAW : GL_DYNAMIC_DRAW; glBufferData(glTarget,size,data,glUsage); } void ECGLRenderer::enableVertexAttributeArray(CJB_UINT32 attributeIndex) { glEnableVertexAttribArray(attributeIndex); } void ECGLRenderer::setVertexAttributePointer(CJB_UINT32 attributeIndex, CJB_UINT32 size, CJB_UINT32 type, bool isNormalized, size_t stride, void* pointer) { glVertexAttribPointer(attributeIndex,size,convertTypeToGLType(type),isNormalized,stride,pointer); } CJB_UINT32 ECGLRenderer::convertTypeToGLType(CJB_UINT32 elementType) { switch(elementType) { case ET_FLOAT: return GL_FLOAT; case ET_USHORT: return GL_UNSIGNED_SHORT; case ET_UINT32: return GL_UNSIGNED_INT; } } void ECGLRenderer::unbindVBO(CJB_UINT32 bufferType) { CJB_UINT32 glTarget = (bufferType == VBO_ARRAY) ? GL_ARRAY_BUFFER : GL_ELEMENT_ARRAY_BUFFER; glBindBuffer(glTarget,0); } void ECGLRenderer::unbindVAO() { glBindVertexArray(0); } void ECGLRenderer::drawElements(CJB_UINT32 mode, size_t triCount, CJB_UINT32 type, void* INDICES ) { CJB_UINT32 glMode = (mode == DRAW_MODE_TRIANGLES) ? GL_TRIANGLES : GL_TRIANGLE_STRIP; glDrawElements(glMode,triCount*3,convertTypeToGLType(type),INDICES); }