Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/atmospheric_engine/src/lib/graphics/effects/cloud_effect.h @ 8716

Last change on this file since 8716 was 8713, checked in by hdavid, 19 years ago

branches/atmospheric_engine

File size: 2.9 KB
Line 
1/**
2* @file cloud_effect.h
3*/
4
5#ifndef _CLOUD_EFFECT
6#define _CLOUD_EFFECT
7
8#include "weather_effect.h"
9
10#include "sound_buffer.h"
11#include "sound_source.h"
12
13#include "world_entity.h"
14#include "material.h"
15#include "shader.h"
16
17#define MAXB 0x100
18#define N 0x1000
19#define NP 12   /* 2^N */
20#define NM 0xfff
21
22#define s_curve(t) ( t * t * (3. - 2. * t) )
23#define lerp(t, a, b) ( a + t * (b - a) )
24#define setup(i,b0,b1,r0,r1)\
25        t = vec[i] + N;\
26        b0 = ((int)t) & BM;\
27        b1 = (b0+1) & BM;\
28        r0 = t - (int)t;\
29        r1 = r0 - 1.;
30#define at2(rx,ry) ( rx * q[0] + ry * q[1] )
31#define at3(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )
32
33
34#define DTOR (PI/180.0f)
35#define SQR(x) (x*x)
36
37typedef struct {
38  float x,y,z;
39  unsigned int color;
40  float u, v;
41} VERTEX;
42
43
44class CloudEffect : public WeatherEffect
45{
46public:
47  CloudEffect(const TiXmlElement* root = NULL);
48  virtual ~CloudEffect();
49
50  virtual void loadParams(const TiXmlElement* root);
51
52  virtual void init();
53
54  virtual void activate();
55  virtual void deactivate();
56
57  inline void activateCloud()
58  { this->activate(); }
59 
60  inline void deactivateCloud()
61  { this->deactivate(); }
62 
63  inline void setCloudOption(const std::string& option)
64  {
65    if (option == "activate")
66      this->cloudActivate = true;
67  }
68 
69  inline void setAnimationSpeed(float speed)
70  { this->animationSpeed = speed; }
71
72  inline void setCloudScale(float scale)
73  { this->scale = scale; }
74 
75  inline void setPlanetRadius(float planetRadius)
76  { this->planetRadius = planetRadius; }
77 
78  inline void setAtmosphericRadius(float atmosphericRadius)
79  { this->atmosphericRadius = atmosphericRadius; }
80 
81  inline void setDivisions(int divs)
82  { this->divs = divs; }
83 
84  virtual void draw() const;
85  virtual void tick(float dt);
86
87  void make3DNoiseTexture();
88  void initNoise();
89  void SetNoiseFrequency(int frequency);
90  double noise3(double vec[3]);
91  void normalize2(double v[2]);
92  void normalize3(double v[3]);
93
94  void generateSkyPlane(int divisions, float planetRadius, float atmosphereRadius,
95                        float hTile, float vTile);
96private:
97
98  bool             cloudActivate;
99  float            animationSpeed;
100
101  // Material                 cloudMaterial;
102 
103  // SHADER STUFF
104  Shader*          shader;
105  Shader::Uniform* offset;
106  float            offsetZ;
107  float            scale;
108  float            planetRadius;
109  float            atmosphericRadius;
110  int              divs;
111
112  // NOISE STUFF
113  int              noise3DTexSize;
114  GLuint           noise3DTexName;
115  GLubyte          *noise3DTexPtr;
116
117  int              p[MAXB + MAXB + 2];
118  double           g3[MAXB + MAXB + 2][3];
119  double           g2[MAXB + MAXB + 2][2];
120  double           g1[MAXB + MAXB + 2];
121
122  int              start;
123  int              B;
124  int              BM;
125 
126  // SKYPLANE STUFF
127  VERTEX *planeVertices;
128  int numPlaneVertices;
129
130  int *indices;
131  int numIndices;
132
133  float pRadius;
134 
135  VERTEX *vertices;
136  int numVertices;
137};
138
139#endif  /* _CLOUD_EFFECT */
Note: See TracBrowser for help on using the repository browser.