1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "System/mmgr.h"
#include "BitmapMuzzleFlame.h"
#include "Sim/Misc/GlobalSynced.h"
#include "Rendering/GlobalRendering.h"
#include "Rendering/GL/VertexArray.h"
#include "Rendering/Textures/ColorMap.h"
#include "Rendering/Textures/TextureAtlas.h"
#include "Sim/Projectiles/ProjectileHandler.h"
CR_BIND_DERIVED(CBitmapMuzzleFlame, CProjectile, );
CR_REG_METADATA(CBitmapMuzzleFlame,
(
CR_MEMBER_BEGINFLAG(CM_Config),
CR_MEMBER(sideTexture),
CR_MEMBER(frontTexture),
CR_MEMBER(dir),
CR_MEMBER(colorMap),
CR_MEMBER(size),
CR_MEMBER(length),
CR_MEMBER(sizeGrowth),
CR_MEMBER(ttl),
CR_MEMBER(frontOffset),
CR_MEMBER_ENDFLAG(CM_Config),
CR_RESERVED(8)
));
CBitmapMuzzleFlame::CBitmapMuzzleFlame()
: CProjectile()
, sideTexture(NULL)
, frontTexture(NULL)
, dir(ZeroVector)
, colorMap(NULL)
, size(0.0f)
, length(0.0f)
, sizeGrowth(0.0f)
, frontOffset(0.0f)
, ttl(0)
, invttl(0.0f)
, life(0.0f)
, createTime(0)
{
// set fields from super-classes
useAirLos = true;
checkCol = false;
deleteMe = false;
}
CBitmapMuzzleFlame::~CBitmapMuzzleFlame()
{
}
void CBitmapMuzzleFlame::Draw()
{
inArray = true;
life = (gs->frameNum - createTime + globalRendering->timeOffset) * invttl;
unsigned char col[4];
colorMap->GetColor(col, life);
float invlife = 1 - life;
float igrowth = sizeGrowth * (1 - invlife * invlife);
float isize = size + size * igrowth;
float ilength = length + length * igrowth;
float3 sidedir = dir.cross(float3(0, 1, 0)).SafeANormalize();
float3 updir = dir.cross(sidedir).SafeANormalize();
va->AddVertexTC(pos + updir * isize, sideTexture->xstart, sideTexture->ystart, col);
va->AddVertexTC(pos + updir * isize + dir * ilength, sideTexture->xend, sideTexture->ystart, col);
va->AddVertexTC(pos - updir * isize + dir * ilength, sideTexture->xend, sideTexture->yend, col);
va->AddVertexTC(pos - updir * isize, sideTexture->xstart, sideTexture->yend, col);
va->AddVertexTC(pos + sidedir * isize, sideTexture->xstart, sideTexture->ystart, col);
va->AddVertexTC(pos + sidedir * isize + dir * ilength, sideTexture->xend, sideTexture->ystart, col);
va->AddVertexTC(pos - sidedir * isize + dir * ilength, sideTexture->xend, sideTexture->yend, col);
va->AddVertexTC(pos - sidedir * isize, sideTexture->xstart, sideTexture->yend, col);
float3 frontpos = pos + dir * frontOffset * ilength;
va->AddVertexTC(frontpos - sidedir * isize + updir * isize, frontTexture->xstart, frontTexture->ystart, col);
va->AddVertexTC(frontpos + sidedir * isize + updir * isize, frontTexture->xend, frontTexture->ystart, col);
va->AddVertexTC(frontpos + sidedir * isize - updir * isize, frontTexture->xend, frontTexture->yend, col);
va->AddVertexTC(frontpos - sidedir * isize - updir * isize, frontTexture->xstart, frontTexture->yend, col);
}
void CBitmapMuzzleFlame::Update()
{
ttl--;
if (ttl == 0) {
deleteMe = true;
}
}
void CBitmapMuzzleFlame::Init(const float3& pos, CUnit* owner)
{
CProjectile::Init(pos, owner);
life = 0.0f;
createTime = gs->frameNum;
invttl = 1.0f / (float) ttl;
}
|