X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGraphic%2FSprite.cpp;h=fc1cae2f09ecb1b56e2bc2cf0d6b0e36bbd1645b;hb=8b6e8f3ad7390309795eb35c0959264cb7924402;hp=3f582f95f9b2e724b72a96b8d5eeea75293c7d62;hpb=7d2f9d40d94d14a61ecdaaa2c41f964029815bc2;p=lugaru.git diff --git a/Source/Graphic/Sprite.cpp b/Source/Graphic/Sprite.cpp index 3f582f9..fc1cae2 100644 --- a/Source/Graphic/Sprite.cpp +++ b/Source/Graphic/Sprite.cpp @@ -100,89 +100,89 @@ void Sprite::Draw() for (unsigned i = 0; i < sprites.size(); i++) { if (lasttype != sprites[i]->type) { switch (sprites[i]->type) { - case cloudsprite: - cloudtexture.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; - glAlphaFunc(GL_GREATER, 0.0001); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - break; - case smoketype: - smoketexture.bind(); - if (!blend) { - blend = 1; - glAlphaFunc(GL_GREATER, 0.0001); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - break; - case bloodsprite: - bloodtexture.bind(); - if (!blend) { - blend = 1; - glAlphaFunc(GL_GREATER, 0.0001); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - 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(); + case cloudsprite: + cloudtexture.bind(); if (!blend) { blend = 1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } - } - break; - case snowsprite: - snowflaketexture.bind(); - if (!blend) { - blend = 1; - glAlphaFunc(GL_GREATER, 0.0001); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - break; - case weaponshinesprite: - shinetexture.bind(); - if (blend) { - blend = 0; - glAlphaFunc(GL_GREATER, 0.001); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - } - break; - case flamesprite: - case weaponflamesprite: - flametexture.bind(); - if (blend || lasttype == bloodflamesprite) { - blend = 0; - glAlphaFunc(GL_GREATER, 0.3); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - } - break; - case bloodflamesprite: - bloodflametexture.bind(); - if (blend) { - blend = 0; - glAlphaFunc(GL_GREATER, 0.3); - glBlendFunc(GL_ONE, GL_ZERO); - } - break; + break; + case breathsprite: + case cloudimpactsprite: + cloudimpacttexture.bind(); + if (!blend) { + blend = 1; + glAlphaFunc(GL_GREATER, 0.0001); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + break; + case smoketype: + smoketexture.bind(); + if (!blend) { + blend = 1; + glAlphaFunc(GL_GREATER, 0.0001); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + break; + case bloodsprite: + bloodtexture.bind(); + if (!blend) { + blend = 1; + glAlphaFunc(GL_GREATER, 0.0001); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + 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 (!blend) { + blend = 1; + glAlphaFunc(GL_GREATER, 0.0001); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + } + break; + case snowsprite: + snowflaketexture.bind(); + if (!blend) { + blend = 1; + glAlphaFunc(GL_GREATER, 0.0001); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + break; + case weaponshinesprite: + shinetexture.bind(); + if (blend) { + blend = 0; + glAlphaFunc(GL_GREATER, 0.001); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + } + break; + case flamesprite: + case weaponflamesprite: + flametexture.bind(); + if (blend || lasttype == bloodflamesprite) { + blend = 0; + glAlphaFunc(GL_GREATER, 0.3); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + } + break; + case bloodflamesprite: + bloodflametexture.bind(); + if (blend) { + blend = 0; + glAlphaFunc(GL_GREATER, 0.3); + glBlendFunc(GL_ONE, GL_ZERO); + } + break; } } if (sprites[i]->type == snowsprite) @@ -196,9 +196,9 @@ void Sprite::Draw() 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); + 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); + 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; @@ -230,42 +230,42 @@ void Sprite::Draw() 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); + 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); + 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); + 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); + 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); + 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); + glColor4f(sprites[i]->color[0] * lightcolor[0], sprites[i]->color[1] * lightcolor[1], sprites[i]->color[2] * lightcolor[2], distancemult); } } 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); + 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); + glColor4f(sprites[i]->color[0] * lightcolor[0], sprites[i]->color[1] * lightcolor[1], sprites[i]->color[2] * lightcolor[2], distancemult); } glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); - glVertex3f( .5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f); + glVertex3f(.5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f); glTexCoord2f(1.0f, 0.0f); - glVertex3f( .5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f); + glVertex3f(.5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-.5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f); glTexCoord2f(1.0f, 0.0f); - glVertex3f( .5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f); + glVertex3f(.5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f); glEnd(); @@ -307,12 +307,18 @@ 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; @@ -349,27 +355,28 @@ void Sprite::Draw() whichpatchx = sprites[i]->position.x / (terrain.size / subdivision * terrain.scale); whichpatchz = sprites[i]->position.z / (terrain.size / subdivision * terrain.scale); - if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) - if (terrain.patchobjectnum[whichpatchx][whichpatchz]) { - if (!spritehit) - 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 (Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw) != -1) { - if (detail == 2 || (detail == 1 && abs(Random() % 4) == 0) || (detail == 0 && abs(Random() % 8) == 0)) - Object::objects[k]->model.MakeDecal(blooddecalfast, DoRotation(colpoint - Object::objects[k]->position, 0, -Object::objects[k]->yaw, 0), sprites[i]->size * 1.6, .5, Random() % 360); - DeleteSprite(i); - spritehit = 1; - } - } + if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) { + if (!spritehit) { + for (unsigned int j = 0; j < terrain.patchobjects[whichpatchx][whichpatchz].size(); j++) { + k = terrain.patchobjects[whichpatchx][whichpatchz][j]; + start = sprites[i]->oldposition; + end = sprites[i]->position; + if (!spritehit) + if (Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw) != -1) { + if (detail == 2 || (detail == 1 && abs(Random() % 4) == 0) || (detail == 0 && abs(Random() % 8) == 0)) + Object::objects[k]->model.MakeDecal(blooddecalfast, DoRotation(colpoint - Object::objects[k]->position, 0, -Object::objects[k]->yaw, 0), sprites[i]->size * 1.6, .5, Random() % 360); + DeleteSprite(i); + spritehit = 1; + } + } } - if (!spritehit) + } + 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, .6, Random() % 360); DeleteSprite(i); } + } } } if (sprites[i]->type == splintersprite) { @@ -462,19 +469,3 @@ Sprite::Sprite() speed = 0; rotatespeed = 0; } - -void Sprite::clearTextures() -{ - toothtexture.destroy(); - cloudtexture.destroy(); - cloudimpacttexture.destroy(); - bloodtexture.destroy(); - flametexture.destroy(); - bloodflametexture.destroy(); - smoketexture.destroy(); - snowflaketexture.destroy(); - shinetexture.destroy(); - splintertexture.destroy(); - leaftexture.destroy(); -} -