161 #include <internal.h>
163 #include <libFreeWRL.h>
165 #include "../vrml_parser/Structs.h"
166 #include "../main/headers.h"
167 #include "../vrml_parser/CParseGeneral.h"
168 #include "../scenegraph/Vector.h"
169 #include "../vrml_parser/CFieldDecls.h"
170 #include "../vrml_parser/CParseParser.h"
171 #include "../vrml_parser/CParseLexer.h"
172 #include "../vrml_parser/CRoutes.h"
173 #include "../opengl/OpenGL_Utils.h"
174 #include "../x3d_parser/Bindable.h"
175 #include "../scenegraph/quaternion.h"
176 #include "../scenegraph/Viewer.h"
177 #include "../scenegraph/Component_Geospatial.h"
178 #include "../scenegraph/RenderFuncs.h"
179 #include "../scenegraph/Component_ProgrammableShaders.h"
180 #include "../scenegraph/Component_Shape.h"
181 #include "../ui/common.h"
182 #include "../scenegraph/LinearAlgebra.h"
183 #define FOGTYPE_LINEAR 1
184 #define FOGTYPE_EXPONENTIAL 2
189 void popShaderFlags();
191 void pushFogParams(
struct X3D_Node *fogparams);
206 double calculateFogScale(){
214 GLDOUBLE modelviewMatrix[16], fogLocal[3], eyeLocal[3], eyeLocalB[3], eyeDepth, fogScale;
215 FW_GL_GETDOUBLEV(GL_MODELVIEW_MATRIX, modelviewMatrix);
216 fogLocal[0] = 0.0; fogLocal[1] = 0.0; fogLocal[2] = 0.0;
217 transformAFFINEd(eyeLocal,fogLocal,modelviewMatrix);
219 transformAFFINEd(eyeLocalB,fogLocal,modelviewMatrix);
220 vecdifd(eyeLocal,eyeLocal,eyeLocalB);
221 eyeDepth = veclengthd(eyeLocal);
228 void render_Fog(
struct X3D_Fog *node) {
233 node->__fogScale = (float)calculateFogScale();
234 if(node->fogType->strptr){
235 if(!strcmp(node->fogType->strptr,
"LINEAR")) fogType = FOGTYPE_LINEAR;
236 if(!strcmp(node->fogType->strptr,
"EXPONENTIAL")) fogType = FOGTYPE_EXPONENTIAL;
238 node->__fogType = fogType;
241 void prep_LocalFog(
struct X3D_Node *node){
245 if(fog->enabled && fog->visibilityRange > 0.0f){
249 render_Fog((
struct X3D_Fog*)node);
252 shaderflags = getShaderFlags();
253 shaderflags.base |= FOG_APPEARANCE_SHADER;
254 pushShaderFlags(shaderflags);
255 pushFogParams((
struct X3D_Node*)fog);
258 void fin_LocalFog(
struct X3D_Node *node){
260 if(fog->enabled && fog->visibilityRange > 0.0f){
267 if(rs->render_blend || rs->render_geom){
273 if(rs->render_blend || rs->render_geom){