Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 6629 in orxonox.OLD for trunk/src/lib/particles


Ignore:
Timestamp:
Jan 20, 2006, 8:11:04 PM (19 years ago)
Author:
bensch
Message:

trunk: particles: precache and ModelParticles

Location:
trunk/src/lib/particles
Files:
4 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/particles/Makefile.am

    r6623 r6629  
    1010                        sprite_particles.cc \
    1111                        spark_particles.cc \
     12                        model_particles.cc \
    1213                        \
    1314                        quick_animation.cc
     
    2021                        sprite_particles.h \
    2122                        spark_particles.h \
     23                        model_particles.h \
    2224                        \
    2325                        quick_animation.h
  • trunk/src/lib/particles/model_particles.cc

    r6628 r6629  
    1616#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_GRAPHICS
    1717
    18 #include "sprite_particles.h"
     18#include "model_particles.h"
    1919
    2020#include "load_param.h"
     
    2828
    2929
    30 CREATE_FACTORY(SpriteParticles, CL_SPRITE_PARTICLES);
     30CREATE_FACTORY(ModelParticles, CL_MODEL_PARTICLES);
    3131
    32 SHELL_COMMAND(texture, SpriteParticles, setMaterialTexture)
    33     ->defaultValues(1, "maps/evil-flower.png");
     32SHELL_COMMAND(texture, ModelParticles, setMaterialTexture)
     33->defaultValues(1, "maps/evil-flower.png");
    3434
    3535using namespace std;
     
    3838 *  standard constructor
    3939 * @param maxCount the Count of particles in the System
    40  * @param type The Type of the SpriteParticles
     40 * @param type The Type of the ModelParticles
    4141*/
    42 SpriteParticles::SpriteParticles (unsigned int maxCount)
    43   : ParticleSystem(maxCount)
     42ModelParticles::ModelParticles (unsigned int maxCount)
     43    : ParticleSystem(maxCount)
    4444{
    4545  this->init();
     
    5050 * @param root: the XML-element to load from
    5151 */
    52 SpriteParticles::SpriteParticles(const TiXmlElement* root)
     52ModelParticles::ModelParticles(const TiXmlElement* root)
    5353{
    5454  this->init();
     
    6060 *  standard deconstructor
    6161*/
    62 SpriteParticles::~SpriteParticles()
     62ModelParticles::~ModelParticles()
    6363{
    6464  // deleting all the living Particles
     
    8080
    8181/**
    82  * @brief initializes the SpriteParticles with default values
     82 * @brief initializes the ModelParticles with default values
    8383*/
    84 void SpriteParticles::init()
     84void ModelParticles::init()
    8585{
    86   this->setClassID(CL_SPRITE_PARTICLES, "SpriteParticles");
     86  this->setClassID(CL_MODEL_PARTICLES, "ModelParticles");
    8787
    8888  this->material.setDiffuseMap("maps/radial-trans-noise.png");
     
    9494 * @param root the XML-element to load from.
    9595 */
    96 void SpriteParticles::loadParams(const TiXmlElement* root)
     96void ModelParticles::loadParams(const TiXmlElement* root)
    9797{
    9898  ParticleSystem::loadParams(root);
    9999
    100   LoadParam(root, "texture", this, SpriteParticles, setMaterialTexture);
     100  LoadParam(root, "texture", this, ModelParticles, setMaterialTexture);
    101101}
    102102
    103103/**
    104104 * @brief sets the Texutre that is placed onto the particles
    105  * @param textureFile the Texture to load onto these SpriteParticles
     105 * @param textureFile the Texture to load onto these ModelParticles
    106106 */
    107 void SpriteParticles::setMaterialTexture(const char* textureFile)
     107void ModelParticles::setMaterialTexture(const char* textureFile)
    108108{
    109109  this->material.setDiffuseMap(textureFile);
     
    117117 * This is just the fastest Way to do this, but will most likely be changed in the future.
    118118 */
    119 void SpriteParticles::draw() const
     119void ModelParticles::draw() const
    120120{
    121121  glPushAttrib(GL_ENABLE_BIT);
    122 
    123122  Particle* drawPart = particles;
    124123
     
    128127    glDisable(GL_LIGHTING);
    129128  glMatrixMode(GL_MODELVIEW);
    130   glDepthMask(GL_FALSE);
    131129
    132   material.select();
     130  this->material.select();
    133131  glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
    134132
    135   //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
     133  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    136134
     135  if (likely(this->getModel() != NULL))
     136    while (likely(drawPart != NULL))
     137    {
     138      glPushMatrix();
     139      glMatrixMode(GL_MODELVIEW);
     140      /* move */
     141      glTranslatef(drawPart->position.x, drawPart->position.y, drawPart->position.z);
     142      /* scale */
     143      glScalef(drawPart->radius, drawPart->radius, drawPart->radius);
     144      /* rotate */
     145      Vector tmpRot = drawPart->orientation.getSpacialAxis();
     146      glRotatef (drawPart->orientation.getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
    137147
    138   while (likely(drawPart != NULL))
    139   {
    140     glColor4fv(drawPart->color);
    141     //! @todo implement a faster code for the look-at Camera algorithm.
     148      this->getModel()->draw();
    142149
    143     const PNode* camera = State::getCamera();  //!< @todo MUST be different
    144     Vector cameraPos = camera->getAbsCoor();
    145     Vector cameraTargetPos = State::getCameraTarget()->getAbsCoor();
    146     Vector view = cameraTargetPos - cameraPos;
    147     Vector up = Vector(0, 1, 0);
    148     up = camera->getAbsDir().apply(up);
    149     Vector h = up.cross(view);
    150     Vector v = h.cross(view);
    151     h.normalize();
    152     v.normalize();
    153     v *= .5 * drawPart->radius;
    154     h *= .5 * drawPart->radius;
    155 
    156     glBegin(GL_TRIANGLE_STRIP);
    157     glTexCoord2i(1, 1);
    158     glVertex3f(drawPart->position.x - h.x - v.x,
    159                drawPart->position.y - h.y - v.y,
    160                drawPart->position.z - h.z - v.z);
    161     glTexCoord2i(0, 1);
    162     glVertex3f(drawPart->position.x - h.x + v.x,
    163                drawPart->position.y - h.y + v.y,
    164                drawPart->position.z - h.z + v.z);
    165     glTexCoord2i(1, 0);
    166     glVertex3f(drawPart->position.x + h.x - v.x,
    167                drawPart->position.y + h.y - v.y,
    168                drawPart->position.z + h.z - v.z);
    169     glTexCoord2i(0, 0);
    170     glVertex3f(drawPart->position.x + h.x + v.x,
    171                drawPart->position.y + h.y + v.y,
    172                drawPart->position.z + h.z + v.z);
    173 
    174     glEnd();
    175 
    176     drawPart = drawPart->next;
    177   }
    178   glDepthMask(GL_TRUE);
     150      glPopMatrix();
     151      drawPart = drawPart->next;
     152    }
     153  else
     154    PRINTF(2)("no model loaded onto ParticleSystem-%s\n", this->getName());
    179155  glPopAttrib();
    180156}
  • trunk/src/lib/particles/model_particles.h

    r6628 r6629  
    11/*!
    2  * @file sprite_particles.h
     2 * @file model_particles.h
    33
    44*/
    55
    6 #ifndef _SPRITE_PARTICLE_SYSTEM_H
    7 #define _SPRITE_PARTICLE_SYSTEM_H
     6#ifndef _MODEL_PARTICLE_SYSTEM_H
     7#define _MODEL_PARTICLE_SYSTEM_H
    88
    99#include "particle_system.h"
     
    1111
    1212//! A class to handle ParticleSystems
    13 class SpriteParticles : public ParticleSystem
     13class ModelParticles : public ParticleSystem
    1414{
    15 
    1615public:
    17   SpriteParticles(unsigned int maxCount = PARTICLE_DEFAULT_MAX_COUNT);
    18   SpriteParticles(const TiXmlElement* root);
    19   virtual ~SpriteParticles();
     16  ModelParticles(unsigned int maxCount = PARTICLE_DEFAULT_MAX_COUNT);
     17  ModelParticles(const TiXmlElement* root);
     18  virtual ~ModelParticles();
    2019
    2120  virtual void loadParams(const TiXmlElement* root);
     
    3534};
    3635
    37 #endif /* _SPRITE_PARTICLE_SYSTEM_H */
     36#endif /* _MODEL_PARTICLE_SYSTEM_H */
  • trunk/src/lib/particles/particle_system.cc

    r6626 r6629  
    7474
    7575/**
    76   \brief initializes the ParticleSystem with default values
    77 */
     76 * @brief initializes the ParticleSystem with default values
     77 */
    7878void ParticleSystem::init()
    7979{
     
    125125  }
    126126  LOAD_PARAM_END_CYCLE(element);
     127
     128  LoadParam(root, "precache", this, ParticleSystem, precache)
     129      .describe("Precaches the ParticleSystem for %1 seconds, %2 times per Second")
     130      .defaultValues(2, 1, 25);
    127131}
    128132
     
    222226}
    223227
    224 
     228/**
     229 * @brief adds an Emitter to this System.
     230 * @param emitter the Emitter to add.
     231 */
    225232void ParticleSystem::addEmitter(ParticleEmitter* emitter)
    226233{
     
    232239}
    233240
    234 
     241/**
     242 * @brief removes a ParticleEmitter from this System
     243 * @param emitter the Emitter to remove
     244 */
    235245void ParticleSystem::removeEmitter(ParticleEmitter* emitter)
    236246{
     
    244254
    245255/**
     256 * @brief does a Precaching, meaning, that the ParticleSystem(and its emitters) will be ticked force
     257 * @param seconds: seconds
     258 * @param ticksPerSeconds times per Second.
     259 */
     260void ParticleSystem::precache(unsigned int seconds, unsigned int ticksPerSecond)
     261{
     262  PRINTF(4)("Precaching %s::%s %d seconds %d timesPerSecond\n", this->getClassName(), this->getName(), seconds, ticksPerSecond);
     263  this->debug();
     264  for (unsigned int i = 0; i < seconds*ticksPerSecond; i++)
     265    this->tick(1.0/(float)ticksPerSecond);
     266}
     267
     268
     269/**
    246270 *  ticks the system.
    247271 * @param dt the time to tick all the Particles of the System
     
    355379//   switch (this->particleType)
    356380//   {
    357 //     case PARTICLE_SPARK:
    358 //       glDisable(GL_LIGHTING);
    359 //       glDepthMask(GL_FALSE);
    360 //       //glEnable(GL_LINE_SMOOTH);
    361 //       glEnable(GL_BLEND);
    362 //
    363 //       glBegin(GL_LINES);
    364 //       while (likely(drawPart != NULL))
    365 //       {
    366 //         glColor4fv(drawPart->color);
    367 //         glVertex3f(drawPart->position.x, drawPart->position.y, drawPart->position.z);
    368 //         glVertex3f(drawPart->position.x - drawPart->velocity.x * drawPart->radius,
    369 //                    drawPart->position.y - drawPart->velocity.y * drawPart->radius,
    370 //                    drawPart->position.z - drawPart->velocity.z * drawPart->radius);
    371 //         drawPart = drawPart->next;
    372 //       }
    373 //       glEnd();
    374 //       break;
    375381//
    376382//     case PARTICLE_MODEL:
    377383//       {
    378 //         GLfloat matrix[4][4];
    379 //
    380 //         if (likely(this->getModel() != NULL))
    381 //           while (likely(drawPart != NULL))
    382 //         {
    383 //           glPushMatrix();
    384 //           glMatrixMode(GL_MODELVIEW);
    385 //           /* move */
    386 //           glTranslatef(drawPart->position.x, drawPart->position.y, drawPart->position.z);
    387 //           /* scale */
    388 //           glScalef(drawPart->radius, drawPart->radius, drawPart->radius);
    389 //           /* rotate */
    390 //           drawPart->orientation.matrix (matrix);
    391 //           glMultMatrixf((float*)matrix);
    392 //
    393 //           this->getModel()->draw();
    394 //
    395 //           glPopMatrix();
    396 //           drawPart = drawPart->next;
    397 //         }
    398 //         else
    399 //           PRINTF(2)("no model loaded onto ParticleSystem-%s\n", this->getName());
    400384//       }
    401385//       break;
     
    488472void ParticleSystem::debug() const
    489473{
    490   PRINT(0)("  ParticleCount: %d, maximumCount: %d :: filled %d%%\n", this->count, this->maxCount, 100*this->count/this->maxCount);
     474  PRINT(0)("  ParticleCount: %d emitters: %d, maximumCount: %d :: filled %d%%\n", this->count, this->emitters.size(), this->maxCount, 100*this->count/this->maxCount);
    491475  if (deadList)
    492476  {
  • trunk/src/lib/particles/particle_system.h

    r6623 r6629  
    9595  void addParticle(const Vector& position, const Vector& velocity, const Quaternion& orientation, const Quaternion& momentum, unsigned int data = 0);
    9696
     97  void precache(unsigned int seconds, unsigned int ticksPerSecond = 25);
     98
    9799  virtual void tick(float dt);
    98100  virtual void draw() const = 0;
  • trunk/src/lib/particles/spark_particles.cc

    r6626 r6629  
    107107void SparkParticles::draw() const
    108108{
    109   exit(-1);
    110109  glPushAttrib(GL_ENABLE_BIT);
    111110
Note: See TracChangeset for help on using the changeset viewer.