X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FSprite.cpp;h=a0502d2e3377b9520e15c2277eb7f726395b5331;hb=64560867a9b6486d601784a2fe4ba6149d31b7aa;hp=c3ac298cc958685170bac4ee845731d5a3f5a9ec;hpb=24004d6ab1e68faaf85ece11b566449997da5013;p=lugaru.git
diff --git a/Source/Sprite.cpp b/Source/Sprite.cpp
index c3ac298..a0502d2 100644
--- a/Source/Sprite.cpp
+++ b/Source/Sprite.cpp
@@ -1,22 +1,21 @@
/*
Copyright (C) 2003, 2010 - Wolfire Games
+Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
This file is part of Lugaru.
-Lugaru 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.
+Lugaru 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,
+Lugaru 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.
+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.
+along with Lugaru. If not, see .
*/
#include "Sprite.h"
@@ -57,7 +56,7 @@ vector Sprite::sprites = vector();
//Functions
void Sprite::Draw()
{
- int i, j, k;
+ int k;
static float M[16];
static XYZ point;
static float distancemult;
@@ -97,7 +96,7 @@ void Sprite::Draw()
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(0);
glAlphaFunc(GL_GREATER, 0.0001);
- for (i = 0; i < sprites.size(); i++) {
+ for (unsigned i = 0; i < sprites.size(); i++) {
if (lasttype != sprites[i]->type) {
switch (sprites[i]->type) {
case cloudsprite:
@@ -108,15 +107,8 @@ void Sprite::Draw()
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
break;
- case cloudimpactsprite:
- cloudimpacttexture.bind();
- if (!blend) {
- blend = 1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
- break;
case breathsprite:
+ case cloudimpactsprite:
cloudimpacttexture.bind();
if (!blend) {
blend = 1;
@@ -142,10 +134,14 @@ void Sprite::Draw()
break;
case splintersprite :
if (lastspecial != sprites[i]->special) {
- if (sprites[i]->special == 0)splintertexture.bind();
- if (sprites[i]->special == 1)leaftexture.bind();
- if (sprites[i]->special == 2)snowflaketexture.bind();
- if (sprites[i]->special == 3)toothtexture.bind();
+ if (sprites[i]->special == 0)
+ splintertexture.bind();
+ if (sprites[i]->special == 1)
+ leaftexture.bind();
+ if (sprites[i]->special == 2)
+ snowflaketexture.bind();
+ if (sprites[i]->special == 3)
+ toothtexture.bind();
if (!blend) {
blend = 1;
glAlphaFunc(GL_GREATER, 0.0001);
@@ -193,15 +189,19 @@ void Sprite::Draw()
else
distancemult = (viewdistsquared - (distsq(&viewer, &sprites[i]->position) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
if (sprites[i]->type == flamesprite) {
- if (distancemult >= 1) glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity);
- else glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity * distancemult);
+ if (distancemult >= 1)
+ glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity);
+ else
+ glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity * distancemult);
} else {
- if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity);
- else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult);
+ if (distancemult >= 1)
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity);
+ else
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult);
}
lasttype = sprites[i]->type;
lastspecial = sprites[i]->special;
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(sprites[i]->position.x, sprites[i]->position.y, sprites[i]->position.z);
if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite)) {
@@ -223,26 +223,35 @@ void Sprite::Draw()
glRotatef(sprites[i]->rotation, 0, 0, 1);
if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite)) {
- if (sprites[i]->alivetime < .14)glScalef(sprites[i]->alivetime / .14, sprites[i]->alivetime / .14, sprites[i]->alivetime / .14);
+ if (sprites[i]->alivetime < .14)
+ glScalef(sprites[i]->alivetime / .14, sprites[i]->alivetime / .14, sprites[i]->alivetime / .14);
}
if (sprites[i]->type == smoketype || sprites[i]->type == snowsprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == breathsprite) {
if (sprites[i]->alivetime < .3) {
- if (distancemult >= 1)glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * sprites[i]->alivetime / .3);
- if (distancemult < 1)glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult * sprites[i]->alivetime / .3);
+ if (distancemult >= 1)
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * sprites[i]->alivetime / .3);
+ if (distancemult < 1)
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult * sprites[i]->alivetime / .3);
}
}
if (sprites[i]->type == splintersprite && sprites[i]->special > 0 && sprites[i]->special != 3) {
if (sprites[i]->alivetime < .2) {
- if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->alivetime / .2);
- else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], distancemult * sprites[i]->alivetime / .2);
+ if (distancemult >= 1)
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->alivetime / .2);
+ else
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], distancemult * sprites[i]->alivetime / .2);
} else {
- if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
- else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ if (distancemult >= 1)
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ else
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
}
}
if (sprites[i]->type == splintersprite && (sprites[i]->special == 0 || sprites[i]->special == 3)) {
- if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
- else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ if (distancemult >= 1)
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ else
+ glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
}
glBegin(GL_TRIANGLES);
@@ -262,13 +271,14 @@ void Sprite::Draw()
glPopMatrix();
}
tempmult = multiplier;
- for (i = sprites.size() - 1; i >= 0; i--) {
+ for (int i = sprites.size() - 1; i >= 0; i--) {
multiplier = tempmult;
if (sprites[i]->type != snowsprite) {
sprites[i]->position += sprites[i]->velocity * multiplier;
sprites[i]->velocity += windvector * multiplier;
}
- if (sprites[i]->type == flamesprite || sprites[i]->type == smoketype)sprites[i]->position += windvector * multiplier / 2;
+ if (sprites[i]->type == flamesprite || sprites[i]->type == smoketype)
+ sprites[i]->position += windvector * multiplier / 2;
if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite))
multiplier *= sprites[i]->speed * .7;
sprites[i]->alivetime += multiplier;
@@ -281,8 +291,9 @@ void Sprite::Draw()
if (sprites[i]->type == breathsprite) {
sprites[i]->opacity -= multiplier / 2;
sprites[i]->size += multiplier / 2;
- if (findLength(&sprites[i]->velocity) <= multiplier)sprites[i]->velocity = 0;
- else {
+ if (findLength(&sprites[i]->velocity) <= multiplier) {
+ sprites[i]->velocity = 0;
+ } else {
XYZ slowdown;
slowdown = sprites[i]->velocity * -1;
Normalise(&slowdown);
@@ -295,12 +306,12 @@ void Sprite::Draw()
sprites[i]->rotation += multiplier * 360;
sprites[i]->position.y -= multiplier;
sprites[i]->position += windvector * multiplier;
- if (sprites[i]->position.y < tempviewer.y - 6)sprites[i]->position.y += 12;
- if (sprites[i]->position.y > tempviewer.y + 6)sprites[i]->position.y -= 12;
- if (sprites[i]->position.z < tempviewer.z - 6)sprites[i]->position.z += 12;
- if (sprites[i]->position.z > tempviewer.z + 6)sprites[i]->position.z -= 12;
- if (sprites[i]->position.x < tempviewer.x - 6)sprites[i]->position.x += 12;
- if (sprites[i]->position.x > tempviewer.x + 6)sprites[i]->position.x -= 12;
+ if (sprites[i]->position.y < tempviewer.y - 6) sprites[i]->position.y += 12;
+ if (sprites[i]->position.y > tempviewer.y + 6) sprites[i]->position.y -= 12;
+ if (sprites[i]->position.z < tempviewer.z - 6) sprites[i]->position.z += 12;
+ if (sprites[i]->position.z > tempviewer.z + 6) sprites[i]->position.z -= 12;
+ if (sprites[i]->position.x < tempviewer.x - 6) sprites[i]->position.x += 12;
+ if (sprites[i]->position.x > tempviewer.x + 6) sprites[i]->position.x -= 12;
}
if (sprites[i]->type == bloodsprite) {
bool spritehit = 0;
@@ -311,23 +322,25 @@ void Sprite::Draw()
float rotationpoint;
int whichtri;
- for (j = 0; j < numplayers; j++) {
- if (!spritehit && player[j].dead && sprites[i]->alivetime > .1) {
+ for (unsigned j = 0; j < Person::players.size(); j++) {
+ if (!spritehit && Person::players[j]->dead && sprites[i]->alivetime > .1) {
where = sprites[i]->oldposition;
- where -= player[j].coords;
- if (!player[j].skeleton.free)where = DoRotation(where, 0, -player[j].yaw, 0);
+ where -= Person::players[j]->coords;
+ if (!Person::players[j]->skeleton.free)
+ where = DoRotation(where, 0, -Person::players[j]->yaw, 0);
startpoint = where;
where = sprites[i]->position;
- where -= player[j].coords;
- if (!player[j].skeleton.free)where = DoRotation(where, 0, -player[j].yaw, 0);
+ where -= Person::players[j]->coords;
+ if (!Person::players[j]->skeleton.free)
+ where = DoRotation(where, 0, -Person::players[j]->yaw, 0);
endpoint = where;
movepoint = 0;
rotationpoint = 0;
- whichtri = player[j].skeleton.drawmodel.LineCheck(&startpoint, &endpoint, &footpoint, &movepoint, &rotationpoint);
+ whichtri = Person::players[j]->skeleton.drawmodel.LineCheck(&startpoint, &endpoint, &footpoint, &movepoint, &rotationpoint);
if (whichtri != -1) {
spritehit = 1;
- player[j].DoBloodBigWhere(0, 160, sprites[i]->oldposition);
+ Person::players[j]->DoBloodBigWhere(0, 160, sprites[i]->oldposition);
DeleteSprite(i);
}
}
@@ -338,13 +351,14 @@ void Sprite::Draw()
if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision)
if (terrain.patchobjectnum[whichpatchx][whichpatchz]) {
if (!spritehit)
- for (j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
+ for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
k = terrain.patchobjects[whichpatchx][whichpatchz][j];
start = sprites[i]->oldposition;
end = sprites[i]->position;
if (!spritehit)
if (objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]) != -1) {
- if (detail == 2 || (detail == 1 && abs(Random() % 4) == 0) || (detail == 0 && abs(Random() % 8) == 0))objects.model[k].MakeDecal(blooddecalfast, DoRotation(colpoint - objects.position[k], 0, -objects.yaw[k], 0), sprites[i]->size * 1.6/*+abs((float)(Random()%100))/2400*/, .5, Random() % 360);
+ if (detail == 2 || (detail == 1 && abs(Random() % 4) == 0) || (detail == 0 && abs(Random() % 8) == 0))
+ objects.model[k].MakeDecal(blooddecalfast, DoRotation(colpoint - objects.position[k], 0, -objects.yaw[k], 0), sprites[i]->size * 1.6, .5, Random() % 360);
DeleteSprite(i);
spritehit = 1;
}
@@ -352,7 +366,7 @@ void Sprite::Draw()
}
if (!spritehit)
if (sprites[i]->position.y < terrain.getHeight(sprites[i]->position.x, sprites[i]->position.z)) {
- terrain.MakeDecal(blooddecalfast, sprites[i]->position, sprites[i]->size * 1.6/*+abs((float)(Random()%100))/2400*/, .6, Random() % 360);
+ terrain.MakeDecal(blooddecalfast, sprites[i]->position, sprites[i]->size * 1.6, .6, Random() % 360);
DeleteSprite(i);
}
}
@@ -360,8 +374,10 @@ void Sprite::Draw()
if (sprites[i]->type == splintersprite) {
sprites[i]->rotation += sprites[i]->rotatespeed * multiplier;
sprites[i]->opacity -= multiplier / 2;
- if (sprites[i]->special == 0 || sprites[i]->special == 2 || sprites[i]->special == 3)sprites[i]->velocity.y += gravity * multiplier;
- if (sprites[i]->special == 1)sprites[i]->velocity.y += gravity * multiplier * .5;
+ if (sprites[i]->special == 0 || sprites[i]->special == 2 || sprites[i]->special == 3)
+ sprites[i]->velocity.y += gravity * multiplier;
+ if (sprites[i]->special == 1)
+ sprites[i]->velocity.y += gravity * multiplier * .5;
}
if (sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite) {
sprites[i]->rotation += multiplier * sprites[i]->rotatespeed;
@@ -379,18 +395,22 @@ void Sprite::Draw()
sprites[i]->color[0] -= multiplier;
sprites[i]->color[1] -= multiplier;
sprites[i]->color[2] -= multiplier;
- if (sprites[i]->color[0] < .6)sprites[i]->color[0] = .6;
- if (sprites[i]->color[1] < .6)sprites[i]->color[1] = .6;
- if (sprites[i]->color[2] < .6)sprites[i]->color[2] = .6;
+ if (sprites[i]->color[0] < .6)
+ sprites[i]->color[0] = .6;
+ if (sprites[i]->color[1] < .6)
+ sprites[i]->color[1] = .6;
+ if (sprites[i]->color[2] < .6)
+ sprites[i]->color[2] = .6;
sprites[i]->size += multiplier;
sprites[i]->velocity = 0;
sprites[i]->velocity.y = 1.5;
sprites[i]->rotation += multiplier * sprites[i]->rotatespeed / 5;
}
- if (sprites[i]->opacity <= 0 || sprites[i]->size <= 0)DeleteSprite(i);
+ if (sprites[i]->opacity <= 0 || sprites[i]->size <= 0)
+ DeleteSprite(i);
}
if (check)
- for (i = sprites.size() - 1; i >= 0; i--) {
+ for (int i = sprites.size() - 1; i >= 0; i--) {
sprites[i]->oldposition = sprites[i]->position;
}
glAlphaFunc(GL_GREATER, 0.0001);