CORE: Rom DataBase with DelaySI & CountPerOp per rom settings
[mupen64plus-pandora.git] / source / mupen64plus-video-arachnoid / src / FogManager.cpp
1 /******************************************************************************
2  * Arachnoid Graphics Plugin for Mupen64Plus
3  * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/
4  *
5  * Copyright (C) 2009 Jon Ring
6  * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  *****************************************************************************/
22
23 #include "FogManager.h"
24 #include "ExtensionChecker.h"
25 #include "m64p.h"
26 #include "OpenGL.h"
27
28 #ifndef GL_GLEXT_VERSION
29     //-----------------------------------------------------------------------------
30     // EXT_fog_coord functions
31     //-----------------------------------------------------------------------------
32     #ifndef GL_EXT_fog_coord
33     #define GL_EXT_fog_coord 1
34         #if defined(GL_GLEXT_PROTOTYPES) && !defined(HAVE_GLES)
35             extern void APIENTRY glFogCoordfEXT (GLfloat);
36             extern void APIENTRY glFogCoordfvEXT (const GLfloat *);
37             extern void APIENTRY glFogCoorddEXT (GLdouble);
38             extern void APIENTRY glFogCoorddvEXT (const GLdouble *);
39             extern void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *);
40         #endif 
41
42         typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
43         typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
44         typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord);
45         typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
46         typedef void (APIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
47
48         #define GL_FOG_COORDINATE_SOURCE_EXT      0x8450
49         #define GL_FOG_COORDINATE_EXT             0x8451
50         #define GL_FOG_COORDINATE_ARRAY_EXT       0x8457
51     #endif
52
53     PFNGLFOGCOORDFEXTPROC glFogCoordfEXT;
54     PFNGLFOGCOORDFVEXTPROC glFogCoordfvEXT;
55     PFNGLFOGCOORDDEXTPROC glFogCoorddEXT;
56     PFNGLFOGCOORDDVEXTPROC glFogCoorddvEXT;
57     PFNGLFOGCOORDPOINTEREXTPROC glFogCoordPointerEXT;
58 #endif
59
60 #ifdef HAVE_GLES
61 #define glFogi  glFogf
62 #endif
63
64 //-----------------------------------------------------------------------------
65 //! Static Variables
66 //-----------------------------------------------------------------------------
67 bool FogManager::m_fogExtensionsSupported = false;
68
69 //-----------------------------------------------------------------------------
70 //! Constructor
71 //-----------------------------------------------------------------------------
72 FogManager::FogManager()
73 {
74     m_multiplier = 0;
75     m_offset     = 0;
76 }
77
78 //-----------------------------------------------------------------------------
79 //! Destructor
80 //-----------------------------------------------------------------------------
81 FogManager::~FogManager()
82 {
83     dispose();
84 }
85
86 //-----------------------------------------------------------------------------
87 //* Initialize
88 //! Initializes fog extensions 
89 //-----------------------------------------------------------------------------
90 void FogManager::initialize()
91 {
92     m_multiplier = 0;
93     m_offset     = 0;
94
95     //Initialize extensions
96     static bool fogExtensionInitialized = false;
97     if ( !fogExtensionInitialized )
98     {
99 #ifndef HAVE_GLES
100         m_fogExtensionsSupported = isExtensionSupported("GL_EXT_fog_coord");
101         if ( m_fogExtensionsSupported )
102         {
103 #ifndef GL_GLEXT_VERSION
104             glFogCoordfEXT       = (PFNGLFOGCOORDFEXTPROC)wglGetProcAddress( "glFogCoordfEXT" );
105             glFogCoordfvEXT      = (PFNGLFOGCOORDFVEXTPROC)wglGetProcAddress( "glFogCoordfvEXT" );
106             glFogCoorddEXT       = (PFNGLFOGCOORDDEXTPROC)wglGetProcAddress( "glFogCoorddEXT" );
107             glFogCoorddvEXT      = (PFNGLFOGCOORDDVEXTPROC)wglGetProcAddress( "glFogCoorddvEXT" );
108             glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)wglGetProcAddress( "glFogCoordPointerEXT" );
109 #endif
110             fogExtensionInitialized  = true;
111         }        
112 #endif
113     }
114
115 #ifndef HAVE_GLES
116     glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
117 #endif
118 }
119
120 //-----------------------------------------------------------------------------
121 //! Dispose
122 //-----------------------------------------------------------------------------
123 void FogManager::dispose()
124 {
125 }
126
127 //-----------------------------------------------------------------------------
128 //* SetFogCoordPointer
129 //! Function used to set vertex based fog
130 //! @param[in] type Specifies the datatype of each fog coordinate in the array.
131 //! @param[in] stride Specifies the byte offset between consecutive fog coordinates 
132 //! @param[in] pointer    Specifies a pointer to the first component of the first fog coordinate in the array
133 //! http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.opengl/doc/openglrf/glFogCoordPointerEXT.htm
134 //-----------------------------------------------------------------------------
135 void FogManager::setFogCoordPointer(unsigned int type, int stride, const void* pointer)
136 {
137     if ( m_fogExtensionsSupported )
138     {
139         glFogCoordPointerEXT(type, stride, pointer);
140     }
141 }
142
143 //-----------------------------------------------------------------------------
144 //* Enable Fog Coord Array
145 //! Function used to enable vertex based fog
146 //! @see disableFogCoordArray()
147 //-----------------------------------------------------------------------------
148 void FogManager::enableFogCoordArray()
149 {
150     if ( m_fogExtensionsSupported )
151     {
152         glEnableClientState(GL_FOG_COORDINATE_ARRAY_EXT);
153     }
154 }
155
156 //-----------------------------------------------------------------------------
157 //* Disable Fog Coord Array
158 //! Function used to disable vertex based fog
159 //! @see enableFogCoordArray()
160 //-----------------------------------------------------------------------------
161 void FogManager::disableFogCoordArray()
162 {
163     if ( m_fogExtensionsSupported )
164     {
165         glDisableClientState(GL_FOG_COORDINATE_ARRAY_EXT);
166     }
167 }
168
169 //-----------------------------------------------------------------------------
170 //* Set Linear Fog
171 //! Function used to set linear fog using a linear fog equation
172 //! Equation for linear fog is:
173 //!     <KBD> fog = (end - z) / (end - start) </KBD>
174 //! where  z is the distance in  eye coordinates from the origin to the fragment being fogged
175 //! @param start Specifies start (near) distance used in the linear  fog equation.  
176 //!            The initial near distance is 0.
177 //! @param end Specifies end (the far) distance used in the linear fog equation.  
178 //!            The initial far  distance  is 1.
179 //! http://www.hmug.org/man/3/glFogi.php
180 //-----------------------------------------------------------------------------
181 void FogManager::setLinearFog(float start, float end)
182 {
183     glFogi(GL_FOG_MODE, GL_LINEAR);
184     glFogf(GL_FOG_START, start);
185     glFogf(GL_FOG_END, end);
186 }
187
188 //-----------------------------------------------------------------------------
189 //* Set Fog Color
190 //! @param r The red component of the fog color
191 //! @param g The green component of the fog color
192 //! @param b The blue component of the fog color
193 //! @param a The alpha component of the fog color
194 //-----------------------------------------------------------------------------
195 void FogManager::setFogColor(float r, float g, float b, float a)
196 {
197     float fogColor[4] = { r,g,b,a };
198     glFogfv(GL_FOG_COLOR, fogColor );
199 }