mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-10-04 13:27:14 +00:00
initial commit. This is icculus version 5542b94cae02a6333845854bbbd1abe0a259f1a4
This commit is contained in:
commit
3096eaf5e2
2519 changed files with 816064 additions and 0 deletions
130
BBGE/QuadTrail.cpp
Normal file
130
BBGE/QuadTrail.cpp
Normal file
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
Copyright (C) 2007, 2010 - Bit-Blot
|
||||
|
||||
This file is part of Aquaria.
|
||||
|
||||
Aquaria is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "QuadTrail.h"
|
||||
#include <assert.h>
|
||||
|
||||
QuadTrail::QuadTrail(int maxPoints, float pointDist)
|
||||
: RenderObject(), maxPoints(maxPoints), pointDist(pointDist), numPoints(0)
|
||||
{
|
||||
quadTrailAlphaEffect = QTAE_NORMAL;
|
||||
cull = false;
|
||||
repeatTexture = 1;
|
||||
|
||||
lifeRate = 0.5;
|
||||
}
|
||||
|
||||
void QuadTrail::addPoint(const Vector &point)
|
||||
{
|
||||
if (numPoints > 0)
|
||||
{
|
||||
if ((points.back().point - point).isLength2DIn(pointDist))
|
||||
{
|
||||
backOffset = point - points.back().point;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
QuadTrailPoint p;
|
||||
p.point = point;
|
||||
|
||||
points.push_back(p);
|
||||
numPoints++;
|
||||
if (numPoints >= maxPoints)
|
||||
points.pop_front();
|
||||
|
||||
backOffset.x = 0;
|
||||
backOffset.y = 0;
|
||||
}
|
||||
|
||||
void QuadTrail::onRender()
|
||||
{
|
||||
if (numPoints < 2) return;
|
||||
|
||||
#ifdef BBGE_BUILD_OPENGL
|
||||
glDisable(GL_CULL_FACE);
|
||||
int c = 0;
|
||||
Vector p, diff, dl, dr;
|
||||
Vector lastPoint;
|
||||
|
||||
const float texScale = texture ? float(numPoints*pointDist)/texture->width : 1.0f;
|
||||
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (Points::iterator i = points.begin(); i != points.end(); i++)
|
||||
{
|
||||
if (quadTrailAlphaEffect == QTAE_NORMAL)
|
||||
{
|
||||
glColor4f(1, 1, 1, (*i).life);
|
||||
}
|
||||
if (c == 0)
|
||||
{
|
||||
lastPoint = (*i).point;
|
||||
c++;
|
||||
continue;
|
||||
}
|
||||
p = (*i).point;
|
||||
|
||||
if (c == numPoints-1)
|
||||
p += backOffset;
|
||||
|
||||
diff = p - lastPoint;
|
||||
//possible opt here
|
||||
if (texture)
|
||||
diff.setLength2D(texture->width*0.5f);
|
||||
else
|
||||
diff.setLength2D(32);
|
||||
dl = diff.getPerpendicularLeft();
|
||||
dr = diff.getPerpendicularRight();
|
||||
|
||||
glTexCoord2f(0, (float(c)/numPoints)*texScale);
|
||||
glVertex2f(p.x+dl.x, p.y+dl.y);
|
||||
glTexCoord2f(1, (float(c+1)/numPoints)*texScale);
|
||||
glVertex2f(p.x+dr.x, p.y+dr.y);
|
||||
|
||||
c++;
|
||||
lastPoint = (*i).point;
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
glPointSize(4);
|
||||
glColor4f(0, 1, 0, 0.5);
|
||||
|
||||
glBegin(GL_POINTS);
|
||||
for (Points::iterator i = points.begin(); i != points.end(); i++)
|
||||
{
|
||||
glVertex2f((*i).point.x, (*i).point.y);
|
||||
}
|
||||
glEnd();
|
||||
#endif
|
||||
}
|
||||
|
||||
void QuadTrail::onUpdate(float dt)
|
||||
{
|
||||
RenderObject::onUpdate(dt);
|
||||
|
||||
for (Points::iterator i = points.begin(); i != points.end(); i++)
|
||||
{
|
||||
(*i).life -= dt * lifeRate;
|
||||
if ((*i).life <= 0)
|
||||
(*i).life = 0;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue