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"
27 #include <simgear/screen/extensions.hxx>
30 glActiveTextureProc glActiveTexturePtr = 0;
31 bool glActiveTextureIsSupported = false;
35 //------------------------------------------------------------------------------
36 // Static initializations.
37 //------------------------------------------------------------------------------
38 unsigned int SkyTextureState::s_iNumTextureUnits = 0;
41 //------------------------------------------------------------------------------
42 // Function : SkyTextureState::SkyTextureState
44 //------------------------------------------------------------------------------
46 * @fn SkyTextureState::SkyTextureState()
49 SkyTextureState::SkyTextureState()
51 if (0 == s_iNumTextureUnits)
53 int iNumTextureUnits = 0;
54 if (SGIsOpenGLExtensionSupported("GL_ARB_multitexture")) {
55 glActiveTextureIsSupported = true;
57 glActiveTexturePtr = (glActiveTextureProc)
58 SGLookupFunction("glActiveTextureARB");
62 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &iNumTextureUnits);
63 if (iNumTextureUnits > 0)
64 s_iNumTextureUnits = iNumTextureUnits;
66 s_iNumTextureUnits = 1;
69 _pTextureUnitState = new TexState[s_iNumTextureUnits];
73 //------------------------------------------------------------------------------
74 // Function : SkyTextureState::~SkyTextureState
76 //------------------------------------------------------------------------------
78 * @fn SkyTextureState::~SkyTextureState()
81 SkyTextureState::~SkyTextureState()
83 SAFE_DELETE(_pTextureUnitState);
87 //------------------------------------------------------------------------------
88 // Function : SkyTextureState::Activate
90 //------------------------------------------------------------------------------
92 * @fn SkyTextureState::Activate()
93 * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
95 * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
97 SKYRESULT SkyTextureState::Activate()
99 SkyTextureState *pCurrent = GraphicsContext::InstancePtr()->GetCurrentTextureState();
100 assert(NULL != pCurrent);
101 //GLVU::CheckForGLError("SkyTextureState::Activate(8)");
102 for (unsigned int i = 0; i < s_iNumTextureUnits; ++i)
104 if (glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
105 glActiveTexturePtr(GL_TEXTURE0_ARB + i);
107 bool bEnabled = IsTextureEnabled(i);
108 if (pCurrent->IsTextureEnabled(i) != bEnabled)
110 FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
111 //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
113 glEnable(GetActiveTarget(i));
115 glDisable(GetActiveTarget(i));
117 //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
120 GLenum eTarget = GetActiveTarget(i);
121 unsigned int iID = GetTextureID(i);
122 // if ((pCurrent->GetActiveTarget(i) != eTarget) ||
123 // (pCurrent->GetTextureID(i) != iID))
125 FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
126 glBindTexture(eTarget, iID);
128 //GLVU::CheckForGLError("SkyTextureState::Activate(5)");
129 GLenum paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_S);
130 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_S) != paramValue)
132 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
133 glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
135 //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
136 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
137 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_T) != paramValue)
139 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
140 glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
142 //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
143 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
144 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_R) != paramValue)
146 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
147 glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
149 //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
150 paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
151 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MIN_FILTER) != paramValue)
153 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
154 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
156 //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
157 paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
158 if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MAG_FILTER) != paramValue)
160 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
161 glTexParameteri(eTarget, GL_TEXTURE_MAG_FILTER, paramValue);
163 //GLVU::CheckForGLError("SkyTextureState::Activate()");
165 if (glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
166 glActiveTexturePtr(GL_TEXTURE0_ARB);
172 //------------------------------------------------------------------------------
173 // Function : SkyTextureState::Force
175 //------------------------------------------------------------------------------
177 * @fn SkyTextureState::Force()
178 * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
180 * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
182 SKYRESULT SkyTextureState::Force()
184 SkyTextureState *pCurrent = GraphicsContext::InstancePtr()->GetCurrentTextureState();
185 assert(NULL != pCurrent);
186 //GLVU::CheckForGLError("SkyTextureState::Activate(8)");
187 for (unsigned int i = 0; i < s_iNumTextureUnits; ++i)
189 if (glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
190 glActiveTexturePtr(GL_TEXTURE0_ARB + i);
192 bool bEnabled = IsTextureEnabled(i);
193 FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
194 //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
196 glEnable(GetActiveTarget(i));
198 glDisable(GetActiveTarget(i));
200 //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
201 GLenum eTarget = GetActiveTarget(i);
202 unsigned int iID = GetTextureID(i);
204 FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
205 glBindTexture(eTarget, iID);
207 //GLVU::CheckForGLError("SkyTextureState::Activate(5)");
208 GLenum paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_S);
209 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
210 glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
212 //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
213 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
214 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
215 glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
217 //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
218 paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
219 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
220 glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
222 //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
223 paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
224 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
225 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
227 //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
228 paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
229 FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
230 glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
232 if(glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
233 glActiveTexturePtr(GL_TEXTURE0_ARB);
239 //------------------------------------------------------------------------------
240 // Function : SkyTextureState::SetTexture
242 //------------------------------------------------------------------------------
244 * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, SkyTexture& texture)
245 * @brief @todo <WRITE BRIEF SkyTextureState::BindTexture DOCUMENTATION>
247 * @todo <WRITE EXTENDED SkyTextureState::BindTexture FUNCTION DOCUMENTATION>
249 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit,
253 if (iTextureUnit >= s_iNumTextureUnits)
255 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
258 _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
259 _pTextureUnitState[iTextureUnit].iBoundTexture = texture.GetID();
265 //------------------------------------------------------------------------------
266 // Function : SkyTextureState::SetTexture
268 //------------------------------------------------------------------------------
270 * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, unsigned int iTextureID)
271 * @brief @todo <WRITE BRIEF SkyTextureState::SetTexture DOCUMENTATION>
273 * @todo <WRITE EXTENDED SkyTextureState::SetTexture FUNCTION DOCUMENTATION>
275 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit,
277 unsigned int iTextureID)
279 if (iTextureUnit >= s_iNumTextureUnits)
281 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
284 _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
285 _pTextureUnitState[iTextureUnit].iBoundTexture = iTextureID;
291 //------------------------------------------------------------------------------
292 // Function : SkyTextureState::EnableTexture
294 //------------------------------------------------------------------------------
296 * @fn SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
297 * @brief @todo <WRITE BRIEF SkyTextureState::EnableTexture DOCUMENTATION>
299 * @todo <WRITE EXTENDED SkyTextureState::EnableTexture FUNCTION DOCUMENTATION>
301 SKYRESULT SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
303 if (iTextureUnit >= s_iNumTextureUnits)
305 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::EnableTexture(): Invalid texture unit.");
308 _pTextureUnitState[iTextureUnit].bEnabled = bEnable;
314 //------------------------------------------------------------------------------
315 // Function : SkyTextureState::SetTextureParameter
317 //------------------------------------------------------------------------------
319 * @fn SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, GLenum eParameter, GLenum eMode)
320 * @brief @todo <WRITE BRIEF SkyTextureState::SetTextureParameter DOCUMENTATION>
322 * @todo <WRITE EXTENDED SkyTextureState::SetTextureParameter FUNCTION DOCUMENTATION>
324 SKYRESULT SkyTextureState::SetTextureParameter(unsigned int iTextureUnit,
328 if (iTextureUnit >= s_iNumTextureUnits)
330 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::SetTextureParameter(): Invalid texture unit.");
335 case GL_TEXTURE_WRAP_S:
336 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_S] = eMode;
338 case GL_TEXTURE_WRAP_T:
339 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_T] = eMode;
341 case GL_TEXTURE_WRAP_R:
342 _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_R] = eMode;
344 case GL_TEXTURE_MIN_FILTER:
345 _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MIN] = eMode;
347 case GL_TEXTURE_MAG_FILTER:
348 _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MAG] = eMode;
351 FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTExtureState::SetTextureParameter(): Invalid parameter.");