Ejemplo n.º 1
0
Texture::~Texture() throw()
{
   if (m_texId != 0)
   {
      glDeleteTextures(1, &m_texId);
      glTraceError("glDeleteTextures");
   }
}
Ejemplo n.º 2
0
void Texture::Bind() const throw()
{
   ATLASSERT(m_texId != 0); // Generate() not called?

   glEnable(GL_TEXTURE_2D);

   glBindTexture(GL_TEXTURE_2D, m_texId);
   glTraceError("glBindTexture");
}
Ejemplo n.º 3
0
void Texture::Generate()
{
   ATLASSERT(m_texId == 0); // Generate() already called?

   glEnable(GL_TEXTURE_2D);

   glGenTextures(1, &m_texId);
   glTraceError("glGenTextures");
}
Ejemplo n.º 4
0
 /// dtor; restores viewport
 ~ViewportRestorer()
 {
    glViewport(
       m_aiViewportInfo[0],
       m_aiViewportInfo[1],
       m_aiViewportInfo[2],
       m_aiViewportInfo[3]);
    glTraceError("glViewport");
 }
Ejemplo n.º 5
0
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");
}
Ejemplo n.º 7
0
 /// ctor; stores current viewport
 ViewportRestorer()
 {
    glGetIntegerv(GL_VIEWPORT, &m_aiViewportInfo.front());
    glTraceError("glGetIntegerv");
 }