ExplosionLaserBeamRenderer.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2009
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 ////////////////////////////////////////////////////////////////////////////////
00020 
00021 #include <sprites/ExplosionLaserBeamRenderer.h>
00022 #include <common/Defines.h>
00023 #include <console/Console.h>
00024 #include <image/ImageFactory.h>
00025 #include <sound/SoundUtils.h>
00026 #include <client/ScorchedClient.h>
00027 #include <graph/ParticleEmitter.h>
00028 #include <graph/ParticleEngine.h>
00029 
00030 
00031 REGISTER_CLASS_SOURCE(ExplosionLaserBeamRenderer);
00032 
00033 GLTexture *ExplosionLaserBeamRenderer::_texture = 0;
00034 
00035 ExplosionLaserBeamRenderer::~ExplosionLaserBeamRenderer()
00036 {
00037 }
00038 
00039 ExplosionLaserBeamRenderer::ExplosionLaserBeamRenderer():
00040         totalTime_(0), time_(0), size_(12.0f), angle_(0)
00041 {
00042 
00043 }
00044 
00045 void ExplosionLaserBeamRenderer::init(unsigned int playerId,
00046         Vector &position, Vector &velocity, const char *data)
00047 {
00048         if (0 != strcmp("none", data))
00049         {
00050                 SoundBuffer *firedSound = 
00051                         Sound::instance()->fetchOrCreateBuffer(
00052                                 S3D::getDataFile(data));
00053                 SoundUtils::playAbsoluteSound(VirtualSoundPriority::eAction,
00054                         firedSound, position);
00055         }
00056 
00057         for (int j=0;j<layers;j++){
00058                 for(int i=0;i<sides;i++){
00059                         points[j][i]=Vector((float)(360/sides)*i,(double)((size_/(layers+1))*(j+1)));
00060                 }
00061         }
00062         if (!_texture)
00063         {
00064                 std::string file1 = S3D::getDataFile("data/textures/waves.bmp");
00065         
00066                 ImageHandle map = ImageFactory::loadImageHandle(file1.c_str(), file1.c_str(), false);
00067                 _texture = new GLTexture;
00068                 _texture->create(map, true);
00069         }
00070 
00071         position_ = position;
00072 
00073         ParticleEmitter emmiter;
00074         emmiter.setAttributes(
00075                         10.0f, 0.9f, // Life
00076                         0.5f, 9.5f, // Mass
00077                         0.0f, 0.0f, // Friction
00078                         Vector::getNullVector(), Vector::getNullVector(), // Velocity
00079                         Vector(0.9f, 0.9f, 0.1f), 0.9f, // StartColor1
00080                         Vector(0.9f, 0.9f, 0.1f), 0.1f, // StartColor2
00081                         Vector(0.6f, 0.6f, 0.95f), 0.0f, // EndColor1
00082                         Vector(0.8f, 0.8f, 1.0f), 0.1f, // EndColor2
00083                         0.0f, 0.0f, 0.5f, 0.5f, // Start Size
00084                         0.0f, 0.0f, 10.0f, 10.0f, // EndSize
00085                         Vector(0.0f, 0.0f, 10.0f), // Gravity
00086                         true,
00087                         false);
00088 
00089                 Vector newPos1 = position_ + Vector(-4.0f, -4.0f, 0.0f);
00090                 Vector newPos2 = position_ + Vector(4.0f, 4.0f, 0.0f);
00091                 emmiter.emitLinear(800, newPos1, newPos2, 
00092                         ScorchedClient::instance()->getParticleEngine(), 
00093                         ParticleRendererQuads::getInstance());          
00094 }
00095 
00096 void ExplosionLaserBeamRenderer::draw(Action *action)
00097 {
00098         GLState currentState(GLState::TEXTURE_ON | GLState::BLEND_ON);
00099         _texture->draw();
00100 
00101         glPushMatrix(); 
00102         glTranslatef(position_[0],position_[1],0.0f);
00103         glScalef(time_*0.05f,time_*0.05f,1.0f);
00104         
00105         for (int j=0;j<layers;j++){
00106                 glRotatef(angle_,0.0f,0.0f,1.0f);
00107                 glBegin(GL_TRIANGLE_STRIP);
00108                 int tempheight=(int)(time_*time_*time_);
00109                 if (tempheight>100) tempheight=100;
00110                 Vector height(0,0,tempheight);
00111 
00112                 glColor4f(0.0f,0.6f,0.9f, 0.4f);
00113                 
00114                 for (int i=0;i<(sides+1);i++){
00115                         
00116                         glNormal3fv ((float*)(points[j][i%sides]));
00117                         if (i%2){
00118                                 glTexCoord2f(0.0f, 0.0f+((layers-j)*time_));
00119                         }else{
00120                                 glTexCoord2f(2.0f, 0.0f+((layers-j)*time_));
00121                         }
00122                         glVertex3fv((float*)(points[j][i%sides]+height));
00123                         glNormal3fv ((float*)(points[j][i%sides]));
00124                         if (i%2){
00125                                 glTexCoord2f(0.0f, (float)(tempheight/10)+((layers-j)*time_));
00126                         }else{
00127                                 glTexCoord2f(2.0f, (float)(tempheight/10)+((layers-j)*time_));
00128                         }
00129                         glVertex3fv((float*)(points[j][i%sides]));
00130                 }
00131                 for (int i=0;i<(sides+1);i++){
00132                         
00133                         glNormal3fv ((float*)(points[j][i%sides]));
00134                         if (i%2){
00135                                 glTexCoord2f(0.0f, 0.0f-((layers-j)*time_));
00136                         }else{
00137                                 glTexCoord2f(2.0f, 0.0f-((layers-j)*time_));
00138                         }
00139                         glVertex3fv((float*)(points[j][i%sides]));
00140                         glNormal3fv ((float*)(points[j][i%sides]));
00141                         if (i%2){
00142                                 glTexCoord2f(0.0f, (float)(tempheight/10)-((layers-j)*time_));
00143                         }else{
00144                                 glTexCoord2f(2.0f, (float)(tempheight/10)-((layers-j)*time_));
00145                         }
00146                         glVertex3fv((float*)(points[j][i%sides]+height));
00147                 }
00148                 
00149                 glEnd();
00150         }
00151         glPopMatrix();
00152         
00153 }
00154 void ExplosionLaserBeamRenderer::simulate(Action *action, float frameTime, bool &remove)
00155 {
00156 
00157         totalTime_ += frameTime;
00158         time_ += frameTime;
00159         angle_=(angle_+3.0f);
00160         if (angle_>360.0f){
00161                 angle_=0.0f;
00162         }
00163         if ((time_)>size_){
00164                 remove=true;
00165         }else{
00166                 remove=false;
00167         }
00168 
00169                 
00170 }
00171 

Generated on Mon Feb 16 15:14:47 2009 for Scorched3D by  doxygen 1.5.3