Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/atmospheric_engine/src/lib/particles/model_particles.cc @ 8180

Last change on this file since 8180 was 7221, checked in by bensch, 19 years ago

orxonox/trunk: merged the std-branche back, it runs on windows and Linux

svn merge https://svn.orxonox.net/orxonox/branches/std . -r7202:HEAD

File size: 3.4 KB
Line 
1/*
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*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_GRAPHICS
17
18#include "model_particles.h"
19
20#include "util/loading/load_param.h"
21#include "util/loading/factory.h"
22#include "material.h"
23#include "state.h"
24#include "shell_command.h"
25
26#include "parser/tinyxml/tinyxml.h"
27#include <algorithm>
28
29
30CREATE_FACTORY(ModelParticles, CL_MODEL_PARTICLES);
31
32SHELL_COMMAND(texture, ModelParticles, setMaterialTexture)
33->defaultValues("maps/evil-flower.png");
34
35using namespace std;
36
37/**
38 *  standard constructor
39 * @param maxCount the Count of particles in the System
40 * @param type The Type of the ModelParticles
41*/
42ModelParticles::ModelParticles (unsigned int maxCount)
43    : ParticleSystem(maxCount)
44{
45  this->init();
46}
47
48/**
49 * @brief creates a Particle System out of a XML-element
50 * @param root: the XML-element to load from
51 */
52ModelParticles::ModelParticles(const TiXmlElement* root)
53{
54  this->init();
55  if (root != NULL)
56    this->loadParams(root);
57}
58
59/**
60 *  standard deconstructor
61*/
62ModelParticles::~ModelParticles()
63{ }
64
65/**
66 * @brief initializes the ModelParticles with default values
67*/
68void ModelParticles::init()
69{
70  this->setClassID(CL_MODEL_PARTICLES, "ModelParticles");
71
72  this->material.setDiffuseMap("maps/radial-trans-noise.png");
73}
74
75
76/**
77 * loads Parameters from a TiXmlElement
78 * @param root the XML-element to load from.
79 */
80void ModelParticles::loadParams(const TiXmlElement* root)
81{
82  ParticleSystem::loadParams(root);
83
84  LoadParam(root, "texture", this, ModelParticles, setMaterialTexture);
85}
86
87/**
88 * @brief sets the Texutre that is placed onto the particles
89 * @param textureFile the Texture to load onto these ModelParticles
90 */
91void ModelParticles::setMaterialTexture(const std::string& textureFile)
92{
93  this->material.setDiffuseMap(textureFile);
94}
95
96/**
97 * @brief draws all the Particles of this System
98 *
99 * The Cases in this Function all do the same:
100 * Drawing all the particles with the appropriate Type.
101 * This is just the fastest Way to do this, but will most likely be changed in the future.
102 */
103void ModelParticles::draw() const
104{
105  glPushAttrib(GL_ENABLE_BIT);
106  Particle* drawPart = particles;
107
108  GLboolean checkLight = false;
109  glGetBooleanv(GL_LIGHTING, &checkLight);
110  if (checkLight == GL_TRUE)
111    glDisable(GL_LIGHTING);
112  glMatrixMode(GL_MODELVIEW);
113
114  this->material.select();
115  glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
116
117  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
118
119  if (likely(this->getModel() != NULL))
120    while (likely(drawPart != NULL))
121    {
122      glPushMatrix();
123      glMatrixMode(GL_MODELVIEW);
124      /* move */
125      glTranslatef(drawPart->position.x, drawPart->position.y, drawPart->position.z);
126      /* scale */
127      glScalef(drawPart->radius, drawPart->radius, drawPart->radius);
128      /* rotate */
129      Vector tmpRot = drawPart->orientation.getSpacialAxis();
130      glRotatef (drawPart->orientation.getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
131
132      this->getModel()->draw();
133
134      glPopMatrix();
135      drawPart = drawPart->next;
136    }
137  else
138    PRINTF(2)("no model loaded onto ParticleSystem-%s\n", this->getName());
139  glPopAttrib();
140}
Note: See TracBrowser for help on using the repository browser.