| [7679] | 1 | /* | 
|---|
| [7768] | 2 | orxonox - the future of 3D-vertical-scrollers | 
|---|
| [7679] | 3 |  | 
|---|
| [7768] | 4 | Copyright (C) 2004 orx | 
|---|
| [7679] | 5 |  | 
|---|
| [7768] | 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. | 
|---|
| [7679] | 10 |  | 
|---|
|  | 11 | ### File Specific: | 
|---|
| [7768] | 12 | main-programmer: hdavid, amaechler | 
|---|
| [8255] | 13 |  | 
|---|
|  | 14 | INSPIRED BY http://www.codesampler.com/usersrc/usersrc_6.htm#oglu_sky_dome_shader | 
|---|
| [7679] | 15 | */ | 
|---|
|  | 16 |  | 
|---|
|  | 17 | #include "cloud_effect.h" | 
|---|
|  | 18 |  | 
|---|
|  | 19 | #include "util/loading/load_param.h" | 
|---|
|  | 20 | #include "util/loading/factory.h" | 
|---|
| [8255] | 21 | #include "util/loading/resource_manager.h" | 
|---|
| [7679] | 22 |  | 
|---|
|  | 23 | #include "glincl.h" | 
|---|
| [8255] | 24 | #include "material.h" | 
|---|
| [7795] | 25 | #include <math.h> | 
|---|
| [8255] | 26 | #include "state.h" | 
|---|
|  | 27 | #include "p_node.h" | 
|---|
|  | 28 | #include "shader.h" | 
|---|
|  | 29 | #include "shell_command.h" | 
|---|
| [7679] | 30 |  | 
|---|
|  | 31 | #include "parser/tinyxml/tinyxml.h" | 
|---|
|  | 32 |  | 
|---|
| [8255] | 33 | #include "sglmodel.h" | 
|---|
|  | 34 |  | 
|---|
| [7679] | 35 | using namespace std; | 
|---|
|  | 36 |  | 
|---|
| [8255] | 37 | SHELL_COMMAND(activate, CloudEffect, activateCloud); | 
|---|
|  | 38 | SHELL_COMMAND(deactivate, CloudEffect, deactivateCloud); | 
|---|
|  | 39 |  | 
|---|
| [7679] | 40 | CREATE_FACTORY(CloudEffect, CL_CLOUD_EFFECT); | 
|---|
|  | 41 |  | 
|---|
|  | 42 | CloudEffect::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 |  | 
|---|
| [8255] | 51 | if(cloudActivate) | 
|---|
|  | 52 | this->activate(); | 
|---|
| [7679] | 53 | } | 
|---|
|  | 54 |  | 
|---|
|  | 55 | CloudEffect::~CloudEffect() | 
|---|
|  | 56 | { | 
|---|
|  | 57 | this->deactivate(); | 
|---|
|  | 58 |  | 
|---|
| [8255] | 59 | delete this->cloudMaterial; | 
|---|
| [7784] | 60 |  | 
|---|
| [8255] | 61 | cloudModel.Delete(); | 
|---|
|  | 62 | Shader::unload(this->cloudShader); | 
|---|
| [7784] | 63 |  | 
|---|
| [7679] | 64 | } | 
|---|
|  | 65 |  | 
|---|
|  | 66 |  | 
|---|
|  | 67 | bool CloudEffect::init() | 
|---|
|  | 68 | { | 
|---|
| [8255] | 69 | PRINTF(1)("Initializing CloudEffect\n"); | 
|---|
| [7768] | 70 |  | 
|---|
| [8255] | 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; | 
|---|
| [7768] | 77 |  | 
|---|
| [8255] | 78 | this->cloudTexture = "pictures/sky/cloud1.jpg"; | 
|---|
| [7679] | 79 |  | 
|---|
| [8255] | 80 | cloudModel.Load("sky.sgl"); | 
|---|
|  | 81 | cloudModel.Unitize(); | 
|---|
| [7768] | 82 |  | 
|---|
| [8255] | 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"); | 
|---|
| [7768] | 89 |  | 
|---|
| [8255] | 90 | // Tell the shader the bounding box of the sky dome | 
|---|
|  | 91 | this->cloudShader->bindShader("bbox", bbox, 4); | 
|---|
| [7784] | 92 |  | 
|---|
| [8255] | 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); | 
|---|
| [7768] | 98 |  | 
|---|
| [7679] | 99 | } | 
|---|
|  | 100 |  | 
|---|
|  | 101 |  | 
|---|
| [8255] | 102 | void CloudEffect::loadParams(const TiXmlElement* root) | 
|---|
| [7768] | 103 | { | 
|---|
| [8255] | 104 | WeatherEffect::loadParams(root); | 
|---|
| [7768] | 105 |  | 
|---|
| [8255] | 106 | // LoadParam(root, "speed", this, CloudEffect, setCloudAnimation); | 
|---|
|  | 107 | // LoadParam(root, "texture", this, CloudEffect, setCloudTexture); | 
|---|
| [7768] | 108 |  | 
|---|
| [8255] | 109 | LOAD_PARAM_START_CYCLE(root, element); | 
|---|
|  | 110 | { | 
|---|
|  | 111 | LoadParam_CYCLE(element, "option", this, CloudEffect, setCloudOption); | 
|---|
|  | 112 | } | 
|---|
|  | 113 | LOAD_PARAM_END_CYCLE(element); | 
|---|
|  | 114 | } | 
|---|
| [7768] | 115 |  | 
|---|
|  | 116 |  | 
|---|
| [8255] | 117 | bool CloudEffect::activate() | 
|---|
| [7679] | 118 | { | 
|---|
| [8255] | 119 | PRINTF(0)( "Activating CloudEffect with Material %s\n", this->cloudTexture.c_str()); | 
|---|
| [7784] | 120 |  | 
|---|
| [8255] | 121 | this->cloudActivate = true; | 
|---|
|  | 122 |  | 
|---|
| [7768] | 123 | } | 
|---|
| [7679] | 124 |  | 
|---|
| [8255] | 125 | bool CloudEffect::deactivate() | 
|---|
| [7768] | 126 | { | 
|---|
| [8255] | 127 | PRINTF(0)("Deactivating CloudEffect\n"); | 
|---|
|  | 128 |  | 
|---|
|  | 129 | this->cloudActivate = false; | 
|---|
| [7679] | 130 | } | 
|---|
| [7768] | 131 |  | 
|---|
| [8255] | 132 | void CloudEffect::draw() const | 
|---|
| [7768] | 133 | { | 
|---|
| [8255] | 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(); | 
|---|
| [7768] | 150 |  | 
|---|
| [8255] | 151 | // ****** | 
|---|
| [7768] | 152 |  | 
|---|
| [8255] | 153 | glMatrixMode(GL_MODELVIEW); | 
|---|
|  | 154 | glPushMatrix(); | 
|---|
| [7768] | 155 |  | 
|---|
| [8255] | 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); | 
|---|
| [7768] | 164 |  | 
|---|
| [8255] | 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}; | 
|---|
| [7768] | 167 |  | 
|---|
| [8255] | 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]); | 
|---|
| [7768] | 171 |  | 
|---|
| [8255] | 172 | // Turn off the depth buffer when rendering the background | 
|---|
|  | 173 | // glDisable(GL_DEPTH_TEST); | 
|---|
| [7768] | 174 |  | 
|---|
| [8255] | 175 | this->cloudShader->activateShader(); | 
|---|
| [7768] | 176 |  | 
|---|
| [8255] | 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); | 
|---|
| [7768] | 182 |  | 
|---|
| [8255] | 183 | glActiveTexture(GL_TEXTURE0 + 0); | 
|---|
|  | 184 | glActiveTexture(GL_TEXTURE0 + 1); | 
|---|
| [7768] | 185 |  | 
|---|
| [8255] | 186 | // Load the cloud texture | 
|---|
|  | 187 | //glBindTexture(GL_TEXTURE_2D, g_cloud_texture); | 
|---|
|  | 188 | this->cloudMaterial->select(); | 
|---|
| [7768] | 189 |  | 
|---|
| [8255] | 190 | // Render the sky dome | 
|---|
|  | 191 | cloudModel.Render(); | 
|---|
| [7768] | 192 |  | 
|---|
| [8255] | 193 | // Unselect the shader | 
|---|
|  | 194 | Shader::deactivateShader(); | 
|---|
| [7768] | 195 |  | 
|---|
| [8255] | 196 | /* Turn on the depth buffer when rendering the foreground. */ | 
|---|
|  | 197 | // glEnable(GL_DEPTH_TEST); | 
|---|
| [7768] | 198 |  | 
|---|
| [8255] | 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 |  | 
|---|
| [7768] | 213 | } | 
|---|
|  | 214 |  | 
|---|
| [8255] | 215 | void CloudEffect::tick (float dt) | 
|---|
| [7768] | 216 | { | 
|---|
| [8255] | 217 | if (!this->cloudActivate) | 
|---|
|  | 218 | return; | 
|---|
| [7768] | 219 |  | 
|---|
| [8255] | 220 | // Update the timer for scrolling the clouds | 
|---|
|  | 221 | time = time + ((1.0f / 2000.0f) * cloudScroll); | 
|---|
| [7768] | 222 | } | 
|---|
| [7784] | 223 |  | 
|---|