Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/atmospheric_engine/src/lib/graphics/effects/volfog_effect.cc @ 7760

Last change on this file since 7760 was 7760, checked in by amaechler, 18 years ago

branches/atmospheric_engine: basic volfog (prob) working, weird values…

File size: 5.2 KB
Line 
1/*
2        orxonox - the future of 3D-vertical-scrollers
3
4        Copyright (C) 2004 orx
5
6        This program is free software; you can redistribute it and/or modify
7        it under the terms of the GNU General Public License as published by
8        the Free Software Foundation; either version 2, or (at your option)
9        any later version.
10
11### File Specific:
12        main-programmer: hdavid, amaechler
13*/
14
15#include "volfog_effect.h"
16
17#include "util/loading/load_param.h"
18#include "util/loading/factory.h"
19
20#include "p_node.h"
21#include "state.h"
22
23#include "glincl.h"
24//#include "shell_command.h"
25
26#define GLX_GLXEXT_PROTOTYPES
27#include <GL/glx.h>
28#include <GL/glut.h>
29
30//#include <GL/glext.h> //OpenGL Extensions
31//#include <GL/glxext.h> // GLX Extensions
32
33#ifndef GL_EXT_fog_coord
34#define GL_EXT_fog_coord 1
35
36typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
37typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
38typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord);
39typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
40typedef void (APIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
41#endif
42
43PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = 0;
44PFNGLFOGCOORDFVEXTPROC glFogCoordfvEXT = 0;
45PFNGLFOGCOORDDEXTPROC glFogCoorddEXT = 0;
46PFNGLFOGCOORDDVEXTPROC glFogCoorddvEXT = 0;
47PFNGLFOGCOORDPOINTEREXTPROC glFogCoordPointerEXT = 0;
48
49
50using namespace std;
51
52CREATE_FACTORY(VolFogEffect, CL_VOLFOG_EFFECT);
53
54VolFogEffect::VolFogEffect(const TiXmlElement* root)
55{
56        this->setClassID(CL_VOLFOG_EFFECT, "VolFogEffect");
57
58        if (root != NULL)
59                this->loadParams(root);
60
61        // Initialize Effect
62        this->init();
63
64        // Activate Effect
65        this->activate();
66}
67
68
69VolFogEffect::~VolFogEffect()
70{
71        this->deactivate();
72}
73
74void VolFogEffect::loadParams(const TiXmlElement* root)
75{
76        WeatherEffect::loadParams(root);
77}
78
79bool VolFogEffect::init()
80{
81        PRINTF(0)("Initalize VolFogEffect\n");
82
83        // set fog mode
84        GLenum fogMode  = GL_EXP;
85
86        // set fog density
87        float  fogDensity  = 0.001f;
88
89        // set fog near & far distance
90        float fogStart = 0.0f;
91        float fogEnd   = 1000.0f;
92
93        // Set fog color
94        float fogColor[4] = {0.6f,0.58f,0.79f,0.0f};
95       
96
97        glFogCoordfEXT       = (PFNGLFOGCOORDFEXTPROC)glXGetProcAddressARB((const GLubyte*)"glFogCoordfEXT");
98        glFogCoordfvEXT      = (PFNGLFOGCOORDFVEXTPROC)glXGetProcAddressARB((const GLubyte*)"glFogCoordfvEXT");
99        glFogCoorddEXT       = (PFNGLFOGCOORDDEXTPROC)glXGetProcAddressARB((const GLubyte*)"glFogCoorddEXT");
100        glFogCoorddvEXT      = (PFNGLFOGCOORDDVEXTPROC)glXGetProcAddressARB((const GLubyte*)"glFogCoorddvEXT");
101        glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glXGetProcAddressARB((const GLubyte*)"glFogCoordPointerEXT");
102
103        // set the fog attributes
104        glFogf (GL_FOG_START,  fogStart);
105        glFogf (GL_FOG_END,    fogEnd);
106        glFogfv(GL_FOG_COLOR,  fogColor);
107        glFogi (GL_FOG_MODE,   fogMode);
108        glFogf (GL_FOG_DENSITY,fogDensity);
109        glFogi (GL_FOG_COORDINATE_SOURCE_EXT,GL_FOG_COORDINATE_EXT);
110
111        // enable the fog
112        glEnable(GL_FOG);
113
114        if (glewInit() == GLEW_OK)
115                PRINTF(0)("glewInit OK\n");
116        else
117                PRINTF(0)("glewInit failed\n");
118
119        if (glewGetExtension("GL_EXT_fog_coord"))
120        {
121                PRINTF(0)("GL_EXT_fog_coord extension found\n");
122                return true;
123        }
124        else
125        {
126                PRINTF(0)("GL_EXT_fog_coord extension NOT found\n");
127                return false;
128        }
129}
130
131
132bool VolFogEffect::activate()
133{
134        PRINTF(0)("Activating VolFogEffect\n");
135}
136
137bool VolFogEffect::deactivate()
138{
139        PRINTF(0)("Deactivating VolFogEffect\n");
140
141        glDisable(GL_FOG);
142}
143
144
145/**
146* draws the effect, if needed
147*/
148void VolFogEffect::draw() const
149{
150  glPushAttrib(GL_ENABLE_BIT);
151  glClearColor(fogColor[0],fogColor[1],fogColor[2],0.0f);
152        glShadeModel(GL_SMOOTH);
153        glEnable(GL_DEPTH_TEST);
154        glEnable(GL_CULL_FACE);
155        glCullFace(GL_BACK);
156
157        /* clear all pixels in colour buffer */
158        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
159
160        /* Enable blending */
161        //glEnable(GL_BLEND);
162        //glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
163       
164        int i;
165        //glLoadIdentity();
166
167       
168        glBegin( GL_LINES );
169                glNormal3f(0,1,0);
170                for(i=-20;i<=20;i+=2)
171                {
172                        float fog_c;
173                        float diff[3];
174
175                        diff[0] = State::getCameraNode()->getAbsCoor().x - i;
176                        diff[2] = State::getCameraNode()->getAbsCoor().z + 20;
177                        diff[1] = State::getCameraNode()->getAbsCoor().y;
178                        fog_c = 1.3f*sqrt(diff[0]*diff[0]+diff[1]*diff[1]+diff[2]*diff[2]);
179                        glFogCoordfEXT(fog_c*2);
180                        glVertex3f(i,0,-20);
181
182                        diff[0] = State::getCameraNode()->getAbsCoor().x - i;
183                        diff[2] = State::getCameraNode()->getAbsCoor().z + 20;
184                        diff[1] = State::getCameraNode()->getAbsCoor().y;
185                        fog_c = 1.3f*sqrt(diff[0]*diff[0]+diff[1]*diff[1]+diff[2]*diff[2]);
186                        glFogCoordfEXT(fog_c*2);
187                        glVertex3f(i,0,20);
188
189                        diff[0] = State::getCameraNode()->getAbsCoor().x - i;
190                        diff[2] = State::getCameraNode()->getAbsCoor().z + 20;
191                        diff[1] = State::getCameraNode()->getAbsCoor().y;
192                        fog_c = 1.3f*sqrt(diff[0]*diff[0]+diff[1]*diff[1]+diff[2]*diff[2]);
193                        glFogCoordfEXT(fog_c*2);
194                        glVertex3f(-20,0,i);
195
196                        diff[0] = State::getCameraNode()->getAbsCoor().x - i;
197                        diff[2] = State::getCameraNode()->getAbsCoor().z + 20;
198                        diff[1] = State::getCameraNode()->getAbsCoor().y;
199                        fog_c = 1.3f*sqrt(diff[0]*diff[0]+diff[1]*diff[1]+diff[2]*diff[2]);
200                        glFogCoordfEXT(fog_c*2);
201                        glVertex3f(20,0,i);
202                }
203        glEnd();
204
205  glPopAttrib();
206
207}
208
209
210/**
211* ticks the effect if there is any time dependancy
212*/
213void VolFogEffect::tick(float dt)       
214{
215}
Note: See TracBrowser for help on using the repository browser.