| 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 | } |