/*
* Copyright 2010 Inalogic® Inc.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License, as
* published by the Free Software Foundation; either version 2.1 or 3.0
* of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the applicable version of the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of both the GNU Lesser General Public
* License along with this program. If not, see
*
* Authored by: Jay Taoko
*
*/
#ifndef GLRESOURCE_H
#define GLRESOURCE_H
#include "NuxCore/NuxCore.h"
#include "NuxCore/SystemTypes.h"
#include "NuxCore/Error.h"
#include "NuxCore/FilePath.h"
#include "NuxCore/Color.h"
#include "NuxCore/Rect.h"
#include "NuxCore/Point.h"
#include "NuxCore/Size.h"
#include "NuxImage/BitmapFormats.h"
#include "NuxCore/Parsing.h"
#include "NuxCore/Object.h"
#include "NuxCore/ObjectPtr.h"
#include "NuxCore/Math/MathUtility.h"
#include "NuxCore/Math/Constants.h"
#include "NuxCore/Math/Vector3.h"
#include "NuxCore/Math/Vector4.h"
#include "NuxCore/Math/Matrix3.h"
#include "NuxCore/Math/Matrix4.h"
#include "NuxCore/Math/Spline.h"
#include "NuxCore/Math/MathFunctions.h"
#include "NuxImage/ImageSurface.h"
namespace nux
{
class IOpenGLResource;
class BaseTexture;
class Texture2D;
class TextureRectangle;
class TextureCube;
class TextureVolume;
class TextureFrameAnimation;
class BaseMeshBuffer;
class NIndexBuffer;
class CachedTexture2D;
class CachedTextureRectangle;
class CachedTextureCube;
class CachedTextureVolume;
class CachedTextureFrameAnimation;
class FontTexture;
}
#define NUX_ENABLE_CG_SHADERS 0
#if defined(NUX_OS_WINDOWS)
#include "GL/glew.h"
#include "GL/wglew.h"
GLEWContext *glewGetContext();
WGLEWContext *wglewGetContext();
#if (NUX_ENABLE_CG_SHADERS)
#include "CG/cg.h"
#include "CG/cgGL.h"
#pragma comment( lib, "cg.lib" )
#pragma comment( lib, "cgGL.lib" )
#endif
#elif defined(NUX_OS_LINUX)
#ifdef NUX_OPENGLES_20
#ifndef GLEW_MX
#define GLEW_MX
#endif
#include "EGL/egl.h"
#include "GLES2/gl2.h"
#else
#ifndef GLEW_MX
#define GLEW_MX
#endif
#include "GL/glew.h"
#include "GL/glxew.h"
GLEWContext *glewGetContext();
GLXEWContext *glxewGetContext();
#if (NUX_ENABLE_CG_SHADERS)
#include "Cg/cg.h"
#include "Cg/cgGL.h"
#endif
#endif
#endif
#include "RunTimeStats.h"
#include "NuxGraphicsResources.h"
#include "FontTexture.h"
#include "GlobalGraphicsInitializer.h"
#include "GLError.h"
#define CG_FRAGMENT_PROFILE CG_PROFILE_FP30
#define CG_VERTEX_PROFILE CG_PROFILE_VP30
#define NUX_BUFFER_OFFSET(i) ((BYTE *)NULL + (i))
namespace nux
{
enum
{
OGL_OK = 0,
OGL_ERROR,
OGL_ERROR_UNKNOWN,
OGL_INVALID_SURFACE_LEVEL,
OGL_INVALID_CALL,
OGL_INVALID_LOCK,
OGL_INVALID_UNLOCK,
OGL_INVALID_TEXTURE,
OGL_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
};
extern const TCHAR *OGLDeviceErrorMessages[];
#define OGL_OK 0
#define OGL_CALL(call) \
{ \
int Result = call; \
if(Result != OGL_OK) \
{nuxError(TEXT("OGL Object Error: Error # %d - (%s) "), Result, *OGLDeviceErrorMessages[Result] );} \
}
//if(Result!=OGL_OK) {nuxError(TEXT("OGL Object Error: Error # %d - %s"), Result, OGLDeviceErrorMessages[Result]);}
enum TEXTURE_FORMAT
{
TEXTURE_FMT_UNKNOWN = 0,
TEXTURE_FMT_ALPHA = GL_ALPHA,
TEXTURE_FMT_ALPHA8 = GL_ALPHA8,
TEXTURE_FMT_ALPHA16 = GL_ALPHA16,
TEXTURE_FMT_LUMINANCE = GL_LUMINANCE,
TEXTURE_FMT_LUMINANCE8 = GL_LUMINANCE8,
TEXTURE_FMT_LUMINANCE16 = GL_LUMINANCE16,
TEXTURE_FMT_LUMINANCE_ALPHA = GL_LUMINANCE_ALPHA,
TEXTURE_FMT_LUMINANCE8_ALPHA8 = GL_LUMINANCE8_ALPHA8,
TEXTURE_FMT_LUMINANCE16_ALPHA16 = GL_LUMINANCE16_ALPHA16,
TEXTURE_FMT_INTENSITY = GL_INTENSITY,
TEXTURE_FMT_INTENSITY8 = GL_INTENSITY8,
TEXTURE_FMT_INTENSITY16 = GL_INTENSITY16,
TEXTURE_FMT_GL_DEPTH_COMPONENT = GL_DEPTH_COMPONENT,
TEXTURE_FMT_GL_DEPTH_COMPONENT24 = GL_DEPTH_COMPONENT24,
TEXTURE_FMT_RGBA = GL_RGBA,
TEXTURE_FMT_RGBA8 = GL_RGBA8,
TEXTURE_FMT_RGBA16 = GL_RGBA16,
TEXTURE_FMT_RGBA16F_ARB = GL_RGBA16F_ARB,
TEXTURE_FMT_RGBA32F_ARB = GL_RGBA32F_ARB,
TEXTURE_FMT_RGB = GL_RGB,
TEXTURE_FMT_RGB8 = GL_RGB8,
TEXTURE_FMT_RGB16 = GL_RGB16,
TEXTURE_FMT_RGB16F_ARB = GL_RGB16F_ARB,
TEXTURE_FMT_RGB32F_ARB = GL_RGB32F_ARB,
TEXTURE_FMT_COMPRESSED_RGB_S3TC_DXT1_EXT = GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
TEXTURE_FMT_COMPRESSED_RGBA_S3TC_DXT1_EXT = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
TEXTURE_FMT_COMPRESSED_RGBA_S3TC_DXT3_EXT = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,
TEXTURE_FMT_COMPRESSED_RGBA_S3TC_DXT5_EXT = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
TEXTURE_FMT_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
};
struct PixelFormatReadInfo
{
const TCHAR *Name;
GLenum Format; // format use for glReadPixels
GLenum type; // type use for glReadPixels
// Format specific internal flags, e.g. whether SRGB is supported with this format
DWORD Flags;
bool Supported;
};
enum eCUBEMAP_FACES
{
CUBEMAP_FACE_POSITIVE_X = GL_TEXTURE_CUBE_MAP_POSITIVE_X,
CUBEMAP_FACE_NEGATIVE_X = GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
CUBEMAP_FACE_POSITIVE_Y = GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
CUBEMAP_FACE_NEGATIVE_Y = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
CUBEMAP_FACE_POSITIVE_Z = GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
CUBEMAP_FACE_NEGATIVE_Z = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
CUBEMAP_FACE_FORCE_DWORD = 0x7fffffff
};
enum VBO_USAGE
{
VBO_USAGE_UNKNOWN = 0,
VBO_USAGE_STATIC = GL_STATIC_DRAW,
VBO_USAGE_DYNAMIC = GL_DYNAMIC_DRAW,
VBO_USAGE_STREAM = GL_STREAM_DRAW,
VBO_USAGE_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
};
enum INDEX_FORMAT
{
INDEX_FORMAT_UNKNOWN = 0,
INDEX_FORMAT_USHORT = GL_UNSIGNED_SHORT,
INDEX_FORMAT_UINT = GL_UNSIGNED_INT,
INDEX_FORMAT_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
};
// Primitives supported by draw-primitive API
typedef enum
{
PRIMITIVE_TYPE_POINTLIST = GL_POINTS,
PRIMITIVE_TYPE_LINELIST = GL_LINES,
PRIMITIVE_TYPE_LINESTRIP = GL_LINE_STRIP,
PRIMITIVE_TYPE_TRIANGLELIST = GL_TRIANGLES,
PRIMITIVE_TYPE_TRIANGLESTRIP = GL_TRIANGLE_STRIP,
PRIMITIVE_TYPE_TRIANGLEFAN = GL_TRIANGLE_FAN,
PRIMITIVE_TYPE_QUADLIST = GL_QUADS,
PRIMITIVE_TYPE_QUADSTRIP = GL_QUAD_STRIP,
PRIMITIVE_TYPE_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
} PRIMITIVE_TYPE;
enum OpenGLResourceType
{
RTINDEXBUFFER,
RTVERTEXBUFFER,
RTSURFACE,
RTVOLUME,
RTBASETEXTURE,
RTTEXTURE,
RTTEXTURERECTANGLE,
RTCUBETEXTURE,
RTVOLUMETEXTURE,
RTANIMATEDTEXTURE,
RTVERTEXDECLARATION,
RTQUERY,
RTFRAMEBUFFEROBJECT,
RT_GLSL_VERTEXSHADER,
RT_GLSL_PIXELSHADER,
RT_GLSL_GEOMETRYSHADER,
RT_GLSL_SHADERPROGRAM,
RT_CG_VERTEXSHADER,
RT_CG_PIXELSHADER,
RT_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
};
/* Multi-Sample buffer types */
typedef enum
{
MULTISAMPLE_TYPE_NONE = 0,
MULTISAMPLE_TYPE_NONMASKABLE = 1,
MULTISAMPLE_TYPE_2_SAMPLES = 2,
MULTISAMPLE_TYPE_3_SAMPLES = 3,
MULTISAMPLE_TYPE_4_SAMPLES = 4,
MULTISAMPLE_TYPE_5_SAMPLES = 5,
MULTISAMPLE_TYPE_6_SAMPLES = 6,
MULTISAMPLE_TYPE_7_SAMPLES = 7,
MULTISAMPLE_TYPE_8_SAMPLES = 8,
MULTISAMPLE_TYPE_9_SAMPLES = 9,
MULTISAMPLE_TYPE_10_SAMPLES = 10,
MULTISAMPLE_TYPE_11_SAMPLES = 11,
MULTISAMPLE_TYPE_12_SAMPLES = 12,
MULTISAMPLE_TYPE_13_SAMPLES = 13,
MULTISAMPLE_TYPE_14_SAMPLES = 14,
MULTISAMPLE_TYPE_15_SAMPLES = 15,
MULTISAMPLE_TYPE_16_SAMPLES = 16,
MULTISAMPLE_TYPE_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
} MULTISAMPLE_TYPE;
typedef enum
{
MEM_POOL_DEFAULT = 0,
MEM_POOL_MANAGED = 1,
MEM_POOL_SYSTEMMEM = 2,
MEM_POOL_SCRATCH = 3,
MEM_POOL_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
} MEM_POOL;
typedef struct
{
OpenGLResourceType ResourceType;
unsigned int Width;
unsigned int Height;
unsigned int Depth;
BitmapFormat PixelFormat;
unsigned int RowPitch;
unsigned int SlicePitch;
unsigned int BitsPerPixel;
unsigned int WidthInBlocks;
unsigned int HeightInBlocks;
unsigned int DepthInBlocks;
unsigned int BytesPerBlock;
int ExpBias;
DWORD Flags;
MULTISAMPLE_TYPE MultiSampleType;
} TEXTURE_DESC;
typedef struct _SURFACE_DESC
{
BitmapFormat PixelFormat;
OpenGLResourceType Type;
DWORD Usage;
MEM_POOL Pool;
MULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
unsigned int Width;
unsigned int Height;
} SURFACE_DESC;
typedef struct _VOLUME_DESC
{
BitmapFormat PixelFormat;
OpenGLResourceType Type;
DWORD Usage;
MEM_POOL Pool;
unsigned int Width;
unsigned int Height;
unsigned int Depth;
} VOLUME_DESC;
typedef struct _ANIMATEDTEXTURE_DESC
{
BitmapFormat PixelFormat;
OpenGLResourceType Type;
DWORD Usage;
MEM_POOL Pool;
unsigned int Width;
unsigned int Height;
unsigned int Depth;
} ANIMATEDTEXTURE_DESC;
typedef struct _VERTEXBUFFER_DESC
{
VBO_USAGE Usage;
unsigned int Size;
} VERTEXBUFFER_DESC;
typedef struct _INDEXBUFFER_DESC
{
INDEX_FORMAT Format;
VBO_USAGE Usage;
unsigned int Size;
} INDEXBUFFER_DESC;
typedef struct _LOCKED_RECT
{
int Pitch;
void *pBits;
} SURFACE_LOCKED_RECT;
typedef struct _SURFACE_RECT
{
long left; //Specifies the x-coordinate of the lower-left corner of the rectangle.
long top; //Specifies the y-coordinate of the lower-left corner of the rectangle.
long right; //Specifies the x-coordinate of the upper-right corner of the rectangle.
long bottom; //Specifies the y-coordinate of the upper-right corner of the rectangle.
} SURFACE_RECT;
/* Structures for LockBox */
typedef struct _VOLUME_BOX
{
int Left;
int Top;
int Right;
int Bottom;
int Front;
int Back;
} VOLUME_BOX;
typedef struct _VOLUME_LOCKED_BOX
{
int RowPitch;
int SlicePitch;
void *pBits;
} VOLUME_LOCKED_BOX;
typedef enum _ATTRIB_DECL_TYPE
{
ATTRIB_DECLTYPE_UNKNOWN = 0,
ATTRIB_DECLTYPE_FLOAT1,
ATTRIB_DECLTYPE_FLOAT2,
ATTRIB_DECLTYPE_FLOAT3,
ATTRIB_DECLTYPE_FLOAT4,
ATTRIB_DECLTYPE_COLOR,
ATTRIB_DECLTYPE_UBYTE4,
ATTRIB_DECLTYPE_SHORT2,
ATTRIB_DECLTYPE_SHORT4,
ATTRIB_DECLTYPE_UBYTE4N,
ATTRIB_DECLTYPE_SHORT2N,
ATTRIB_DECLTYPE_SHORT4N,
ATTRIB_DECLTYPE_USHORT2N,
ATTRIB_DECLTYPE_USHORT4N,
ATTRIB_DECLTYPE_UDEC3,
ATTRIB_DECLTYPE_DEC3N,
ATTRIB_DECLTYPE_FLOAT16_2,
ATTRIB_DECLTYPE_FLOAT16_4,
ATTRIB_DECLTYPE_UNUSED,
ATTRIB_DECLTYPE_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
} ATTRIB_DECL_TYPE;
typedef enum _ATTRIB_COMPONENT_TYPE
{
ATTRIB_CT_UNKNOWN = 0,
ATTRIB_CT_BYTE = GL_BYTE,
ATTRIB_CT_UNSIGNED_BYTE = GL_UNSIGNED_BYTE,
ATTRIB_CT_SHORT = GL_SHORT,
ATTRIB_CT_UNSIGNED_SHORT = GL_UNSIGNED_SHORT,
ATTRIB_CT_INT = GL_INT,
ATTRIB_CT_UNSIGNED_INT = GL_UNSIGNED_INT,
ATTRIB_CT_FLOAT = GL_FLOAT,
ATTRIB_CT_HALF_FLOAT = GL_HALF_FLOAT_ARB,
// ATTRIB_CT_2_BYTES = GL_2_BYTES,
// ATTRIB_CT_3_BYTES = GL_3_BYTES,
// ATTRIB_CT_4_BYTES = GL_4_BYTES,
ATTRIB_CT_DOUBLE = GL_DOUBLE,
// Type can be GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE
ATTRIB_CT_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
} ATTRIB_COMPONENT_TYPE;
// Binding Semantics
typedef enum
{
ATTRIB_USAGE_DECL_POSITION = 0,
ATTRIB_USAGE_DECL_BLENDWEIGHT = 1,
ATTRIB_USAGE_DECL_NORMAL = 2,
ATTRIB_USAGE_DECL_COLOR = 3,
ATTRIB_USAGE_DECL_COLOR1 = 4,
ATTRIB_USAGE_DECL_FOGCOORD = 5,
ATTRIB_USAGE_DECL_PSIZE = 6,
ATTRIB_USAGE_DECL_BLENDINDICES = 7,
ATTRIB_USAGE_DECL_TEXCOORD = 8,
ATTRIB_USAGE_DECL_TEXCOORD0 = 8,
ATTRIB_USAGE_DECL_TEXCOORD1 = 9,
ATTRIB_USAGE_DECL_TEXCOORD2 = 10,
ATTRIB_USAGE_DECL_TEXCOORD3 = 11,
ATTRIB_USAGE_DECL_TEXCOORD4 = 12,
ATTRIB_USAGE_DECL_TEXCOORD5 = 13,
ATTRIB_USAGE_DECL_TEXCOORD6 = 14,
ATTRIB_USAGE_DECL_TEXCOORD7 = 15,
ATTRIB_USAGE_DECL_TANGENT = 14,
ATTRIB_USAGE_DECL_BINORMAL = 15,
ATTRIB_USAGE_DECL_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
} ATTRIB_USAGE_DECL;
typedef enum
{
QUERY_TYPE_VCACHE = 4,
QUERY_TYPE_RESOURCEMANAGER = 5,
QUERY_TYPE_VERTEXSTATS = 6,
QUERY_TYPE_EVENT = 8,
QUERY_TYPE_OCCLUSION = 9,
QUERY_TYPE_SCREENEXTENT = 10,
QUERY_TYPE_FORCE_DWORD = 0x7fffffff /* force 32-bit size enum */
} QUERY_TYPE;
// Flags field for Issue
#define ISSUE_END (1 << 0) // Tells the runtime to issue the end of a query, changing it's state to "non-signaled".
#define ISSUE_BEGIN (1 << 1) // Tells the runtime to issue the begining of a query.
struct VERTEXELEMENT
{
VERTEXELEMENT()
{
Stream = 0;
Offset = 0;
Type = ATTRIB_CT_UNKNOWN;
NumComponent = 0;
stride_ = 0;
}
VERTEXELEMENT(
int stream,
int offset,
ATTRIB_COMPONENT_TYPE type,
BYTE numcomponents,
int stride)
{
Stream = stream;
Offset = offset;
Type = type;
NumComponent = numcomponents;
stride_ = stride;
}
int Stream;
int Offset;
// Type can be GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE ...
ATTRIB_COMPONENT_TYPE Type;
// This can be 1, 2, 3 or 4; For a position (xyzw), it will be 4. For a texture coordinate (uv) it will be 2.
int NumComponent;
int stride_;
};
#define DECL_END VERTEXELEMENT( \
0xFF, \
0, \
ATTRIB_CT_UNKNOWN, \
0, 0)
unsigned int GetVertexElementSize (VERTEXELEMENT vtxelement);
#define MAXDECLLENGTH 64
#define MAX_NUM_STREAM 8
void DecomposeTypeDeclaraction (ATTRIB_DECL_TYPE Type, BYTE &NumComponent, ATTRIB_COMPONENT_TYPE &ComponentType);
// void AddVertexElement (std::vector& Elements,
// WORD Stream,
// WORD Offset,
// //ubiS16 Stride,
// ATTRIB_DECL_TYPE Type,
// ATTRIB_USAGE_DECL Usage,
// BYTE UsageIndex);
GLenum GetGLPrimitiveType(PRIMITIVE_TYPE InPrimitiveType);
unsigned int GetGLElementCount(PRIMITIVE_TYPE InPrimitiveType, unsigned int InPrimitiveCount);
}
#endif // GLRESOURCE_H