X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FSprite.cpp;h=5b7c9e1f935899ee1f4642669bd804d0ab75f934;hb=cd043e3f9e26c2b3406b40a354c2840941e9db7f;hp=c3ac298cc958685170bac4ee845731d5a3f5a9ec;hpb=24004d6ab1e68faaf85ece11b566449997da5013;p=lugaru.git diff --git a/Source/Sprite.cpp b/Source/Sprite.cpp index c3ac298..5b7c9e1 100644 --- a/Source/Sprite.cpp +++ b/Source/Sprite.cpp @@ -3,20 +3,18 @@ Copyright (C) 2003, 2010 - Wolfire Games 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 +55,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 +95,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: @@ -142,10 +140,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 +195,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 +229,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 +277,14 @@ void Sprite::Draw() glPopMatrix(); } tempmult = multiplier; - for (i = sprites.size() - 1; i >= 0; i--) { + for (unsigned 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 +297,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 +312,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 +328,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 +357,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/*+abs((float)(Random()%100))/2400*/, .5, Random() % 360); DeleteSprite(i); spritehit = 1; } @@ -360,8 +380,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 +401,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 (unsigned i = sprites.size() - 1; i >= 0; i--) { sprites[i]->oldposition = sprites[i]->position; } glAlphaFunc(GL_GREATER, 0.0001);