2 //------------------------------------------------------------------------------
3 // File : SkyTextureState.cpp
4 //------------------------------------------------------------------------------
5 // SkyWorks : Copyright 2002 Mark J. Harris and
6 // The University of North Carolina at Chapel Hill
7 //------------------------------------------------------------------------------
8 // Permission to use, copy, modify, distribute and sell this software and its
9 // documentation for any purpose is hereby granted without fee, provided that
10 // the above copyright notice appear in all copies and that both that copyright
11 // notice and this permission notice appear in supporting documentation.
12 // Binaries may be compiled with this software without any royalties or
15 // The author(s) and The University of North Carolina at Chapel Hill make no
16 // representations about the suitability of this software for any purpose.
17 // It is provided "as is" without express or
20 * @file SkyTextureState.cpp
22 * Implementation of class SkyTextureState, which encapsulates OpenGL texture state.
24 #include "SkyTextureState.hpp"
29 //------------------------------------------------------------------------------
30 // Static initializations.
31 //------------------------------------------------------------------------------
32 unsigned int SkyTextureState::s_iNumTextureUnits = 0;
35 //------------------------------------------------------------------------------
36 // Function : SkyTextureState::SkyTextureState
38 //------------------------------------------------------------------------------
40 * @fn SkyTextureState::SkyTextureState()
43 SkyTextureState::SkyTextureState()
45 if (0 == s_iNumTextureUnits)
47 int iNumTextureUnits = 0;
48 #ifdef GL_ARB_multitexture
49 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &iNumTextureUnits);
50 if (iNumTextureUnits > 0)
51 s_iNumTextureUnits = iNumTextureUnits;
53 s_iNumTextureUnits = 1;
57 _pTextureUnitState = new TexState[s_iNumTextureUnits];
61 //------------------------------------------------------------------------------
62 // Function : SkyTextureState::~SkyTextureState
64 //------------------------------------------------------------------------------
66 * @fn SkyTextureState::~SkyTextureState()
69 SkyTextureState::~SkyTextureState()
71 SAFE_DELETE(_pTextureUnitState);
75 //------------------------------------------------------------------------------
76 // Function : SkyTextureState::Activate
78 //------------------------------------------------------------------------------
80 * @fn SkyTextureState::Activate()
81 * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
83 * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
85 SKYRESULT SkyTextureState::Activate()
87 SkyTextureState *pCurrent = GraphicsContext::InstancePtr()->GetCurrentTextureState();
88 assert(NULL != pCurrent);
89 //GLVU::CheckForGLError("SkyTextureState::Activate(8)");
90 for (unsigned int i = 0; i < s_iNumTextureUnits; ++i)
92 #ifdef GL_ARB_multitexture
93 if (s_iNumTextureUnits > 1)
94 glActiveTextureARB(GL_TEXTURE0_ARB + i);
96 bool bEnabled = IsTextureEnabled(i);
97 if (pCurrent->IsTextureEnabled(i) != bEnabled)
99 FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
100 //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
102 glEnable(GetActiveTarget(i));
104 glDisable(GetActiveTarget(i));
106 //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
109 GLenum eTarget = GetActiveTarget(i);
110 unsigned int iID = GetTextureID(i);
111 // if ((pCurrent->GetActiveTarget(i) != eTarget) ||
112 // (pCurrent->GetTextureID(i) != iID))
114 FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
115 glBindTexture(eTarget, iID);
117 //GLVU::CheckForGLError("SkyTextureState::Activate(5)");
118 GLenum paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_S);
119 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_S) != paramValue)
121 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
122 glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
124 //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
125 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
126 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_T) != paramValue)
128 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
129 glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
131 //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
132 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
133 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_R) != paramValue)
135 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
136 glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
138 //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
139 paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
140 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MIN_FILTER) != paramValue)
142 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
143 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
145 //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
146 paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
147 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MAG_FILTER) != paramValue)
149 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
150 glTexParameteri(eTarget, GL_TEXTURE_MAG_FILTER, paramValue);
152 //GLVU::CheckForGLError("SkyTextureState::Activate()");
154 #ifdef GL_ARB_multitexture
155 if (s_iNumTextureUnits > 1)
156 glActiveTextureARB(GL_TEXTURE0_ARB);
163 //------------------------------------------------------------------------------
164 // Function : SkyTextureState::Force
166 //------------------------------------------------------------------------------
168 * @fn SkyTextureState::Force()
169 * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
171 * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
173 SKYRESULT SkyTextureState::Force()
175 SkyTextureState *pCurrent = GraphicsContext::InstancePtr()->GetCurrentTextureState();
176 assert(NULL != pCurrent);
177 //GLVU::CheckForGLError("SkyTextureState::Activate(8)");
178 for (unsigned int i = 0; i < s_iNumTextureUnits; ++i)
180 #ifdef GL_ARB_multitexture
181 if (s_iNumTextureUnits > 1)
182 glActiveTextureARB(GL_TEXTURE0_ARB + i);
184 bool bEnabled = IsTextureEnabled(i);
185 FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
186 //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
188 glEnable(GetActiveTarget(i));
190 glDisable(GetActiveTarget(i));
192 //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
193 GLenum eTarget = GetActiveTarget(i);
194 unsigned int iID = GetTextureID(i);
196 FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
197 glBindTexture(eTarget, iID);
199 //GLVU::CheckForGLError("SkyTextureState::Activate(5)");
200 GLenum paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_S);
201 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
202 glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
204 //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
205 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
206 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
207 glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
209 //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
210 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
211 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
212 glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
214 //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
215 paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
216 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
217 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
219 //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
220 paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
221 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
222 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
224 #ifdef GL_ARB_multitexture
225 if (s_iNumTextureUnits > 1)
226 glActiveTextureARB(GL_TEXTURE0_ARB);
233 //------------------------------------------------------------------------------
234 // Function : SkyTextureState::SetTexture
236 //------------------------------------------------------------------------------
238 * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, SkyTexture& texture)
239 * @brief @todo <WRITE BRIEF SkyTextureState::BindTexture DOCUMENTATION>
241 * @todo <WRITE EXTENDED SkyTextureState::BindTexture FUNCTION DOCUMENTATION>
243 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit,
247 if (iTextureUnit >= s_iNumTextureUnits)
249 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
252 _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
253 _pTextureUnitState[iTextureUnit].iBoundTexture = texture.GetID();
259 //------------------------------------------------------------------------------
260 // Function : SkyTextureState::SetTexture
262 //------------------------------------------------------------------------------
264 * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, unsigned int iTextureID)
265 * @brief @todo <WRITE BRIEF SkyTextureState::SetTexture DOCUMENTATION>
267 * @todo <WRITE EXTENDED SkyTextureState::SetTexture FUNCTION DOCUMENTATION>
269 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit,
271 unsigned int iTextureID)
273 if (iTextureUnit >= s_iNumTextureUnits)
275 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
278 _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
279 _pTextureUnitState[iTextureUnit].iBoundTexture = iTextureID;
285 //------------------------------------------------------------------------------
286 // Function : SkyTextureState::EnableTexture
288 //------------------------------------------------------------------------------
290 * @fn SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
291 * @brief @todo <WRITE BRIEF SkyTextureState::EnableTexture DOCUMENTATION>
293 * @todo <WRITE EXTENDED SkyTextureState::EnableTexture FUNCTION DOCUMENTATION>
295 SKYRESULT SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
297 if (iTextureUnit >= s_iNumTextureUnits)
299 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::EnableTexture(): Invalid texture unit.");
302 _pTextureUnitState[iTextureUnit].bEnabled = bEnable;
308 //------------------------------------------------------------------------------
309 // Function : SkyTextureState::SetTextureParameter
311 //------------------------------------------------------------------------------
313 * @fn SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, GLenum eParameter, GLenum eMode)
314 * @brief @todo <WRITE BRIEF SkyTextureState::SetTextureParameter DOCUMENTATION>
316 * @todo <WRITE EXTENDED SkyTextureState::SetTextureParameter FUNCTION DOCUMENTATION>
318 SKYRESULT SkyTextureState::SetTextureParameter(unsigned int iTextureUnit,
322 if (iTextureUnit >= s_iNumTextureUnits)
324 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::SetTextureParameter(): Invalid texture unit.");
329 case GL_TEXTURE_WRAP_S:
330 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_S] = eMode;
332 case GL_TEXTURE_WRAP_T:
333 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_T] = eMode;
335 case GL_TEXTURE_WRAP_R:
336 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_R] = eMode;
338 case GL_TEXTURE_MIN_FILTER:
339 _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MIN] = eMode;
341 case GL_TEXTURE_MAG_FILTER:
342 _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MAG] = eMode;
345 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTExtureState::SetTextureParameter(): Invalid parameter.");