Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/atmospheric_engine/src/lib/graphics/effects/cloud_effect.cc @ 8247

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

branches/atmospheric_engine: fog activate, cleanups

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        INSPIRED BY http://www.codesampler.com/usersrc/usersrc_6.htm#oglu_sky_dome_shader
15*/
16
17#include "cloud_effect.h"
18
19#include "util/loading/load_param.h"
20#include "util/loading/factory.h"
21#include "util/loading/resource_manager.h"
22
23#include "glincl.h"
24#include "material.h"
25#include <math.h>
26#include "state.h"
27#include "p_node.h"
28#include "shader.h"
29#include "shell_command.h"
30
31#include "parser/tinyxml/tinyxml.h"
32
33#include "sglmodel.h"
34
35using namespace std;
36
37SHELL_COMMAND(activate, CloudEffect, activateCloud);
38SHELL_COMMAND(deactivate, CloudEffect, deactivateCloud);
39
40CREATE_FACTORY(CloudEffect, CL_CLOUD_EFFECT);
41
42CloudEffect::CloudEffect(const TiXmlElement* root)
43{
44        this->setClassID(CL_CLOUD_EFFECT, "CloudEffect");
45
46        this->init();
47
48        if (root != NULL)
49                this->loadParams(root);
50
51        if(cloudActivate)
52                this->activate();
53}
54
55CloudEffect::~CloudEffect()
56{
57        this->deactivate();
58
59        delete this->cloudMaterial;
60
61        cloudModel.Delete();
62        Shader::unload(this->cloudShader);
63
64}
65
66
67bool CloudEffect::init()
68{
69        PRINTF(1)("Initializing CloudEffect\n");
70
71        // Default values
72        this->cloudActivate = false;
73        this->cloudTint[4] = ( 0.9f, 0.7f, 0.7f, 1.0f );
74        this->cloudScroll = 1.0f;
75        this->time = 0.0f;
76        //g_cloud_texture = 0;
77
78        this->cloudTexture = "pictures/sky/cloud1.jpg";
79
80        cloudModel.Load("sky.sgl");
81        cloudModel.Unitize();
82
83        // Get the bounding box of the sky dome
84        float bbox[3] = {0};
85        cloudModel.GetDimensions(bbox[0], bbox[1], bbox[2]);
86       
87        // Load Shaders
88        this->cloudShader = new Shader( ResourceManager::getInstance()->getDataDir() + "/shaders/sky.vert", ResourceManager::getInstance()->getDataDir() +"/shaders/sky.frag");
89
90        // Tell the shader the bounding box of the sky dome
91        this->cloudShader->bindShader("bbox", bbox, 4);
92
93        // Initialze Cloud Material
94        this->cloudMaterial = new Material("Sky");
95        this->cloudMaterial->setIllum(3);
96        this->cloudMaterial->setAmbient(1.0, 1.0, 1.0);
97        this->cloudMaterial->setDiffuseMap(this->cloudTexture);
98
99}
100
101
102void CloudEffect::loadParams(const TiXmlElement* root)
103{
104        WeatherEffect::loadParams(root);
105
106        // LoadParam(root, "speed", this, CloudEffect, setCloudAnimation);
107        // LoadParam(root, "texture", this, CloudEffect, setCloudTexture);
108
109        LOAD_PARAM_START_CYCLE(root, element);
110        {
111                LoadParam_CYCLE(element, "option", this, CloudEffect, setCloudOption);
112        }
113        LOAD_PARAM_END_CYCLE(element);
114}
115
116
117bool CloudEffect::activate()
118{
119        PRINTF(0)( "Activating CloudEffect with Material %s\n", this->cloudTexture.c_str());
120
121        this->cloudActivate = true;
122       
123}
124
125bool CloudEffect::deactivate()
126{
127        PRINTF(0)("Deactivating CloudEffect\n");
128
129        this->cloudActivate = false;
130}
131
132void CloudEffect::draw() const
133{
134        if (!this->cloudActivate)
135                return;
136               
137        //      glMatrixMode(GL_MODELVIEW);
138        //      glPushMatrix();
139        //
140        //      // Move sphere along with the camera
141        //      Vector r = State::getCameraNode()->getAbsCoor();
142        //      glTranslatef(r.x, r.y, r.z);
143        //
144        //      // Sky movement
145        //      glRotatef(mover, 0, 0, 1);
146        //
147        //      cloudMaterial->select();
148        //      gluSphere(this->sphereObj, this->sphereRadius, 20, 20);
149        //      glPopMatrix();
150
151        // ******
152
153        glMatrixMode(GL_MODELVIEW);
154        glPushMatrix();
155
156        // glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
157        // glShadeModel(GL_SMOOTH);
158        // glEnable(GL_DEPTH_TEST);
159        // glEnable(GL_CULL_FACE);
160        // glCullFace(GL_BACK);
161        // glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
162       
163        // glLineWidth(3.0f);
164
165        static float time = 0.0f;
166        // static vector3f eye = {0.0f, 0.0f, 0.0f}, look = {0.0f, 0.0f, 1.0f}, up = {0.0f, 1.0f, 0.0f};
167
168        // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
169        // glLoadIdentity();
170        // gluLookAt(eye[x], eye[y], eye[z], look[x], look[y], look[z], up[x], up[y], up[z]);
171
172        // Turn off the depth buffer when rendering the background
173        // glDisable(GL_DEPTH_TEST);
174
175        this->cloudShader->activateShader();
176
177        /* Select the shader program and update parameters. */
178        /* The "time" parameter controls the cloud scrolling. */
179        this->cloudShader->bindShader("time", &time, 1);
180        /* The "horizon" parameter controls the sky tinting. */
181        this->cloudShader->bindShader("horizon", cloudTint, 4);
182
183        glActiveTexture(GL_TEXTURE0 + 0);
184        glActiveTexture(GL_TEXTURE0 + 1);
185
186        // Load the cloud texture
187        //glBindTexture(GL_TEXTURE_2D, g_cloud_texture);
188        this->cloudMaterial->select();
189
190        // Render the sky dome
191        cloudModel.Render();
192
193        // Unselect the shader
194        Shader::deactivateShader();
195
196        /* Turn on the depth buffer when rendering the foreground. */
197        // glEnable(GL_DEPTH_TEST);
198
199        /* Render the forground, for example, a teapot or bunny. */
200        //    glEnable(GL_LIGHTING);
201        //    glColor3f(0.0f, 1.0f, 0.0f);
202        //    glBegin(GL_QUADS);
203        //    glNormal3f( 0.0f,  1.0f,  0.0f);
204        //    glVertex3f( 20.0f, -1.0f,  20.0f);
205        //    glVertex3f( 20.0f, -1.0f, -20.0f);
206        //    glVertex3f(-20.0f, -1.0f, -20.0f);
207        //    glVertex3f(-20.0f, -1.0f,  20.0f);
208        //    glEnd();
209        //    glDisable(GL_LIGHTING);
210
211        glPopMatrix();
212       
213}
214
215void CloudEffect::tick (float dt)
216{
217        if (!this->cloudActivate)
218                return;
219
220        // Update the timer for scrolling the clouds
221        time = time + ((1.0f / 2000.0f) * cloudScroll);
222}
223
Note: See TracBrowser for help on using the repository browser.