Changeset 8255 in orxonox.OLD for trunk/src/lib
- Timestamp:
- Jun 8, 2006, 3:44:12 PM (19 years ago)
- Location:
- trunk/src/lib
- Files:
-
- 16 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/graphics/effects/cloud_effect.cc
r7810 r8255 11 11 ### File Specific: 12 12 main-programmer: hdavid, amaechler 13 14 INSPIRED BY http://www.codesampler.com/usersrc/usersrc_6.htm#oglu_sky_dome_shader 13 15 */ 14 16 … … 17 19 #include "util/loading/load_param.h" 18 20 #include "util/loading/factory.h" 21 #include "util/loading/resource_manager.h" 19 22 20 23 #include "glincl.h" 21 //#include "graphics_engine.h"24 #include "material.h" 22 25 #include <math.h> 26 #include "state.h" 27 #include "p_node.h" 28 #include "shader.h" 29 #include "shell_command.h" 23 30 24 31 #include "parser/tinyxml/tinyxml.h" 25 32 33 #include "sglmodel.h" 34 26 35 using namespace std; 36 37 SHELL_COMMAND(activate, CloudEffect, activateCloud); 38 SHELL_COMMAND(deactivate, CloudEffect, deactivateCloud); 27 39 28 40 CREATE_FACTORY(CloudEffect, CL_CLOUD_EFFECT); … … 37 49 this->loadParams(root); 38 50 39 this->activate(); 51 if(cloudActivate) 52 this->activate(); 40 53 } 41 54 … … 43 56 { 44 57 this->deactivate(); 45 } 58 59 delete this->cloudMaterial; 60 61 cloudModel.Delete(); 62 Shader::unload(this->cloudShader); 63 64 } 65 66 67 bool 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 46 101 47 102 void CloudEffect::loadParams(const TiXmlElement* root) … … 49 104 WeatherEffect::loadParams(root); 50 105 51 LoadParam(root, "animSpeed", this, CloudEffect, setCloudAnimation); 52 53 } 54 55 56 bool CloudEffect::init() 57 { 58 // default values 59 this->cloudAnimTimeStep = 0; 60 61 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 62 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 63 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 64 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 65 66 // Generate noise map a 67 CloudEffect::genNoiseMap(cloudMap32_a); 68 69 if (this->cloudAnimTimeStep > 0) { 70 // Generate noise map b 71 CloudEffect::genNoiseMap(cloudMap32_b); 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); 72 112 } 73 } 113 LOAD_PARAM_END_CYCLE(element); 114 } 115 74 116 75 117 bool CloudEffect::activate() 76 118 { 77 PRINTF(0)( "Activating CloudEffect\n"); 78 if (this->cloudAnimTimeStep == 0) { 79 for (int i = 0; i < 32*32; i++) 80 cloudMap32_c[i] = cloudMap32_a[i]; 81 82 CloudEffect::overlapOctaves(); 83 CloudEffect::expFilter(); 84 CloudEffect::genCloudTexture(); 85 } 119 PRINTF(0)( "Activating CloudEffect with Material %s\n", this->cloudTexture.c_str()); 120 121 this->cloudActivate = true; 122 86 123 } 87 124 … … 89 126 { 90 127 PRINTF(0)("Deactivating CloudEffect\n"); 91 } 92 93 void CloudEffect::genCloudTexture() { 94 for(int i=0; i<256; i++) 95 for(int j=0; j<256; j++) 96 { 97 float color = cloudMap256[i*256+j]; 98 cloudTexture[i][j][0] = (char) color; 99 cloudTexture[i][j][1] = (char) color; 100 cloudTexture[i][j][2] = (char) color; 101 } 102 103 glGenTextures(2, &texID[0]); 104 glBindTexture(GL_TEXTURE_2D, texID[0]); 105 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, cloudTexture); 106 } 107 108 void CloudEffect::calcAnimMap(float timer) { 109 110 for (int x=0; x<32*32; x++) 111 cloudMap32_c[x] = (cloudMap32_a[x] * ((this->cloudAnimTimeStep - timer) / this->cloudAnimTimeStep)) + (cloudMap32_b[x] * (timer / this->cloudAnimTimeStep)); 112 128 129 this->cloudActivate = false; 113 130 } 114 131 115 132 void CloudEffect::draw() const 116 133 { 117 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 118 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); 119 154 glPushMatrix(); 120 glEnable(GL_TEXTURE_2D); 121 122 glBindTexture(GL_TEXTURE_2D, texID[0]); 123 124 // FIXME : Bind this to the sky - how do I do this? 125 glBegin(GL_QUADS); 126 glTexCoord2f(0.0f, 0.0f); glVertex3f(20, 20, 60); // Bottom Left Of The Texture and Quad 127 glTexCoord2f(1.0f, 0.0f); glVertex3f(60, 20, 60); // Bottom Right Of The Texture and Quad 128 glTexCoord2f(1.0f, 1.0f); glVertex3f(60, 60, 60); // Top Right Of The Texture and Quad 129 glTexCoord2f(0.0f, 1.0f); glVertex3f(20, 60, 60); // Top Left Of The Texture and Quad 130 glEnd(); 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); 131 210 132 211 glPopMatrix(); 212 133 213 } 134 214 135 215 void CloudEffect::tick (float dt) 136 216 { 137 if (this->cloudAnimTimeStep > 0) { 138 if (timer >= this->cloudAnimTimeStep) { 139 timer -= this->cloudAnimTimeStep; 140 for (int i = 0; i < 32*32; i++) 141 cloudMap32_a[i] = cloudMap32_b[i]; 142 CloudEffect::genNoiseMap(cloudMap32_b); 143 } 144 145 //map32anim = (map32a * (10 - timer)) + (map32b * timer); 146 CloudEffect::calcAnimMap(timer); 147 148 CloudEffect::overlapOctaves(); 149 CloudEffect::expFilter(); 150 CloudEffect::genCloudTexture(); 151 152 timer += dt; 153 } 154 } 155 156 /* 157 Random noise generator 158 */ 159 float CloudEffect::noise(int x, int y, int random) 160 { 161 int n = x + y * 57 + random * 131; 162 n = (n<<13) ^ n; 163 return (1.0f - ( (n * (n * n * 15731 + 789221) + 164 1376312589)&0x7fffffff)* 0.000000000931322574615478515625f); 165 } 166 167 /* 168 Set noise for the 32*32 noise map: 169 */ 170 void CloudEffect::genNoiseMap(float *map) 171 { 172 float temp[34][34]; 173 174 int random = rand() % 5000; 175 176 for (int y = 1; y < 33; y++) 177 for (int x = 1; x < 33; x++) 178 temp[x][y] = 128.0f + CloudEffect::noise(x, y, random) * 128.0f; 179 180 // Seamless cloud 181 for (int x=1; x<33; x++) 182 { 183 temp[0][x] = temp[32][x]; 184 temp[33][x] = temp[1][x]; 185 temp[x][0] = temp[x][32]; 186 temp[x][33] = temp[x][1]; 187 } 188 temp[0][0] = temp[32][32]; 189 temp[33][33] = temp[1][1]; 190 temp[0][33] = temp[32][1]; 191 temp[33][0] = temp[1][32]; 192 193 // We mirror the side and corner elements so our final cloud will be seamless without any ugly borders showing. 194 for (int y=1; y<33; y++) 195 for (int x=1; x<33; x++) 196 { 197 float center = temp[x][y]/4.0f; 198 float sides = (temp[x+1][y] + temp[x-1][y] + temp[x][y+1] + temp[x][y-1])/8.0f; 199 float corners = (temp[x+1][y+1] + temp[x+1][y-1] + temp[x-1][y+1] + temp[x-1][y-1])/16.0f; 200 201 map[((x-1)*32) + (y-1)] = center + sides + corners; 202 } 203 } 204 205 /* 206 Interpolation - average the value of each pixel value with that of its neighbors' values. 207 */ 208 float CloudEffect::interpolate(float x, float y, float *map) 209 { 210 int Xint = (int)x; 211 int Yint = (int)y; 212 213 float Xfrac = x - Xint; 214 float Yfrac = y - Yint; 215 216 int X0 = Xint % 32; 217 int Y0 = Yint % 32; 218 int X1 = (Xint + 1) % 32; 219 int Y1 = (Yint + 1) % 32; 220 221 float bot = map[X0*32 + Y0] + Xfrac * (map[X1*32 + Y0] - map[X0*32 + Y0]); 222 float top = map[X0*32 + Y1] + Xfrac * (map[X1*32 + Y1] - map[X0*32 + Y1]); 223 224 return (bot + Yfrac * (top - bot)); 225 } 226 227 228 /* 229 Octaves are overlapped together to give cloud more turbulence. We will use four octaves for our cloud. 230 */ 231 void CloudEffect::overlapOctaves() 232 { 233 for (int x=0; x<256*256; x++) 234 { 235 cloudMap256[x] = 0; 236 } 237 238 for (int octave=0; octave<4; octave++) 239 for (int x=0; x<256; x++) 240 for (int y=0; y<256; y++) 241 { 242 float scale = 1 / pow(2.0f, (float) 3-octave); 243 float noise = CloudEffect::interpolate(x*scale, y*scale , cloudMap32_c); 244 245 //The octaves are added together with the proper weight factors. 246 //You could replace pow(2, i) with 1<<i for faster computation 247 cloudMap256[(y*256) + x] += noise / pow(2.0f, (float) octave); 248 } 249 } 250 251 252 /* 253 Filter the noise with exponential function 254 */ 255 void CloudEffect::expFilter() 256 { 257 float cover = 20.0f; 258 float sharpness = 0.95f; 259 260 for (int x=0; x<256*256; x++) 261 { 262 float c = cloudMap256[x] - (255.0f-cover); 263 if (c<0) c = 0; 264 cloudMap256[x] = 255.0f - ((float)(pow(sharpness, c))*255.0f); 265 } 266 } 267 268 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 -
trunk/src/lib/graphics/effects/cloud_effect.h
r7810 r8255 6 6 #define _CLOUD_EFFECT 7 7 8 #include "vector.h"9 #include "vector2D.h"10 11 8 #include "weather_effect.h" 12 9 13 10 #include "sound_buffer.h" 14 11 #include "sound_source.h" 12 13 #include "world_entity.h" 14 #include "glincl.h" 15 16 #include "sglmodel.h" 17 18 class Shader; 19 class Material; 20 class Vector; 15 21 16 22 class CloudEffect : public WeatherEffect … … 27 33 virtual bool deactivate(); 28 34 35 inline void activateCloud() { this->activate(); } 36 inline void deactivateCloud() { this->deactivate(); } 37 29 38 virtual void draw() const; 30 39 virtual void tick(float dt); 31 40 32 inline void setCloudAnimation(float timestep) { this->cloudAnimTimeStep = timestep; } 41 inline void setCloudOption(const std::string& option) { 42 if (option == "activate") this->cloudActivate = true; 43 } 44 33 45 34 46 private: 35 // Basic noise maps 32x32 36 float cloudMap32_a[32 * 32]; 37 float cloudMap32_b[32 * 32]; 38 float cloudMap32_c[32 * 32]; 47 void initialize(char* fileName); 39 48 40 // The cloud map 256x256 41 float cloudMap256[256 * 256]; 49 bool cloudActivate; 42 50 43 // Temporary array to hold texture RGB values 44 char cloudTexture[256][256][3]; 51 Material* cloudMaterial; // A Material for the Sphere. 45 52 46 GLuint texID[2]; 47 float timer; 53 std::string cloudTexture; 48 54 49 bool cloudAnimTimeStep; 55 Sglmodel_sgl cloudModel; 56 Shader* cloudShader; 50 57 51 float noise(int x, int y, int random); 52 float interpolate(float x, float y, float *map); 53 void overlapOctaves(); 54 void expFilter(); 58 GLfloat cloudTint[4]; 59 GLfloat cloudScroll; 55 60 56 void genNoiseMap(float *map); 57 void genCloudTexture(); 58 void calcAnimMap(float timer); 61 float time; 59 62 60 63 }; -
trunk/src/lib/graphics/effects/fog_effect.cc
r7810 r8255 20 20 #include "glincl.h" 21 21 22 /*#include "shell_command.h"23 SHELL_COMMAND(activateFog, FogEffect, FogEffect::activate) 24 ->setAlias("aFog");25 SHELL_COMMAND(deactivate Fog, FogEffect, FogEffect::deactivate)26 ->setAlias("dFog");*/ 22 #include "shell_command.h" 23 24 SHELL_COMMAND(activate, FogEffect, activateFog); 25 SHELL_COMMAND(deactivate, FogEffect, deactivateFog); 26 SHELL_COMMAND(startfogging, FogEffect, startFogging); 27 27 28 28 using namespace std; … … 39 39 this->loadParams(root); 40 40 41 this->activate(); 41 if (this->fogActivate) 42 this->activate(); 42 43 } 43 44 … … 57 58 LoadParam(root, "range", this, FogEffect, setFogRange); 58 59 LoadParam(root, "color", this, FogEffect, setFogColor); 60 61 LOAD_PARAM_START_CYCLE(root, element); 62 { 63 LoadParam_CYCLE(element, "option", this, FogEffect, setFogOption); 64 } 65 LOAD_PARAM_END_CYCLE(element); 59 66 } 60 67 … … 62 69 { 63 70 //default values 71 this->fogActivate = false; 72 this->fogFadeDuration = 0; 73 this->localTimer = 0; 74 64 75 this->fogMode = GL_EXP2; 65 76 this->fogDensity = 0.001; 66 77 this->fogStart = 0; 67 78 this->fogEnd = 5000; 68 this->colorVector = Vector(0.7, 0.7, 0.7); 79 this->colorVector = Vector(0.7, 0.7, 0.7); 80 69 81 } 70 71 82 72 83 … … 75 86 PRINTF(0)( "Enabling FogEffect, mode: %i, density: %f, start: %f, end: %f, color %f, %f, %f\n", this->fogMode, this->fogDensity, this->fogStart, this->fogEnd, this->colorVector.x, this->colorVector.y, this->colorVector.z); 76 87 88 this->fogActivate = true; 89 90 GLfloat fogColor[4] = { colorVector.x, colorVector.y, colorVector.z, 1.0}; 91 glFogi(GL_FOG_MODE, this->fogMode); 92 glFogfv(GL_FOG_COLOR, fogColor); 93 glFogf(GL_FOG_DENSITY, this->fogDensity); 94 glHint(GL_FOG_HINT, GL_DONT_CARE); 95 glFogf(GL_FOG_START, this->fogStart); 96 glFogf(GL_FOG_END, this->fogEnd); 97 77 98 glEnable(GL_FOG); 78 { 79 GLfloat fogColor[4] = { colorVector.x, colorVector.y, colorVector.z, 1.0}; 80 81 glFogi(GL_FOG_MODE, this->fogMode); 82 glFogfv(GL_FOG_COLOR, fogColor); 83 glFogf(GL_FOG_DENSITY, this->fogDensity); 84 glHint(GL_FOG_HINT, GL_DONT_CARE); 85 glFogf(GL_FOG_START, this->fogStart); 86 glFogf(GL_FOG_END, this->fogEnd); 87 } 88 glClearColor(0.5, 0.5, 0.5, 1.0); 99 // glClearColor(0.5, 0.5, 0.5, 1.0); 89 100 } 90 101 … … 93 104 { 94 105 PRINTF(0)("Deactivating FogEffect\n"); 106 107 this->fogActivate = false; 108 95 109 glDisable(GL_FOG); 110 } 111 112 void FogEffect::draw() const { 113 114 if (this->fogFadeDuration != 0 && this->localTimer < this->fogFadeDuration) 115 glFogf(GL_FOG_DENSITY, this->fogFadeDensity); 116 //else 117 // glFogf(GL_FOG_DENSITY, this->fogDensity); 118 119 } 120 void FogEffect::tick(float dt) 121 { 122 if (!this->fogActivate) 123 return; 124 125 126 if (this->fogFadeDuration != 0 && this->localTimer < this->fogFadeDuration) { 127 this->localTimer += dt; 128 float progress = this->localTimer / this->fogFadeDuration; 129 this->fogFadeDensity = progress * this->fogDensity; 130 } 131 } 132 133 void FogEffect::startFogging() { 134 135 if (this->fogActivate) 136 this->deactivate(); 137 138 this->fogFadeDuration = 10; 139 this->localTimer = 0; 140 this->activate(); 141 96 142 } 97 143 -
trunk/src/lib/graphics/effects/fog_effect.h
r7810 r8255 23 23 virtual bool deactivate(); 24 24 25 void activateFog() { this->activate(); } 26 void deactivateFog() { this->deactivate(); } 27 28 virtual void draw() const; 29 virtual void tick(float dt); 30 25 31 inline void setFogMode(const std::string& mode) { this->fogMode = this->stringToFogMode(mode); } 26 32 inline void setFogDensity(float density) { this->fogDensity = density; } 27 33 inline void setFogRange(float start, float end) { this->fogStart = start; this->fogEnd = end; } 28 34 inline void setFogColor(float r, float g, float b) { this->colorVector = Vector(r, g, b); } 35 inline void setFogOption(const std::string& option) { if (option == "activate") this->fogActivate = true; } 36 37 void startFogging(); 29 38 30 39 private: 31 40 GLint stringToFogMode(const std::string& mode); 32 41 33 private: 34 GLint fogMode; 35 GLfloat fogDensity; 36 GLfloat fogStart; 37 GLfloat fogEnd; 38 Vector colorVector; 42 bool fogActivate; 43 GLfloat fogFadeDuration; 44 float localTimer; 45 46 GLint fogMode; 47 GLfloat fogDensity; 48 GLfloat fogFadeDensity; 49 50 GLfloat fogStart; 51 GLfloat fogEnd; 52 Vector colorVector; 39 53 }; 40 54 -
trunk/src/lib/graphics/effects/lightening_effect.cc
r7810 r8255 18 18 #include "util/loading/load_param.h" 19 19 #include "util/loading/factory.h" 20 #include " render2D/image_plane.h"20 #include "effects/billboard.h" 21 21 22 22 #include "glincl.h" 23 23 #include "parser/tinyxml/tinyxml.h" 24 24 25 #include "shell_command.h" 26 #include "light.h" 27 28 SHELL_COMMAND(activate, LighteningEffect, activateLightening); 29 SHELL_COMMAND(deactivate, LighteningEffect, deactivateLightening); 30 25 31 using namespace std; 26 32 … … 30 36 { 31 37 this->setClassID(CL_LIGHTENING_EFFECT, "LighteningEffect"); 32 33 34 lightening = new ImagePlane(NULL);35 lightening->setTexture("maps/lightning_bolt.png");36 lightening->setSize(50, 50);37 lightening->setAbsCoor2D(10,10);38 lightening->setVisibility(true);39 40 38 41 39 this->init(); … … 44 42 this->loadParams(root); 45 43 46 this->activate(); 44 if(this->lighteningActivate) 45 this->activate(); 47 46 } 48 47 … … 50 49 { 51 50 this->deactivate(); 52 delete lightening;53 51 } 54 52 … … 56 54 { 57 55 WeatherEffect::loadParams(root); 56 57 LoadParam(root, "coord", this, LighteningEffect, coord); 58 LoadParam(root, "option", this, LighteningEffect, setLighteningOption); 59 LoadParam(root, "frequency", this, LighteningEffect, setFlashFrequency); 60 LoadParam(root, "const-time", this, LighteningEffect, setFlashConstTime); 61 LoadParam(root, "rising-time", this, LighteningEffect, setFlashRisingTime); 62 LoadParam(root, "size", this, LighteningEffect, setFlashSize); 63 LoadParam(root, "seed", this, LighteningEffect, setFlashSeed); 58 64 } 59 65 … … 61 67 bool LighteningEffect::init() 62 68 { 63 //Default values 69 lighteningActivate = false; 70 71 this->time = 0.0; 72 this->flashFrequency = 1.4f; 73 this->flashConstTime = 0.5f; 74 this->flashRisingTime = 0.1f; 75 76 this->width = 400.0f; 77 this->height = 100.0f; 78 this->seedWidth = 50; 79 this->seedHeight = 50; 80 this->bNewCoordinate = false; 81 82 this->seedX = 500.f; 83 this->seedZ = 1000.0f; 84 this->seedTime = 4.0f; 85 86 this->billboard[0] = new Billboard(NULL); 87 this->billboard[0]->setTexture("maps/lightning_bolt1.png"); 88 this->billboard[0]->setSize(this->width, this->height); 89 this->billboard[0]->setAbsCoor(3000,850,0); 90 this->billboard[0]->setVisibiliy(false); 91 92 this->billboard[1] = new Billboard(NULL); 93 this->billboard[1]->setTexture("maps/lightning_bolt2.png"); 94 this->billboard[1]->setSize(this->width, this->height); 95 this->billboard[1]->setAbsCoor(3000,850,0); 96 this->billboard[1]->setVisibiliy(false); 97 98 this->billboard[2] = new Billboard(NULL); 99 this->billboard[2]->setTexture("maps/lightning_bolt3.png"); 100 this->billboard[2]->setSize(this->width, this->height); 101 this->billboard[2]->setAbsCoor(3000,850,0); 102 this->billboard[2]->setVisibiliy(false); 103 104 this->billboard[3] = new Billboard(NULL); 105 this->billboard[3]->setTexture("maps/lightning_bolt4.png"); 106 this->billboard[3]->setSize(this->width, this->height); 107 this->billboard[3]->setAbsCoor(0.0f, 50.0f, 0.0f); 108 this->billboard[3]->setVisibiliy(false); 109 /* 110 this->soundSource = NULL; 111 this->thunderBuffer = NULL; 112 113 this->soundSource.setSourceNode(this); 114 115 //load sound 116 if (this->thunderBuffer != NULL) 117 ResourceManager::getInstance()->unload(this->thunderBuffer); 118 this->thunderBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/thunder.wav", WAV);*/ 119 } 120 121 void LighteningEffect::coord(float x, float y, float z) 122 { 123 this->billboard[0]->setAbsCoor(x, y, z); 124 this->billboard[1]->setAbsCoor(x, y, z); 125 this->billboard[2]->setAbsCoor(x, y, z); 126 this->billboard[3]->setAbsCoor(x, y, z); 127 this->mainPosX = x; 128 this->mainPosY = y; 129 this->mainPosZ = z; 130 } 131 132 133 void LighteningEffect::setFlashSize(float width, float height, float seedWidth, float seedHeight) 134 { 135 this->width = width; 136 this->height = height; 137 this->seedWidth = seedWidth; 138 this->seedHeight = seedHeight; 139 this->billboard[0]->setSize(this->width, this->height); 140 this->billboard[1]->setSize(this->width, this->height); 141 this->billboard[2]->setSize(this->width, this->height); 142 this->billboard[3]->setSize(this->width, this->height); 64 143 } 65 144 … … 68 147 { 69 148 PRINTF(0)( "Activating LighteningEffect\n" ); 70 149 this->time = 0; 150 lighteningActivate = true; 71 151 } 72 152 … … 75 155 { 76 156 PRINTF(0)("Deactivating LighteningEffect\n"); 157 this->billboard[0]->setVisibiliy(false); 158 this->billboard[1]->setVisibiliy(false); 159 this->billboard[2]->setVisibiliy(false); 160 this->billboard[3]->setVisibiliy(false); 161 lighteningActivate = false; 77 162 } 78 163 79 164 void LighteningEffect::tick (float dt) 80 165 { 81 82 } 166 if(!lighteningActivate) 167 return; 168 169 this->time += dt; 170 171 /*if( flashLight != NULL) 172 { 173 if((int)(100*time)%2) 174 this->flashLight->setDiffuseColor(0,0,0); 175 else 176 this->flashLight->setDiffuseColor(100,100,100); 177 178 //PRINTF(0)("100*time: %f %i\n", 100*time, (int)(100*time)); 179 }*/ 180 181 if( this->time > this->flashFrequency) 182 { 183 this->billboard[0]->setVisibiliy(true); 184 this->time = 0.0f; 185 186 this->flashLight = new Light(); 187 this->flashLight->setAbsCoor(this->billboard[0]->getAbsCoor().x, this->billboard[0]->getAbsCoor().y, this->billboard[0]->getAbsCoor().z); 188 this->flashLight->setDiffuseColor(100,100,100); 189 190 //this->soundSource.play(this->thunderBuffer); 191 } 192 else if( this->billboard[3]->isVisible() && this->time > this->flashConstTime) 193 { 194 this->billboard[3]->setVisibiliy(false); 195 this->time = 0.0f; 196 this->bNewCoordinate = true; 197 198 if(flashLight != NULL) 199 { 200 delete this->flashLight; 201 flashLight = NULL; 202 } 203 } 204 205 if( this->billboard[2]->isVisible() && this->time > this->flashRisingTime) 206 { 207 this->billboard[2]->setVisibiliy(false); 208 this->billboard[3]->setVisibiliy(true); 209 this->flashLight->setDiffuseColor(100,100,100); 210 } 211 else if( this->billboard[1]->isVisible() && this->time > this->flashRisingTime*2/3 ) 212 { 213 this->billboard[1]->setVisibiliy(false); 214 this->billboard[2]->setVisibiliy(true); 215 this->flashLight->setDiffuseColor(0,0,0); 216 } 217 else if( this->billboard[0]->isVisible() && this->time > this->flashRisingTime*1/3 ) 218 { 219 this->billboard[0]->setVisibiliy(false); 220 this->billboard[1]->setVisibiliy(true); 221 this->flashLight->setDiffuseColor(100,100,100); 222 } 223 224 if( this->bNewCoordinate) 225 { 226 float posX = this->mainPosX - this->seedX * (float)rand()/(float)RAND_MAX; 227 float posZ = this->mainPosZ + this->seedZ * (float)rand()/(float)RAND_MAX; 228 this->billboard[0]->setAbsCoor(posX, this->mainPosY, posZ); 229 this->billboard[1]->setAbsCoor(posX, this->mainPosY, posZ); 230 this->billboard[2]->setAbsCoor(posX, this->mainPosY, posZ); 231 this->billboard[3]->setAbsCoor(posX, this->mainPosY, posZ); 232 this->bNewCoordinate = false; 233 } 234 } 235 236 void LighteningEffect::draw() const 237 { 238 } -
trunk/src/lib/graphics/effects/lightening_effect.h
r7810 r8255 15 15 16 16 17 class ImagePlane; 17 class Billboard; 18 class Light; 18 19 19 20 class LighteningEffect : public WeatherEffect … … 30 31 virtual bool deactivate(); 31 32 32 virtual void tick(float dt); 33 virtual void draw() const; 34 virtual void tick(float dt); 35 36 void coord(float x, float y, float z); 37 void setFlashSize(float width, float height, float seedWidth, float seedHeight); 38 39 inline void setLighteningOption(const std::string& option) { if (option == "activate") this->lighteningActivate = true;} 40 inline void setFlashFrequency(float flashFrequency) { this->flashFrequency = flashFrequency; } 41 inline void setFlashConstTime(float flashConstTime) { this->flashConstTime = flashConstTime; } 42 inline void setFlashRisingTime(float flashRisingTime) { if(flashRisingTime > this->flashConstTime) 43 this->flashRisingTime = this->flashConstTime/2; 44 else 45 this->flashRisingTime = flashRisingTime; } 46 inline void setFlashSeed(float seedX, float seedZ, float seedTime) { this->seedX = seedX; 47 this->seedZ = seedZ; 48 this->seedTime = seedTime; } 33 49 50 void activateLightening() { this->activate(); } 51 void deactivateLightening() { this->deactivate(); } 52 34 53 private: 35 ImagePlane* lightening; 54 Billboard* billboard[4]; 55 bool lighteningActivate; 56 57 float flashFrequency; 58 float flashConstTime; 59 float flashRisingTime; 60 61 float time; 62 63 bool bNewCoordinate; 64 float width; 65 float height; 66 float seedWidth; 67 float seedHeight; 68 69 float seedX; 70 float seedZ; 71 float seedTime; 72 73 float mainPosX; 74 float mainPosY; 75 float mainPosZ; 76 77 Light* flashLight; 78 79 //OrxSound::SoundSource soundSource; 80 //OrxSound::SoundBuffer* thunderBuffer; 36 81 37 82 }; -
trunk/src/lib/graphics/effects/rain_effect.cc
r7810 r8255 1 1 /* 2 3 4 5 6 7 8 9 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 10 11 11 ### File Specific: 12 12 main-programmer: hdavid, amaechler 13 13 */ 14 14 … … 25 25 #include "plane_emitter.h" 26 26 #include "shell_command.h" 27 #include "light.h" 27 28 28 29 #include "parser/tinyxml/tinyxml.h" … … 31 32 SHELL_COMMAND(deactivate, RainEffect, deactivateRain); 32 33 34 SHELL_COMMAND(startRaining, RainEffect, startRaining); 35 33 36 using namespace std; 34 37 35 38 CREATE_FACTORY(RainEffect, CL_RAIN_EFFECT); 39 40 // TODO: Dim Light with Rain, Finish preCaching, check out if multiple rain emitters work, Think about what happens with building poss. to hang movewithcam off, benchmark, possible to activate lightening, turn off visibility when in a building, variable emitter size depending on playable, also rain velocity 36 41 37 42 RainEffect::RainEffect(const TiXmlElement* root) … … 50 55 51 56 //load wind sound 52 if (this->rainWindForce >0) {57 if (this->rainWindForce != 0) { 53 58 if (this->windBuffer != NULL) 54 59 ResourceManager::getInstance()->unload(this->windBuffer); … … 56 61 } 57 62 58 this->activate(); 63 if(rainActivate) 64 this->activate(); 59 65 } 60 66 … … 80 86 LoadParam(root, "life", this, RainEffect, setRainLife); 81 87 LoadParam(root, "wind", this, RainEffect, setRainWind); 82 LoadParam(root, "option", this, RainEffect, setRainOption); 88 LoadParam(root, "startraining", this, RainEffect, setRainStart); 89 90 LOAD_PARAM_START_CYCLE(root, element); 91 { 92 LoadParam_CYCLE(element, "option", this, RainEffect, setRainOption); 93 } 94 LOAD_PARAM_END_CYCLE(element); 95 83 96 } 84 97 … … 87 100 { 88 101 //Default values 102 this->rainActivate = false; 103 this->rainMove = false; 89 104 this->rainCoord = Vector(500, 500, 500); 90 105 this->rainSize = Vector2D(1000, 1000); … … 94 109 this->rainMaxParticles = this->rainRate * this->rainLife; 95 110 this->rainWindForce = 0; 111 this->rainStartDuration = 0; 112 this->localTimer = 0; 113 this->soundRainVolume = 0.8f; 96 114 97 115 this->emitter = new PlaneEmitter(this->rainSize); 116 117 lightMan = LightManager::getInstance(); 118 this->rainAmbient = lightMan->getAmbientColor(); 98 119 } 99 120 … … 104 125 { 105 126 PRINTF(0)( "Activating RainEffect, coord: %f, %f, %f, size: %f, %f, rate: %f, velocity: %f, moveRain: %s\n", this->rainCoord.x, this->rainCoord.y, this->rainCoord.z, this->rainSize.x, this-> rainSize.y, this->rainRate, this->rainVelocity, this->rainMove ? "true" : "false" ); 127 128 this->rainActivate = true; 106 129 107 130 if (unlikely(RainEffect::rainParticles == NULL)) … … 114 137 RainEffect::rainParticles->setRadius(0.2, 0.02); 115 138 RainEffect::rainParticles->setRadius(1, 0.01); 116 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2); 117 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2); 118 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2); 139 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2); // grey blue 1 140 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2); // grey blue 2 141 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2); // light grey 119 142 } 120 143 … … 128 151 this->emitter->setSpread(this->rainWindForce / 50, 0.2); 129 152 130 this->soundSource.loop(this->rainBuffer); 131 if (this->rainWindForce > 0) 132 this->soundSource.loop(this->windBuffer); 153 this->soundSource.loop(this->rainBuffer, this->soundRainVolume); 154 if (this->rainWindForce != 0) this->soundSource.loop(this->windBuffer, 0.1f * this->rainWindForce); 155 156 lightMan->setAmbientColor(.1,.1,.1); 133 157 } 134 158 … … 137 161 { 138 162 PRINTF(0)("Deactivating RainEffect\n"); 163 164 this->rainActivate = false; 139 165 this->emitter->setSystem(NULL); 140 166 167 // Stop Sound 141 168 this->soundSource.stop(); 142 } 143 144 void RainEffect::activateRain() 145 { 146 this->activate(); 147 } 148 149 void RainEffect::deactivateRain() 150 { 151 this->deactivate(); 152 } 153 169 170 // Restore Light Ambient 171 lightMan->setAmbientColor(this->rainAmbient, this->rainAmbient, this->rainAmbient); 172 } 154 173 155 174 void RainEffect::tick (float dt) 156 175 { 176 if (!this->rainActivate) 177 return; 178 157 179 if (this->rainMove) { 158 180 this->rainCoord = State::getCameraNode()->getAbsCoor(); 159 181 this->emitter->setRelCoor(this->rainCoord.x , this->rainCoord.y+800, this->rainCoord.z); 160 182 } 161 } 183 184 if (this->rainStartDuration != 0 && this->localTimer < this->rainStartDuration) { 185 this->localTimer += dt; 186 float progress = this->localTimer / this->rainStartDuration; 187 188 // Dim Light 189 lightMan->setAmbientColor(1.1 - progress, 1.1 - progress, 1.1 - progress); 190 191 // use alpha in color to fade in 192 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1 193 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2 194 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2 * progress); // light grey 195 196 // increase radius for more "heavy" rain 197 RainEffect::rainParticles->setRadius(0, 0.03 * progress); 198 RainEffect::rainParticles->setRadius(0.2, 0.02 * progress); 199 RainEffect::rainParticles->setRadius(1, 0.01 * progress); 200 201 // increase sound volume 202 // this->soundSource.fadein(this->rainBuffer, 10); 203 } 204 205 } 206 207 void RainEffect::startRaining() { 208 209 if (this->rainActivate) 210 this->deactivate(); 211 212 this->rainStartDuration = 10; 213 this->localTimer = 0; 214 this->activate(); 215 216 } -
trunk/src/lib/graphics/effects/rain_effect.h
r7810 r8255 14 14 class SparkParticles; 15 15 class PlainEmitter; 16 class LightManager; 16 17 17 18 #include "weather_effect.h" … … 34 35 virtual bool deactivate(); 35 36 36 void activateRain(); 37 void deactivateRain(); 37 virtual void tick(float dt); 38 38 39 virtual void tick(float dt); 39 inline void activateRain() { this->activate(); } 40 inline void deactivateRain() { this->deactivate(); } 41 void startRaining(); 40 42 41 43 inline void setRainCoord(float x, float y, float z) { this->rainCoord = Vector(x, y, z); } … … 45 47 inline void setRainLife(float life) { this->rainLife = life; } 46 48 inline void setRainWind(int force) { this->rainWindForce = force; } 47 inline void setRainOption(const std::string& option) { if (option == "moverain") this->rainMove = true; } 49 inline void setRainStart(float duration) { this->rainStartDuration = duration; } 50 51 inline void setRainOption(const std::string& option) { 52 if (option == "moverain") this->rainMove = true; 53 if (option == "activate") this->rainActivate = true; 54 } 48 55 49 56 50 57 private: 51 static SparkParticles* 52 ParticleEmitter* 58 static SparkParticles* rainParticles; 59 ParticleEmitter* emitter; 53 60 54 Vector rainCoord; 55 Vector2D rainSize; 56 GLfloat rainRate; 57 GLfloat rainVelocity; 58 GLfloat rainLife; 59 GLfloat rainMaxParticles; 60 int rainWindForce; 61 bool rainMove; 61 float localTimer; 62 63 Vector rainCoord; 64 Vector2D rainSize; 65 GLfloat rainRate; 66 GLfloat rainVelocity; 67 GLfloat rainLife; 68 GLfloat rainMaxParticles; 69 int rainWindForce; 70 GLfloat rainStartDuration; 71 bool rainMove; 72 bool rainActivate; 62 73 63 74 OrxSound::SoundSource soundSource; 64 75 OrxSound::SoundBuffer* rainBuffer; 65 76 OrxSound::SoundBuffer* windBuffer; 77 78 float soundRainVolume; 79 80 LightManager* lightMan; 81 GLfloat rainAmbient; 82 66 83 }; 67 84 68 69 85 #endif /* _RAIN_EFFECT */ -
trunk/src/lib/graphics/effects/snow_effect.cc
r7810 r8255 53 53 } 54 54 55 this->activate(); 55 if(snowActivate) 56 this->activate(); 56 57 } 57 58 … … 75 76 LoadParam(root, "emissionRate", this, SnowEffect, emissionRate); 76 77 LoadParam(root, "emissionVelocity", this, SnowEffect, emissionVelocity); 77 78 LoadParam(root, "wind", this, SnowEffect, wind); 78 79 LoadParam(root, "size", this, SnowEffect, size); 79 80 LoadParam(root, "coord", this, SnowEffect, coord); 81 82 LOAD_PARAM_START_CYCLE(root, element); 83 { 84 LoadParam_CYCLE(element, "option", this, SnowEffect, setSnowOption); 85 } 86 LOAD_PARAM_END_CYCLE(element); 80 87 } 81 88 … … 85 92 86 93 // Default values 94 this->snowActivate = false; 95 this->snowMove = false; 87 96 this->particles = 12000; 88 97 this->texture = "maps/snow_flake_01_32x32.png"; … … 100 109 this->alpha = 0.5; 101 110 this->snowSize = Vector2D(2500, 2500); 102 111 this->snowCoord = Vector(100,450,400); 103 112 this->snowWindForce = 1; 104 105 this->activated = false;106 113 } 107 114 … … 109 116 { 110 117 PRINTF(0)("Activating SnowEffect\n"); 111 activated = true; 118 119 this->snowActivate = true; 112 120 113 121 SnowEffect::snowParticles = new SpriteParticles(particles); … … 131 139 this->emitter->setSize(snowSize); 132 140 133 //SnowEffect::snowParticles->precache(8);141 // SnowEffect::snowParticles->precache(8); 134 142 135 143 if (this->snowWindForce > 1) … … 141 149 { 142 150 PRINTF(0)("Deactivating SnowEffect\n"); 143 activated = false; 144 151 152 this->snowActivate = false; 145 153 this->emitter->setSystem(NULL); 146 154 … … 150 158 } 151 159 152 void SnowEffect::activateSnow() 153 { 160 void SnowEffect::draw() const 161 { 162 if (!this->snowActivate) 163 return; 164 } 165 166 void SnowEffect::tick(float dt) 167 { 168 if (!this->snowActivate) 169 return; 170 171 /* 172 float distance = (State::getCameraNode()->getAbsCoor() - Vector(snowCoord.x, State::getCameraNode()->getAbsCoor().y, snowCoord.z)).len(); 173 174 if(activated) 175 { 176 if(distance > 0.3*snowSize.x || distance > 0.3*snowSize.y) 177 this->deactivate(); 178 else if(distance > 0.25*snowSize.x || distance > 0.25*snowSize.y) 179 this->alpha = 0.15; 180 else if(distance > 0.2*snowSize.x || distance > 0.2*snowSize.y) 181 this->alpha = 0.25; 182 else if(distance > 0.1*snowSize.x || distance > 0.1*snowSize.y) 183 this->alpha = 0.4; 184 185 SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha); 186 SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2); 187 SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0); 188 } 189 else 190 { 191 if(distance < 0.3*snowSize.x || distance < 0.3*snowSize.y ) 154 192 this->activate(); 155 } 156 157 void SnowEffect::deactivateSnow() 158 { 159 this->deactivate(); 160 } 161 162 void SnowEffect::draw() const 163 { 164 } 165 166 void SnowEffect::tick(float dt) 167 { 168 float distance = (State::getCameraNode()->getAbsCoor() - Vector(snowCoord.x, State::getCameraNode()->getAbsCoor().y, snowCoord.z)).len(); 169 170 if(activated) 171 { 172 if(distance > 0.3*snowSize.x || distance > 0.3*snowSize.y) 173 this->deactivate(); 174 else if(distance > 0.25*snowSize.x || distance > 0.25*snowSize.y) 175 this->alpha = 0.15; 176 else if(distance > 0.2*snowSize.x || distance > 0.2*snowSize.y) 177 this->alpha = 0.25; 178 else if(distance > 0.1*snowSize.x || distance > 0.1*snowSize.y) 179 this->alpha = 0.4; 180 181 SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha); 182 SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2); 183 SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0); 184 } 185 else 186 { 187 if(distance < 0.3*snowSize.x || distance < 0.3*snowSize.y ) 188 this->activate(); 189 if( distance < 0.25*snowSize.x || distance < 0.25*snowSize.y ) 190 this->alpha = 0.25; 191 else if( distance < 0.2*snowSize.x || distance < 0.2*snowSize.y ) 192 this->alpha = 0.4; 193 else if( distance < 0.1*snowSize.x || distance < 0.1*snowSize.y ) 194 this->alpha = 0.5; 195 196 SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha); 197 SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2); 198 SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0); 199 } 200 } 201 193 if( distance < 0.25*snowSize.x || distance < 0.25*snowSize.y ) 194 this->alpha = 0.25; 195 else if( distance < 0.2*snowSize.x || distance < 0.2*snowSize.y ) 196 this->alpha = 0.4; 197 else if( distance < 0.1*snowSize.x || distance < 0.1*snowSize.y ) 198 this->alpha = 0.5; 199 200 SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha); 201 SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2); 202 SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0); 203 }*/ 204 205 if (this->snowMove) { 206 this->snowCoord = State::getCameraNode()->getAbsCoor(); 207 this->emitter->setRelCoor(this->snowCoord.x , this->snowCoord.y+300, this->snowCoord.z); 208 } 209 } -
trunk/src/lib/graphics/effects/snow_effect.h
r7810 r8255 33 33 virtual bool deactivate(); 34 34 35 inline void activateSnow() { this->activate(); } 36 inline void deactivateSnow() { this->deactivate(); } 37 35 38 virtual void draw() const; 36 39 virtual void tick(float dt); 37 40 38 void activateSnow();39 void deactivateSnow();40 41 41 42 inline void numParticles(int n) { this->particles = n; } … … 48 49 inline void size(float sizeX, float sizeY) { this->snowSize = Vector2D(sizeX, sizeY); } 49 50 inline void coord(float x, float y, float z) { this->snowCoord = Vector(x, y, z); } 50 inline void wind(int force) { this->snowWindForce = force; } 51 inline void wind(int force) { this->snowWindForce = force; } 52 53 inline void setSnowOption(const std::string& option) { 54 /*if (option == "fade") this->snowFade = true;*/ 55 if (option == "movesnow") this->snowMove = true; 56 if (option == "activate") this->snowActivate = true; 57 } 51 58 52 59 53 60 private: 54 int 55 std::string 56 float 57 float 58 float 59 float 60 float 61 float 62 float 63 Vector 64 Vector2D 65 int 61 int particles; 62 std::string texture; 63 float life, randomLife; 64 float snowRadius, randomRadius; 65 float snowMass, randomMass; 66 float rate; 67 float velocity, randomVelocity; 68 float angle, randomAngle; 69 float alpha; 70 Vector snowCoord; 71 Vector2D snowSize; 72 int snowWindForce; 66 73 67 bool activated; 74 bool snowMove; 75 bool snowActivate; 68 76 69 PlaneEmitter* 77 PlaneEmitter* emitter; 70 78 71 static SpriteParticles* 72 OrxSound::SoundSource 73 OrxSound::SoundBuffer* 79 static SpriteParticles* snowParticles; 80 OrxSound::SoundSource soundSource; 81 OrxSound::SoundBuffer* windBuffer; 74 82 75 83 }; -
trunk/src/lib/graphics/effects/weather_effect.cc
r7810 r8255 15 15 */ 16 16 17 // TODO: descriptions to loadparams, movealong unified, start activation 17 18 18 19 #include "weather_effect.h" -
trunk/src/lib/graphics/light.h
r6512 r8255 1 1 /*! 2 3 2 * @file light.h 3 * Handles Lights. 4 4 5 6 7 5 A Light is one of the more important things in a 3D-environment, 6 without it one sees nothing :) 7 It is here for diffuse-, specular- and Bump-Mappings. 8 8 */ 9 9 … … 25 25 class Light : public PNode 26 26 { 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 27 public: 28 Light(const TiXmlElement* root = NULL); 29 virtual ~Light(); 30 31 virtual void loadParams(const TiXmlElement* root); 32 33 void setDiffuseColor(GLfloat r, GLfloat g, GLfloat b); 34 void setSpecularColor(GLfloat r, GLfloat g, GLfloat b); 35 void setAttenuation(float constantAttenuation, float linearAttenuation, float quadraticAttenuation); 36 void setSpotDirection(const Vector& direction); 37 void setSpotDirection(float x, float y, float z) { setSpotDirection(Vector(x,y,z)); }; 38 void setSpotCutoff(GLfloat cutoff); 39 40 /** @returns the lightNumber*/ 41 int getLightNumber() const {return this->lightNumber;} 42 43 virtual void draw() const; 44 45 void debug() const; 46 47 // attributes 48 private: 49 int lightNumber; //!< The number of this Light. 50 GLfloat diffuseColor[4]; //!< The Diffuse Color this Light emmits. 51 GLfloat specularColor[4]; //!< The specular Color of this Light. 52 float constantAttenuation; //!< The Factor of the the Constant Attenuation. 53 float linearAttenuation; //!< The Factor of the the Linear Attenuation. 54 float quadraticAttenuation; //!< The Factor of the the Quadratic Attenuation. 55 GLfloat spotDirection[4]; //!< The direction of the Spot Light. 56 GLfloat spotCutoff; //!< The cutoff Angle of the Light Source 57 57 }; 58 59 60 58 59 60 61 61 //! A class that handles Lights 62 62 /** 63 63 A Light is a source that emits light rays (photons) 64 64 65 66 67 68 69 65 <b>Usage:</b>\n 66 First you have to get the Light Manager up and running by using LightManager::getInstance(). 67 This automatically initiates the GL_LIGHTING, and sets some default stuff about the light.\n 68 Then you will create a new light using: 69 \li new Light(); 70 70 71 72 71 if you want to operate on this Light just apply the following functions onto it. 72 (You can also optain the Light-pointer with LightManager::getInstance()->getLight(lightNumber)) 73 73 74 75 76 77 78 79 80 74 now you can operate on the light as follows: 75 \li void setDiffuseColor(GLfloat r, GLfloat g, GLfloat b); 76 \li void setSpecularColor(GLfloat r, GLfloat g, GLfloat b); 77 \li void setAttenuation(float constantAttenuation, float linearAttenuation, float quadraticAttenuation); 78 \li void setSpotDirection(Vector direction); 79 \li void setSpotCutoff(GLfloat cutoff); 80 \li all PNode stuff also works 81 81 82 83 82 To redraw the light use 83 \li void draw() const; (this is automatically done by the LightManager) 84 84 85 86 85 for some nice output just use: 86 \li void debug() const; (either on LightManager for a resume or on any Light for single information.) 87 87 */ 88 88 class LightManager : public BaseObject 89 {90 89 { 90 friend class Light; 91 91 92 93 94 95 92 public: 93 virtual ~LightManager(); 94 /** @returns a Pointer to the only object of this Class */ 95 inline static LightManager* getInstance() { if (!singletonRef) singletonRef = new LightManager(); return singletonRef; }; 96 96 97 98 97 virtual void loadParams(const TiXmlElement* root); 98 void loadLights(const TiXmlElement* root); 99 99 100 void setAmbientColor(GLfloat r, GLfloat g, GLfloat b); 100 void setAmbientColor(GLfloat r, GLfloat g, GLfloat b); 101 // HACK: Assuming r = g = b values 102 inline GLfloat getAmbientColor() { return this->ambientColor[0]; } 101 103 102 103 104 Light* getLight(int lightNumber) const; 105 inline Light* getLight() const { return this->currentLight; }; 104 106 105 107 void draw() const; 106 108 107 109 void debug() const; 108 110 109 110 111 private: 112 LightManager(); 111 113 112 113 114 int registerLight(Light* light); 115 void unregisterLight(Light* light); 114 116 115 116 117 117 private: 118 static LightManager* singletonRef; //!< This is the LightHandlers Reference. 119 GLfloat ambientColor[4]; //!< The ambient Color of the scene. 118 120 119 120 121 Light** lights; //!< An array of Lenght NUMBEROFLIGHTS, that holds pointers to all LightValues. 122 Light* currentLight; //!< The current Light, we are working with. 121 123 122 124 }; -
trunk/src/lib/graphics/shader.cc
r8037 r8255 201 201 } 202 202 203 void Shader::bindShader(const char* name, const float* value, size_t size) 204 { 205 if (likely (this->shaderProgram != 0)) { 206 glUseProgramObjectARB(this->shaderProgram); 207 208 unsigned int location = glGetUniformLocationARB(this->shaderProgram, name); 209 /* This is EXPENSIVE and should be avoided. */ 210 211 if (size == 1) glUniform1fvARB(location, 1, value); 212 else if (size == 2) glUniform2fvARB(location, 1, value); 213 else if (size == 3) glUniform3fvARB(location, 1, value); 214 else if (size == 4) glUniform4fvARB(location, 1, value); 215 else if (size == 9) glUniformMatrix3fvARB(location, 1, false, value); 216 else if (size == 16) glUniformMatrix4fvARB(location, 1, false, value); 217 218 } 219 } 220 203 221 void Shader::deactivateShader() 204 222 { -
trunk/src/lib/graphics/shader.h
r8037 r8255 96 96 static bool checkShaderAbility(); 97 97 void activateShader(); 98 void bindShader(const char* name, const float* value, size_t size); 98 99 static void deactivateShader(); 99 100 -
trunk/src/lib/sound/sound_source.cc
r7810 r8255 1 1 /* 2 3 4 5 6 7 8 9 10 11 12 13 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: Benjamin Grauer 13 co-programmer: ... 14 14 */ 15 15 … … 24 24 namespace OrxSound 25 25 { 26 /** 27 * @brief creates a SoundSource at position sourceNode with the SoundBuffer buffer 28 */ 29 SoundSource::SoundSource(const PNode* sourceNode, const SoundBuffer* buffer) 30 { 31 this->setClassID(CL_SOUND_SOURCE, "SoundSource"); 32 33 // adding the Source to the SourcesList of the SoundEngine 34 this->buffer = buffer; 35 this->sourceNode = sourceNode; 36 this->resident = false; 37 38 this->sourceID = 0; 39 this->bPlay = false; 40 } 41 42 43 /** 44 * @brief construct a SoundSource out of the another soundSource 45 * @param source the Source to create this source from. 46 * 47 * Copies the buffer from source to this Source. 48 * Acquires a new SourceID if source is Playing. 49 */ 50 SoundSource::SoundSource(const SoundSource& source) 51 { 52 this->setClassID(CL_SOUND_SOURCE, "SoundSource"); 53 54 // adding the Source to the SourcesList of the SoundEngine 55 this->buffer = source.buffer; 56 this->sourceNode = source.sourceNode; 57 this->resident = source.resident; 58 59 this->sourceID = 0; 60 if (source.bPlay == true) 61 { 62 this->bPlay = true; 63 SoundEngine::getInstance()->popALSource(this->sourceID); 64 } 65 else 66 this->bPlay = false; 67 } 68 69 70 /** 71 * @brief paste a copy of the source into this Source. 72 * @param source the SoundSource to paste into this one. 73 * @returns a Reference to this Source. 74 * 75 */ 76 SoundSource& SoundSource::operator=(const SoundSource& source) 77 { 78 this->buffer = source.buffer; 79 this->sourceNode = sourceNode; 80 this->resident = source.resident; 81 82 if (source.bPlay) 83 this->play(); 84 else 85 this->stop(); 86 } 87 88 89 /** 90 * @brief compares two Sources with each other. 91 * @param source the Source to compare against this One. 92 * Two Sources are the same, if the PNodes match, and the Sound Played are the same. 93 * The alSource must not match, because no two Sources can have the same alSource. 94 */ 95 bool SoundSource::operator==(const SoundSource& source) 96 { 97 return (this->buffer == source.buffer && 98 this->bPlay == source.bPlay && 99 this->sourceNode == source.sourceNode); 100 } 101 102 103 /** 104 * @brief deletes a SoundSource 105 */ 106 SoundSource::~SoundSource() 107 { 108 this->stop(); 109 if (this->sourceID != 0) 110 SoundEngine::getInstance()->pushALSource(this->sourceID); 111 } 112 113 114 /** 115 * @brief Plays back a SoundSource 116 */ 117 void SoundSource::play() 118 { 119 if (this->buffer && this->retrieveSource()) 120 { 121 if (this->bPlay) 122 alSourceStop(this->sourceID); 123 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 124 alSourcei (this->sourceID, AL_LOOPING, AL_FALSE ); 125 alSourcePlay(this->sourceID); 126 127 if (DEBUG_LEVEL >= 3) 128 SoundEngine::checkError("Play Source", __LINE__); 129 this->bPlay = true; 130 } 131 } 132 133 134 /** 135 * @brief Plays back buffer on this Source 136 * @param buffer the buffer to play back on this Source 137 */ 138 void SoundSource::play(const SoundBuffer* buffer) 139 { 140 if (!this->retrieveSource()) 141 { 142 PRINTF(3)("No more Free sources (You might consider raising the Source-Count).\n"); 143 return; 144 } 145 146 alSourceStop(this->sourceID); 147 alSourcei (this->sourceID, AL_BUFFER, buffer->getID()); 148 alSourcei (this->sourceID, AL_LOOPING, AL_FALSE ); 149 alSourcePlay(this->sourceID); 150 151 if (unlikely(this->buffer != NULL)) 152 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 153 this->bPlay = true; 154 155 if (DEBUG_LEVEL >= 3) 156 SoundEngine::checkError("Play Source", __LINE__); 157 } 158 159 160 /** 161 * @brief Plays and loops buffer on this Source 162 * @param buffer the buffer to play back on this Source 163 */ 164 void SoundSource::loop(const SoundBuffer* buffer) 165 { 166 if (this->buffer && this->retrieveSource()) 167 { 168 if (this->bPlay) 169 alSourceStop(this->sourceID); 170 171 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 172 alSourcei (this->sourceID, AL_LOOPING, AL_TRUE ); 173 alSourcePlay(this->sourceID); 174 175 if (DEBUG_LEVEL >= 3) 176 SoundEngine::checkError("Play LoopSource", __LINE__); 177 this->bPlay = true; 178 } 26 /** 27 * @brief creates a SoundSource at position sourceNode with the SoundBuffer buffer 28 */ 29 SoundSource::SoundSource(const PNode* sourceNode, const SoundBuffer* buffer) 30 { 31 this->setClassID(CL_SOUND_SOURCE, "SoundSource"); 32 33 // adding the Source to the SourcesList of the SoundEngine 34 this->buffer = buffer; 35 this->sourceNode = sourceNode; 36 this->resident = false; 37 38 this->sourceID = 0; 39 this->bPlay = false; 40 } 41 42 43 /** 44 * @brief construct a SoundSource out of the another soundSource 45 * @param source the Source to create this source from. 46 * 47 * Copies the buffer from source to this Source. 48 * Acquires a new SourceID if source is Playing. 49 */ 50 SoundSource::SoundSource(const SoundSource& source) 51 { 52 this->setClassID(CL_SOUND_SOURCE, "SoundSource"); 53 54 // adding the Source to the SourcesList of the SoundEngine 55 this->buffer = source.buffer; 56 this->sourceNode = source.sourceNode; 57 this->resident = source.resident; 58 59 this->sourceID = 0; 60 if (source.bPlay == true) 61 { 62 this->bPlay = true; 63 SoundEngine::getInstance()->popALSource(this->sourceID); 64 } 65 else 66 this->bPlay = false; 67 } 68 69 70 /** 71 * @brief paste a copy of the source into this Source. 72 * @param source the SoundSource to paste into this one. 73 * @returns a Reference to this Source. 74 * 75 */ 76 SoundSource& SoundSource::operator=(const SoundSource& source) 77 { 78 this->buffer = source.buffer; 79 this->sourceNode = sourceNode; 80 this->resident = source.resident; 81 82 if (source.bPlay) 83 this->play(); 84 else 85 this->stop(); 86 } 87 88 89 /** 90 * @brief compares two Sources with each other. 91 * @param source the Source to compare against this One. 92 * Two Sources are the same, if the PNodes match, and the Sound Played are the same. 93 * The alSource must not match, because no two Sources can have the same alSource. 94 */ 95 bool SoundSource::operator==(const SoundSource& source) 96 { 97 return (this->buffer == source.buffer && 98 this->bPlay == source.bPlay && 99 this->sourceNode == source.sourceNode); 100 } 101 102 103 /** 104 * @brief deletes a SoundSource 105 */ 106 SoundSource::~SoundSource() 107 { 108 this->stop(); 109 if (this->sourceID != 0) 110 SoundEngine::getInstance()->pushALSource(this->sourceID); 111 } 112 113 114 /** 115 * @brief Plays back a SoundSource 116 */ 117 void SoundSource::play() 118 { 119 if (this->buffer && this->retrieveSource()) 120 { 121 if (this->bPlay) 122 alSourceStop(this->sourceID); 123 124 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 125 alSourcei (this->sourceID, AL_LOOPING, AL_FALSE); 126 alSourcef (this->sourceID, AL_GAIN, 1); 127 alSourcePlay(this->sourceID); 128 129 if (DEBUG_LEVEL >= 3) 130 SoundEngine::checkError("Play Source", __LINE__); 131 this->bPlay = true; 132 } 133 } 134 135 136 /** 137 * @brief Plays back buffer on this Source 138 * @param buffer the buffer to play back on this Source 139 */ 140 void SoundSource::play(const SoundBuffer* buffer) 141 { 142 if (!this->retrieveSource()) 143 { 144 PRINTF(3)("No more Free sources (You might consider raising the Source-Count).\n"); 145 return; 146 } 147 148 alSourceStop(this->sourceID); 149 alSourcei (this->sourceID, AL_BUFFER, buffer->getID()); 150 alSourcei (this->sourceID, AL_LOOPING, AL_FALSE); 151 alSourcef (this->sourceID, AL_GAIN, 1); 152 153 alSourcePlay(this->sourceID); 154 155 if (unlikely(this->buffer != NULL)) 156 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 157 this->bPlay = true; 158 159 if (DEBUG_LEVEL >= 3) 160 SoundEngine::checkError("Play Source", __LINE__); 161 } 162 163 164 /** 165 * @brief Plays back buffer on this Source with gain 166 * @param buffer the buffer to play back on this Source 167 */ 168 void SoundSource::play(const SoundBuffer* buffer, float gain) 169 { 170 if (!this->retrieveSource()) 171 { 172 PRINTF(3)("No more Free sources (You might consider raising the Source-Count).\n"); 173 return; 174 } 175 176 alSourceStop(this->sourceID); 177 alSourcei (this->sourceID, AL_BUFFER, buffer->getID()); 178 alSourcei (this->sourceID, AL_LOOPING, AL_FALSE); 179 alSourcef (this->sourceID, AL_GAIN, gain); 180 181 alSourcePlay(this->sourceID); 182 183 if (unlikely(this->buffer != NULL)) 184 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 185 this->bPlay = true; 186 187 if (DEBUG_LEVEL >= 3) 188 SoundEngine::checkError("Play Source", __LINE__); 189 } 190 191 192 /** 193 * @brief Plays and loops back a SoundSource 194 */ 195 void SoundSource::loop() 196 { 197 if (this->buffer && this->retrieveSource()) 198 { 199 if (this->bPlay) 200 alSourceStop(this->sourceID); 201 202 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 203 alSourcei (this->sourceID, AL_LOOPING, AL_TRUE); 204 alSourcef (this->sourceID, AL_GAIN, 1); 205 alSourcePlay(this->sourceID); 206 207 if (DEBUG_LEVEL >= 3) 208 SoundEngine::checkError("Play Source", __LINE__); 209 this->bPlay = true; 210 } 211 } 212 213 /** 214 * @brief Plays and loops buffer on this Source 215 * @param buffer the buffer to play back on this Source 216 */ 217 void SoundSource::loop(const SoundBuffer* buffer) 218 { 219 if (this->buffer && this->retrieveSource()) 220 { 221 if (this->bPlay) 222 alSourceStop(this->sourceID); 223 224 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 225 alSourcei (this->sourceID, AL_LOOPING, AL_TRUE); 226 alSourcef (this->sourceID, AL_GAIN, 1); 227 228 alSourcePlay(this->sourceID); 229 230 if (DEBUG_LEVEL >= 3) 231 SoundEngine::checkError("Loop Source", __LINE__); 232 this->bPlay = true; 233 } 234 } 235 236 237 /** 238 * @brief Plays and loops buffer on this Source with gain control 239 * @param buffer the buffer to play back on this Source 240 */ 241 void SoundSource::loop(const SoundBuffer* buffer, float gain) 242 { 243 if (this->buffer && this->retrieveSource()) 244 { 245 if (this->bPlay) 246 alSourceStop(this->sourceID); 247 248 alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID()); 249 alSourcei (this->sourceID, AL_LOOPING, AL_TRUE); 250 alSourcef (this->sourceID, AL_GAIN, gain); 251 252 alSourcePlay(this->sourceID); 253 254 if (DEBUG_LEVEL >= 3) 255 SoundEngine::checkError("Loop Source", __LINE__); 256 this->bPlay = true; 257 } 258 } 259 260 261 /** 262 * @brief Stops playback of a SoundSource 263 */ 264 void SoundSource::stop() 265 { 266 this->bPlay = false; 267 if (this->sourceID != 0) 268 { 269 this->bPlay = false; 270 if (this->sourceID != 0) 271 { 272 alSourceStop(this->sourceID); 273 if (DEBUG_LEVEL >= 3) 274 SoundEngine::checkError("StopSource", __LINE__); 275 alSourcei(this->sourceID, AL_BUFFER, 0); 276 if (!this->resident) 277 SoundEngine::getInstance()->pushALSource(this->sourceID); 278 this->sourceID = 0; 279 } 280 } 281 } 282 283 /** 284 * @brief Pauses Playback of a SoundSource 285 */ 286 void SoundSource::pause() 287 { 288 alSourcePause(this->sourceID); 289 if (DEBUG_LEVEL >= 3) 290 SoundEngine::checkError("Pause Source", __LINE__); 291 } 292 293 294 /** 295 * @brief Rewinds Playback of a SoundSource 296 */ 297 void SoundSource::rewind() 298 { 299 alSourceRewind(this->sourceID); 300 301 if (DEBUG_LEVEL >= 3) 302 SoundEngine::checkError("Rewind Source", __LINE__); 303 } 304 305 306 /** 307 * @brief sets the RolloffFactor of the Sound emitted from the SoundSource 308 * @param rolloffFactor The Factor described 309 * 310 * this tells openAL how fast the Sounds decay outward from the Source 311 */ 312 void SoundSource::setRolloffFactor(ALfloat rolloffFactor) 313 { 314 alSourcef(this->sourceID, AL_ROLLOFF_FACTOR, rolloffFactor); 315 316 if (DEBUG_LEVEL >= 3) 317 SoundEngine::checkError("Set Source Rolloff-factor", __LINE__); 318 } 319 320 321 /** 322 * @brief sets the Positional this Source should be attached to. 323 * @param sourceNode the Source this is attached to. 324 * If sourceNode == NULL then the Source will be centered, and Audio will be played on all channels. 325 */ 326 void SoundSource::setSourceNode(const PNode* sourceNode) 327 { 328 this->sourceNode = sourceNode; 329 } 330 331 /** 332 * @brief retrieve a Source. 333 */ 334 bool SoundSource::retrieveSource() 335 { 336 if (this->sourceID != 0) 337 return true; 338 else 339 { 340 SoundEngine::getInstance()->popALSource(this->sourceID); 341 if (this->sourceID != 0) 342 { 343 if (unlikely(this->sourceNode == NULL)) 344 resetSource(this->sourceID); 345 return true; 346 } 347 } 348 return false; 349 } 350 351 352 /** 353 * @brief reset an alSource to its default Values. 354 */ 355 void SoundSource::resetSource(ALuint sourceID) 356 { 357 alSource3f(sourceID, AL_POSITION, 0.0, 0.0, 0.0); 358 alSource3f(sourceID, AL_VELOCITY, 0.0, 0.0, 0.0); 359 alSource3f(sourceID, AL_DIRECTION, 0.0, 0.0, 0.0); 360 alSourcef (sourceID, AL_ROLLOFF_FACTOR, 0.0 ); 361 //alSourcei (sourceID, AL_SOURCE_RELATIVE, AL_TRUE ); 362 alSourcef (sourceID, AL_GAIN, SoundEngine::getInstance()->getEffectsVolume()); 363 } 364 365 366 /** 367 * @brief Fades in a Source over a time period 368 * @param duration time perios to fade in 369 */ 370 void SoundSource::fadein(const SoundBuffer* buffer, ALfloat duration) 371 { 372 //if (this->buffer && this->retrieveSource()) 373 //{ 374 375 for (ALfloat n = 0.0; n < 1.0; n+=.01) 376 { 377 alSourcef(this->sourceID, AL_GAIN, n); 378 // sleep(1); 379 } 380 381 // alSourcePlay(this->sourceID); 382 383 // if (DEBUG_LEVEL >= 3) 384 // SoundEngine::checkError("Loop Source", __LINE__); 385 // this->bPlay = true; 386 //} 387 388 } 389 390 179 391 } 180 181 182 /**183 * @brief Stops playback of a SoundSource184 */185 void SoundSource::stop()186 {187 this->bPlay = false;188 if (this->sourceID != 0)189 {190 this->bPlay = false;191 if (this->sourceID != 0)192 {193 alSourceStop(this->sourceID);194 if (DEBUG_LEVEL >= 3)195 SoundEngine::checkError("StopSource", __LINE__);196 alSourcei(this->sourceID, AL_BUFFER, 0);197 if (!this->resident)198 SoundEngine::getInstance()->pushALSource(this->sourceID);199 this->sourceID = 0;200 }201 }202 }203 204 /**205 * @brief Pauses Playback of a SoundSource206 */207 void SoundSource::pause()208 {209 alSourcePause(this->sourceID);210 if (DEBUG_LEVEL >= 3)211 SoundEngine::checkError("Pause Source", __LINE__);212 }213 214 215 /**216 * @brief Rewinds Playback of a SoundSource217 */218 void SoundSource::rewind()219 {220 alSourceRewind(this->sourceID);221 222 if (DEBUG_LEVEL >= 3)223 SoundEngine::checkError("Rewind Source", __LINE__);224 }225 226 227 /**228 * @brief sets the RolloffFactor of the Sound emitted from the SoundSource229 * @param rolloffFactor The Factor described230 *231 * this tells openAL how fast the Sounds decay outward from the Source232 */233 void SoundSource::setRolloffFactor(ALfloat rolloffFactor)234 {235 alSourcef(this->sourceID, AL_ROLLOFF_FACTOR, rolloffFactor);236 237 if (DEBUG_LEVEL >= 3)238 SoundEngine::checkError("Set Source Rolloff-factor", __LINE__);239 }240 241 242 /**243 * @brief sets the Positional this Source should be attached to.244 * @param sourceNode the Source this is attached to.245 * If sourceNode == NULL then the Source will be centered, and Audio will be played on all channels.246 */247 void SoundSource::setSourceNode(const PNode* sourceNode)248 {249 this->sourceNode = sourceNode;250 }251 252 /**253 * @brief retrieve a Source.254 */255 bool SoundSource::retrieveSource()256 {257 if (this->sourceID != 0)258 return true;259 else260 {261 SoundEngine::getInstance()->popALSource(this->sourceID);262 if (this->sourceID != 0)263 {264 if (unlikely(this->sourceNode == NULL))265 resetSource(this->sourceID);266 return true;267 }268 }269 return false;270 }271 272 273 /**274 * @brief reset an alSource to its default Values.275 */276 void SoundSource::resetSource(ALuint sourceID)277 {278 alSource3f(sourceID, AL_POSITION, 0.0, 0.0, 0.0);279 alSource3f(sourceID, AL_VELOCITY, 0.0, 0.0, 0.0);280 alSource3f(sourceID, AL_DIRECTION, 0.0, 0.0, 0.0);281 alSourcef (sourceID, AL_ROLLOFF_FACTOR, 0.0 );282 //alSourcei (sourceID, AL_SOURCE_RELATIVE, AL_TRUE );283 alSourcef (sourceID, AL_GAIN, SoundEngine::getInstance()->getEffectsVolume());284 }285 } -
trunk/src/lib/sound/sound_source.h
r7810 r8255 1 1 /*! 2 3 2 * @file sound_source.h 3 * @brief Definition of the SoundSource. 4 4 */ 5 5 … … 14 14 namespace OrxSound 15 15 { 16 class SoundBuffer; 17 //! A class that represents a SoundSource 18 class SoundSource : public BaseObject 19 { 20 public: 21 SoundSource(const PNode* sourceNode = NULL, const SoundBuffer* buffer = NULL); 22 SoundSource(const SoundSource& source); 23 SoundSource& operator=(const SoundSource& source); 24 bool operator==(const SoundSource& source); 25 26 virtual ~SoundSource(); 27 28 // user interaction 29 void play(); 30 void play(const SoundBuffer* buffer); 31 void loop(); 32 void loop(const SoundBuffer* buffer); 33 void stop(); 34 void pause(); 35 void rewind(); 36 37 // development functions 38 /** @returns The ID of this Source */ 39 inline ALuint getID() const { return this->sourceID; }; 40 /** @returns true, if the Source is Playing */ 41 inline bool isPlaying() const { return this->bPlay; }; 42 void setSourceNode(const PNode* sourceNode); 43 /** @returns the SoundBuffer of this Source */ 44 inline const SoundBuffer* getBuffer() const { return this->buffer; }; 45 /** @returns the SourceNode of this Source */ 46 inline const PNode* getNode() const { return this->sourceNode; }; 47 /** @param resident if the Source is Resident */ 48 inline void setResident(bool resident) { this->resident = resident; }; 49 /** @returns true if the alSource is Resident */ 50 inline bool isResident() const { return this->resident; }; 51 52 void setRolloffFactor(ALfloat rolloffFactor); 53 54 static void resetSource(ALuint sourceID); 55 56 private: 57 bool retrieveSource(); 58 59 private: 60 bool bPlay; //!< If the Source is Playing. 61 bool resident; //!< If the alSource should be resident (if true, the alSource will be returned on deletion). 62 ALuint sourceID; //!< The ID of the Source 63 const SoundBuffer* buffer; //!< The buffer to play in this source. 64 const PNode* sourceNode; //!< The SourceNode representing the position/velocity... of this source. 65 }; 16 class SoundBuffer; 17 //! A class that represents a SoundSource 18 class SoundSource : public BaseObject 19 { 20 public: 21 SoundSource(const PNode* sourceNode = NULL, const SoundBuffer* buffer = NULL); 22 SoundSource(const SoundSource& source); 23 SoundSource& operator=(const SoundSource& source); 24 bool operator==(const SoundSource& source); 25 26 virtual ~SoundSource(); 27 28 // user interaction 29 void play(); 30 void play(const SoundBuffer* buffer); 31 void play(const SoundBuffer* buffer, float gain); 32 void loop(); 33 void loop(const SoundBuffer* buffer); 34 void loop(const SoundBuffer* buffer, float gain); 35 void stop(); 36 void pause(); 37 void rewind(); 38 void fadein(const SoundBuffer* buffer, ALfloat duration); 39 40 41 // development functions 42 /** @returns The ID of this Source */ 43 inline ALuint getID() const { return this->sourceID; }; 44 /** @returns true, if the Source is Playing */ 45 inline bool isPlaying() const { return this->bPlay; }; 46 void setSourceNode(const PNode* sourceNode); 47 /** @returns the SoundBuffer of this Source */ 48 inline const SoundBuffer* getBuffer() const { return this->buffer; }; 49 /** @returns the SourceNode of this Source */ 50 inline const PNode* getNode() const { return this->sourceNode; }; 51 /** @param resident if the Source is Resident */ 52 inline void setResident(bool resident) { this->resident = resident; }; 53 /** @returns true if the alSource is Resident */ 54 inline bool isResident() const { return this->resident; }; 55 56 void setRolloffFactor(ALfloat rolloffFactor); 57 58 static void resetSource(ALuint sourceID); 59 60 private: 61 bool retrieveSource(); 62 63 private: 64 bool bPlay; //!< If the Source is Playing. 65 bool resident; //!< If the alSource should be resident (if true, the alSource will be returned on deletion). 66 ALuint sourceID; //!< The ID of the Source 67 const SoundBuffer* buffer; //!< The buffer to play in this source. 68 const PNode* sourceNode; //!< The SourceNode representing the position/velocity... of this source. 69 }; 66 70 } 67 71 #endif /* _SOUND_SOURCE_H */
Note: See TracChangeset
for help on using the changeset viewer.