1 //------------------------------------------------------------------------------
2 // File : SkyTextureState.cpp
3 //------------------------------------------------------------------------------
4 // SkyWorks : Copyright 2002 Mark J. Harris and
5 // The University of North Carolina at Chapel Hill
6 //------------------------------------------------------------------------------
7 // Permission to use, copy, modify, distribute and sell this software and its
8 // documentation for any purpose is hereby granted without fee, provided that
9 // the above copyright notice appear in all copies and that both that copyright
10 // notice and this permission notice appear in supporting documentation.
11 // Binaries may be compiled with this software without any royalties or
14 // The author(s) and The University of North Carolina at Chapel Hill make no
15 // representations about the suitability of this software for any purpose.
16 // It is provided "as is" without express or
19 * @file SkyTextureState.cpp
21 * Implementation of class SkyTextureState, which encapsulates OpenGL texture state.
23 #include "SkyTextureState.hpp"
26 //------------------------------------------------------------------------------
27 // Static initializations.
28 //------------------------------------------------------------------------------
29 unsigned int SkyTextureState::s_iNumTextureUnits = 0;
32 //------------------------------------------------------------------------------
33 // Function : SkyTextureState::SkyTextureState
35 //------------------------------------------------------------------------------
37 * @fn SkyTextureState::SkyTextureState()
40 SkyTextureState::SkyTextureState()
42 if (0 == s_iNumTextureUnits)
44 int iNumTextureUnits = 0;
45 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &iNumTextureUnits);
46 if (iNumTextureUnits > 0)
47 s_iNumTextureUnits = iNumTextureUnits;
49 s_iNumTextureUnits = 1;
52 _pTextureUnitState = new TexState[s_iNumTextureUnits];
56 //------------------------------------------------------------------------------
57 // Function : SkyTextureState::~SkyTextureState
59 //------------------------------------------------------------------------------
61 * @fn SkyTextureState::~SkyTextureState()
64 SkyTextureState::~SkyTextureState()
66 SAFE_DELETE(_pTextureUnitState);
70 //------------------------------------------------------------------------------
71 // Function : SkyTextureState::Activate
73 //------------------------------------------------------------------------------
75 * @fn SkyTextureState::Activate()
76 * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
78 * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
80 SKYRESULT SkyTextureState::Activate()
82 SkyTextureState *pCurrent = GraphicsContext::InstancePtr()->GetCurrentTextureState();
83 assert(NULL != pCurrent);
84 //GLVU::CheckForGLError("SkyTextureState::Activate(8)");
85 for (unsigned int i = 0; i < s_iNumTextureUnits; ++i)
87 if (s_iNumTextureUnits > 1)
88 glActiveTextureARB(GL_TEXTURE0_ARB + i);
89 bool bEnabled = IsTextureEnabled(i);
90 if (pCurrent->IsTextureEnabled(i) != bEnabled)
92 FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
93 //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
95 glEnable(GetActiveTarget(i));
97 glDisable(GetActiveTarget(i));
99 //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
102 GLenum eTarget = GetActiveTarget(i);
103 unsigned int iID = GetTextureID(i);
104 if ((pCurrent->GetActiveTarget(i) != eTarget) ||
105 (pCurrent->GetTextureID(i) != iID))
107 FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
108 glBindTexture(eTarget, iID);
110 //GLVU::CheckForGLError("SkyTextureState::Activate(5)");
111 GLenum paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_S);
112 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_S) != paramValue)
114 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
115 glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
117 //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
118 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
119 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_T) != paramValue)
121 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
122 glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
124 //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
125 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
126 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_R) != paramValue)
128 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
129 //glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
131 //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
132 paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
133 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MIN_FILTER) != paramValue)
135 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
136 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
138 //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
139 paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
140 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MAG_FILTER) != paramValue)
142 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
143 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
145 //GLVU::CheckForGLError("SkyTextureState::Activate()");
147 if (s_iNumTextureUnits > 1)
148 glActiveTextureARB(GL_TEXTURE0_ARB);
154 //------------------------------------------------------------------------------
155 // Function : SkyTextureState::SetTexture
157 //------------------------------------------------------------------------------
159 * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, SkyTexture& texture)
160 * @brief @todo <WRITE BRIEF SkyTextureState::BindTexture DOCUMENTATION>
162 * @todo <WRITE EXTENDED SkyTextureState::BindTexture FUNCTION DOCUMENTATION>
164 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit,
168 if (iTextureUnit >= s_iNumTextureUnits)
170 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
173 _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
174 _pTextureUnitState[iTextureUnit].iBoundTexture = texture.GetID();
180 //------------------------------------------------------------------------------
181 // Function : SkyTextureState::SetTexture
183 //------------------------------------------------------------------------------
185 * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, unsigned int iTextureID)
186 * @brief @todo <WRITE BRIEF SkyTextureState::SetTexture DOCUMENTATION>
188 * @todo <WRITE EXTENDED SkyTextureState::SetTexture FUNCTION DOCUMENTATION>
190 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit,
192 unsigned int iTextureID)
194 if (iTextureUnit >= s_iNumTextureUnits)
196 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
199 _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
200 _pTextureUnitState[iTextureUnit].iBoundTexture = iTextureID;
206 //------------------------------------------------------------------------------
207 // Function : SkyTextureState::EnableTexture
209 //------------------------------------------------------------------------------
211 * @fn SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
212 * @brief @todo <WRITE BRIEF SkyTextureState::EnableTexture DOCUMENTATION>
214 * @todo <WRITE EXTENDED SkyTextureState::EnableTexture FUNCTION DOCUMENTATION>
216 SKYRESULT SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
218 if (iTextureUnit >= s_iNumTextureUnits)
220 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::EnableTexture(): Invalid texture unit.");
223 _pTextureUnitState[iTextureUnit].bEnabled = bEnable;
229 //------------------------------------------------------------------------------
230 // Function : SkyTextureState::SetTextureParameter
232 //------------------------------------------------------------------------------
234 * @fn SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, GLenum eParameter, GLenum eMode)
235 * @brief @todo <WRITE BRIEF SkyTextureState::SetTextureParameter DOCUMENTATION>
237 * @todo <WRITE EXTENDED SkyTextureState::SetTextureParameter FUNCTION DOCUMENTATION>
239 SKYRESULT SkyTextureState::SetTextureParameter(unsigned int iTextureUnit,
243 if (iTextureUnit >= s_iNumTextureUnits)
245 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::SetTextureParameter(): Invalid texture unit.");
250 case GL_TEXTURE_WRAP_S:
251 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_S] = eMode;
253 case GL_TEXTURE_WRAP_T:
254 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_T] = eMode;
256 case GL_TEXTURE_WRAP_R:
257 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_R] = eMode;
259 case GL_TEXTURE_MIN_FILTER:
260 _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MIN] = eMode;
262 case GL_TEXTURE_MAG_FILTER:
263 _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MAG] = eMode;
266 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTExtureState::SetTextureParameter(): Invalid parameter.");