CSmokeTrailProjectile::CSmokeTrailProjectile( const float3& pos1, const float3& pos2, const float3& dir1, const float3& dir2, CUnit* owner, bool firstSegment, bool lastSegment, float size, int time, float color, bool drawTrail, CProjectile* drawCallback, AtlasedTexture* texture): CProjectile((pos1 + pos2) * 0.5f, ZeroVector, owner, false, false, false), pos1(pos1), pos2(pos2), orgSize(size), creationTime(gs->frameNum), lifeTime(time), color(color), dir1(dir1), dir2(dir2), drawTrail(drawTrail), drawSegmented(false), firstSegment(firstSegment), lastSegment(lastSegment), drawCallbacker(drawCallback), texture(texture) { checkCol = false; castShadow = true; // if no custom texture is defined, use the default texture // Note that this will crash anyway (no idea why) so never have a null texture! if (texture == NULL) { texture = projectileDrawer->smoketrailtex; } if (!drawTrail) { const float dist = pos1.distance(pos2); dirpos1 = pos1 - dir1 * dist * 0.33f; dirpos2 = pos2 + dir2 * dist * 0.33f; } else if (dir1.dot(dir2) < 0.98f) { const float dist = pos1.distance(pos2); dirpos1 = pos1 - dir1 * dist * 0.33f; dirpos2 = pos2 + dir2 * dist * 0.33f; // float3 mp = (pos1 + pos2) / 2; midpos = CalcBeizer(0.5f, pos1, dirpos1, dirpos2, pos2); middir = (dir1 + dir2).ANormalize(); drawSegmented = true; } SetRadiusAndHeight(pos1.distance(pos2), 0.0f); if ((pos.y - ground->GetApproximateHeight(pos.x, pos.z)) > 10) { useAirLos = true; } }
CSmokeTrailProjectile::CSmokeTrailProjectile( CUnit* owner, const float3& pos1, const float3& pos2, const float3& dir1, const float3& dir2, bool firstSegment, bool lastSegment, float size, int time, float color, bool drawTrail, CProjectile* drawCallback, AtlasedTexture* texture ): CProjectile((pos1 + pos2) * 0.5f, ZeroVector, owner, false, false, false), pos1(pos1), pos2(pos2), orgSize(size), creationTime(gs->frameNum), lifeTime(time), color(color), dir1(dir1), dir2(dir2), drawTrail(drawTrail), drawSegmented(false), firstSegment(firstSegment), lastSegment(lastSegment), drawCallbacker(drawCallback), texture(texture == NULL ? projectileDrawer->smoketrailtex : texture) { checkCol = false; castShadow = true; if (!drawTrail) { const float dist = pos1.distance(pos2); dirpos1 = pos1 - dir1 * dist * 0.33f; dirpos2 = pos2 + dir2 * dist * 0.33f; } else if (dir1.dot(dir2) < 0.98f) { const float dist = pos1.distance(pos2); dirpos1 = pos1 - dir1 * dist * 0.33f; dirpos2 = pos2 + dir2 * dist * 0.33f; // float3 mp = (pos1 + pos2) / 2; midpos = CalcBeizer(0.5f, pos1, dirpos1, dirpos2, pos2); middir = (dir1 + dir2).ANormalize(); drawSegmented = true; } SetRadiusAndHeight(pos1.distance(pos2), 0.0f); if ((pos.y - CGround::GetApproximateHeight(pos.x, pos.z)) > 10) { useAirLos = true; } }
CSmokeTrailProjectile::CSmokeTrailProjectile(const float3& pos1,const float3& pos2,const float3& dir1,const float3& dir2, CUnit* owner,bool firstSegment,bool lastSegment,float size,float time,float color,bool drawTrail,CProjectile* drawCallback) : CProjectile((pos1+pos2)*0.5f,ZeroVector,owner, false), pos1(pos1), pos2(pos2), creationTime(gs->frameNum), lifeTime((int)time), orgSize(size), color(color), dir1(dir1), dir2(dir2), drawTrail(drawTrail), drawSegmented(false), drawCallbacker(drawCallback), firstSegment(firstSegment), lastSegment(lastSegment) { checkCol=false; castShadow=true; if(!drawTrail){ float dist=pos1.distance(pos2); dirpos1=pos1-dir1*dist*0.33f; dirpos2=pos2+dir2*dist*0.33f; } else if(dir1.dot(dir2)<0.98f){ float dist=pos1.distance(pos2); dirpos1=pos1-dir1*dist*0.33f; dirpos2=pos2+dir2*dist*0.33f; float3 mp=(pos1+pos2)/2; midpos=CalcBeizer(0.5f,pos1,dirpos1,dirpos2,pos2); middir=(dir1+dir2).Normalize(); drawSegmented=true; } SetRadius(pos1.distance(pos2)); if(pos.y-ground->GetApproximateHeight(pos.x,pos.z)>10) useAirLos=true; }
void CStarburstProjectile::Draw(void) { float3 interPos=pos+speed*gu->timeOffset; inArray=true; float age2=(age&7)+gu->timeOffset; float color=0.7; unsigned char col[4]; unsigned char col2[4]; if(drawTrail){ //draw the trail as a single quad float3 dif(interPos-camera->pos); dif.Normalize(); float3 dir1(dif.cross(dir)); dir1.Normalize(); float3 dif2(oldSmoke-camera->pos); dif2.Normalize(); float3 dir2(dif2.cross(oldSmokeDir)); dir2.Normalize(); float a1=(1-float(0)/(Smoke_Time))*255; a1*=0.7+fabs(dif.dot(dir)); int alpha=min(255,(int)max(0.f,a1)); col[0]=(unsigned char) (color*alpha); col[1]=(unsigned char) (color*alpha); col[2]=(unsigned char) (color*alpha); col[3]=(unsigned char)alpha; float a2=(1-float(age2)/(Smoke_Time))*255; a2*=0.7+fabs(dif2.dot(oldSmokeDir)); if(age<8) a2=0; alpha=min(255,(int)max(0.f,a2)); col2[0]=(unsigned char) (color*alpha); col2[1]=(unsigned char) (color*alpha); col2[2]=(unsigned char) (color*alpha); col2[3]=(unsigned char)alpha; float xmod=0; float ymod=0.25; float size=1; float size2=(1+age2*(1/Smoke_Time)*7); float txs=(1-age2/8.0); va->AddVertexTC(interPos-dir1*size, txs/4+1.0/32, 2.0/16, col); va->AddVertexTC(interPos+dir1*size, txs/4+1.0/32, 3.0/16, col); va->AddVertexTC(oldSmoke+dir2*size2, 0.25+1.0/32, 3.0/16, col2); va->AddVertexTC(oldSmoke-dir2*size2, 0.25+1.0/32, 2.0/16, col2); } else { //draw the trail as particles float dist=pos.distance(oldSmoke); float3 dirpos1=pos-dir*dist*0.33; float3 dirpos2=oldSmoke+oldSmokeDir*dist*0.33; for(int a=0;a<numParts;++a){ float a1=1-float(a)/Smoke_Time; col[0]=(unsigned char) (color*255); col[1]=(unsigned char) (color*255); col[2]=(unsigned char) (color*255); col[3]=255;//min(255,max(0,a1*255)); float size=(1+(a)*(1/Smoke_Time)*7); float3 pos1=CalcBeizer(float(a)/(numParts),pos,dirpos1,dirpos2,oldSmoke); va->AddVertexTC(pos1+( camera->up+camera->right)*size, 4.0/16, 0.0/16, col); va->AddVertexTC(pos1+( camera->up-camera->right)*size, 5.0/16, 0.0/16, col); va->AddVertexTC(pos1+(-camera->up-camera->right)*size, 5.0/16, 1.0/16, col); va->AddVertexTC(pos1+(-camera->up+camera->right)*size, 4.0/16, 1.0/16, col); } } DrawCallback(); if(curCallback==0) DrawCallback(); }
void CStarburstProjectile::Draw(void) { inArray = true; float age2 = (age & 7) + globalRendering->timeOffset; unsigned char col[4]; unsigned char col2[4]; if (weaponDef->visuals.smokeTrail) { #if defined(USE_GML) && GML_ENABLE_SIM const int curNumParts = *(volatile int *)&numParts; #else const int curNumParts = numParts; #endif va->EnlargeArrays(4+4*curNumParts,0,VA_SIZE_TC); const float color = 0.7f; if(drawTrail){ //draw the trail as a single quad float3 dif(drawPos-camera->pos); dif.Normalize(); float3 dir1(dif.cross(dir)); dir1.Normalize(); float3 dif2(oldSmoke-camera->pos); dif2.Normalize(); float3 dir2(dif2.cross(oldSmokeDir)); dir2.Normalize(); float a1=(1-float(0)/(Smoke_Time))*255; a1*=0.7f+fabs(dif.dot(dir)); const int alpha1 = std::min(255, (int) std::max(0.f,a1)); col[0]=(unsigned char) (color*alpha1); col[1]=(unsigned char) (color*alpha1); col[2]=(unsigned char) (color*alpha1); col[3]=(unsigned char)alpha1; float a2=(1-float(age2)/(Smoke_Time))*255; a2*=0.7f+fabs(dif2.dot(oldSmokeDir)); if(age<8) a2=0; const int alpha2 = std::min(255, (int) std::max(0.f,a2)); col2[0]=(unsigned char) (color*alpha2); col2[1]=(unsigned char) (color*alpha2); col2[2]=(unsigned char) (color*alpha2); col2[3]=(unsigned char)alpha2; const float size = 1.0f; const float size2 = (1.0f + age2 * (1.0f / Smoke_Time) * 7.0f); const float txs = weaponDef->visuals.texture2->xend - (weaponDef->visuals.texture2->xend - weaponDef->visuals.texture2->xstart) * (age2 / 8.0f); // (1.0f - age2 / 8.0f); va->AddVertexQTC(drawPos - dir1 * size, txs, weaponDef->visuals.texture2->ystart, col); va->AddVertexQTC(drawPos + dir1 * size, txs, weaponDef->visuals.texture2->yend, col); va->AddVertexQTC(oldSmoke + dir2 * size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->yend, col2); va->AddVertexQTC(oldSmoke - dir2 * size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->ystart, col2); } else { //draw the trail as particles const float dist = pos.distance(oldSmoke); const float3 dirpos1 = pos-dir * dist * 0.33f; const float3 dirpos2 = oldSmoke + oldSmokeDir * dist * 0.33f; for (int a = 0; a < curNumParts; ++a) { //! CAUTION: loop count must match EnlargeArrays above //float a1=1-float(a)/Smoke_Time; col[0]=(unsigned char) (color*255); col[1]=(unsigned char) (color*255); col[2]=(unsigned char) (color*255); col[3]=255;//min(255,max(0,a1*255)); const float size=(1+(a)*(1/Smoke_Time)*7); const float3 pos1=CalcBeizer(float(a)/(curNumParts),pos,dirpos1,dirpos2,oldSmoke); #define st projectileDrawer->smoketex[0] va->AddVertexQTC(pos1 + ( camera->up + camera->right) * size, st->xstart, st->ystart, col); va->AddVertexQTC(pos1 + ( camera->up - camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up - camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up + camera->right) * size, st->xstart, st->ystart, col); #undef st } } } DrawCallback(); if(curCallback==0) DrawCallback(); }
void CStarburstProjectile::Draw() { inArray = true; if (weaponDef->visuals.smokeTrail) { const int curNumParts = GML::SimEnabled() ? *(volatile int*) &numParts : numParts; va->EnlargeArrays(4 + (4 * curNumParts), 0, VA_SIZE_TC); const float age2 = (age & 7) + globalRendering->timeOffset; const float color = 0.7f; if (drawTrail) { // draw the trail as a single quad const float3 dif1 = (drawPos - camera->pos).ANormalize(); const float3 dir1 = (dif1.cross(dir)).ANormalize(); const float3 dif2 = (oldSmoke - camera->pos).ANormalize(); const float3 dir2 = (dif2.cross(oldSmokeDir)).ANormalize(); const float a1 = ((1.0f - (0.0f / SMOKE_TIME))) * (0.7f + math::fabs(dif1.dot(dir))); const float a2 = (age < 8)? 0.0f: ((1.0f - (age2 / SMOKE_TIME))) * (0.7f + math::fabs(dif2.dot(oldSmokeDir))); const float alpha1 = Clamp(a1, 0.0f, 1.0f); const float alpha2 = Clamp(a2, 0.0f, 1.0f); const float size1 = 1.0f; const float size2 = (1.0f + age2 * (1.0f / SMOKE_TIME) * 7.0f); const float txs = weaponDef->visuals.texture2->xend - (weaponDef->visuals.texture2->xend - weaponDef->visuals.texture2->xstart) * (age2 / 8.0f); SColor col (color * alpha1, color * alpha1, color * alpha1, alpha1); SColor col2(color * alpha2, color * alpha2, color * alpha2, alpha2); va->AddVertexQTC(drawPos - dir1 * size1, txs, weaponDef->visuals.texture2->ystart, col); va->AddVertexQTC(drawPos + dir1 * size1, txs, weaponDef->visuals.texture2->yend, col); va->AddVertexQTC(oldSmoke + dir2 * size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->yend, col2); va->AddVertexQTC(oldSmoke - dir2 * size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->ystart, col2); } else { // draw the trail as particles const float dist = pos.distance(oldSmoke); const float3 dirpos1 = pos - dir * dist * 0.33f; const float3 dirpos2 = oldSmoke + oldSmokeDir * dist * 0.33f; const SColor col(color, color, color); for (int a = 0; a < curNumParts; ++a) { // CAUTION: loop count must match EnlargeArrays above const float size = 1 + (a * (1.0f / SMOKE_TIME) * 7.0f); const float3 pos1 = CalcBeizer((float)a / curNumParts, pos, dirpos1, dirpos2, oldSmoke); #define st projectileDrawer->smoketex[0] va->AddVertexQTC(pos1 + ( camera->up + camera->right) * size, st->xstart, st->ystart, col); va->AddVertexQTC(pos1 + ( camera->up - camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up - camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up + camera->right) * size, st->xstart, st->ystart, col); #undef st } } } DrawCallback(); }
void CMissileProjectile::Draw(void) { float3 interPos=pos+speed*gu->timeOffset; inArray=true; float age2=(age&7)+gu->timeOffset; float color=0.6f; unsigned char col[4]; if(drawTrail){ //draw the trail as a single quad float3 dif(interPos-camera->pos); dif.Normalize(); float3 dir1(dif.cross(dir)); dir1.Normalize(); float3 dif2(oldSmoke-camera->pos); dif2.Normalize(); float3 dir2(dif2.cross(oldDir)); dir2.Normalize(); float a1=(1-float(0)/(Smoke_Time))*255; a1*=0.7f+fabs(dif.dot(dir)); float alpha=min((float)255,max(float(0),a1)); col[0]=(unsigned char) (color*alpha); col[1]=(unsigned char) (color*alpha); col[2]=(unsigned char) (color*alpha); col[3]=(unsigned char) alpha; unsigned char col2[4]; float a2=(1-float(age2)/(Smoke_Time))*255; if(age<8) a2=0; a2*=0.7f+fabs(dif2.dot(oldDir)); alpha=min((float)255,max((float)0,a2)); col2[0]=(unsigned char) (color*alpha); col2[1]=(unsigned char) (color*alpha); col2[2]=(unsigned char) (color*alpha); col2[3]=(unsigned char) alpha; float xmod=0; float ymod=0.25f; float size=(1); float size2=(1+(age2*(1/Smoke_Time))*7); float txs=weaponDef->visuals.texture2->xend - (weaponDef->visuals.texture2->xend-weaponDef->visuals.texture2->xstart)*(age2/8.0f);//(1-age2/8.0f); va->AddVertexTC(interPos-dir1*size, txs, weaponDef->visuals.texture2->ystart, col); va->AddVertexTC(interPos+dir1*size, txs, weaponDef->visuals.texture2->yend, col); va->AddVertexTC(oldSmoke+dir2*size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->yend, col2); va->AddVertexTC(oldSmoke-dir2*size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->ystart, col2); } else { //draw the trail as particles float dist=pos.distance(oldSmoke); float3 dirpos1=pos-dir*dist*0.33f; float3 dirpos2=oldSmoke+oldDir*dist*0.33f; for(int a=0;a<numParts;++a){ float a1=1-float(a)/Smoke_Time; float alpha=255; col[0]=(unsigned char) (color*alpha); col[1]=(unsigned char) (color*alpha); col[2]=(unsigned char) (color*alpha); col[3]=(unsigned char)alpha;//min(255,max(0,a1*255)); float size=(1+(a*(1/Smoke_Time))*7); float3 pos1=CalcBeizer(float(a)/(numParts),pos,dirpos1,dirpos2,oldSmoke); va->AddVertexTC(pos1+( camera->up+camera->right)*size, ph->smoketex[0].xstart, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+( camera->up-camera->right)*size, ph->smoketex[0].xend, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+(-camera->up-camera->right)*size, ph->smoketex[0].xend, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+(-camera->up+camera->right)*size, ph->smoketex[0].xstart, ph->smoketex[0].ystart, col); } } //rita flaren col[0]=255; col[1]=210; col[2]=180; col[3]=1; float fsize = radius*0.4f; va->AddVertexTC(interPos-camera->right*fsize-camera->up*fsize,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart,col); va->AddVertexTC(interPos+camera->right*fsize-camera->up*fsize,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart,col); va->AddVertexTC(interPos+camera->right*fsize+camera->up*fsize,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend,col); va->AddVertexTC(interPos-camera->right*fsize+camera->up*fsize,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend,col); /* col[0]=200; col[1]=200; col[2]=200; col[3]=255; float3 r=dir.cross(UpVector); r.Normalize(); float3 u=dir.cross(r); va->AddVertexTC(interPos+r*1.0f,1.0f/16,1.0f/16,col); va->AddVertexTC(interPos-r*1.0f,1.0f/16,1.0f/16,col); va->AddVertexTC(interPos+dir*9,1.0f/16,1.0f/16,col); va->AddVertexTC(interPos+dir*9,1.0f/16,1.0f/16,col); va->AddVertexTC(interPos+u*1.0f,1.0f/16,1.0f/16,col); va->AddVertexTC(interPos-u*1.0f,1.0f/16,1.0f/16,col); va->AddVertexTC(interPos+dir*9,1.0f/16,1.0f/16,col); va->AddVertexTC(interPos+dir*9,1.0f/16,1.0f/16,col);*/ }
void CSmokeTrailProjectile::Draw() { inArray=true; float age=gs->frameNum+gu->timeOffset-creationTime; if(drawTrail){ float3 dif(pos1-camera->pos2); dif.Normalize(); float3 odir1(dif.cross(dir1)); odir1.Normalize(); float3 dif2(pos2-camera->pos2); dif2.Normalize(); float3 odir2(dif2.cross(dir2)); odir2.Normalize(); unsigned char col[4]; float a1=(1-float(age)/(lifeTime))*255; if(lastSegment) a1=0; a1*=0.7f+fabs(dif.dot(dir1)); float alpha=min(255.f,max(0.f,a1)); col[0]=(unsigned char) (color*alpha); col[1]=(unsigned char) (color*alpha); col[2]=(unsigned char) (color*alpha); col[3]=(unsigned char)alpha; unsigned char col2[4]; float a2=(1-float(age+8)/(lifeTime))*255; if(firstSegment) a2=0; a2*=0.7f+fabs(dif2.dot(dir2)); alpha=min(255.f,max(0.f,a2)); col2[0]=(unsigned char) (color*alpha); col2[1]=(unsigned char) (color*alpha); col2[2]=(unsigned char) (color*alpha); col2[3]=(unsigned char)alpha; float size=1+(age*(1.0f/lifeTime))*orgSize; float size2=1+((age+8)*(1.0f/lifeTime))*orgSize; if(drawSegmented){ float3 dif3(midpos-camera->pos2); dif3.Normalize(); float3 odir3(dif3.cross(middir)); odir3.Normalize(); float size3=0.2f+((age+4)*(1.0f/lifeTime))*orgSize; unsigned char col3[4]; float a2=(1-float(age+4)/(lifeTime))*255; a2*=0.7f+fabs(dif3.dot(middir)); alpha=min(255.f,max(0.f,a2)); col3[0]=(unsigned char) (color*alpha); col3[1]=(unsigned char) (color*alpha); col3[2]=(unsigned char) (color*alpha); col3[3]=(unsigned char)alpha; float midtexx = ph->smoketrailtex.xstart + (ph->smoketrailtex.xend - ph->smoketrailtex.xstart)*0.5f; va->AddVertexTC(pos1-odir1*size,ph->smoketrailtex.xstart,ph->smoketrailtex.ystart,col); va->AddVertexTC(pos1+odir1*size,ph->smoketrailtex.xstart,ph->smoketrailtex.yend,col); va->AddVertexTC(midpos+odir3*size3,midtexx,ph->smoketrailtex.yend,col3); va->AddVertexTC(midpos-odir3*size3,midtexx,ph->smoketrailtex.ystart,col3); va->AddVertexTC(midpos-odir3*size3,midtexx,ph->smoketrailtex.ystart,col3); va->AddVertexTC(midpos+odir3*size3,midtexx,ph->smoketrailtex.yend,col3); va->AddVertexTC(pos2+odir2*size2,ph->smoketrailtex.xend,ph->smoketrailtex.yend,col2); va->AddVertexTC(pos2-odir2*size2,ph->smoketrailtex.xend,ph->smoketrailtex.ystart,col2); } else { va->AddVertexTC(pos1-odir1*size,ph->smoketrailtex.xstart,ph->smoketrailtex.ystart,col); va->AddVertexTC(pos1+odir1*size,ph->smoketrailtex.xstart,ph->smoketrailtex.yend,col); va->AddVertexTC(pos2+odir2*size2,ph->smoketrailtex.xend,ph->smoketrailtex.yend,col2); va->AddVertexTC(pos2-odir2*size2,ph->smoketrailtex.xend,ph->smoketrailtex.ystart,col2); } } else { //draw as particles unsigned char col[4]; for(int a=0;a<8;++a){ float a1=1-float(age+a)/lifeTime; float alpha=min(255.f,max(0.f,a1*255)); col[0]=(unsigned char) (color*alpha); col[1]=(unsigned char) (color*alpha); col[2]=(unsigned char) (color*alpha); col[3]=(unsigned char)alpha; float size=((0.2f+(age+a)*(1.0f/lifeTime))*orgSize)*1.2f; float3 pos=CalcBeizer(a/8.0f,pos1,dirpos1,dirpos2,pos2); va->AddVertexTC(pos1+( camera->up+camera->right)*size, ph->smoketex[0].xstart, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+( camera->up-camera->right)*size, ph->smoketex[0].xend, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+(-camera->up-camera->right)*size, ph->smoketex[0].xend, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+(-camera->up+camera->right)*size, ph->smoketex[0].xstart, ph->smoketex[0].ystart, col); } } if(drawCallbacker) drawCallbacker->DrawCallback(); }
void CMissileProjectile::Draw() { inArray = true; const float age2 = (age & 7) + globalRendering->timeOffset; unsigned char col[4]; va->EnlargeArrays(8 + (4 * numParts), 0, VA_SIZE_TC); if (weaponDef->visuals.smokeTrail) { const float color = 0.6f; if (drawTrail) { // draw the trail as a single quad float3 dif(drawPos - camera->pos); dif.ANormalize(); float3 dir1(dif.cross(dir)); dir1.ANormalize(); float3 dif2(oldSmoke - camera->pos); dif2.ANormalize(); float3 dir2(dif2.cross(oldDir)); dir2.ANormalize(); float a1 = (1.0f / (SMOKE_TIME)) * 255; a1 *= 0.7f + math::fabs(dif.dot(dir)); const float alpha1 = std::min(255.0f, std::max(0.0f, a1)); col[0] = (unsigned char) (color * alpha1); col[1] = (unsigned char) (color * alpha1); col[2] = (unsigned char) (color * alpha1); col[3] = (unsigned char) alpha1; unsigned char col2[4]; float a2 = (1 - float(age2) / (SMOKE_TIME)) * 255; if (age < 8) { a2 = 0; } a2 *= 0.7f + math::fabs(dif2.dot(oldDir)); const float alpha2 = std::min(255.0f, std::max(0.0f, a2)); col2[0] = (unsigned char) (color * alpha2); col2[1] = (unsigned char) (color * alpha2); col2[2] = (unsigned char) (color * alpha2); col2[3] = (unsigned char) alpha2; const float size = 1.0f; const float size2 = (1 + (age2 * (1 / SMOKE_TIME)) * 7); const float txs = weaponDef->visuals.texture2->xend - (weaponDef->visuals.texture2->xend - weaponDef->visuals.texture2->xstart) * (age2 / 8.0f); va->AddVertexQTC(drawPos - dir1 * size, txs, weaponDef->visuals.texture2->ystart, col); va->AddVertexQTC(drawPos + dir1 * size, txs, weaponDef->visuals.texture2->yend, col); va->AddVertexQTC(oldSmoke + dir2 * size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->yend, col2); va->AddVertexQTC(oldSmoke - dir2 * size2, weaponDef->visuals.texture2->xend, weaponDef->visuals.texture2->ystart, col2); } else { // draw the trail as particles const float dist = pos.distance(oldSmoke); const float3 dirpos1 = pos - dir * dist * 0.33f; const float3 dirpos2 = oldSmoke + oldDir * dist * 0.33f; for (int a = 0; a < numParts; ++a) { //! CAUTION: loop count must match EnlargeArrays above const float alpha = 255.0f; col[0] = (unsigned char) (color * alpha); col[1] = (unsigned char) (color * alpha); col[2] = (unsigned char) (color * alpha); col[3] = (unsigned char) alpha; const float size = (1 + (a * (1 / SMOKE_TIME)) * 7); float3 pos1 = CalcBeizer(float(a) / (numParts), pos, dirpos1, dirpos2, oldSmoke); #define st projectileDrawer->smoketex[0] va->AddVertexQTC(pos1 + ( camera->up + camera->right) * size, st->xstart, st->ystart, col); va->AddVertexQTC(pos1 + ( camera->up - camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up - camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up + camera->right) * size, st->xstart, st->ystart, col); #undef st } } } // rocket flare col[0] = 255; col[1] = 210; col[2] = 180; col[3] = 1; const float fsize = radius * 0.4f; va->AddVertexQTC(drawPos - camera->right * fsize-camera->up * fsize, weaponDef->visuals.texture1->xstart, weaponDef->visuals.texture1->ystart, col); va->AddVertexQTC(drawPos + camera->right * fsize-camera->up * fsize, weaponDef->visuals.texture1->xend, weaponDef->visuals.texture1->ystart, col); va->AddVertexQTC(drawPos + camera->right * fsize+camera->up * fsize, weaponDef->visuals.texture1->xend, weaponDef->visuals.texture1->yend, col); va->AddVertexQTC(drawPos - camera->right * fsize+camera->up * fsize, weaponDef->visuals.texture1->xstart, weaponDef->visuals.texture1->yend, col); }
void CPieceProjectile::Draw() { if (flags & PF_NoCEGTrail) { if (flags & PF_Smoke) { // this piece leaves a default (non-CEG) smoketrail inArray = true; float age2 = (age & 7) + globalRendering->timeOffset; float color = 0.5f; unsigned char col[4]; float3 dir = speed; dir.Normalize(); int numParts = age & 7; va->EnlargeArrays(4+4*numParts,0,VA_SIZE_TC); if (drawTrail) { // draw the trail as a single quad if camera close enough float3 dif(drawPos - camera->pos); dif.Normalize(); float3 dir1(dif.cross(dir)); dir1.Normalize(); float3 dif2(oldSmoke - camera->pos); dif2.Normalize(); float3 dir2(dif2.cross(oldSmokeDir)); dir2.Normalize(); float a1 = ((1 - 0.0f / (Smoke_Time)) * 255) * (0.7f + fabs(dif.dot(dir))); float alpha = std::min(255.0f, std::max(0.f, a1)); col[0] = (unsigned char) (color * alpha); col[1] = (unsigned char) (color * alpha); col[2] = (unsigned char) (color * alpha); col[3] = (unsigned char) (alpha); unsigned char col2[4]; float a2 = ((1 - float(age2) / (Smoke_Time)) * 255) * (0.7f + fabs(dif2.dot(oldSmokeDir))); if (age < 8) a2 = 0; alpha = std::min(255.0f, std::max(0.f, a2)); col2[0] = (unsigned char) (color * alpha); col2[1] = (unsigned char) (color * alpha); col2[2] = (unsigned char) (color * alpha); col2[3] = (unsigned char) (alpha); const float size = 1.0f; const float size2 = 1 + (age2 * (1 / Smoke_Time)) * 14; const float txs = projectileDrawer->smoketrailtex->xstart - (projectileDrawer->smoketrailtex->xend - projectileDrawer->smoketrailtex->xstart) * (age2 / 8.0f); va->AddVertexQTC(drawPos - dir1 * size, txs, projectileDrawer->smoketrailtex->ystart, col); va->AddVertexQTC(drawPos + dir1 * size, txs, projectileDrawer->smoketrailtex->yend, col); va->AddVertexQTC(oldSmoke + dir2 * size2, projectileDrawer->smoketrailtex->xend, projectileDrawer->smoketrailtex->yend, col2); va->AddVertexQTC(oldSmoke - dir2 * size2, projectileDrawer->smoketrailtex->xend, projectileDrawer->smoketrailtex->ystart, col2); } else { // draw the trail as particles const float dist = pos.distance(oldSmoke); const float3 dirpos1 = pos - dir * dist * 0.33f; const float3 dirpos2 = oldSmoke + oldSmokeDir * dist * 0.33f; for (int a = 0; a < numParts; ++a) { //! CAUTION: loop count must match EnlargeArrays above float alpha = 255.0f; col[0] = (unsigned char) (color * alpha); col[1] = (unsigned char) (color * alpha); col[2] = (unsigned char) (color * alpha); col[3] = (unsigned char) (alpha); const float size = 1.0f + ((a) * (1.0f / Smoke_Time)) * 14.0f; const float3 pos1 = CalcBeizer(float(a) / (numParts), pos, dirpos1, dirpos2, oldSmoke); #define st projectileDrawer->smoketex[0] va->AddVertexQTC(pos1 + ( camera->up+camera->right) * size, st->xstart, st->ystart, col); va->AddVertexQTC(pos1 + ( camera->up-camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up-camera->right) * size, st->xend, st->ystart, col); va->AddVertexQTC(pos1 + (-camera->up+camera->right) * size, st->xstart, st->ystart, col); #undef st } } } } DrawCallback(); if (curCallback == 0) { DrawCallback(); } }
void CPieceProjectile::Draw() { if(flags & PP_Smoke){ float3 interPos=pos+speed*gu->timeOffset; inArray=true; float age2=(age&7)+gu->timeOffset; float color=0.5f; unsigned char col[4]; float3 dir=speed; dir.Normalize(); if(drawTrail){ //draw the trail as a single quad float3 dif(interPos-camera->pos); dif.Normalize(); float3 dir1(dif.cross(dir)); dir1.Normalize(); float3 dif2(oldSmoke-camera->pos); dif2.Normalize(); float3 dir2(dif2.cross(oldSmokeDir)); dir2.Normalize(); float a1=(1-float(0)/(Smoke_Time))*255; a1*=0.7f+fabs(dif.dot(dir)); float alpha=min(255.f,max(0.f,a1)); col[0]=(unsigned char) (color*alpha); col[1]=(unsigned char) (color*alpha); col[2]=(unsigned char) (color*alpha); col[3]=(unsigned char) (alpha); unsigned char col2[4]; float a2=(1-float(age2)/(Smoke_Time))*255; a2*=0.7f+fabs(dif2.dot(oldSmokeDir)); if(age<8) a2=0; alpha=min(255.f,max(0.f,a2)); col2[0]=(unsigned char) (color*alpha); col2[1]=(unsigned char) (color*alpha); col2[2]=(unsigned char) (color*alpha); col2[3]=(unsigned char) (alpha); float size=(1); float size2=1+(age2*(1/Smoke_Time))*14; float txs=ph->smoketrailtex.xstart - (ph->smoketrailtex.xend-ph->smoketrailtex.xstart)*(age2/8.0f);//(1-age2/8.0f); va->AddVertexTC(interPos-dir1*size, txs, ph->smoketrailtex.ystart, col); va->AddVertexTC(interPos+dir1*size, txs, ph->smoketrailtex.yend, col); va->AddVertexTC(oldSmoke+dir2*size2, ph->smoketrailtex.xend, ph->smoketrailtex.yend, col2); va->AddVertexTC(oldSmoke-dir2*size2, ph->smoketrailtex.xend, ph->smoketrailtex.ystart, col2); } else { //draw the trail as particles float dist=pos.distance(oldSmoke); float3 dirpos1=pos-dir*dist*0.33f; float3 dirpos2=oldSmoke+oldSmokeDir*dist*0.33f; int numParts=age&7; for(int a=0;a<numParts;++a){ //float a1=1-float(a)/Smoke_Time; float alpha=255; col[0]=(unsigned char) (color*alpha); col[1]=(unsigned char) (color*alpha); col[2]=(unsigned char) (color*alpha); col[3]=(unsigned char) (alpha);//min(255,max(0,a1*255)); float size=1+((a)*(1/Smoke_Time))*14; float3 pos1=CalcBeizer(float(a)/(numParts),pos,dirpos1,dirpos2,oldSmoke); va->AddVertexTC(pos1+( camera->up+camera->right)*size, ph->smoketex[0].xstart, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+( camera->up-camera->right)*size, ph->smoketex[0].xend, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+(-camera->up-camera->right)*size, ph->smoketex[0].xend, ph->smoketex[0].ystart, col); va->AddVertexTC(pos1+(-camera->up+camera->right)*size, ph->smoketex[0].xstart, ph->smoketex[0].ystart, col); } } } DrawCallback(); if(curCallback==0) DrawCallback(); }