#include "Explosion.h" #include void InitExplosion(VExplosion * e, int NumLines, float duration, Vector * Position) { int i; e->markedForRemoval = false; e->next = NULL; e->NumLines = NumLines; e->TimeLeft = duration; e->Duration = duration; e->lines = (VObject *) NewPtrClear(sizeof(VObject) * e->NumLines); e->rotates = (Vector *) NewPtrClear(sizeof(Vector) * e->NumLines); e->moves = (Vector *) NewPtrClear(sizeof(Vector) * e->NumLines); for(i = 0; i < e->NumLines; i++) { InitObject(&e->lines[i]); BuildExplosionModel(&e->lines[i].Model); e->lines[i].Position = *Position; e->rotates[i].x = ((float)(Random() % 200) - 100) / 1000; e->rotates[i].y = ((float)(Random() % 200) - 100) / 1000; e->rotates[i].z = ((float)(Random() % 200) - 100) / 1000; e->moves[i].x = ((float)(Random() % 200) - 100) / 10000; if (Random() % 2) e->moves[i].x *= -1; e->moves[i].y = ((float)(Random() % 200) - 100) / 10000; if (Random() % 2) e->moves[i].y *= -1; e->moves[i].z = ((float)(Random() % 200) - 100) / 10000; if (Random() % 2) e->moves[i].z *= -1; e->lines[i].Model.Color[0] = 100 / (float)((Random() % 100) + 100); e->lines[i].Model.Color[1] = 100 / (float)((Random() % 100) + 100); e->lines[i].Model.Color[2] = 100 / (float)((Random() % 100) + 100); } } void CleanUpExplosion(VExplosion * e) { while (e->NumLines > 0) { e->NumLines--; CleanUpObject(&e->lines[e->NumLines]); } DisposePtr((Ptr) e->lines); e->lines = NULL; DisposePtr((Ptr) e->moves); e->moves = NULL; DisposePtr((Ptr) e->rotates); e->rotates = NULL; } void RunExplosion(VExplosion * e, float interval) { int i; e->TimeLeft -= interval; if(e->TimeLeft <= 0) e->markedForRemoval = true; for(i = 0; i < e->NumLines; i++) { e->lines[i].Model.Color[3] -= 1 / (e->Duration / interval); AddVector(&e->lines[i].Position, &e->moves[i], &e->lines[i].Position); AddVector(&e->lines[i].Front, &e->rotates[i], &e->lines[i].Front); NormalizeVector(&e->lines[i].Front); CrossProduct(&e->lines[i].Front, &e->lines[i].Right, &e->lines[i].Up); CrossProduct(&e->lines[i].Up, &e->lines[i].Front, &e->lines[i].Right); NormalizeVector(&e->lines[i].Right); NormalizeVector(&e->lines[i].Up); } } void DrawExplosion(VExplosion * e) { int i; for(i = 0; i < e->NumLines; i++) { DrawObject(&e->lines[i]); } }