Files
libsst/Include/ZRenderer/ZOpenGLDimensionTexture.hpp
2026-04-03 00:22:39 -05:00

263 lines
6.4 KiB
C++

/*
ZOpenGLDimensionTexture.hpp
Author: James Russell <jcrussell@762studios.com>
Created: 7/1/2012
Purpose:
OpenGL implementation of a 'dimensional' (1D, 2D, 3D) texture.
License:
TODO
*/
#pragma once
#ifndef _ZOPENGLDIMENSIONTEXTURE_HPP
#define _ZOPENGLDIMENSIONTEXTURE_HPP
#include <SST/SST_GLAPI.h>
#include <ZRenderer/ZDimensionTextureBase.hpp>
//Forward Declarations
class ZOpenGLRenderer;
//OpenGL implementation of the two dimensional texture interface
class ZOpenGLDimensionTexture : public ZDimensionTextureBase
{
private:
DISABLE_COPY_AND_ASSIGN(ZOpenGLDimensionTexture);
protected:
//Gets the texture data from the graphics device as part of a thread request
static void GetDeviceData_( ZThread *_renderThread, void *_dataBuffer );
//Subclass Implementation
virtual void GetDeviceData(void* _buffer);
public:
//Renderer associated with this texture
ZOpenGLRenderer *Renderer;
//The OpenGL handle to the loaded texture
GLuint GLHandle;
//Gets the OpenGL 'target' parameter for this texture type
GLenum GetGLTarget()
{
switch(Type)
{
case ZTT_TEXTURE1D: return GL_TEXTURE_1D;
case ZTT_TEXTURE2D: return GL_TEXTURE_2D;
case ZTT_TEXTURE3D: return GL_TEXTURE_3D;
case ZTT_TEXTURE_CUBE: /* Invalid Here */
default: return GL_INVALID_ENUM;
}
}
//Gets the OpenGL 'internalFormat' parameter for this texture format (used for glTexImage*D)
GLenum GetGLInternalFormat()
{
switch (Format)
{
case ZTF_R8: return GL_R8;
case ZTF_R8_SNORM: return GL_R8_SNORM;
case ZTF_R8I: return GL_R8I;
case ZTF_R8UI: return GL_R8UI;
case ZTF_R16: return GL_R16;
case ZTF_R16_SNORM: return GL_R16_SNORM;
case ZTF_R16I: return GL_R16I;
case ZTF_R16UI: return GL_R16UI;
case ZTF_R16F: return GL_R16F;
case ZTF_R32I: return GL_R32I;
case ZTF_R32UI: return GL_R32UI;
case ZTF_R32F: return GL_R32F;
case ZTF_RG8: return GL_RG8;
case ZTF_RG8_SNORM: return GL_RG8_SNORM;
case ZTF_RG8I: return GL_RG8I;
case ZTF_RG8UI: return GL_RG8UI;
case ZTF_RG16: return GL_RG16;
case ZTF_RG16_SNORM: return GL_RG16_SNORM;
case ZTF_RG16I: return GL_RG16I;
case ZTF_RG16UI: return GL_RG16UI;
case ZTF_RG16F: return GL_RG16F;
case ZTF_RG32I: return GL_RG32I;
case ZTF_RG32UI: return GL_RG32UI;
case ZTF_RG32F: return GL_RG32F;
case ZTF_RGB8: return GL_RGB8;
case ZTF_RGB8_SNORM: return GL_RGB8_SNORM;
case ZTF_RGB8I: return GL_RGB8I;
case ZTF_RGB8UI: return GL_RGB8UI;
case ZTF_RGB16: return GL_RGB16;
case ZTF_RGB16_SNORM: return GL_RGB16_SNORM;
case ZTF_RGB16I: return GL_RGB16I;
case ZTF_RGB16UI: return GL_RGB16UI;
case ZTF_RGB16F: return GL_RGB16F;
case ZTF_RGB32I: return GL_RGB32I;
case ZTF_RGB32UI: return GL_RGB32UI;
case ZTF_RGB32F: return GL_RGB32F;
case ZTF_RGBA8: return GL_RGBA8;
case ZTF_RGBA8_SNORM: return GL_RGBA8_SNORM;
case ZTF_RGBA8I: return GL_RGBA8I;
case ZTF_RGBA8UI: return GL_RGBA8UI;
case ZTF_RGBA16: return GL_RGBA16;
case ZTF_RGBA16_SNORM: return GL_RGBA16_SNORM;
case ZTF_RGBA16I: return GL_RGBA16I;
case ZTF_RGBA16UI: return GL_RGBA16UI;
case ZTF_RGBA16F: return GL_RGBA16F;
case ZTF_RGBA32I: return GL_RGBA32I;
case ZTF_RGBA32UI: return GL_RGBA32UI;
case ZTF_RGBA32F: return GL_RGBA32F;
case ZTF_DEPTH16: return GL_DEPTH_COMPONENT16;
case ZTF_DEPTH24: return GL_DEPTH_COMPONENT24;
case ZTF_DEPTH32: return GL_DEPTH_COMPONENT32;
case ZTF_DEPTH24_STENCIL8: return GL_DEPTH24_STENCIL8;
default: return GL_INVALID_ENUM;
}
}
//Gets the OpenGL 'format' parameter for this texture's bitmap format (used for glTexImage*D)
GLenum GetGLFormat()
{
switch (Bitmap.GetFormat())
{
case ZBF_R8:
case ZBF_R8I:
case ZBF_R16:
case ZBF_R16I:
case ZBF_R32:
case ZBF_R32I:
case ZBF_R32F: return GL_RED;
case ZBF_RG8:
case ZBF_RG8I:
case ZBF_RG16:
case ZBF_RG16I:
case ZBF_RG32:
case ZBF_RG32I:
case ZBF_RG32F: return GL_RG;
case ZBF_RGB8:
case ZBF_RGB8I:
case ZBF_RGB16:
case ZBF_RGB16I:
case ZBF_RGB32:
case ZBF_RGB32I:
case ZBF_RGB32F: return GL_RGB;
case ZBF_RGBA8:
case ZBF_RGBA8I:
case ZBF_RGBA16:
case ZBF_RGBA16I:
case ZBF_RGBA32:
case ZBF_RGBA32I:
case ZBF_RGBA32F: return GL_RGBA;
case ZBF_BGR8:
case ZBF_BGR8I:
case ZBF_BGR16:
case ZBF_BGR16I:
case ZBF_BGR32:
case ZBF_BGR32I:
case ZBF_BGR32F: return GL_BGR;
case ZBF_BGRA8:
case ZBF_BGRA8I:
case ZBF_BGRA16:
case ZBF_BGRA16I:
case ZBF_BGRA32:
case ZBF_BGRA32I:
case ZBF_BGRA32F: return GL_BGRA;
case ZBF_DEPTH32: return GL_DEPTH_COMPONENT;
default: return GL_INVALID_ENUM;
}
}
//Gets the OpenGL 'type' parameter for this texture's bitmap format (used for glTexImage*D calls)
GLenum GetGLType()
{
switch (Bitmap.GetFormat())
{
case ZBF_R8:
case ZBF_RG8:
case ZBF_RGB8:
case ZBF_RGBA8:
case ZBF_BGR8:
case ZBF_BGRA8: return GL_UNSIGNED_BYTE;
case ZBF_R8I:
case ZBF_RG8I:
case ZBF_RGB8I:
case ZBF_RGBA8I:
case ZBF_BGR8I:
case ZBF_BGRA8I: return GL_BYTE;
case ZBF_R16:
case ZBF_RG16:
case ZBF_RGB16:
case ZBF_RGBA16:
case ZBF_BGR16:
case ZBF_BGRA16: return GL_UNSIGNED_SHORT;
case ZBF_R16I:
case ZBF_RG16I:
case ZBF_RGB16I:
case ZBF_RGBA16I:
case ZBF_BGR16I:
case ZBF_BGRA16I: return GL_SHORT;
case ZBF_R32:
case ZBF_RG32:
case ZBF_RGB32:
case ZBF_RGBA32:
case ZBF_BGR32:
case ZBF_BGRA32: return GL_UNSIGNED_INT;
case ZBF_R32I:
case ZBF_RG32I:
case ZBF_RGB32I:
case ZBF_RGBA32I:
case ZBF_BGR32I:
case ZBF_BGRA32I: return GL_INT;
case ZBF_R32F:
case ZBF_RG32F:
case ZBF_RGB32F:
case ZBF_RGBA32F:
case ZBF_BGR32F:
case ZBF_BGRA32F: return GL_FLOAT;
case ZBF_DEPTH32: return GL_UNSIGNED_INT;
default: return GL_INVALID_ENUM;
}
}
/*
Constructor.
@param _renderer - the current renderer instance
@param _type - the type of texture
@param _format - the format of the texture
@param _usage - the usage type of texture
@param _bitmap - the bitmap for this texture (or side, in case of cube map)
@param _generateMipmaps - flag indicating we should generate mipmaps
*/
ZOpenGLDimensionTexture(ZOpenGLRenderer* _renderer, ZTextureType _type, ZTextureFormat _format, ZTextureUsage _usage, const ZBitmap& _bitmap, bool _generateMipmaps);
//Virtual destructor
virtual ~ZOpenGLDimensionTexture();
};
#endif