2019-09-16 17:35:04 +00:00
# pragma once
# include <stdlib.h>
# include <algorithm>
2019-09-16 20:56:48 +00:00
# include <vector>
2019-09-17 17:03:42 +00:00
# include <map>
2019-09-16 21:28:26 +00:00
# include "gl_samplers.h"
2019-09-17 17:03:42 +00:00
# include "gl_hwtexture.h"
2019-10-04 16:12:03 +00:00
# include "matrix.h"
2019-09-16 20:56:48 +00:00
class FSamplerManager ;
2019-09-16 17:35:04 +00:00
struct BaseVertex
{
float x , y , z ;
float u , v ;
void SetVertex ( float _x , float _y , float _z = 0 )
{
x = _x ;
y = _y ;
z = _z ;
}
void SetTexCoord ( float _u = 0 , float _v = 0 )
{
u = _u ;
v = _v ;
}
2019-09-16 19:08:42 +00:00
void Set ( float _x , float _y , float _z = 0 , float _u = 0 , float _v = 0 )
{
x = _x ;
y = _y ;
z = _z ;
u = _u ;
v = _v ;
}
2019-09-16 17:35:04 +00:00
} ;
enum EDrawType
{
DT_TRIANGLES ,
DT_TRIANGLE_STRIP ,
DT_TRIANGLE_FAN ,
DT_QUADS ,
DT_LINES
} ;
2019-10-04 16:12:03 +00:00
enum EMatrixType
{
Matrix_Projection ,
Matrix_ModelView ,
Matrix_Texture0 ,
Matrix_Texture1 ,
Matrix_Texture2 ,
Matrix_Texture3 ,
Matrix_Texture4 ,
Matrix_Texture5 ,
Matrix_Texture6 ,
Matrix_Texture7 ,
NUMMATRICES
} ;
enum ECull
{
Cull_None ,
Cull_Front ,
Cull_Back
} ;
2019-10-04 16:44:16 +00:00
enum EDepthFunc
{
Depth_Always ,
Depth_Less ,
Depth_Equal ,
Depth_LessEqual
} ;
2019-10-04 17:17:55 +00:00
enum ERenderAlpha
{
STYLEALPHA_Zero , // Blend factor is 0.0
STYLEALPHA_One , // Blend factor is 1.0
STYLEALPHA_Src , // Blend factor is alpha
STYLEALPHA_InvSrc , // Blend factor is 1.0 - alpha
STYLEALPHA_SrcCol , // Blend factor is color (HWR only)
STYLEALPHA_InvSrcCol , // Blend factor is 1.0 - color (HWR only)
STYLEALPHA_DstCol , // Blend factor is dest. color (HWR only)
STYLEALPHA_InvDstCol , // Blend factor is 1.0 - dest. color (HWR only)
STYLEALPHA_Dst , // Blend factor is dest. alpha
STYLEALPHA_InvDst , // Blend factor is 1.0 - dest. alpha
STYLEALPHA_MAX
} ;
enum ERenderOp
{
STYLEOP_Add , // Add source to destination
STYLEOP_Sub , // Subtract source from destination
STYLEOP_RevSub , // Subtract destination from source
} ;
2019-09-16 17:35:04 +00:00
class GLInstance
{
2019-09-17 17:03:42 +00:00
enum
{
MAX_TEXTURES = 15 , // slot 15 is used internally and not available.
THCACHESIZE = 200 ,
} ;
2019-09-16 20:56:48 +00:00
std : : vector < BaseVertex > Buffer ; // cheap-ass implementation. The primary purpose is to get the GL accesses out of polymost.cpp, not writing something performant right away.
2019-09-17 17:03:42 +00:00
unsigned int LastBoundTextures [ MAX_TEXTURES ] ;
unsigned TextureHandleCache [ THCACHESIZE ] ;
int currentindex = THCACHESIZE ;
2019-10-04 16:12:03 +00:00
int maxTextureSize ;
VSMatrix matrices [ NUMMATRICES ] ;
2019-09-17 17:03:42 +00:00
2019-09-16 17:35:04 +00:00
public :
2019-09-16 20:56:48 +00:00
FSamplerManager * mSamplers ;
void Init ( ) ;
2019-10-04 16:12:03 +00:00
void InitGLState ( int fogmode , int multisample ) ;
2019-09-16 20:56:48 +00:00
void Deinit ( ) ;
2019-09-17 17:03:42 +00:00
static int GetTexDimension ( int value )
{
//if (value > gl.max_texturesize) return gl.max_texturesize;
return value ;
}
2019-09-16 17:35:04 +00:00
std : : pair < size_t , BaseVertex * > AllocVertices ( size_t num ) ;
void Draw ( EDrawType type , size_t start , size_t count ) ;
2019-09-17 17:03:42 +00:00
int GetTextureID ( ) ;
2019-09-18 18:44:21 +00:00
FHardwareTexture * NewTexture ( ) ;
void BindTexture ( int texunit , FHardwareTexture * texid , int sampler = NoSampler ) ;
2019-09-17 17:03:42 +00:00
void UnbindTexture ( int texunit ) ;
void UnbindAllTextures ( ) ;
2019-10-04 16:12:03 +00:00
void EnableBlend ( bool on ) ;
void EnableAlphaTest ( bool on ) ;
void EnableDepthTest ( bool on ) ;
const VSMatrix & GetMatrix ( int num )
{
return matrices [ num ] ;
}
void SetMatrix ( int num , const VSMatrix * mat ) ;
void SetMatrix ( int num , const float * mat )
{
SetMatrix ( num , reinterpret_cast < const VSMatrix * > ( mat ) ) ;
}
void SetCull ( int type ) ;
void EnableStencilWrite ( int value ) ;
void EnableStencilTest ( int value ) ;
void DisableStencil ( ) ;
2019-10-04 16:25:18 +00:00
void SetColor ( float r , float g , float b , float a = 1.f ) ;
void SetColorub ( uint8_t r , uint8_t g , uint8_t b , uint8_t a = 255 )
{
SetColor ( r * ( 1 / 255.f ) , g * ( 1 / 255.f ) , b * ( 1 / 255.f ) , a * ( 1 / 255.f ) ) ;
}
2019-10-04 16:44:16 +00:00
void SetDepthFunc ( int func ) ;
void SetFogLinear ( float * color , float start , float end ) ;
void SetFogExp2 ( float * color , float coefficient ) ;
2019-10-04 17:17:55 +00:00
void SetColorMask ( bool on ) ;
void SetDepthMask ( bool on ) ;
void SetBlendFunc ( int src , int dst ) ;
void SetBlendOp ( int op ) ;
2019-09-16 17:35:04 +00:00
} ;
2019-10-04 16:12:03 +00:00
extern GLInstance GLInterface ;