]> git.mxchange.org Git - simgear.git/blob - simgear/scene/sky/clouds3d/SkyTextureState.cpp
A first attempt at making the clouds3d endian aware. Almost there.
[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
28
29 //------------------------------------------------------------------------------
30 // Static initializations.
31 //------------------------------------------------------------------------------
32 unsigned int SkyTextureState::s_iNumTextureUnits = 0;
33
34
35 //------------------------------------------------------------------------------
36 // Function               : SkyTextureState::SkyTextureState
37 // Description      : 
38 //------------------------------------------------------------------------------
39 /**
40 * @fn SkyTextureState::SkyTextureState()
41 * @brief Constructor.
42 */ 
43 SkyTextureState::SkyTextureState()
44 {
45   if (0 == s_iNumTextureUnits)
46   {
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;
52     else
53       s_iNumTextureUnits = 1;
54 #endif
55   }
56   
57   _pTextureUnitState = new TexState[s_iNumTextureUnits];
58 }
59
60
61 //------------------------------------------------------------------------------
62 // Function               : SkyTextureState::~SkyTextureState
63 // Description      : 
64 //------------------------------------------------------------------------------
65 /**
66 * @fn SkyTextureState::~SkyTextureState()
67 * @brief Destructor.
68 */ 
69 SkyTextureState::~SkyTextureState()
70 {
71   SAFE_DELETE(_pTextureUnitState);
72 }
73
74
75 //------------------------------------------------------------------------------
76 // Function               : SkyTextureState::Activate
77 // Description      : 
78 //------------------------------------------------------------------------------
79 /**
80  * @fn SkyTextureState::Activate()
81  * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
82  * 
83  * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
84  */ 
85 SKYRESULT SkyTextureState::Activate()
86 {
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)
91   {
92 #ifdef GL_ARB_multitexture
93     if (s_iNumTextureUnits > 1)
94       glActiveTextureARB(GL_TEXTURE0_ARB + i);
95 #endif
96     bool bEnabled = IsTextureEnabled(i);
97     if (pCurrent->IsTextureEnabled(i) != bEnabled)
98     {
99       FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
100       //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
101       if (bEnabled)
102         glEnable(GetActiveTarget(i));
103       else
104         glDisable(GetActiveTarget(i));
105     }
106     //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
107     if (bEnabled)
108     {
109       GLenum eTarget    = GetActiveTarget(i);
110       unsigned int iID  = GetTextureID(i);
111       // if ((pCurrent->GetActiveTarget(i) != eTarget) ||
112       //     (pCurrent->GetTextureID(i)    != iID))
113       // {
114         FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
115         glBindTexture(eTarget, iID);
116       // }
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) 
120       {
121         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
122         glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
123       }
124       //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
125       paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
126       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_T) != paramValue) 
127       {
128         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
129         glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
130       }
131       //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
132       paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
133       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_R) != paramValue) 
134       {
135         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
136         glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
137       }
138       //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
139       paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
140       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MIN_FILTER) != paramValue) 
141       {
142         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
143         glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
144       }
145        //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
146       paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
147       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MAG_FILTER) != paramValue) 
148       {
149         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
150         glTexParameteri(eTarget, GL_TEXTURE_MAG_FILTER, paramValue);
151       }
152       //GLVU::CheckForGLError("SkyTextureState::Activate()");
153     }
154 #ifdef GL_ARB_multitexture
155     if (s_iNumTextureUnits > 1)
156       glActiveTextureARB(GL_TEXTURE0_ARB);
157 #endif
158   }
159   return SKYRESULT_OK;
160 }
161
162
163 //------------------------------------------------------------------------------
164 // Function               : SkyTextureState::Force
165 // Description      : 
166 //------------------------------------------------------------------------------
167 /**
168  * @fn SkyTextureState::Force()
169  * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
170  * 
171  * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
172  */ 
173 SKYRESULT SkyTextureState::Force()
174 {
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)
179   {
180 #ifdef GL_ARB_multitexture
181     if (s_iNumTextureUnits > 1)
182       glActiveTextureARB(GL_TEXTURE0_ARB + i);
183 #endif
184     bool bEnabled = IsTextureEnabled(i);
185     FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
186     //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
187     if (bEnabled)
188         glEnable(GetActiveTarget(i));
189     else
190         glDisable(GetActiveTarget(i));
191
192     //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
193     GLenum eTarget    = GetActiveTarget(i);
194     unsigned int iID  = GetTextureID(i);
195
196     FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
197     glBindTexture(eTarget, iID);
198
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);
203
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);
208
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);
213
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);
218
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);
223
224 #ifdef GL_ARB_multitexture
225     if (s_iNumTextureUnits > 1)
226       glActiveTextureARB(GL_TEXTURE0_ARB);
227 #endif
228   }
229   return SKYRESULT_OK;
230 }
231
232
233 //------------------------------------------------------------------------------
234 // Function               : SkyTextureState::SetTexture
235 // Description      : 
236 //------------------------------------------------------------------------------
237 /**
238  * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, SkyTexture&  texture)
239  * @brief @todo <WRITE BRIEF SkyTextureState::BindTexture DOCUMENTATION>
240  * 
241  * @todo <WRITE EXTENDED SkyTextureState::BindTexture FUNCTION DOCUMENTATION>
242  */ 
243 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit, 
244                                       GLenum       eTarget, 
245                                       SkyTexture&  texture)
246 {
247   if (iTextureUnit >= s_iNumTextureUnits)
248   {
249     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
250   }
251   
252   _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
253   _pTextureUnitState[iTextureUnit].iBoundTexture = texture.GetID();
254   
255   return SKYRESULT_OK;
256 }
257
258
259 //------------------------------------------------------------------------------
260 // Function               : SkyTextureState::SetTexture
261 // Description      : 
262 //------------------------------------------------------------------------------
263 /**
264  * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, unsigned int iTextureID)
265  * @brief @todo <WRITE BRIEF SkyTextureState::SetTexture DOCUMENTATION>
266  * 
267  * @todo <WRITE EXTENDED SkyTextureState::SetTexture FUNCTION DOCUMENTATION>
268  */ 
269 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit, 
270                                       GLenum       eTarget, 
271                                       unsigned int iTextureID)
272 {
273   if (iTextureUnit >= s_iNumTextureUnits)
274   {
275     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
276   }
277   
278   _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
279   _pTextureUnitState[iTextureUnit].iBoundTexture = iTextureID;
280   
281   return SKYRESULT_OK;
282 }
283
284
285 //------------------------------------------------------------------------------
286 // Function               : SkyTextureState::EnableTexture
287 // Description      : 
288 //------------------------------------------------------------------------------
289 /**
290  * @fn SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
291  * @brief @todo <WRITE BRIEF SkyTextureState::EnableTexture DOCUMENTATION>
292  * 
293  * @todo <WRITE EXTENDED SkyTextureState::EnableTexture FUNCTION DOCUMENTATION>
294  */ 
295 SKYRESULT SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
296 {
297   if (iTextureUnit >= s_iNumTextureUnits)
298   {
299     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::EnableTexture(): Invalid texture unit.");
300   }  
301   
302   _pTextureUnitState[iTextureUnit].bEnabled = bEnable;
303   
304   return SKYRESULT_OK;
305 }
306
307
308 //------------------------------------------------------------------------------
309 // Function               : SkyTextureState::SetTextureParameter
310 // Description      : 
311 //------------------------------------------------------------------------------
312 /**
313  * @fn SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, GLenum eParameter, GLenum eMode)
314  * @brief @todo <WRITE BRIEF SkyTextureState::SetTextureParameter DOCUMENTATION>
315  * 
316  * @todo <WRITE EXTENDED SkyTextureState::SetTextureParameter FUNCTION DOCUMENTATION>
317  */ 
318 SKYRESULT SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, 
319                                                GLenum       eParameter, 
320                                                GLenum       eMode)
321 {
322   if (iTextureUnit >= s_iNumTextureUnits)
323   {
324     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::SetTextureParameter(): Invalid texture unit.");
325   }  
326
327   switch (eParameter)
328   {
329   case GL_TEXTURE_WRAP_S:
330     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_S] = eMode;
331     break;
332   case GL_TEXTURE_WRAP_T:
333     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_T] = eMode;
334     break;
335   case GL_TEXTURE_WRAP_R:
336     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_R] = eMode;
337     break;
338   case GL_TEXTURE_MIN_FILTER:
339     _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MIN] = eMode;
340     break;
341   case GL_TEXTURE_MAG_FILTER:
342     _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MAG] = eMode;
343     break;
344   default:
345     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTExtureState::SetTextureParameter(): Invalid parameter.");
346     break;
347   }
348   
349   return SKYRESULT_OK;
350 }
351