2
* Copyright 2010 Inalogic Inc.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3, as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the applicable version of the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of both the GNU Lesser General Public
15
* License version 3 along with this program. If not, see
16
* <http://www.gnu.org/licenses/>
18
* Authored by: Jay Taoko <jay.taoko_AT_gmail_DOT_com>
23
#ifndef GLRENDERSTATES_H
24
#define GLRENDERSTATES_H
26
#include "NuxCore/NKernel.h"
32
GFXRS_FRONT_POLYGONMODE, // GL_FILL
33
GFXRS_BACK_POLYGONMODE, // GL_FILL
34
GFXRS_CULLFACEENABLE, // GL_FALSE
35
GFXRS_CULLFACE, // GL_BACK
36
GFXRS_FRONTFACE, // GL_CCW
38
GFXRS_SCISSORTESTENABLE, // GL_FALSE
39
GFXRS_FOGENABLE, // GL_FALSE
41
GFXRS_ZTESTENABLE, // GL_TRUE
42
GFXRS_ZWRITEENABLE, // GL_TRUE
43
GFXRS_ZFUNC, // GL_LESS
47
GFXRS_ALPHABLENDENABLE, // GL_FALSE
48
GFXRS_BLENDOP, // GL_FUNC_ADD
49
GFXRS_BLENDOPALPHA, // GL_FUNC_ADD
50
GFXRS_SRCBLEND, // GL_ONE
51
GFXRS_DESTBLEND, // GL_ZERO
52
GFXRS_SRCBLENDALPHA, // GL_ONE
53
GFXRS_DESTBLENDALPHA, // GL_ZERO
55
GFXRS_ALPHATESTENABLE, // GL_FALSE
56
GFXRS_ALPHATESTREF, // 0x0
57
GFXRS_ALPHATESTFUNC, // GL_ALWAYS
59
GFXRS_STENCILENABLE, // GL_FALSE
60
GFXRS_TWOSIDEDSTENCILENABLE, // GL_FALSE
61
GFXRS_FRONT_STENCILWRITEMASK, // 0xFFFFFFFF
62
GFXRS_BACK_STENCILWRITEMASK, // 0xFFFFFFFF
64
GFXRS_FRONT_STENCILFUNC, // GL_ALWAYS
65
GFXRS_FRONT_STENCILREF, // 0x0
66
GFXRS_FRONT_STENCILMASK, // 0xFF
67
GFXRS_FRONT_STENCILFAIL, // GL_KEEP
68
GFXRS_FRONT_STENCILZFAIL, // GL_KEEP
69
GFXRS_FRONT_STENCILZPASS, // GL_KEEP
71
GFXRS_BACK_STENCILFUNC, // GL_ALWAYS
72
GFXRS_BACK_STENCILREF, // 0x0
73
GFXRS_BACK_STENCILMASK, // 0xFF
74
GFXRS_BACK_STENCILFAIL, // GL_KEEP
75
GFXRS_BACK_STENCILZFAIL, // GL_KEEP
76
GFXRS_BACK_STENCILZPASS, // GL_KEEP
79
GFXRS_POINTSMOOTHENABLE, // GL_FLASE
80
GFXRS_LINESMOOTHENABLE, // GL_FALSE
81
GFXRS_POINTSIZE, // 1.0f
82
GFXRS_LINEWIDTH, // 1.0f
83
GFXRS_POINTHINT, // GL_FASTEST
84
GFXRS_LINEHINT, // GL_FASTEST
86
GFXRS_COLORWRITEENABLE_R, // TRUE or FALSE
87
GFXRS_COLORWRITEENABLE_G, // TRUE or FALSE
88
GFXRS_COLORWRITEENABLE_B, // TRUE or FALSE
89
GFXRS_COLORWRITEENABLE_A, // TRUE or FALSE
91
GFXRS_POLYGONOFFSETENABLE, // GL_FALSE
92
GFXRS_POLYGONOFFSETFACTOR, // 0.0f
93
GFXRS_POLYGONOFFSETUNITS, // 0.0f
95
GFXRS_MAX_RENDERSTATES,
108
GFXSS_SRGBWRITEENABLE,
110
GFXSS_MAX_SAMPLERSTATES,
119
} eGraphicsBoardVendor;
121
struct RenderStateMap
132
GLRenderStates(eGraphicsBoardVendor board);
136
void ResetStateChangeToDefault();
137
void CommitStateChangeToDefault();
138
void CheckStateChange();
140
void SubmitChangeStates();
141
//! Check that all render states ar conform to the default
142
void CheckRenderStatesConformity();
145
void SetRenderStates(UINT rs, UINT value);
148
inline void SetAlphaTest(
149
UBOOL EnableAlphaTest_,
150
DWORD AlphaTestFunc_ = GL_ALWAYS,
151
BYTE AlphaTestRef_ = 0);
153
inline void SetBlend(UBOOL AlphaBlendEnable_);
154
inline void SetBlend(UBOOL AlphaBlendEnable_,
155
DWORD SrcBlendFactor_ /*= GL_ONE*/,
156
DWORD DestBlendFactor_ /*= GL_ZERO*/);
158
inline void SetSeparateBlend(UBOOL _bEnable,
159
DWORD SrcBlendFactor_ /*= GL_ONE*/,
160
DWORD DestBlendFactor_ /*= GL_ZERO*/,
161
DWORD SrcFactorAlpha_ /*= GL_ONE*/,
162
DWORD DestFactorAlpha_ /*= GL_ZERO*/);
164
inline void SetBlendOp(
165
DWORD BlendOp = GL_FUNC_ADD);
167
inline void SetSeparateBlendOp(
168
DWORD BlendOpRGB_ = GL_FUNC_ADD,
169
DWORD BlendOpAlpha_ = GL_FUNC_ADD);
171
inline void SetCullMode(UBOOL EnableCullFace,
172
DWORD FrontFace_ = GL_CCW,
173
DWORD Cullface_ = GL_BACK);
175
inline void SetDepthTest(UBOOL EnableDepthTest,
176
UBOOL WriteEnable_ = GL_TRUE,
177
DWORD DepthFunc_ = GL_LEQUAL);
179
inline void SetDepthRange(
183
// If two sided stencil is not activated, the setting is also used for the back face.
184
inline void SetStencilFrontFace(
185
UBOOL EnableStencil_, // GL_TRUE enable stencil test
186
DWORD Func_ = GL_ALWAYS,
187
DWORD FailOp_ = GL_KEEP,
188
DWORD ZFailOp_ = GL_KEEP,
189
DWORD ZPassOp_ = GL_KEEP,
191
DWORD Mask_ = 0xffffffff);
193
// Set stencil test for the back face.
194
inline void SetStencilBackFace(
195
UBOOL EnableTwoSideStencil_, // GL_TRUE enable Two Sided Stencil test
196
DWORD Func_ = GL_ALWAYS,
197
DWORD FailOp_ = GL_KEEP,
198
DWORD ZFailOp_ = GL_KEEP,
199
DWORD ZPassOp_ = GL_KEEP,
201
DWORD Mask_ = 0xffffffff);
203
inline void SetFrontFaceStencilWriteMask(
204
DWORD WriteMask_ = 0xffffffff);
206
inline void SetBackFaceStencilWriteMask(
207
DWORD WriteMask_ = 0xffffffff);
210
inline void EnableLineSmooth(
211
UBOOL EnableLineSmooth = TRUE,
213
UINT HINT = GL_FASTEST);
215
inline void EnablePointSmooth(
216
UBOOL EnablePointSmooth = TRUE,
218
UINT HINT = GL_FASTEST);
220
inline void SetColorMask(
224
UBOOL bAlpha = TRUE);
226
inline void SetDepthMask(UBOOL bDepth = TRUE);
228
inline void EnableScissor(UBOOL bScissor = FALSE);
229
inline void EnableFog(UBOOL bFog = FALSE);
230
inline void SetPolygonMode(UINT FrontMode = GL_FILL, UINT BackMode = GL_FILL);
232
inline void SetPolygonOffset(UBOOL bEnable,
233
FLOAT Factor = 0.0f, FLOAT Units = 0.0f);
237
eGraphicsBoardVendor m_BoardVendor;
239
inline void HW__EnableAlphaTest(UBOOL b);
241
inline void HW__SetAlphaTestFunc(
242
DWORD AlphaTestFunc_,
245
inline void HW__EnableAlphaBlend(UBOOL b);
247
inline void HW__SetSeparateAlphaBlend_Enable(UBOOL b);
249
inline void HW__SetSeparateAlphaBlendFactors(
250
DWORD SrcBlendFactor_,
251
DWORD DestBlendFactor_,
252
DWORD SrcFactorAlpha_,
253
DWORD DestFactorAlpha_);
255
inline void HW__SetAlphaBlendOp(DWORD BlendOpRGB_,
256
DWORD BlendOpAlpha_);
258
inline void HW__EnableCulling(UBOOL b);
260
inline void HW__SetFrontFace(DWORD FrontFace_);
262
inline void HW__SetCullFace(DWORD CullFace_);
264
inline void HW__SetEnableDepthTest(UBOOL b);
265
inline void HW__SetDepthFunc(DWORD Func);
266
inline void HW__SetDepthRange(FLOAT zNear, FLOAT zFar);
269
inline void HW__EnableStencil(UBOOL b);
270
inline void HW__EnableTwoSidedStencil(UBOOL b);
271
inline void HW__SetStencilFrontFaceWriteMask(DWORD WriteMask_);
272
inline void HW__SetStencilBackFaceWriteMask(DWORD WriteMask_);
274
inline void HW__SetFrontFaceStencilFunc(DWORD Func_,
278
inline void HW__SetBackFaceStencilFunc(
283
inline void HW__SetFrontFaceStencilOp(
288
inline void HW__SetBackFaceStencilOp(
293
inline void HW__EnableLineSmooth(UBOOL EnableLineSmooth);
294
inline void HW__SetLineWidth(UINT width, UINT HINT);
296
inline void HW__EnablePointSmooth(UBOOL EnablePointSmooth);
297
inline void HW__SetPointSize(UINT size, UINT HINT);
299
inline void HW__SetColorMask(UBOOL bRed, UBOOL bGreen, UBOOL bBlue, UBOOL bAlpha);
300
inline void HW__SetDepthMask(UBOOL bDepth);
302
inline void HW__EnableScissor(UBOOL bScissor);
303
inline void HW__EnableFog(UBOOL bFog);
305
inline void HW__SetPolygonMode(UINT FrontMode, UINT BackMode);
306
inline void HW__EnablePolygonOffset(UBOOL EnablePolygonOffset);
307
inline void HW__SetPolygonOffset(FLOAT Factor, FLOAT Units);
310
RenderStateMap *m_RenderStateChangeList;
311
RenderStateMap *m_SamplerStateChangeList;
312
RenderStateMap m_RenderStateChanges[GFXRS_MAX_RENDERSTATES];
313
RenderStateMap m_SamplerStateChanges[4][GFXSS_MAX_SAMPLERSTATES];
319
#define SET_RS_VALUE(a, b) (a).iValue = (b)
320
#define RS_VALUE(a) (a).iValue
322
//#define SET_RS_VALUE_FLOAT(a, b) (a).fValue = (b)
323
//#define RS_VALUE_FLOAT(a, b) (a).fValue
326
inline void GLRenderStates::SetAlphaTest(
327
UBOOL EnableAlphaTest_,
328
DWORD AlphaTestFunc_,
333
if(!RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTENABLE]))
335
HW__EnableAlphaTest(TRUE);
338
if((RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTFUNC]) != AlphaTestFunc_) ||
339
(RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTREF]) != AlphaTestRef_))
341
HW__SetAlphaTestFunc(AlphaTestFunc_, AlphaTestRef_);
346
HW__EnableAlphaTest(GL_FALSE);
347
HW__SetAlphaTestFunc(AlphaTestFunc_, AlphaTestRef_);
351
inline void GLRenderStates::SetBlend(UBOOL AlphaBlendEnable_)
353
if(AlphaBlendEnable_)
355
if(!RS_VALUE(m_RenderStateChanges[GFXRS_ALPHABLENDENABLE]))
357
HW__EnableAlphaBlend(TRUE);
362
if(RS_VALUE(m_RenderStateChanges[GFXRS_ALPHABLENDENABLE]))
364
HW__EnableAlphaBlend(GL_FALSE);
369
inline void GLRenderStates::SetBlend(UBOOL AlphaBlendEnable_,
370
DWORD SrcBlendFactor_,
371
DWORD DestBlendFactor_)
373
SetBlend(AlphaBlendEnable_);
374
if((RS_VALUE(m_RenderStateChanges[GFXRS_SRCBLEND])!= SrcBlendFactor_) ||
375
(RS_VALUE(m_RenderStateChanges[GFXRS_DESTBLEND]) != DestBlendFactor_))
377
HW__SetSeparateAlphaBlendFactors(
385
inline void GLRenderStates::SetSeparateBlend(UBOOL EnableSeparateAlphaBlend,
386
DWORD SrcBlendFactor_,
387
DWORD DestBlendFactor_,
388
DWORD SrcBlendFactorAlpha_,
389
DWORD DestBlendFactorAlpha_)
391
SetBlend(EnableSeparateAlphaBlend);
393
// if(EnableSeparateAlphaBlend)
395
// if(!RS_VALUE(m_RenderStateChanges[GFXRS_ALPHABLENDENABLE]))
397
// HW__EnableAlphaBlend(TRUE);
400
if((RS_VALUE(m_RenderStateChanges[GFXRS_SRCBLEND])!= SrcBlendFactor_) ||
401
(RS_VALUE(m_RenderStateChanges[GFXRS_DESTBLEND]) != DestBlendFactor_) ||
402
(RS_VALUE(m_RenderStateChanges[GFXRS_SRCBLENDALPHA]) != SrcBlendFactorAlpha_) ||
403
(RS_VALUE(m_RenderStateChanges[GFXRS_DESTBLENDALPHA]) != DestBlendFactorAlpha_))
405
HW__SetSeparateAlphaBlendFactors(
408
SrcBlendFactorAlpha_,
409
DestBlendFactorAlpha_);
414
// HW__EnableAlphaBlend(GL_FALSE);
415
// HW__SetSeparateAlphaBlendFactors(
418
// SrcBlendFactorAlpha_,
419
// DestBlendFactorAlpha_);
423
inline void GLRenderStates::SetBlendOp(DWORD BlendOp)
425
if((RS_VALUE(m_RenderStateChanges[GFXRS_BLENDOP])!= BlendOp))
427
HW__SetAlphaBlendOp(BlendOp, BlendOp);
431
inline void GLRenderStates::SetSeparateBlendOp(
435
if((RS_VALUE(m_RenderStateChanges[GFXRS_BLENDOP])!= BlendOpRGB_) ||
436
(RS_VALUE(m_RenderStateChanges[GFXRS_BLENDOPALPHA])!= BlendOpAlpha_))
438
HW__SetAlphaBlendOp(BlendOpRGB_, BlendOpAlpha_);
442
inline void GLRenderStates::SetCullMode(UBOOL EnableCullFace,
448
if(!RS_VALUE(m_RenderStateChanges[GFXRS_CULLFACEENABLE]))
450
HW__EnableCulling(TRUE);
453
if(RS_VALUE(m_RenderStateChanges[GFXRS_FRONTFACE])!= FrontFace_)
455
HW__SetFrontFace(FrontFace_);
458
if(RS_VALUE(m_RenderStateChanges[GFXRS_CULLFACE]) != Cullface_)
460
HW__SetCullFace(Cullface_);
465
HW__EnableCulling(FALSE);
466
HW__SetFrontFace(FrontFace_);
467
HW__SetCullFace(Cullface_);
471
inline void GLRenderStates::SetDepthTest(UBOOL EnableDepthTest,
477
if(!RS_VALUE(m_RenderStateChanges[GFXRS_ZTESTENABLE]))
479
HW__SetEnableDepthTest(TRUE);
482
if(RS_VALUE(m_RenderStateChanges[GFXRS_ZWRITEENABLE])!= WriteEnable_)
484
HW__SetDepthMask(WriteEnable_);
487
if(RS_VALUE(m_RenderStateChanges[GFXRS_ZFUNC]) != DepthFunc_)
489
HW__SetDepthFunc(DepthFunc_);
494
HW__SetEnableDepthTest(FALSE);
495
HW__SetDepthMask(WriteEnable_);
496
HW__SetDepthFunc(DepthFunc_);
500
inline void GLRenderStates::SetDepthRange(FLOAT zNear, FLOAT zFar)
502
if((RS_VALUE(m_RenderStateChanges[GFXRS_ZNEAR]) != static_cast<UINT>(zNear)) ||
503
(RS_VALUE(m_RenderStateChanges[GFXRS_ZFAR]) != static_cast<UINT>(zFar)))
505
HW__SetDepthRange(zNear, zFar);
509
inline void GLRenderStates::SetStencilFrontFace(
510
UBOOL EnableStencil_, // GL_TRUE enable stencil test
520
if(!RS_VALUE(m_RenderStateChanges[GFXRS_STENCILENABLE]))
522
HW__EnableStencil(TRUE);
526
(RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILFUNC])!= Func_) ||
527
(RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILREF]) != Ref_) ||
528
(RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILMASK]) != Mask_) ||
529
(RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILFAIL]) != FailOp_) ||
530
(RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILZFAIL]) != ZFailOp_) ||
531
(RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILZPASS]) != ZPassOp_)
534
HW__SetFrontFaceStencilFunc(Func_, Ref_, Mask_);
535
HW__SetFrontFaceStencilOp(FailOp_, ZFailOp_, ZPassOp_);
540
HW__EnableStencil(FALSE);
541
HW__SetFrontFaceStencilFunc(Func_, Ref_, Mask_);
542
HW__SetFrontFaceStencilOp(FailOp_, ZFailOp_, ZPassOp_);
546
inline void GLRenderStates::SetStencilBackFace(
547
UBOOL EnableTwoSideStencil_, // GL_TRUE enable Two Sided Stencil test
555
if(EnableTwoSideStencil_)
557
if(!RS_VALUE(m_RenderStateChanges[GFXRS_STENCILENABLE]))
559
HW__EnableStencil(TRUE);
562
if(!RS_VALUE(m_RenderStateChanges[GFXRS_TWOSIDEDSTENCILENABLE]))
564
HW__EnableTwoSidedStencil(TRUE);
568
(RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILFUNC])!= Func_) ||
569
(RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILREF]) != Ref_) ||
570
(RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILMASK]) != Mask_) ||
571
(RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILFAIL]) != FailOp_) ||
572
(RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILZFAIL]) != ZFailOp_) ||
573
(RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILZPASS]) != ZPassOp_)
576
HW__SetBackFaceStencilFunc(Func_, Ref_, Mask_);
577
HW__SetBackFaceStencilOp(FailOp_, ZFailOp_, ZPassOp_);
582
HW__EnableTwoSidedStencil(FALSE);
583
HW__SetBackFaceStencilFunc(Func_, Ref_, Mask_);
584
HW__SetBackFaceStencilOp(FailOp_, ZFailOp_, ZPassOp_);
588
inline void GLRenderStates::SetFrontFaceStencilWriteMask(
591
HW__SetStencilFrontFaceWriteMask(WriteMask_);
594
inline void GLRenderStates::SetBackFaceStencilWriteMask(
597
HW__SetStencilBackFaceWriteMask(WriteMask_);
600
inline void GLRenderStates::EnableLineSmooth(
601
UBOOL EnableLineSmooth,
607
if(!RS_VALUE(m_RenderStateChanges[GFXRS_LINESMOOTHENABLE]))
609
HW__EnableLineSmooth(GL_TRUE);
612
if((RS_VALUE(m_RenderStateChanges[GFXRS_LINEWIDTH]) != LineWidth) ||
613
(RS_VALUE(m_RenderStateChanges[GFXRS_LINEHINT]) != Hint))
615
HW__SetLineWidth(LineWidth, Hint);
620
HW__EnableLineSmooth(GL_FALSE);
621
HW__SetLineWidth(LineWidth, Hint);
625
inline void GLRenderStates::EnablePointSmooth(
626
UBOOL EnablePointSmooth,
630
if(EnablePointSmooth)
632
if(!RS_VALUE(m_RenderStateChanges[GFXRS_POINTSMOOTHENABLE]))
634
HW__EnablePointSmooth(GL_TRUE);
637
if((RS_VALUE(m_RenderStateChanges[GFXRS_POINTSIZE]) != PointSize) ||
638
(RS_VALUE(m_RenderStateChanges[GFXRS_POINTHINT]) != Hint))
640
HW__SetLineWidth(PointSize, Hint);
645
HW__EnablePointSmooth(GL_FALSE);
646
HW__SetLineWidth(PointSize, Hint);
650
inline void GLRenderStates::SetColorMask(
656
if((RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_R]) != bRed) ||
657
(RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_G]) != bGreen) ||
658
(RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_B]) != bBlue) ||
659
(RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_A]) != bAlpha))
661
HW__SetColorMask(bRed, bGreen, bBlue, bAlpha);
666
inline void GLRenderStates::SetDepthMask(UBOOL bDepth)
668
if((RS_VALUE(m_RenderStateChanges[GFXRS_ZWRITEENABLE]) != bDepth))
670
HW__SetDepthMask(bDepth);
674
inline void GLRenderStates::EnableScissor(UBOOL bScissor)
676
if((RS_VALUE(m_RenderStateChanges[GFXRS_SCISSORTESTENABLE]) != bScissor))
678
HW__EnableScissor(bScissor);
682
inline void GLRenderStates::EnableFog(UBOOL bFog)
684
if((RS_VALUE(m_RenderStateChanges[GFXRS_FOGENABLE]) != bFog))
690
inline void GLRenderStates::SetPolygonMode(UINT FrontMode, UINT BackMode)
692
if((RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_POLYGONMODE]) != FrontMode) ||
693
(RS_VALUE(m_RenderStateChanges[GFXRS_BACK_POLYGONMODE]) != BackMode))
695
HW__SetPolygonMode(FrontMode, BackMode);
699
inline void GLRenderStates::SetPolygonOffset(UBOOL bEnable,
700
FLOAT Factor, FLOAT Units)
704
if(!RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETENABLE]))
706
HW__EnablePolygonOffset(GL_TRUE);
709
if((RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETFACTOR]) != static_cast<UINT>(Factor)) ||
710
(RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETUNITS]) != static_cast<UINT>(Units)))
712
HW__SetPolygonOffset(Factor, Units);
717
HW__EnablePolygonOffset(GL_FALSE);
722
//////////////////////////////////////
723
inline void GLRenderStates::HW__EnableAlphaTest(UBOOL b)
727
CHECKGL(glEnable(GL_ALPHA_TEST));
731
CHECKGL(glDisable(GL_ALPHA_TEST));
733
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTENABLE], b ? GL_TRUE : GL_FALSE);
736
inline void GLRenderStates::HW__SetAlphaTestFunc(DWORD AlphaTestFunc_,
740
(AlphaTestFunc_ == GL_NEVER) ||
741
(AlphaTestFunc_ == GL_LESS) ||
742
(AlphaTestFunc_ == GL_EQUAL) ||
743
(AlphaTestFunc_ == GL_LEQUAL) ||
744
(AlphaTestFunc_ == GL_GREATER) ||
745
(AlphaTestFunc_ == GL_NOTEQUAL) ||
746
(AlphaTestFunc_ == GL_GEQUAL) ||
747
(AlphaTestFunc_ == GL_ALWAYS),
748
TEXT("Error(HW__SetAlphaTestFunc): Invalid Alpha Test Function RenderState"));
750
CHECKGL(glAlphaFunc(AlphaTestFunc_, (FLOAT)AlphaTestRef_ * (1.0f / 255.0f)));
751
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTFUNC], AlphaTestFunc_);
752
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTREF], AlphaTestRef_);
755
inline void GLRenderStates::HW__EnableAlphaBlend(UBOOL b)
759
CHECKGL(glEnable(GL_BLEND));
763
CHECKGL(glDisable(GL_BLEND));
765
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ALPHABLENDENABLE], b ? GL_TRUE : GL_FALSE);
768
inline void GLRenderStates::HW__SetSeparateAlphaBlendFactors(
769
DWORD SrcBlendFactor_,
770
DWORD DestBlendFactor_,
771
DWORD SrcFactorAlpha_,
772
DWORD DestFactorAlpha_)
774
nuxAssertMsg((SrcBlendFactor_ == GL_ZERO) || (SrcBlendFactor_ == GL_ONE) || (SrcBlendFactor_ == GL_SRC_COLOR) || (SrcBlendFactor_ == GL_ONE_MINUS_SRC_COLOR) ||(SrcBlendFactor_ == GL_DST_COLOR) ||(SrcBlendFactor_ == GL_ONE_MINUS_DST_COLOR) || (SrcBlendFactor_ == GL_SRC_ALPHA) ||(SrcBlendFactor_ == GL_ONE_MINUS_SRC_ALPHA) ||(SrcBlendFactor_ == GL_DST_ALPHA) ||(SrcBlendFactor_ == GL_ONE_MINUS_DST_ALPHA) ||(SrcBlendFactor_ == GL_CONSTANT_COLOR) ||(SrcBlendFactor_ == GL_ONE_MINUS_CONSTANT_COLOR) ||(SrcBlendFactor_ == GL_CONSTANT_ALPHA) ||(SrcBlendFactor_ == GL_ONE_MINUS_CONSTANT_ALPHA) ||(SrcBlendFactor_ == GL_SRC_ALPHA_SATURATE),
775
TEXT("Error(HW__SetSeparateAlphaBlendFactors): Invalid Blend RenderState"));
776
nuxAssertMsg((DestBlendFactor_ == GL_ZERO) || (DestBlendFactor_ == GL_ONE) || (DestBlendFactor_ == GL_SRC_COLOR) || (DestBlendFactor_ == GL_ONE_MINUS_SRC_COLOR) ||(DestBlendFactor_ == GL_DST_COLOR) ||(DestBlendFactor_ == GL_ONE_MINUS_DST_COLOR) || (DestBlendFactor_ == GL_SRC_ALPHA) ||(DestBlendFactor_ == GL_ONE_MINUS_SRC_ALPHA) ||(DestBlendFactor_ == GL_DST_ALPHA) ||(DestBlendFactor_ == GL_ONE_MINUS_DST_ALPHA) ||(DestBlendFactor_ == GL_CONSTANT_COLOR) ||(DestBlendFactor_ == GL_ONE_MINUS_CONSTANT_COLOR) ||(DestBlendFactor_ == GL_CONSTANT_ALPHA) ||(DestBlendFactor_ == GL_ONE_MINUS_CONSTANT_ALPHA),
777
TEXT("Error(HW__SetSeparateAlphaBlendFactors): Invalid Blend RenderState"));
778
nuxAssertMsg((SrcFactorAlpha_ == GL_ZERO) || (SrcFactorAlpha_ == GL_ONE) || (SrcFactorAlpha_ == GL_SRC_COLOR) || (SrcFactorAlpha_ == GL_ONE_MINUS_SRC_COLOR) ||(SrcFactorAlpha_ == GL_DST_COLOR) ||(SrcFactorAlpha_ == GL_ONE_MINUS_DST_COLOR) || (SrcFactorAlpha_ == GL_SRC_ALPHA) ||(SrcFactorAlpha_ == GL_ONE_MINUS_SRC_ALPHA) ||(SrcFactorAlpha_ == GL_DST_ALPHA) ||(SrcFactorAlpha_ == GL_ONE_MINUS_DST_ALPHA) ||(SrcFactorAlpha_ == GL_CONSTANT_COLOR) ||(SrcFactorAlpha_ == GL_ONE_MINUS_CONSTANT_COLOR) ||(SrcFactorAlpha_ == GL_CONSTANT_ALPHA) ||(SrcFactorAlpha_ == GL_ONE_MINUS_CONSTANT_ALPHA) ||(SrcFactorAlpha_ == GL_SRC_ALPHA_SATURATE),
779
TEXT("Error(HW__SetSeparateAlphaBlendFactors): Invalid Blend RenderState"));
780
nuxAssertMsg((DestFactorAlpha_ == GL_ZERO) || (DestFactorAlpha_ == GL_ONE) || (DestFactorAlpha_ == GL_SRC_COLOR) || (DestFactorAlpha_ == GL_ONE_MINUS_SRC_COLOR) ||(DestFactorAlpha_ == GL_DST_COLOR) ||(DestFactorAlpha_ == GL_ONE_MINUS_DST_COLOR) || (DestFactorAlpha_ == GL_SRC_ALPHA) ||(DestFactorAlpha_ == GL_ONE_MINUS_SRC_ALPHA) ||(DestFactorAlpha_ == GL_DST_ALPHA) ||(DestFactorAlpha_ == GL_ONE_MINUS_DST_ALPHA) ||(DestFactorAlpha_ == GL_CONSTANT_COLOR) ||(DestFactorAlpha_ == GL_ONE_MINUS_CONSTANT_COLOR) ||(DestFactorAlpha_ == GL_CONSTANT_ALPHA) ||(DestFactorAlpha_ == GL_ONE_MINUS_CONSTANT_ALPHA),
781
TEXT("Error(HW__SetSeparateAlphaBlendFactors): Invalid Blend RenderState"));
783
CHECKGL(glBlendFuncSeparate(
789
SET_RS_VALUE(m_RenderStateChanges[GFXRS_SRCBLEND], SrcBlendFactor_);
790
SET_RS_VALUE(m_RenderStateChanges[GFXRS_DESTBLEND], DestBlendFactor_);
791
SET_RS_VALUE(m_RenderStateChanges[GFXRS_SRCBLENDALPHA], SrcFactorAlpha_);
792
SET_RS_VALUE(m_RenderStateChanges[GFXRS_DESTBLENDALPHA], DestFactorAlpha_);
795
inline void GLRenderStates::HW__SetAlphaBlendOp(
800
(BlendOpRGB_ == GL_FUNC_ADD) ||
801
(BlendOpRGB_ == GL_FUNC_SUBTRACT) ||
802
(BlendOpRGB_ == GL_FUNC_REVERSE_SUBTRACT) ||
803
(BlendOpRGB_ == GL_MIN) ||
804
(BlendOpRGB_ == GL_MAX),
805
TEXT("Error(HW__SetAlphaBlendOp): Invalid Blend Equation RenderState"));
807
(BlendOpAlpha_ == GL_FUNC_ADD) ||
808
(BlendOpAlpha_ == GL_FUNC_SUBTRACT) ||
809
(BlendOpAlpha_ == GL_FUNC_REVERSE_SUBTRACT) ||
810
(BlendOpAlpha_ == GL_MIN) ||
811
(BlendOpAlpha_ == GL_MAX),
812
TEXT("Error(HW__SetAlphaBlendOp): Invalid Blend Equation RenderState"));
814
CHECKGL(glBlendEquationSeparateEXT(BlendOpRGB_, BlendOpAlpha_));
816
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BLENDOP], BlendOpRGB_);
817
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BLENDOPALPHA], BlendOpAlpha_);
820
inline void GLRenderStates::HW__EnableCulling(UBOOL b)
824
CHECKGL(glEnable(GL_CULL_FACE));
828
CHECKGL(glDisable(GL_CULL_FACE));
830
SET_RS_VALUE(m_RenderStateChanges[GFXRS_CULLFACEENABLE], b ? GL_TRUE : GL_FALSE);
834
inline void GLRenderStates::HW__SetFrontFace(DWORD FrontFace_)
837
(FrontFace_ == GL_CW) ||
838
(FrontFace_ == GL_CCW),
839
TEXT("Error(HW__SetFrontFace): Invalid Front Face RenderState"));
841
CHECKGL(glFrontFace(FrontFace_));
842
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONTFACE], FrontFace_);
845
inline void GLRenderStates::HW__SetCullFace(DWORD CullFace_)
848
(CullFace_ == GL_FRONT) ||
849
(CullFace_ == GL_BACK) ||
850
(CullFace_ == GL_FRONT_AND_BACK),
851
TEXT("Error(HW__SetCullFace): Invalid Cull Face RenderState"));
853
CHECKGL(glCullFace(CullFace_));
854
SET_RS_VALUE(m_RenderStateChanges[GFXRS_CULLFACE], CullFace_);
857
inline void GLRenderStates::HW__SetEnableDepthTest(UBOOL b)
861
CHECKGL(glEnable(GL_DEPTH_TEST));
865
CHECKGL(glDisable(GL_DEPTH_TEST));
867
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ZTESTENABLE], b ? GL_TRUE : GL_FALSE);
870
inline void GLRenderStates::HW__SetDepthRange(FLOAT zNear, FLOAT zFar)
872
CHECKGL(glDepthRange(zNear, zFar));
873
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ZNEAR], static_cast<UINT>(Clamp(zNear, 0.0f, 1.0f)));
874
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ZFAR], static_cast<UINT>(Clamp(zFar, 0.0f, 1.0f)));
877
inline void GLRenderStates::HW__SetDepthFunc(DWORD Func)
880
(Func == GL_NEVER) ||
882
(Func == GL_EQUAL) ||
883
(Func == GL_LEQUAL) ||
884
(Func == GL_GREATER) ||
885
(Func == GL_NOTEQUAL) ||
886
(Func == GL_GEQUAL) ||
888
TEXT("Error(HW__SetDepthFunc): Invalid Depth Func RenderState"));
890
CHECKGL(glDepthFunc(Func));
891
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ZFUNC], Func);
894
inline void GLRenderStates::HW__EnableStencil(UBOOL b)
898
CHECKGL(glEnable(GL_STENCIL_TEST));
902
CHECKGL(glDisable(GL_STENCIL_TEST));
905
SET_RS_VALUE(m_RenderStateChanges[GFXRS_STENCILENABLE], b ? GL_TRUE : GL_FALSE);
908
inline void GLRenderStates::HW__EnableTwoSidedStencil(UBOOL b)
912
if(m_BoardVendor == BOARD_ATI)
914
CHECKGL(glEnable(GL_STENCIL_TEST));
918
CHECKGL(glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT));
923
if(m_BoardVendor == BOARD_ATI)
925
CHECKGL(glDisable(GL_STENCIL_TEST));
929
CHECKGL(glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT));
933
SET_RS_VALUE(m_RenderStateChanges[GFXRS_TWOSIDEDSTENCILENABLE], b ? GL_TRUE : GL_FALSE);
936
inline void GLRenderStates::HW__SetStencilFrontFaceWriteMask(DWORD WriteMask_)
938
CHECKGL(glActiveStencilFaceEXT(GL_FRONT));
939
CHECKGL(glStencilMask(WriteMask_));
940
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILWRITEMASK], WriteMask_);
943
inline void GLRenderStates::HW__SetStencilBackFaceWriteMask(DWORD WriteMask_)
945
CHECKGL(glActiveStencilFaceEXT(GL_BACK));
946
CHECKGL(glStencilMask(WriteMask_));
947
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILWRITEMASK], WriteMask_);
951
inline void GLRenderStates::HW__SetFrontFaceStencilFunc(DWORD Func_,
956
(Func_ == GL_NEVER) ||
957
(Func_ == GL_LESS) ||
958
(Func_ == GL_EQUAL) ||
959
(Func_ == GL_LEQUAL) ||
960
(Func_ == GL_GREATER) ||
961
(Func_ == GL_NOTEQUAL) ||
962
(Func_ == GL_GEQUAL) ||
963
(Func_ == GL_ALWAYS),
964
TEXT("Error(HW__SetFrontFaceStencilFunc): Invalid Stencil Function RenderState"));
966
CHECKGL(glActiveStencilFaceEXT(GL_FRONT));
967
CHECKGL(glStencilFunc(Func_, Ref_, Mask_));
969
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILFUNC], Func_);
970
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILREF], Ref_);
971
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILMASK], Mask_);
974
inline void GLRenderStates::HW__SetBackFaceStencilFunc(
980
(Func_ == GL_NEVER) ||
981
(Func_ == GL_LESS) ||
982
(Func_ == GL_EQUAL) ||
983
(Func_ == GL_LEQUAL) ||
984
(Func_ == GL_GREATER) ||
985
(Func_ == GL_NOTEQUAL) ||
986
(Func_ == GL_GEQUAL) ||
987
(Func_ == GL_ALWAYS),
988
TEXT("Error(HW__SetBackFaceStencilFunc): Invalid Stencil Function RenderState"));
990
if(m_BoardVendor == BOARD_ATI)
992
CHECKGL(glStencilFuncSeparateATI(Func_/*Front function*/, Func_/*Back function*/, Ref_, Mask_)); // incorrect
996
CHECKGL(glActiveStencilFaceEXT(GL_BACK));
997
CHECKGL(glStencilFunc(Func_, Ref_, Mask_));
1000
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILFUNC], Func_);
1001
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILREF], Ref_);
1002
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILMASK], Mask_);
1005
inline void GLRenderStates::HW__SetFrontFaceStencilOp(
1011
(FailOp_ == GL_KEEP) ||
1012
(FailOp_ == GL_ZERO) ||
1013
(FailOp_ == GL_REPLACE) ||
1014
(FailOp_ == GL_INCR) ||
1015
(FailOp_ == GL_INCR_WRAP) ||
1016
(FailOp_ == GL_DECR) ||
1017
(FailOp_ == GL_DECR_WRAP) ||
1018
(FailOp_ == GL_INVERT),
1019
TEXT("Error(HW__SetFrontFaceStencilOp): Invalid FailOp RenderState"));
1022
(ZFailOp_ == GL_KEEP) ||
1023
(ZFailOp_ == GL_ZERO) ||
1024
(ZFailOp_ == GL_REPLACE) ||
1025
(ZFailOp_ == GL_INCR) ||
1026
(ZFailOp_ == GL_INCR_WRAP) ||
1027
(ZFailOp_ == GL_DECR) ||
1028
(ZFailOp_ == GL_DECR_WRAP) ||
1029
(ZFailOp_ == GL_INVERT),
1030
TEXT("Error(HW__SetFrontFaceStencilOp): Invalid ZFailOp RenderState"));
1033
(ZPassOp_ == GL_KEEP) ||
1034
(ZPassOp_ == GL_ZERO) ||
1035
(ZPassOp_ == GL_REPLACE) ||
1036
(ZPassOp_ == GL_INCR) ||
1037
(ZPassOp_ == GL_INCR_WRAP) ||
1038
(ZPassOp_ == GL_DECR) ||
1039
(ZPassOp_ == GL_DECR_WRAP) ||
1040
(ZPassOp_ == GL_INVERT),
1041
TEXT("Error(HW__SetFrontFaceStencilOp): Invalid ZPassOp RenderState"));
1043
if(m_BoardVendor == BOARD_ATI)
1045
CHECKGL(glStencilOpSeparateATI(GL_FRONT, FailOp_, ZFailOp_, ZPassOp_));
1049
CHECKGL(glActiveStencilFaceEXT(GL_FRONT));
1050
CHECKGL(glStencilOp(FailOp_, ZFailOp_, ZPassOp_));
1053
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILFAIL], FailOp_);
1054
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILZFAIL], ZFailOp_);
1055
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILZPASS], ZPassOp_);
1058
inline void GLRenderStates::HW__SetBackFaceStencilOp(
1064
(FailOp_ == GL_KEEP) ||
1065
(FailOp_ == GL_ZERO) ||
1066
(FailOp_ == GL_REPLACE) ||
1067
(FailOp_ == GL_INCR) ||
1068
(FailOp_ == GL_INCR_WRAP) ||
1069
(FailOp_ == GL_DECR) ||
1070
(FailOp_ == GL_DECR_WRAP) ||
1071
(FailOp_ == GL_INVERT),
1072
TEXT("Error(HW__SetBackFaceStencilOp): Invalid FailOp RenderState"));
1075
(ZFailOp_ == GL_KEEP) ||
1076
(ZFailOp_ == GL_ZERO) ||
1077
(ZFailOp_ == GL_REPLACE) ||
1078
(ZFailOp_ == GL_INCR) ||
1079
(ZFailOp_ == GL_INCR_WRAP) ||
1080
(ZFailOp_ == GL_DECR) ||
1081
(ZFailOp_ == GL_DECR_WRAP) ||
1082
(ZFailOp_ == GL_INVERT),
1083
TEXT("Error(HW__SetBackFaceStencilOp): Invalid ZFailOp RenderState"));
1086
(ZPassOp_ == GL_KEEP) ||
1087
(ZPassOp_ == GL_ZERO) ||
1088
(ZPassOp_ == GL_REPLACE) ||
1089
(ZPassOp_ == GL_INCR) ||
1090
(ZPassOp_ == GL_INCR_WRAP) ||
1091
(ZPassOp_ == GL_DECR) ||
1092
(ZPassOp_ == GL_DECR_WRAP) ||
1093
(ZPassOp_ == GL_INVERT),
1094
TEXT("Error(HW__SetBackFaceStencilOp): Invalid ZPassOp RenderState"));
1096
if(m_BoardVendor == BOARD_ATI)
1098
CHECKGL(glStencilOpSeparateATI(GL_BACK, FailOp_, ZFailOp_, ZPassOp_));
1102
CHECKGL(glActiveStencilFaceEXT(GL_BACK));
1103
CHECKGL(glStencilOp(FailOp_, ZFailOp_, ZPassOp_));
1106
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILFAIL], FailOp_);
1107
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILZFAIL], ZFailOp_);
1108
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILZPASS], ZPassOp_);
1111
inline void GLRenderStates::HW__EnableLineSmooth(UBOOL EnableLineSmooth)
1113
if(EnableLineSmooth)
1115
CHECKGL(glEnable(GL_LINE_SMOOTH));
1119
CHECKGL(glDisable(GL_LINE_SMOOTH));
1121
SET_RS_VALUE(m_RenderStateChanges[GFXRS_LINESMOOTHENABLE], EnableLineSmooth ? GL_TRUE : GL_FALSE);
1124
inline void GLRenderStates::HW__SetLineWidth(UINT width, UINT Hint)
1127
(Hint == GL_NICEST) ||
1128
(Hint == GL_FASTEST) ||
1129
(Hint == GL_DONT_CARE),
1130
TEXT("Error(HW__SetLineWidth): Invalid Line Hint RenderState"));
1132
CHECKGL(glLineWidth(width));
1133
CHECKGL(glHint(GL_LINE_SMOOTH_HINT, Hint));
1134
SET_RS_VALUE(m_RenderStateChanges[GFXRS_LINEWIDTH], width);
1135
SET_RS_VALUE(m_RenderStateChanges[GFXRS_LINEHINT], Hint);
1138
inline void GLRenderStates::HW__EnablePointSmooth(UBOOL EnablePointSmooth)
1140
if(EnablePointSmooth)
1142
CHECKGL(glEnable(GL_POINT_SMOOTH));
1146
CHECKGL(glDisable(GL_POINT_SMOOTH));
1148
SET_RS_VALUE(m_RenderStateChanges[GFXRS_POINTSMOOTHENABLE], EnablePointSmooth ? GL_TRUE : GL_FALSE);
1151
inline void GLRenderStates::HW__SetPointSize(UINT size, UINT Hint)
1154
(Hint == GL_NICEST) ||
1155
(Hint == GL_FASTEST) ||
1156
(Hint == GL_DONT_CARE),
1157
TEXT("Error(HW__SetPointSize): Invalid Point Hint RenderState"));
1159
CHECKGL(glPointSize(size));
1160
CHECKGL(glHint(GL_POINT_SMOOTH_HINT, Hint);)
1161
SET_RS_VALUE(m_RenderStateChanges[GFXRS_POINTSIZE], size);
1162
SET_RS_VALUE(m_RenderStateChanges[GFXRS_POINTHINT], Hint);
1165
inline void GLRenderStates::HW__SetColorMask(
1171
CHECKGL(glColorMask(bRed, bGreen, bBlue, bAlpha));
1172
SET_RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_R], bRed);
1173
SET_RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_G], bGreen);
1174
SET_RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_B], bBlue);
1175
SET_RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_A], bAlpha);
1178
inline void GLRenderStates::HW__SetDepthMask(UBOOL bDepth)
1180
CHECKGL(glDepthMask(bDepth));
1181
SET_RS_VALUE(m_RenderStateChanges[GFXRS_ZWRITEENABLE], bDepth);
1184
inline void GLRenderStates::HW__EnableScissor(UBOOL bScissor)
1188
CHECKGL(glEnable(GL_SCISSOR_TEST));
1192
CHECKGL(glDisable(GL_SCISSOR_TEST));
1195
SET_RS_VALUE(m_RenderStateChanges[GFXRS_SCISSORTESTENABLE], bScissor ? GL_TRUE : GL_FALSE);
1198
inline void GLRenderStates::HW__EnableFog(UBOOL bFog)
1202
CHECKGL(glEnable(GL_FOG));
1206
CHECKGL(glDisable(GL_FOG));
1209
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FOGENABLE], bFog ? GL_TRUE : GL_FALSE);
1212
inline void GLRenderStates::HW__SetPolygonMode(UINT FrontMode, UINT BackMode)
1215
(FrontMode == GL_FILL) ||
1216
(FrontMode == GL_LINE) ||
1217
(FrontMode == GL_POINT),
1218
TEXT("Error(HW__SetPolygonMode): Invalid Point Hint RenderState"));
1221
(BackMode == GL_FILL) ||
1222
(BackMode == GL_LINE) ||
1223
(BackMode == GL_POINT),
1224
TEXT("Error(HW__SetPolygonMode): Invalid Point Hint RenderState"));
1226
CHECKGL(glPolygonMode(GL_FRONT, FrontMode));
1227
CHECKGL(glPolygonMode(GL_BACK, BackMode));
1229
SET_RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_POLYGONMODE], FrontMode);
1230
SET_RS_VALUE(m_RenderStateChanges[GFXRS_BACK_POLYGONMODE], BackMode);
1233
inline void GLRenderStates::HW__EnablePolygonOffset(UBOOL EnablePolygonOffset)
1235
if(EnablePolygonOffset)
1237
CHECKGL(glEnable(GL_POLYGON_OFFSET_FILL));
1241
CHECKGL(glDisable(GL_POLYGON_OFFSET_FILL));
1244
SET_RS_VALUE(m_RenderStateChanges[GL_POLYGON_OFFSET_FILL], EnablePolygonOffset ? GL_TRUE : GL_FALSE);
1247
inline void GLRenderStates::HW__SetPolygonOffset(FLOAT Factor, FLOAT Units)
1249
CHECKGL(glPolygonOffset(Factor, Units));
1251
SET_RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETFACTOR], static_cast<UINT>(Factor));
1252
SET_RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETUNITS], static_cast<UINT>(Units));
1258
//#undef SET_RS_VALUE_FLOAT
1259
//#undef RS_VALUE_FLOAT
1263
#endif // GLRENDERSTATES_H