]> git.mxchange.org Git - simgear.git/blob - simgear/scene/sky/clouds3d/SkyTextureState.cpp
Clouds3D crashes because there is no Light
[simgear.git] / simgear / scene / sky / clouds3d / SkyTextureState.cpp
1
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 
13 // restrictions. 
14 //
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 
18 // implied warranty.
19 /**
20  * @file SkyTextureState.cpp
21  * 
22  * Implementation of class SkyTextureState, which encapsulates OpenGL texture state.
23  */
24 #include "SkyTextureState.hpp"
25 //#include "glvu.hpp"
26
27 #include <simgear/screen/extensions.hxx>
28
29
30 glActiveTextureProc glActiveTexturePtr = 0;
31 bool glActiveTextureIsSupported = false;
32
33
34
35 //------------------------------------------------------------------------------
36 // Static initializations.
37 //------------------------------------------------------------------------------
38 unsigned int SkyTextureState::s_iNumTextureUnits = 0;
39
40
41 //------------------------------------------------------------------------------
42 // Function               : SkyTextureState::SkyTextureState
43 // Description      : 
44 //------------------------------------------------------------------------------
45 /**
46 * @fn SkyTextureState::SkyTextureState()
47 * @brief Constructor.
48 */ 
49 SkyTextureState::SkyTextureState()
50 {
51   if (0 == s_iNumTextureUnits)
52   {
53     int iNumTextureUnits = 0;
54     if (SGIsOpenGLExtensionSupported("GL_ARB_multitexture")) {
55        glActiveTextureIsSupported = true;
56
57        glActiveTexturePtr = (glActiveTextureProc)
58                             SGLookupFunction("glActiveTextureARB");
59
60        glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &iNumTextureUnits);
61        if (iNumTextureUnits > 0)
62          s_iNumTextureUnits = iNumTextureUnits;
63        else
64          s_iNumTextureUnits = 1;
65      } else
66        s_iNumTextureUnits = 1;
67   }
68   
69   _pTextureUnitState = new TexState[s_iNumTextureUnits];
70 }
71
72
73 //------------------------------------------------------------------------------
74 // Function               : SkyTextureState::~SkyTextureState
75 // Description      : 
76 //------------------------------------------------------------------------------
77 /**
78 * @fn SkyTextureState::~SkyTextureState()
79 * @brief Destructor.
80 */ 
81 SkyTextureState::~SkyTextureState()
82 {
83   SAFE_DELETE(_pTextureUnitState);
84 }
85
86
87 //------------------------------------------------------------------------------
88 // Function               : SkyTextureState::Activate
89 // Description      : 
90 //------------------------------------------------------------------------------
91 /**
92  * @fn SkyTextureState::Activate()
93  * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
94  * 
95  * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
96  */ 
97 SKYRESULT SkyTextureState::Activate()
98 {
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)
103   {
104     if (glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
105       glActiveTexturePtr(GL_TEXTURE0_ARB + i);
106
107     bool bEnabled = IsTextureEnabled(i);
108     if (pCurrent->IsTextureEnabled(i) != bEnabled)
109     {
110       FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
111       //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
112       if (bEnabled)
113         glEnable(GetActiveTarget(i));
114       else
115         glDisable(GetActiveTarget(i));
116     }
117     //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
118     if (bEnabled)
119     {
120       GLenum eTarget    = GetActiveTarget(i);
121       unsigned int iID  = GetTextureID(i);
122       // if ((pCurrent->GetActiveTarget(i) != eTarget) ||
123       //     (pCurrent->GetTextureID(i)    != iID))
124       // {
125         FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
126         glBindTexture(eTarget, iID);
127       // }
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) 
131       {
132         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
133         glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
134       }
135       //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
136       paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
137       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_T) != paramValue) 
138       {
139         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
140         glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
141       }
142       //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
143       paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
144       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_R) != paramValue) 
145       {
146         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
147         glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
148       }
149       //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
150       paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
151       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MIN_FILTER) != paramValue) 
152       {
153         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
154         glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
155       }
156        //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
157       paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
158       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MAG_FILTER) != paramValue) 
159       {
160         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
161         glTexParameteri(eTarget, GL_TEXTURE_MAG_FILTER, paramValue);
162       }
163       //GLVU::CheckForGLError("SkyTextureState::Activate()");
164     }
165     if (glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
166       glActiveTexturePtr(GL_TEXTURE0_ARB);
167   }
168   return SKYRESULT_OK;
169 }
170
171
172 //------------------------------------------------------------------------------
173 // Function               : SkyTextureState::Force
174 // Description      : 
175 //------------------------------------------------------------------------------
176 /**
177  * @fn SkyTextureState::Force()
178  * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
179  * 
180  * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
181  */ 
182 SKYRESULT SkyTextureState::Force()
183 {
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)
188   {
189     if (glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
190       glActiveTexturePtr(GL_TEXTURE0_ARB + i);
191
192     bool bEnabled = IsTextureEnabled(i);
193     FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
194     //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
195     if (bEnabled)
196         glEnable(GetActiveTarget(i));
197     else
198         glDisable(GetActiveTarget(i));
199
200     //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
201     GLenum eTarget    = GetActiveTarget(i);
202     unsigned int iID  = GetTextureID(i);
203
204     FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
205     glBindTexture(eTarget, iID);
206
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);
211
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);
216
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);
221
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);
226
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);
231
232     if(glActiveTextureIsSupported && (s_iNumTextureUnits > 1))
233       glActiveTexturePtr(GL_TEXTURE0_ARB);
234   }
235   return SKYRESULT_OK;
236 }
237
238
239 //------------------------------------------------------------------------------
240 // Function               : SkyTextureState::SetTexture
241 // Description      : 
242 //------------------------------------------------------------------------------
243 /**
244  * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, SkyTexture&  texture)
245  * @brief @todo <WRITE BRIEF SkyTextureState::BindTexture DOCUMENTATION>
246  * 
247  * @todo <WRITE EXTENDED SkyTextureState::BindTexture FUNCTION DOCUMENTATION>
248  */ 
249 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit, 
250                                       GLenum       eTarget, 
251                                       SkyTexture&  texture)
252 {
253   if (iTextureUnit >= s_iNumTextureUnits)
254   {
255     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
256   }
257   
258   _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
259   _pTextureUnitState[iTextureUnit].iBoundTexture = texture.GetID();
260   
261   return SKYRESULT_OK;
262 }
263
264
265 //------------------------------------------------------------------------------
266 // Function               : SkyTextureState::SetTexture
267 // Description      : 
268 //------------------------------------------------------------------------------
269 /**
270  * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, unsigned int iTextureID)
271  * @brief @todo <WRITE BRIEF SkyTextureState::SetTexture DOCUMENTATION>
272  * 
273  * @todo <WRITE EXTENDED SkyTextureState::SetTexture FUNCTION DOCUMENTATION>
274  */ 
275 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit, 
276                                       GLenum       eTarget, 
277                                       unsigned int iTextureID)
278 {
279   if (iTextureUnit >= s_iNumTextureUnits)
280   {
281     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
282   }
283   
284   _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
285   _pTextureUnitState[iTextureUnit].iBoundTexture = iTextureID;
286   
287   return SKYRESULT_OK;
288 }
289
290
291 //------------------------------------------------------------------------------
292 // Function               : SkyTextureState::EnableTexture
293 // Description      : 
294 //------------------------------------------------------------------------------
295 /**
296  * @fn SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
297  * @brief @todo <WRITE BRIEF SkyTextureState::EnableTexture DOCUMENTATION>
298  * 
299  * @todo <WRITE EXTENDED SkyTextureState::EnableTexture FUNCTION DOCUMENTATION>
300  */ 
301 SKYRESULT SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
302 {
303   if (iTextureUnit >= s_iNumTextureUnits)
304   {
305     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::EnableTexture(): Invalid texture unit.");
306   }  
307   
308   _pTextureUnitState[iTextureUnit].bEnabled = bEnable;
309   
310   return SKYRESULT_OK;
311 }
312
313
314 //------------------------------------------------------------------------------
315 // Function               : SkyTextureState::SetTextureParameter
316 // Description      : 
317 //------------------------------------------------------------------------------
318 /**
319  * @fn SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, GLenum eParameter, GLenum eMode)
320  * @brief @todo <WRITE BRIEF SkyTextureState::SetTextureParameter DOCUMENTATION>
321  * 
322  * @todo <WRITE EXTENDED SkyTextureState::SetTextureParameter FUNCTION DOCUMENTATION>
323  */ 
324 SKYRESULT SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, 
325                                                GLenum       eParameter, 
326                                                GLenum       eMode)
327 {
328   if (iTextureUnit >= s_iNumTextureUnits)
329   {
330     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::SetTextureParameter(): Invalid texture unit.");
331   }  
332
333   switch (eParameter)
334   {
335   case GL_TEXTURE_WRAP_S:
336     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_S] = eMode;
337     break;
338   case GL_TEXTURE_WRAP_T:
339     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_T] = eMode;
340     break;
341   case GL_TEXTURE_WRAP_R:
342     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_R] = eMode;
343     break;
344   case GL_TEXTURE_MIN_FILTER:
345     _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MIN] = eMode;
346     break;
347   case GL_TEXTURE_MAG_FILTER:
348     _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MAG] = eMode;
349     break;
350   default:
351     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTExtureState::SetTextureParameter(): Invalid parameter.");
352     break;
353   }
354   
355   return SKYRESULT_OK;
356 }
357