mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-12-28 15:55:51 +00:00
12ea97f051
GL_CULL_FACE is effectively always disabled, except for quad strip rendering, and keeping GL_CULL_FACE disabled there does not seem to cause any visual artifacts. Instead, it enhances skeletal animation possibilities (e.g. flipping bone strips over without it disappearing)
322 lines
7 KiB
C++
322 lines
7 KiB
C++
/*
|
|
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 "GridRender.h"
|
|
|
|
#include "../BBGE/AfterEffect.h"
|
|
|
|
CurrentRender::CurrentRender() : RenderObject()
|
|
{
|
|
cull = false;
|
|
//alpha = 0.2f;
|
|
setTexture("Particles/Current");
|
|
texture->repeat = true;
|
|
rippleDelay = 2;
|
|
}
|
|
|
|
void CurrentRender::onUpdate(float dt)
|
|
{
|
|
RenderObject::onUpdate(dt);
|
|
|
|
/*
|
|
rippleDelay -= dt;
|
|
if (rippleDelay < 0)
|
|
{
|
|
for (int i = 0; i < dsq->game->paths.size()-1; i++)
|
|
{
|
|
Path *p = dsq->game->paths[i];
|
|
for (int n = 0; n < p->nodes.size()-1; i++)
|
|
{
|
|
PathNode *n1 = &p->nodes[n];
|
|
PathNode *n2 = &p->nodes[n+1];
|
|
Vector diff = n2->position - n1->position;
|
|
Vector pos = n1->position + diff*p->animOffset;
|
|
// spawn effect at pos
|
|
if (core->afterEffectManager)
|
|
core->afterEffectManager->addEffect(new ShockEffect(Vector(core->width/2, core->height/2),pos,0.04,0.06,15,0.2f));
|
|
}
|
|
}
|
|
rippleDelay = 1.0;
|
|
}
|
|
*/
|
|
}
|
|
|
|
void CurrentRender::onRender()
|
|
{
|
|
#ifdef BBGE_BUILD_OPENGL
|
|
// note: Leave cull_face disabled!?
|
|
//glDisable(GL_CULL_FACE);
|
|
//int qs = 0;
|
|
for (Path *p = dsq->game->getFirstPathOfType(PATH_CURRENT); p; p = p->nextOfType)
|
|
{
|
|
if (p->active)
|
|
{
|
|
|
|
/*
|
|
std::ostringstream os;
|
|
os << "animOffset: " << p->animOffset;
|
|
debugLog(os.str());
|
|
*/
|
|
|
|
int w2 = p->rect.getWidth()/2;
|
|
|
|
/*
|
|
if (false)
|
|
{
|
|
float offset = 0;
|
|
glBegin(GL_QUAD_STRIP);
|
|
int sz = p->nodes.size();
|
|
float len = 0;
|
|
|
|
|
|
float totalLength = 0;
|
|
for (int n = 0; n < sz-1; n++)
|
|
{
|
|
totalLength += (p->nodes[n+1].position - p->nodes[n].position).getLength2D();
|
|
}
|
|
|
|
float texScale = totalLength/256.0f;
|
|
|
|
Vector p1, p2, diff, pl, pr;
|
|
for (int n = 0; n < sz; n++)
|
|
{
|
|
PathNode *n1 = &p->nodes[n];
|
|
p1 = n1->position;
|
|
if (n == sz-1)
|
|
{
|
|
PathNode *n2 = &p->nodes[n-1];
|
|
p2 = n2->position;
|
|
diff = p1-p2;
|
|
}
|
|
else
|
|
{
|
|
PathNode *n2 = &p->nodes[n+1];
|
|
p2 = n2->position;
|
|
diff = p2-p1;
|
|
}
|
|
len = diff.getLength2D();
|
|
float add = len/totalLength;
|
|
//texScale = len/totalLength;
|
|
|
|
pl = diff.getPerpendicularLeft();
|
|
pr = diff.getPerpendicularRight();
|
|
|
|
pl.setLength2D(w2);
|
|
pr.setLength2D(w2);
|
|
Vector r1 = p1+pl;
|
|
|
|
Vector r4 = p1+pr;
|
|
|
|
|
|
if (n == 0 || n == sz-1)
|
|
{
|
|
glColor4f(1, 1, 1, 0);
|
|
}
|
|
else
|
|
{
|
|
glColor4f(1, 1, 1, 1);
|
|
}
|
|
//(0+p->animOffset)*texScale +
|
|
glTexCoord2f((offset)*texScale+p->animOffset, 0);
|
|
glVertex2f(r1.x, r1.y);
|
|
|
|
glTexCoord2f((offset)*texScale+p->animOffset, 1);
|
|
//(0+p->animOffset)*texScale +
|
|
glVertex2f(r4.x, r4.y);
|
|
|
|
offset += add;
|
|
|
|
}
|
|
glEnd();
|
|
}
|
|
else
|
|
*/
|
|
|
|
if (true)
|
|
{
|
|
int sz = p->nodes.size()-1;
|
|
for (int n = 0; n < sz; n++)
|
|
{
|
|
PathNode *n1 = &p->nodes[n];
|
|
PathNode *n2 = &p->nodes[n+1];
|
|
Vector p1 = n1->position;
|
|
Vector p2 = n2->position;
|
|
Vector diff = p2-p1;
|
|
Vector d = diff;
|
|
d.setLength2D(p->rect.getWidth());
|
|
p1 -= d*0.75f;
|
|
p2 += d*0.75f;
|
|
diff = p2 - p1;
|
|
|
|
//bool edge = false;
|
|
|
|
/*
|
|
if (n == 0)
|
|
{
|
|
p1 -= diff*0.25f;
|
|
edge = true;
|
|
}
|
|
|
|
if (n == sz-1)
|
|
{
|
|
p2 += diff*0.25f;
|
|
edge = true;
|
|
}
|
|
|
|
diff = p2-p1;
|
|
*/
|
|
|
|
if (!diff.isZero())
|
|
{
|
|
Vector pl = diff.getPerpendicularLeft();
|
|
Vector pr = diff.getPerpendicularRight();
|
|
pl.setLength2D(w2);
|
|
pr.setLength2D(w2);
|
|
|
|
Vector p15 = p1 + diff * 0.25f;
|
|
Vector p25 = p2 - diff * 0.25f;
|
|
Vector r1 = p1+pl;
|
|
Vector r2 = p1+pr;
|
|
Vector r3 = p15+pl;
|
|
Vector r4 = p15+pr;
|
|
Vector r5 = p25+pl;
|
|
Vector r6 = p25+pr;
|
|
Vector r7 = p2+pl;
|
|
Vector r8 = p2+pr;
|
|
float len = diff.getLength2D();
|
|
float texScale = len/256.0f;
|
|
//float texScale2 = texScale;
|
|
|
|
/*
|
|
if (edge)
|
|
texScale *= 2;
|
|
*/
|
|
|
|
/*
|
|
if (edge)
|
|
texScale2 *= 4;
|
|
*/
|
|
|
|
if (isTouchingLine(p1, p2, dsq->screenCenter, dsq->cullRadius+p->rect.getWidth()/2.0f))
|
|
{
|
|
//qs++;
|
|
|
|
glBegin(GL_QUAD_STRIP);
|
|
glColor4f(1,1,1,0);
|
|
glTexCoord2f((0)*texScale+p->animOffset, 0);
|
|
glVertex2f(r1.x, r1.y);
|
|
|
|
glTexCoord2f((0)*texScale+p->animOffset, 1);
|
|
glVertex2f(r2.x, r2.y);
|
|
|
|
glColor4f(1,1,1,p->amount);
|
|
glTexCoord2f((0+0.25f)*texScale+p->animOffset, 0);
|
|
glVertex2f(r3.x, r3.y);
|
|
|
|
glTexCoord2f((0+0.25f)*texScale+p->animOffset, 1);
|
|
glVertex2f(r4.x, r4.y);
|
|
|
|
glColor4f(1,1,1,p->amount);
|
|
glTexCoord2f((1-0.25f)*texScale+p->animOffset, 0);
|
|
glVertex2f(r5.x, r5.y);
|
|
|
|
glTexCoord2f((1-0.25f)*texScale+p->animOffset, 1);
|
|
glVertex2f(r6.x, r6.y);
|
|
|
|
glColor4f(1,1,1,0);
|
|
glTexCoord2f((1)*texScale+p->animOffset, 0);
|
|
glVertex2f(r7.x, r7.y);
|
|
|
|
glTexCoord2f((1)*texScale+p->animOffset, 1);
|
|
glVertex2f(r8.x, r8.y);
|
|
glEnd();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int sz = p->nodes.size()-1;
|
|
for (int n = 0; n < sz; n++)
|
|
{
|
|
PathNode *n1 = &p->nodes[n];
|
|
PathNode *n2 = &p->nodes[n+1];
|
|
Vector p1 = n1->position;
|
|
Vector p2 = n2->position;
|
|
Vector diff = p2-p1;
|
|
Vector pl = diff.getPerpendicularLeft();
|
|
Vector pr = diff.getPerpendicularRight();
|
|
pl.setLength2D(w2);
|
|
pr.setLength2D(w2);
|
|
Vector r1 = p1+pl;
|
|
Vector r2 = p2+pl;
|
|
Vector r3 = p2+pr;
|
|
Vector r4 = p1+pr;
|
|
float len = diff.getLength2D();
|
|
float texScale = len/256.0f;
|
|
|
|
if (isTouchingLine(p1, p2, dsq->screenCenter, dsq->cullRadius))
|
|
{
|
|
//qs++;
|
|
glBegin(GL_QUADS);
|
|
if (n==0)
|
|
glColor4f(1,1,1,0);
|
|
else
|
|
glColor4f(1,1,1,alpha.x);
|
|
glTexCoord2f((0+p->animOffset)*texScale, 0);
|
|
glVertex2f(r1.x, r1.y);
|
|
|
|
if (n==sz-1)
|
|
glColor4f(1,1,1,0);
|
|
else
|
|
glColor4f(1,1,1,alpha.x);
|
|
|
|
glTexCoord2f((1+p->animOffset)*texScale, 0);
|
|
glVertex2f(r2.x, r2.y);
|
|
|
|
glTexCoord2f((1+p->animOffset)*texScale, 1);
|
|
glVertex2f(r3.x, r3.y);
|
|
|
|
if (n==0)
|
|
glColor4f(1,1,1,0);
|
|
else
|
|
glColor4f(1,1,1,alpha.x);
|
|
glTexCoord2f((0+p->animOffset)*texScale, 1);
|
|
glVertex2f(r4.x, r4.y);
|
|
glEnd();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//glEnd();
|
|
|
|
}
|
|
//glEnable(GL_CULL_FACE);
|
|
|
|
/*
|
|
std::ostringstream os;
|
|
os << "current quads: " << qs;
|
|
debugLog(os.str());
|
|
*/
|
|
|
|
#endif
|
|
|
|
}
|
|
|