Texture::~Texture() throw() { if (m_texId != 0) { glDeleteTextures(1, &m_texId); glTraceError("glDeleteTextures"); } }
void Texture::Bind() const throw() { ATLASSERT(m_texId != 0); // Generate() not called? glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, m_texId); glTraceError("glBindTexture"); }
void Texture::Generate() { ATLASSERT(m_texId == 0); // Generate() already called? glEnable(GL_TEXTURE_2D); glGenTextures(1, &m_texId); glTraceError("glGenTextures"); }
/// dtor; restores viewport ~ViewportRestorer() { glViewport( m_aiViewportInfo[0], m_aiViewportInfo[1], m_aiViewportInfo[2], m_aiViewportInfo[3]); glTraceError("glViewport"); }
void Texture::Upload(const Bitmap& bmp, bool bGenerateMipmap) { // check if non-power-of-two texture size is used if ((!IsPowerOfTwo(bmp.XRes()) || !IsPowerOfTwo(bmp.YRes())) && !OpenGL::IsExtensionSupported(OpenGL::Extension::ARB_texture_non_power_of_two)) { // fail here: modern graphics cards should support this extension throw Exception(_T("Non-power-of-two texture size not supported by graphics card"), __FILE__, __LINE__); } Bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // upload bits const GLubyte* data = &bmp.Data()->m_color[0]; if (bGenerateMipmap) { // build mipmapped textures gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bmp.XRes(), bmp.YRes(), GL_RGBA, GL_UNSIGNED_BYTE, data); glTraceError("gluBuild2DMipmaps"); m_uiSize = unsigned(bmp.XRes() * bmp.YRes() * 4 * 1.3333); } else { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmp.XRes(), bmp.YRes(), 0, GL_RGBA, GL_UNSIGNED_BYTE, data); glTraceError("glTexImage2D"); m_uiSize = bmp.XRes() * bmp.YRes() * 4; } }
void RangedAppendOnlyIndexBuffer::RenderRange(const IndexRange& range) const { ATLASSERT(OpenGL::IsRenderThread()); // must be called in render thread ATLASSERT(m_spIndexBuffer != NULL); if (glDrawRangeElements == NULL) { const_cast<RangedAppendOnlyIndexBuffer&>(*this).glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSWINPROC)wglGetProcAddress("glDrawRangeElements"); } ATLASSERT(glDrawRangeElements != NULL); glDrawRangeElements(GL_TRIANGLES, range.m_uiFirstIndex, range.m_uiLastIndex, range.m_uiSize, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>(range.m_uiStart*sizeof(unsigned int)) ); glTraceError("glDrawRangeElements"); }
/// ctor; stores current viewport ViewportRestorer() { glGetIntegerv(GL_VIEWPORT, &m_aiViewportInfo.front()); glTraceError("glGetIntegerv"); }