Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/environments/water.cc @ 6659

Last change on this file since 6659 was 6645, checked in by bensch, 19 years ago

orxonox/trunk: totally remastered the ResourceManager.
Now it takes MultiTypes instead of (void*) as parameters

  1. This is TypeSafe
  2. This is easier to use
  3. This makes much more sense, and is objectOriented

also made some minor adjustments to the MultiType, some comparisons

also fixed the loading in all the Other classes like material md2 and so on

File size: 6.0 KB
RevLine 
[4597]1/*
[3416]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:
[4261]12   main-programmer: Benjamin Grauer
13   co-programmer: ...
[3411]14*/
15
[3590]16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
17
[6455]18#include "water.h"
19#include "factory.h"
[5356]20#include "load_param.h"
[3608]21
[6455]22#include "grid.h"
[6457]23#include "material.h"
[6455]24
[6467]25#include "resource_manager.h"
26#include "shader.h"
27
[6470]28#include "skybox.h"
[6467]29
[6470]30
[5356]31using namespace std;
[5357]32
[6455]33CREATE_FACTORY(Water, CL_WATER);
[3608]34
[4010]35
[6455]36Water::Water(const TiXmlElement* root)
[4010]37{
[6456]38  this->setClassID(CL_WATER, "Water");
[6457]39  this->toList(OM_ENVIRON);
[6456]40
[6455]41  this->resX = this->resY = 10;
[6458]42  this->sizeX = this->sizeY = 1.0f;
43  this->height = 0.5f;
[6455]44  this->grid = NULL;
[4010]45
[6518]46  this->velocities = NULL;
47  this->viscosity = 5;
[6522]48  this->cohesion = .0000000001;
[6518]49
[6455]50  if (root != NULL)
51    this->loadParams(root);
[6456]52
53  this->rebuildGrid();
[6457]54  this->waterMaterial = new Material();
[6645]55  this->waterShader = (Shader*)ResourceManager::getInstance()->load("shaders/water.vert", SHADER, RP_GAME, "shaders/water.frag");
[6467]56
[6519]57  this->grid->height(this->grid->columns()/2,this->grid->rows()/2) = 100;
[4010]58}
59
[6455]60Water::~Water()
[4261]61{
[6456]62  delete this->grid;
[6457]63  delete this->waterMaterial;
[4261]64}
65
[6455]66void Water::loadParams(const TiXmlElement* root)
[4010]67{
[6455]68  WorldEntity::loadParams(root);
[4620]69
[6455]70  LoadParam(root, "size", this, Water, setSize)
71      .describe("the size of the WaterSurface")
72      .defaultValues(2, 1.0f, 1.0f);
[6341]73
[6455]74  LoadParam(root, "resolution", this, Water, setResolution)
75      .describe("sets the resolution of the water surface")
76      .defaultValues(2, 10, 10);
[6458]77
78  LoadParam(root, "height", this, Water, setHeight)
79      .describe("the height of the Waves")
80      .defaultValues(1, 0.5f);
[4012]81}
[3803]82
[6455]83void Water::rebuildGrid()
[4012]84{
[6518]85  if (this->velocities != NULL)
86  {
87    assert (this->grid != NULL);
88    for (unsigned int i = 0; i < this->grid->rows(); i++)
89      delete[] this->velocities[i];
90    delete[] this->velocities;
91  }
[6610]92
93//   WE DO NOT NEED THIS AS IT IS DONE IN WORLDENTITY->setModel();
94//   if (this->grid != NULL)
95//     this->grid = NULL;
96
[6455]97  this->grid = new Grid(this->sizeX, this->sizeY, this->resX, this->resY);
[6518]98  this->velocities = new float*[this->resX];
99  for (unsigned int i = 0; i < this->grid->rows(); i++)
[6610]100  {
[6518]101    this->velocities[i] = new float[this->resY];
[6610]102    for (unsigned int j = 0; j < this->resY; j++)
103      this->velocities[i][j] = 0.0;
104  }
[6456]105  this->setModel(this->grid, 0);
[6307]106}
[3411]107
[6455]108void Water::setResolution(unsigned int resX, unsigned int resY)
[3803]109{
[6455]110  this->resX = resX;
111  this->resY = resY;
[3803]112}
113
[6455]114void Water::setSize(float sizeX, float sizeY)
[3803]115{
[6455]116  this->sizeX = sizeX;
117  this->sizeY = sizeY;
[3803]118}
119
[6458]120void Water::setHeight(float height)
121{
122  this->height = height;
123}
124
125
[6457]126void Water::draw() const
127{
[6523]128  //SkyBox::enableCubeMap();
[6470]129
[6523]130  glBindTexture(GL_TEXTURE_2D, 15);
131  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
132
133  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
134  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
135  glEnable(GL_TEXTURE_GEN_S);
136  glEnable(GL_TEXTURE_GEN_T);
137
138  glEnable(GL_BLEND);
139  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
140  // this->waterShader->activateShader();
[6467]141//  this->waterMaterial->select();
[6457]142  WorldEntity::draw();
[6470]143  //Shader::deactivateShader();
144
[6471]145  SkyBox::disableCubeMap();
[6457]146}
[6456]147
148void Water::tick(float dt)
149{
[6518]150/*
151    THE OLD USELESS ALGORITHM
[6457]152  phase += dt *.1;
153  for (unsigned int i = 0; i < this->grid->rows(); i++)
154  {
155    for (unsigned int j = 0; j < this->grid->columns(); j++)
156    {
[6458]157      this->grid->height(i,j) = this->height*sin(((float)i/(float)this->grid->rows() *phase)+
[6467]158          this->height*cos((float)j/(float)this->grid->columns()) * phase * 2.0);
[6457]159    }
160  }
[6518]161  this->grid->rebuildNormals(this->height);*/
162
163
164  unsigned int i, j;
165  float u;
166
167  // wave/advection
168  // calc movement
169  for(j = 1; j < this->grid->rows() - 1; j++) {
170    for(i = 1; i < this->grid->columns() - 1; i++) {
171      u =  this->grid->height(i+1,j)+ this->grid->height(i-1, j) +
172          this->grid->height(i, j+1) + this->grid->height(i, j-1) -
173          4 * this->grid->height(i, j);
174      this->velocities[i][j] += dt * this->viscosity * this->viscosity * u / this->height;
[6522]175      this->grid->height(i, j) += dt * this->velocities[i][j];
[6518]176    }
177  }
[6522]178/*  // advect
[6518]179  for(j = 1; j < this->grid->rows() - 1; j++) {
180    for(i = 1; i < this->grid->columns() - 1; i++) {
181      this->grid->height(i, j) += dt * this->velocities[i][j];
182    }
[6522]183  }*/
[6518]184  // bound
185//   unsigned int w = this->grid->columns - 1;
186//   for(i = 0; i < this->grid->columns; i++) {
187//     _map[i][0].u[1] = _map[i][1  ].u[1];
188//     _map[i][w].u[1] = _map[i][w-1].u[1];
189//     _map[0][i].u[1] = _map[1  ][i].u[1];
190//     _map[w][i].u[1] = _map[w-1][i].u[1];
191//   }
192
193  // diffusion
194  for(j = 1; j < this->grid->rows() - 1; j++) {
195    for(i = 1; i < this->grid->columns() - 1 ; i++) {
196      u = this->grid->height(i+1, j) + this->grid->height(i-1, j) +
197          this->grid->height(i, j+1) + this->grid->height(i, j-1) -
198          4* this->grid->height(i, j);
199      this->grid->height(i,j) += dt * this->cohesion * u / this->height;
200    }
201  }
202
203  // calc normals
[6519]204//   float l[3];
205//   float m[3];
206//   for(j = 1; j < this->grid->rows() -1; j++) {
207//     for(i = 1; i < this->grid->columns() - 1; i++) {
208//       l[0] = this->grid->vertexG(i, j-1).x - this->grid->vertexG(i, j+1).x;
209//       l[1] = this->grid->vertexG(i, j-1).y - this->grid->vertexG(i, j+1).y;
210//       l[2] = this->grid->vertexG(i, j-1).z - this->grid->vertexG(i, j+1).z;
211//       m[0] = this->grid->vertexG(i-1,j).x - this->grid->vertexG(i+1, j).x;
212//       m[1] = this->grid->vertexG(i-1,j).y - this->grid->vertexG(i+1, j).y;
213//       m[2] = this->grid->vertexG(i-1,j).z - this->grid->vertexG(i+1, j).z;
214//       this->grid->normalG(i, j).x = l[1] * m[2] - l[2] * m[1];
215//       this->grid->normalG(i, j).y = l[2] * m[0] - l[0] * m[2];
216//       this->grid->normalG(i, j).z = l[0] * m[1] - l[1] * m[0];
217//     }
218//   }
219  this->grid->rebuildNormals(this->height);
[6456]220}
Note: See TracBrowser for help on using the repository browser.