/** ******************************************************************************* * @file ewolOObject.cpp * @brief ewol OpenGl Object system (Sources) * @author Edouard DUPIN * @date 24/10/2011 * @par Project * ewol * * @par Copyright * Copyright 2011 Edouard DUPIN, all right reserved * * This software is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY. * * Licence summary : * You can modify and redistribute the sources code and binaries. * You can send me the bug-fix * * Term of the licence in in the file licence.txt. * ******************************************************************************* */ #include <etkTypes.h> #include <etkString.h> #include <ewolOObject.h> #include <ewolTexture.h> #include <GL/gl.h> #undef __class__ #define __class__ "ewol::OObject2DColored" void ewol::OObject2DColored::Draw(void) { if (m_coord.Size()<=0) { return; } // Enable Pointers glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_COLOR_ARRAY ); // Set the vertex pointer to our vertex data glVertexPointer(2, GL_FLOAT, 0, &m_coord[0] ); glColorPointer(4, GL_FLOAT, 0, &m_coordColor[0] ); // Render : draw all of the triangles at once glDrawArrays( GL_TRIANGLES, 0, m_coord.Size()); //glDrawElements( GL_TRIANGLES, 0, m_coord.Size()); //EWOL_DEBUG("Draw ..." << m_coord.Size()/3 << " triangle(s)"); // Disable Pointers glDisableClientState( GL_COLOR_ARRAY ); glDisableClientState( GL_VERTEX_ARRAY ); } void ewol::OObject2DColored::Rectangle(float x, float y, float w, float h, float red, float green, float blue, float alpha) { //EWOL_DEBUG("Add rectangle : ..."); coord2D_ts point; color_ts color; color.red = red; color.green = green; color.blue = blue; color.alpha = alpha; point.x = x; point.y = y + h; m_coord.PushBack(point); m_coordColor.PushBack(color); point.x = x; point.y = y; m_coord.PushBack(point); m_coordColor.PushBack(color); point.x = x + w; point.y = y; m_coord.PushBack(point); m_coordColor.PushBack(color); m_coord.PushBack(point); m_coordColor.PushBack(color); point.x = x + w; point.y = y + h; m_coord.PushBack(point); m_coordColor.PushBack(color); point.x = x; point.y = y + h; m_coord.PushBack(point); m_coordColor.PushBack(color); } #undef __class__ #define __class__ "ewol::OObject2DTextured" ewol::OObject2DTextured::OObject2DTextured(etk::File textureName) { EWOL_DEBUG("Create OObject textured : \"" << textureName << "\""); m_textureId = ewol::LoadTexture(textureName); } ewol::OObject2DTextured::~OObject2DTextured(void) { ewol::UnLoadTexture(m_textureId); } void ewol::OObject2DTextured::Draw(void) { if (m_coord.Size()<=0) { EWOL_WARNING("Nothink to draw..."); return; } glColor4f(1.0, 1.0, 1.0, 1.0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, m_textureId); glEnableClientState( GL_VERTEX_ARRAY ); // Enable Vertex Arrays glEnableClientState( GL_TEXTURE_COORD_ARRAY ); // Enable Texture Coord Arrays glVertexPointer( 2, GL_FLOAT, 0, &m_coord[0] ); glTexCoordPointer( 2, GL_FLOAT, 0, &m_coordTex[0] ); glDrawArrays( GL_TRIANGLES, 0, m_coord.Size()); //EWOL_DEBUG("request draw of " << m_coord.Size() << " elements"); glDisableClientState( GL_VERTEX_ARRAY ); // Disable Vertex Arrays glDisableClientState( GL_TEXTURE_COORD_ARRAY ); // Disable Texture Coord Arrays glDisable(GL_TEXTURE_2D); } void ewol::OObject2DTextured::Rectangle(float x, float y, float w, float h, float texX, float texY, float texSX, float texSY) { //EWOL_DEBUG("Add rectangle : ..."); coord2D_ts point; texCoord_ts tex; tex.u = texX; tex.v = texY; point.x = x; point.y = y; m_coord.PushBack(point); m_coordTex.PushBack(tex); tex.u = texSX; tex.v = texY; point.x = x + w; point.y = y; m_coord.PushBack(point); m_coordTex.PushBack(tex); tex.u = texSX; tex.v = texSY; point.x = x + w; point.y = y + h; m_coord.PushBack(point); m_coordTex.PushBack(tex); m_coord.PushBack(point); m_coordTex.PushBack(tex); tex.u = texX; tex.v = texSY; point.x = x; point.y = y + h; m_coord.PushBack(point); m_coordTex.PushBack(tex); tex.u = texX; tex.v = texY; point.x = x; point.y = y; m_coord.PushBack(point); m_coordTex.PushBack(tex); } #undef __class__ #define __class__ "ewol::OObject2DText" ewol::OObject2DText::OObject2DText(float x, float y, etk::String FontName, int32_t size, fontMode_te mode, color_ts textColorFg, const char* utf8String) { Text(x, y, FontName, size, mode, textColorFg, utf8String); } ewol::OObject2DText::~OObject2DText(void) { } void ewol::OObject2DText::Draw(void) { if (m_coord.Size()<=0) { EWOL_WARNING("Nothink to draw..."); return; } glColor4f(m_textColorFg.red, m_textColorFg.green, m_textColorFg.blue, m_textColorFg.alpha); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, m_FontTextureId); glEnableClientState( GL_VERTEX_ARRAY ); // Enable Vertex Arrays glEnableClientState( GL_TEXTURE_COORD_ARRAY ); // Enable Texture Coord Arrays glVertexPointer( 2, GL_FLOAT, 0, &m_coord[0] ); glTexCoordPointer( 2, GL_FLOAT, 0, &m_coordTex[0] ); glDrawArrays( GL_QUADS, 0, m_coord.Size()); //EWOL_DEBUG("request draw of " << m_coord.Size() << " elements"); glDisableClientState( GL_VERTEX_ARRAY ); // Disable Vertex Arrays glDisableClientState( GL_TEXTURE_COORD_ARRAY ); // Disable Texture Coord Arrays glDisable(GL_TEXTURE_2D); } void ewol::OObject2DText::Text(float x, float y, etk::String FontName, int32_t size, fontMode_te mode, color_ts textColorFg, const char* utf8String) { m_FontTextureId = 0; m_coord.Clear(); m_coordTex.Clear(); // get font Name : m_FontId = GetFontIdWithName(FontName); if (m_FontId == -1) { EWOL_ERROR("Can not find the font with the name : " << FontName); } EWOL_DEBUG("Font name : " << FontName << " id=" << m_FontId); m_textColorFg = textColorFg; coord2D_ts drawPosition; drawPosition.x = x; drawPosition.y = y; ewol::DrawText(m_FontId, mode, size, drawPosition, utf8String, m_FontTextureId, m_coord, m_coordTex); } /* uint32_t m_FontId; //!< font internal ID uint32_t m_FontTextureId; //!< font internal Texture ID etk::VectorType<coord2D_ts> m_coord; //!< internal coord of the object etk::VectorType<texCoord_ts> m_coordTex; //!< internal texture coordinate for every point */