]> git.mxchange.org Git - simgear.git/blob - simgear/scene/sky/clouds3d/SkyTextureState.cpp
Initial revision.
[simgear.git] / simgear / scene / sky / clouds3d / SkyTextureState.cpp
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 
12 // restrictions. 
13 //
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 
17 // implied warranty.
18 /**
19  * @file SkyTextureState.cpp
20  * 
21  * Implementation of class SkyTextureState, which encapsulates OpenGL texture state.
22  */
23 #include "SkyTextureState.hpp"
24 //#include "glvu.hpp"
25
26 //------------------------------------------------------------------------------
27 // Static initializations.
28 //------------------------------------------------------------------------------
29 unsigned int SkyTextureState::s_iNumTextureUnits = 0;
30
31
32 //------------------------------------------------------------------------------
33 // Function               : SkyTextureState::SkyTextureState
34 // Description      : 
35 //------------------------------------------------------------------------------
36 /**
37 * @fn SkyTextureState::SkyTextureState()
38 * @brief Constructor.
39 */ 
40 SkyTextureState::SkyTextureState()
41 {
42   if (0 == s_iNumTextureUnits)
43   {
44     int iNumTextureUnits = 0;
45     glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &iNumTextureUnits);
46     if (iNumTextureUnits > 0)
47       s_iNumTextureUnits = iNumTextureUnits;
48     else
49       s_iNumTextureUnits = 1;
50   }
51   
52   _pTextureUnitState = new TexState[s_iNumTextureUnits];
53 }
54
55
56 //------------------------------------------------------------------------------
57 // Function               : SkyTextureState::~SkyTextureState
58 // Description      : 
59 //------------------------------------------------------------------------------
60 /**
61 * @fn SkyTextureState::~SkyTextureState()
62 * @brief Destructor.
63 */ 
64 SkyTextureState::~SkyTextureState()
65 {
66   SAFE_DELETE(_pTextureUnitState);
67 }
68
69
70 //------------------------------------------------------------------------------
71 // Function               : SkyTextureState::Activate
72 // Description      : 
73 //------------------------------------------------------------------------------
74 /**
75  * @fn SkyTextureState::Activate()
76  * @brief @todo <WRITE BRIEF SkyTextureState::Activate DOCUMENTATION>
77  * 
78  * @todo <WRITE EXTENDED SkyTextureState::Activate FUNCTION DOCUMENTATION>
79  */ 
80 SKYRESULT SkyTextureState::Activate()
81 {
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)
86   {
87     if (s_iNumTextureUnits > 1)
88       glActiveTextureARB(GL_TEXTURE0_ARB + i);
89     bool bEnabled = IsTextureEnabled(i);
90     if (pCurrent->IsTextureEnabled(i) != bEnabled)
91     {
92       FAIL_RETURN(pCurrent->EnableTexture(i, bEnabled));
93       //GLVU::CheckForGLError("SkyTextureState::Activate(7)");
94       if (bEnabled)
95         glEnable(GetActiveTarget(i));
96       else
97         glDisable(GetActiveTarget(i));
98     }
99     //GLVU::CheckForGLError("SkyTextureState::Activate(6)");
100     if (bEnabled)
101     {
102       GLenum eTarget    = GetActiveTarget(i);
103       unsigned int iID  = GetTextureID(i);
104       if ((pCurrent->GetActiveTarget(i) != eTarget) ||
105           (pCurrent->GetTextureID(i)    != iID))
106       {
107         FAIL_RETURN(pCurrent->SetTexture(i, eTarget, iID));
108         glBindTexture(eTarget, iID);
109       }
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) 
113       {
114         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_S, paramValue));
115         glTexParameteri(eTarget, GL_TEXTURE_WRAP_S, paramValue);
116       }
117       //GLVU::CheckForGLError("SkyTextureState::Activate(4)");
118       paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_T);
119       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_T) != paramValue) 
120       {
121         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_T, paramValue));
122         glTexParameteri(eTarget, GL_TEXTURE_WRAP_T, paramValue);
123       }
124       //GLVU::CheckForGLError("SkyTextureState::Activate(3)");
125       paramValue = GetTextureParameter(i, GL_TEXTURE_WRAP_R);
126       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_WRAP_R) != paramValue) 
127       {
128         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_WRAP_R, paramValue));
129         //glTexParameteri(eTarget, GL_TEXTURE_WRAP_R, paramValue);
130       }
131       //GLVU::CheckForGLError("SkyTextureState::Activate(2)");
132       paramValue = GetTextureParameter(i, GL_TEXTURE_MIN_FILTER);
133       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MIN_FILTER) != paramValue) 
134       {
135         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MIN_FILTER, paramValue));
136         glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
137       }
138        //GLVU::CheckForGLError("SkyTextureState::Activate(1)");
139       paramValue = GetTextureParameter(i, GL_TEXTURE_MAG_FILTER);
140       if (pCurrent->GetTextureParameter(i, GL_TEXTURE_MAG_FILTER) != paramValue) 
141       {
142         FAIL_RETURN(pCurrent->SetTextureParameter(i, GL_TEXTURE_MAG_FILTER, paramValue));
143         glTexParameteri(eTarget, GL_TEXTURE_MIN_FILTER, paramValue);
144       }
145       //GLVU::CheckForGLError("SkyTextureState::Activate()");
146     }
147     if (s_iNumTextureUnits > 1)
148       glActiveTextureARB(GL_TEXTURE0_ARB);
149   }
150   return SKYRESULT_OK;
151 }
152
153
154 //------------------------------------------------------------------------------
155 // Function               : SkyTextureState::SetTexture
156 // Description      : 
157 //------------------------------------------------------------------------------
158 /**
159  * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, SkyTexture&  texture)
160  * @brief @todo <WRITE BRIEF SkyTextureState::BindTexture DOCUMENTATION>
161  * 
162  * @todo <WRITE EXTENDED SkyTextureState::BindTexture FUNCTION DOCUMENTATION>
163  */ 
164 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit, 
165                                       GLenum       eTarget, 
166                                       SkyTexture&  texture)
167 {
168   if (iTextureUnit >= s_iNumTextureUnits)
169   {
170     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
171   }
172   
173   _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
174   _pTextureUnitState[iTextureUnit].iBoundTexture = texture.GetID();
175   
176   return SKYRESULT_OK;
177 }
178
179
180 //------------------------------------------------------------------------------
181 // Function               : SkyTextureState::SetTexture
182 // Description      : 
183 //------------------------------------------------------------------------------
184 /**
185  * @fn SkyTextureState::SetTexture(unsigned int iTextureUnit, GLenum eTarget, unsigned int iTextureID)
186  * @brief @todo <WRITE BRIEF SkyTextureState::SetTexture DOCUMENTATION>
187  * 
188  * @todo <WRITE EXTENDED SkyTextureState::SetTexture FUNCTION DOCUMENTATION>
189  */ 
190 SKYRESULT SkyTextureState::SetTexture(unsigned int iTextureUnit, 
191                                       GLenum       eTarget, 
192                                       unsigned int iTextureID)
193 {
194   if (iTextureUnit >= s_iNumTextureUnits)
195   {
196     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::BindTexture(): Invalid texture unit.");
197   }
198   
199   _pTextureUnitState[iTextureUnit].eActiveTarget = eTarget;
200   _pTextureUnitState[iTextureUnit].iBoundTexture = iTextureID;
201   
202   return SKYRESULT_OK;
203 }
204
205
206 //------------------------------------------------------------------------------
207 // Function               : SkyTextureState::EnableTexture
208 // Description      : 
209 //------------------------------------------------------------------------------
210 /**
211  * @fn SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
212  * @brief @todo <WRITE BRIEF SkyTextureState::EnableTexture DOCUMENTATION>
213  * 
214  * @todo <WRITE EXTENDED SkyTextureState::EnableTexture FUNCTION DOCUMENTATION>
215  */ 
216 SKYRESULT SkyTextureState::EnableTexture(unsigned int iTextureUnit, bool bEnable)
217 {
218   if (iTextureUnit >= s_iNumTextureUnits)
219   {
220     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::EnableTexture(): Invalid texture unit.");
221   }  
222   
223   _pTextureUnitState[iTextureUnit].bEnabled = bEnable;
224   
225   return SKYRESULT_OK;
226 }
227
228
229 //------------------------------------------------------------------------------
230 // Function               : SkyTextureState::SetTextureParameter
231 // Description      : 
232 //------------------------------------------------------------------------------
233 /**
234  * @fn SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, GLenum eParameter, GLenum eMode)
235  * @brief @todo <WRITE BRIEF SkyTextureState::SetTextureParameter DOCUMENTATION>
236  * 
237  * @todo <WRITE EXTENDED SkyTextureState::SetTextureParameter FUNCTION DOCUMENTATION>
238  */ 
239 SKYRESULT SkyTextureState::SetTextureParameter(unsigned int iTextureUnit, 
240                                                GLenum       eParameter, 
241                                                GLenum       eMode)
242 {
243   if (iTextureUnit >= s_iNumTextureUnits)
244   {
245     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureState::SetTextureParameter(): Invalid texture unit.");
246   }  
247
248   switch (eParameter)
249   {
250   case GL_TEXTURE_WRAP_S:
251     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_S] = eMode;
252     break;
253   case GL_TEXTURE_WRAP_T:
254     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_T] = eMode;
255     break;
256   case GL_TEXTURE_WRAP_R:
257     _pTextureUnitState[iTextureUnit].eWrapMode[TexState::SKY_TEXCOORD_R] = eMode;
258     break;
259   case GL_TEXTURE_MIN_FILTER:
260     _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MIN] = eMode;
261     break;
262   case GL_TEXTURE_MAG_FILTER:
263     _pTextureUnitState[iTextureUnit].eFilterMode[TexState::SKY_FILTER_MAG] = eMode;
264     break;
265   default:
266     FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTExtureState::SetTextureParameter(): Invalid parameter.");
267     break;
268   }
269   
270   return SKYRESULT_OK;
271 }