void Screen::CreateHardwareSurfaces() { glGenFramebuffersOES(1, &frameBuffer); glGenRenderbuffersOES(1, &renderBuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderBuffer); iphPrepareGLContext(); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, renderBuffer); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &iWidth); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &iHeight); #if SEED_ENABLE_DEPTH_TEST glGenRenderbuffersOES(1, &depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, iWidth, iHeight); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); #endif // SEED_ENABLE_DEPTH_TEST if (iMode == LANDSCAPE || iMode == LANDSCAPE_GOOFY) { this->iModeWidth = this->iHeight; this->iModeHeight = this->iWidth; } else { this->iModeWidth = this->iHeight; this->iModeHeight = this->iWidth; } }
inline void VL_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params) { if (glGetRenderbufferParameterivOES) glGetRenderbufferParameterivOES(target, pname, params); else VL_TRAP(); }
void glGetRenderbufferParameterivOESLogged(GLenum target, GLenum pname, GLint* params) { printf("glGetRenderbufferParameterivOES(%s, %s, %p)\n", GLEnumName(target), GLEnumName(pname), params); glGetRenderbufferParameterivOES(target, pname, params); }
void RenderingEngine::Initialize(const vector<ISurface*>& surfaces) { vector<ISurface*>::const_iterator surface; for (surface = surfaces.begin(); surface != surfaces.end(); ++surface) { // Create the VBO for the vertices. vector<float> vertices; unsigned char vertexFlags = VertexFlagsNormals | VertexFlagsTexCoords; (*surface)->GenerateVertices(vertices, vertexFlags); GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); // Create a new VBO for the indices if needed. int indexCount = (*surface)->GetTriangleIndexCount(); GLuint indexBuffer; if (!m_drawables.empty() && indexCount == m_drawables[0].IndexCount) { indexBuffer = m_drawables[0].IndexBuffer; } else { vector<GLushort> indices(indexCount); (*surface)->GenerateTriangleIndices(indices); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLushort), &indices[0], GL_STATIC_DRAW); } Drawable drawable = { vertexBuffer, indexBuffer, indexCount}; m_drawables.push_back(drawable); } // Extract width and height from the color buffer. int width, height; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height); // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); // Create the framebuffer object. GLuint framebuffer; glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); void* pixels; ivec2 size; // Load the background texture. glGenTextures(1, &m_backgroundTexture); glBindTexture(GL_TEXTURE_2D, m_backgroundTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); m_resourceManager->LoadPngImage("Background"); pixels = m_resourceManager->GetImageData(); size = m_resourceManager->GetImageSize(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); m_resourceManager->UnloadImage(); // Load the checkboard texture. glGenTextures(1, &m_gridTexture); glBindTexture(GL_TEXTURE_2D, m_gridTexture); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); m_resourceManager->LoadPngImage("Checkerboard"); pixels = m_resourceManager->GetImageData(); size = m_resourceManager->GetImageSize(); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, size.x, size.y, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels); m_resourceManager->UnloadImage(); // Set up various GL state. glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); // Set up the material properties. vec4 specular(0.5f, 0.5f, 0.5f, 1); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular.Pointer()); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0f); m_translation = mat4::Translate(0, 0, -7); }
void RenderingEngine::Initialize() { // Create vertices for full-screen quad. m_backgroundVertices.resize(4); m_backgroundVertices[0].Position = vec3(-1, -1.5, 0); m_backgroundVertices[0].TexCoord = vec2(0, 0); m_backgroundVertices[1].Position = vec3(-1, 1.5, 0); m_backgroundVertices[1].TexCoord = vec2(0, 1); m_backgroundVertices[2].Position = vec3(1, -1.5, 0); m_backgroundVertices[2].TexCoord = vec2(1, 0); m_backgroundVertices[3].Position = vec3(1, 1.5, 0); m_backgroundVertices[3].TexCoord = vec2(1, 1); if (false) { m_backgroundVertices[0].TexCoord *= 0.3; m_backgroundVertices[1].TexCoord *= 0.3; m_backgroundVertices[2].TexCoord *= 0.3; m_backgroundVertices[3].TexCoord *= 0.3; } // Create the line-based stick figure. size_t indexCount = sizeof(StickFigureIndices) / sizeof(GLushort); size_t lineCount = indexCount / 2; m_stickFigure.Indices = IndexList(StickFigureIndices, StickFigureIndices + indexCount); glGenBuffers(1, &m_stickFigure.IndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_stickFigure.IndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_stickFigure.Indices.size() * sizeof(GLushort), &m_stickFigure.Indices[0], GL_STATIC_DRAW); m_stickFigure.Vertices.resize(JointCount); // Create the triangle-based stick figure. GenerateTriangleIndices(lineCount, m_aaStickFigure.Indices); glGenBuffers(1, &m_aaStickFigure.IndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_aaStickFigure.IndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_aaStickFigure.Indices.size() * sizeof(GLushort), &m_aaStickFigure.Indices[0], GL_STATIC_DRAW); m_aaStickFigure.Vertices.resize(lineCount * 8); GenerateTriangleTexCoords(m_aaStickFigure); // Initialize the demo state. m_demoState = DemoStateAaLines; // Load up some textures. m_textures.Tile = CreateTexture(Tile); m_textures.Circle = CreateTexture(Circle); m_textures.BlurryCircle = CreateTexture(BlurryCircle); // Extract width and height from the color buffer. ivec2 screenSize; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &screenSize.x); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &screenSize.y); // Create the on-screen FBO. glGenFramebuffersOES(1, &m_framebuffers.Screen); glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_framebuffers.Screen); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_renderbuffers.Screen); // Set up various GL state. glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glViewport(0, 0, screenSize.x, screenSize.y); glAlphaFunc(GL_LESS, 0.5); // Set up the transforms. glMatrixMode(GL_PROJECTION); glLoadIdentity(); const float NearPlane = 5, FarPlane = 100; const float Scale = 0.0005; glFrustumf(-Scale * screenSize.x / 2, Scale * screenSize.x / 2, -Scale * screenSize.y / 2, Scale * screenSize.y / 2, NearPlane, FarPlane); glMatrixMode(GL_MODELVIEW); }
void RenderingEngine::Initialize(const vector<ISurface*>& surfaces) { vector<ISurface*>::const_iterator surface; for (surface = surfaces.begin(); surface != surfaces.end(); ++surface) { // Create the VBO for the vertices. vector<float> vertices; (*surface)->GenerateVertices(vertices, VertexFlagsNormals); GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); // Create a new VBO for the indices if needed. int indexCount = (*surface)->GetTriangleIndexCount(); GLuint indexBuffer; if (!m_drawables.empty() && indexCount == m_drawables[0].IndexCount) { indexBuffer = m_drawables[0].IndexBuffer; } else { vector<GLushort> indices(indexCount); (*surface)->GenerateTriangleIndices(indices); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLushort), &indices[0], GL_STATIC_DRAW); } Drawable drawable = { vertexBuffer, indexBuffer, indexCount}; m_drawables.push_back(drawable); } // Extract width and height from the color buffer. int width, height; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height); // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); // Create the framebuffer object. GLuint framebuffer; glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); // Set up various GL state. glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); // Set up the material properties. vec4 specular(0.5f, 0.5f, 0.5f, 1); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular.Pointer()); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0f); m_translation = mat4::Translate(0, 0, -7); }
void RenderingEngine::Initialize(const vector<ISurface*>& surfaces) { vector<ISurface*>::const_iterator surface; for (surface = surfaces.begin(); surface != surfaces.end(); ++surface) { // Create the VBO for the vertices. vector<float> vertices; (*surface)->GenerateVertices(vertices, VertexFlagsNormals); GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); // Create a VBO for the triangle indices. int triangleIndexCount = (*surface)->GetTriangleIndexCount(); vector<GLushort> triangleIndices(triangleIndexCount); (*surface)->GenerateTriangleIndices(triangleIndices); GLuint triangleIndexBuffer; glGenBuffers(1, &triangleIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, triangleIndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangleIndexCount * sizeof(GLushort), &triangleIndices[0], GL_STATIC_DRAW); // Create a VBO for the line indices. int lineIndexCount = (*surface)->GetTriangleIndexCount(); vector<GLushort> lineIndices(lineIndexCount); (*surface)->GenerateLineIndices(lineIndices); GLuint lineIndexBuffer; glGenBuffers(1, &lineIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, lineIndexCount * sizeof(GLushort), &lineIndices[0], GL_STATIC_DRAW); Drawable drawable = { vertexBuffer, triangleIndexBuffer, lineIndexBuffer, triangleIndexCount, lineIndexBuffer }; m_drawables.push_back(drawable); } #ifndef MACOSX // Extract width and height from the color buffer. int width, height; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height); // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); // Create the framebuffer object. GLuint framebuffer; glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); #endif // Set up various GL state. glEnableClientState(GL_VERTEX_ARRAY); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_FLAT); glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); // Set up the material properties. vec4 ambient(0.2f, 0.2f, 0.2f, 1); vec4 specular(0.5f, 0.5f, 0.5f, 1); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient.Pointer()); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular.Pointer()); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 30.0f); m_translation = mat4::Translate(0, 0, -7); }