Index: rts/Lua/LuaWeaponDefs.cpp =================================================================== --- rts/Lua/LuaWeaponDefs.cpp (revision 3625) +++ rts/Lua/LuaWeaponDefs.cpp (working copy) @@ -341,6 +341,7 @@ HSTR_PUSH_NUMBER(L, "tileLength", v.tilelength); HSTR_PUSH_NUMBER(L, "scrollSpeed", v.scrollspeed); HSTR_PUSH_NUMBER(L, "pulseSpeed", v.pulseSpeed); + HSTR_PUSH_BOOL (L, "plasmaBlend", v.plasmaBlend); return 1; // CColorMap *colorMap; // AtlasedTexture *texture1; Index: rts/Rendering/Textures/TextureAtlas.cpp =================================================================== --- rts/Rendering/Textures/TextureAtlas.cpp (revision 3625) +++ rts/Rendering/Textures/TextureAtlas.cpp (working copy) @@ -340,3 +340,13 @@ { return textures.find(StringToLower(name)) != textures.end(); } + +AtlasedTexture CTextureAtlas::GetTextureWithBackup(std::string name, std::string backupName) +{ + if (textures.find(StringToLower(name)) != textures.end()) { + return textures[StringToLower(name)]; + } else { + return textures[StringToLower(backupName)]; + } +} + Index: rts/Rendering/Textures/TextureAtlas.h =================================================================== --- rts/Rendering/Textures/TextureAtlas.h (revision 3625) +++ rts/Rendering/Textures/TextureAtlas.h (working copy) @@ -57,8 +57,12 @@ //return a Texture struct of the specified texture AtlasedTexture GetTexture(std::string name); + //Return a Texture struct of the specified texture if it exists, otherwise return a backup texture. + AtlasedTexture GetTextureWithBackup(std::string name, std::string backupName); + //return a boolean true if the texture exists within the "textures" map and false if it does not. bool TextureExists(const std::string& name); + //return a pointer to a Texture struct of the specified texture, this pointer points to the actuall Texture struct stored, do not delete or modify AtlasedTexture* GetTexturePtr(std::string name); Index: rts/Sim/Projectiles/ExplosiveProjectile.cpp =================================================================== --- rts/Sim/Projectiles/ExplosiveProjectile.cpp (revision 3625) +++ rts/Sim/Projectiles/ExplosiveProjectile.cpp (working copy) @@ -104,18 +104,35 @@ float3 dir=speed; dir.Normalize(); + + if (weaponDef->visuals.plasmaBlend) { //plasma shot is a blend of 5 textures - for(int a=0;a<5;++a){ - col[0]=int((5-a)*0.2f*col[0]); - col[1]=int((5-a)*0.2f*col[1]); - col[2]=int((5-a)*0.2f*col[2]); - col[3]=int((5-a)*0.2f*col[3]); - float3 interPos=pos+speed*gu->timeOffset-dir*drawRadius*0.6f*a; - va->AddVertexTC(interPos-camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart,col); - va->AddVertexTC(interPos+camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart,col); - va->AddVertexTC(interPos+camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend,col); - va->AddVertexTC(interPos-camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend,col); - } + for(int a=0;a<5;++a){ + col[0]=int((5-a)*0.2f*col[0]); + col[1]=int((5-a)*0.2f*col[1]); + col[2]=int((5-a)*0.2f*col[2]); + col[3]=int((5-a)*0.2f*col[3]); + float3 interPos=pos+speed*gu->timeOffset-dir*drawRadius*0.6f*a; + va->AddVertexTC(interPos-camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart,col); + va->AddVertexTC(interPos+camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart,col); + va->AddVertexTC(interPos+camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend,col); + va->AddVertexTC(interPos-camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend,col); + } + } else { //plasma shot texture is directional and not blended + float3 dif(pos-camera->pos); + float camDist=dif.Length(); + dif/=camDist; + float3 dir1(dif.cross(speed)); + dir1.Normalize(); + float3 dir2(dif.cross(dir1)); + + float3 interPos=pos+speed*gu->timeOffset-dir*drawRadius*0.6f*5; + va->AddVertexTC(interPos-dir1*drawRadius-dir2*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart,col); + va->AddVertexTC(interPos-dir1*drawRadius+dir2*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart,col); + va->AddVertexTC(interPos+dir1*drawRadius+dir2*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend,col); + va->AddVertexTC(interPos+dir1*drawRadius-dir2*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend,col); + } + } int CExplosiveProjectile::ShieldRepulse(CPlasmaRepulser* shield,float3 shieldPos, float shieldForce, float shieldMaxSpeed) Index: rts/Sim/Projectiles/FireBallProjectile.cpp =================================================================== --- rts/Sim/Projectiles/FireBallProjectile.cpp (revision 3625) +++ rts/Sim/Projectiles/FireBallProjectile.cpp (working copy) @@ -63,10 +63,10 @@ col[0]=(maxCol-i)*25; col[1]=(maxCol-i)*15; col[2]=(maxCol-i)*10; - va->AddVertexTC(interPos-camera->right*size-camera->up*size,ph->fireballflaretex.xstart ,ph->fireballflaretex.ystart ,col); - va->AddVertexTC(interPos+camera->right*size-camera->up*size,ph->fireballflaretex.xend ,ph->fireballflaretex.ystart ,col); - va->AddVertexTC(interPos+camera->right*size+camera->up*size,ph->fireballflaretex.xend ,ph->fireballflaretex.yend ,col); - va->AddVertexTC(interPos-camera->right*size+camera->up*size,ph->fireballflaretex.xstart ,ph->fireballflaretex.yend ,col); + va->AddVertexTC(interPos-camera->right*size-camera->up*size,ph->dguntex.xstart ,ph->dguntex.ystart ,col); + va->AddVertexTC(interPos+camera->right*size-camera->up*size,ph->dguntex.xend ,ph->dguntex.ystart ,col); + va->AddVertexTC(interPos+camera->right*size+camera->up*size,ph->dguntex.xend ,ph->dguntex.yend ,col); + va->AddVertexTC(interPos-camera->right*size+camera->up*size,ph->dguntex.xstart ,ph->dguntex.yend ,col); interPos = interPos-speed*0.5f; } } Index: rts/Sim/Projectiles/ProjectileHandler.cpp =================================================================== --- rts/Sim/Projectiles/ProjectileHandler.cpp (revision 3625) +++ rts/Sim/Projectiles/ProjectileHandler.cpp (working copy) @@ -106,118 +106,27 @@ sprintf(num, "%02i", i); smoketex[i] = textureAtlas->GetTexture(std::string("ismoke") + num); } - - //The following section allows the modmaker to define projectile textures in alternative to some of those above. - if (textureAtlas->TextureExists("sbtrailtexture")) { - sbtrailtex = textureAtlas->GetTexture("sbtrailtexture"); - } else { - sbtrailtex = textureAtlas->GetTexture("smoketrail"); - } - - if (textureAtlas->TextureExists("missiletrailtexture")) { - missiletrailtex = textureAtlas->GetTexture("missiletrailtexture"); - } else { - missiletrailtex = textureAtlas->GetTexture("smoketrail"); - } - - if (textureAtlas->TextureExists("muzzleflametexture")) { - muzzleflametex = textureAtlas->GetTexture("muzzleflametexture"); - } else { - muzzleflametex = textureAtlas->GetTexture("explo"); - } - - if (textureAtlas->TextureExists("repulsetexture")) { - repulsetex = textureAtlas->GetTexture("repulsetexture"); - } else { - repulsetex = textureAtlas->GetTexture("explo"); - } - - if (textureAtlas->TextureExists("fireballflaretexture")) { - fireballflaretex = textureAtlas->GetTexture("fireballflaretexture"); - } else { - fireballflaretex = textureAtlas->GetTexture("flare"); - } - - if (textureAtlas->TextureExists("flareprojectiletexture")) { - flareprojectiletex = textureAtlas->GetTexture("flareprojectiletexture"); - } else { - flareprojectiletex = textureAtlas->GetTexture("flare"); - } - - if (textureAtlas->TextureExists("sbflaretexture")) { - sbflaretex = textureAtlas->GetTexture("sbflaretexture"); - } else { - sbflaretex = textureAtlas->GetTexture("flare"); - } - if (textureAtlas->TextureExists("missileflaretexture")) { - missileflaretex = textureAtlas->GetTexture("missileflaretexture"); - } else { - missileflaretex = textureAtlas->GetTexture("flare"); - } + sbtrailtex = textureAtlas->GetTextureWithBackup( "sbtrailtexture", "smoketrail" ); + missiletrailtex = textureAtlas->GetTextureWithBackup( "missiletrailtexture", "smoketrail" ); + muzzleflametex = textureAtlas->GetTextureWithBackup( "muzzleflametexture", "explo" ); + repulsetex = textureAtlas->GetTextureWithBackup( "repulsetexture", "explo" ); + dguntex = textureAtlas->GetTextureWithBackup( "dguntexture", "flare" ); + flareprojectiletex = textureAtlas->GetTextureWithBackup( "flareprojectiletexture", "flare" ); + sbflaretex = textureAtlas->GetTextureWithBackup( "sbflaretexture", "flare" ); + missileflaretex = textureAtlas->GetTextureWithBackup( "missileflaretexture", "flare" ); + beamlaserflaretex = textureAtlas->GetTextureWithBackup( "beamlaserflaretexture", "flare" ); + bubbletex = textureAtlas->GetTextureWithBackup( "bubbletexture", "circularthingy" ); + geosquaretex = textureAtlas->GetTextureWithBackup( "geosquaretexture", "circularthingy" ); + gfxtex = textureAtlas->GetTextureWithBackup( "gfxtexture", "circularthingy" ); + projectiletex = textureAtlas->GetTextureWithBackup( "projectiletexture", "circularthingy" ); + repulsegfxtex = textureAtlas->GetTextureWithBackup( "repulsegfxtexture", "circularthingy" ); + sphereparttex = textureAtlas->GetTextureWithBackup( "sphereparttexture", "circularthingy" ); + torpedotex = textureAtlas->GetTextureWithBackup( "torpedotexture", "circularthingy" ); + wrecktex = textureAtlas->GetTextureWithBackup( "wrecktexture", "circularthingy" ); + plasmatex = textureAtlas->GetTextureWithBackup( "plasmatexture", "circularthingy" ); + - if (textureAtlas->TextureExists("beamlaserflaretexture")) { - beamlaserflaretex = textureAtlas->GetTexture("beamlaserflaretexture"); - } else { - beamlaserflaretex = textureAtlas->GetTexture("flare"); - } - - if (textureAtlas->TextureExists("bubbletexture")) { - bubbletex = textureAtlas->GetTexture("bubbletexture"); - } else { - bubbletex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("geosquaretexture")) { - geosquaretex = textureAtlas->GetTexture("geosquaretexture"); - } else { - geosquaretex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("gfxtexture")) { - gfxtex = textureAtlas->GetTexture("gfxtexture"); - } else { - gfxtex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("projectiletexture")) { - projectiletex = textureAtlas->GetTexture("projectiletexture"); - } else { - projectiletex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("repulsegfxtexture")) { - repulsegfxtex = textureAtlas->GetTexture("repulsegfxtexture"); - } else { - repulsegfxtex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("sphereparttexture")) { - sphereparttex = textureAtlas->GetTexture("sphereparttexture"); - } else { - sphereparttex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("torpedotexture")) { - torpedotex = textureAtlas->GetTexture("torpedotexture"); - } else { - torpedotex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("wrecktexture")) { - wrecktex = textureAtlas->GetTexture("wrecktexture"); - } else { - wrecktex = textureAtlas->GetTexture("circularthingy"); - } - - if (textureAtlas->TextureExists("weapondeftexture")) { - weapondeftex = textureAtlas->GetTexture("weapondeftexture"); - } else { - weapondeftex = textureAtlas->GetTexture("circularthingy"); - } - - - groundFXAtlas = SAFE_NEW CTextureAtlas(2048, 2048); //add all textures in groundfx section ptex = resources.GetAllValues("resources\\graphics\\groundfx"); Index: rts/Sim/Projectiles/ProjectileHandler.h =================================================================== --- rts/Sim/Projectiles/ProjectileHandler.h (revision 3625) +++ rts/Sim/Projectiles/ProjectileHandler.h (working copy) @@ -72,28 +72,28 @@ //texturcoordinates for projectiles AtlasedTexture flaretex; - AtlasedTexture fireballflaretex; //dgun texture - AtlasedTexture flareprojectiletex; - AtlasedTexture sbtrailtex; //first section of starburst missile trail texture - AtlasedTexture missiletrailtex; - AtlasedTexture muzzleflametex; //first section of missile trail texture + AtlasedTexture dguntex; //dgun texture + AtlasedTexture flareprojectiletex; //texture used by flares that trick missiles + AtlasedTexture sbtrailtex; //default first section of starburst missile trail texture + AtlasedTexture missiletrailtex; //default first section of missile trail texture + AtlasedTexture muzzleflametex; //default muzzle flame texture AtlasedTexture repulsetex; //texture of impact on repulsor - AtlasedTexture sbflaretex; //starburst missile flare texture - AtlasedTexture missileflaretex; - AtlasedTexture beamlaserflaretex; + AtlasedTexture sbflaretex; //default starburst missile flare texture + AtlasedTexture missileflaretex; //default missile flare texture + AtlasedTexture beamlaserflaretex; //default beam laser flare texture AtlasedTexture explotex; AtlasedTexture explofadetex; AtlasedTexture heatcloudtex; AtlasedTexture circularthingytex; AtlasedTexture bubbletex; //torpedo trail texture - AtlasedTexture geosquaretex; + AtlasedTexture geosquaretex; //unknown use AtlasedTexture gfxtex; //nanospray texture - AtlasedTexture projectiletex; - AtlasedTexture repulsegfxtex; - AtlasedTexture sphereparttex; - AtlasedTexture torpedotex; - AtlasedTexture wrecktex; //smoking explosion part - AtlasedTexture weapondeftex; //plasma texture + AtlasedTexture projectiletex; //appears to be unused + AtlasedTexture repulsegfxtex; //used by repulsor + AtlasedTexture sphereparttex; //sphere explosion texture + AtlasedTexture torpedotex; //appears in-game as a 1 texel texture + AtlasedTexture wrecktex; //smoking explosion part texture + AtlasedTexture plasmatex; //default plasma texture AtlasedTexture laserendtex; AtlasedTexture laserfallofftex; AtlasedTexture randdotstex; Index: rts/Sim/Weapons/WeaponDefHandler.cpp =================================================================== --- rts/Sim/Weapons/WeaponDefHandler.cpp (revision 3625) +++ rts/Sim/Weapons/WeaponDefHandler.cpp (working copy) @@ -116,6 +116,8 @@ sunparser->GetDef(weaponDefs[id].laserflaresize, "15", weaponname + "\\laserflaresize"); sunparser->GetDef(weaponDefs[id].intensity, "0.9", weaponname + "\\intensity"); sunparser->GetDef(weaponDefs[id].duration, "0.05", weaponname + "\\duration"); + + sunparser->GetDef(weaponDefs[id].visuals.plasmaBlend, "1", weaponname + "\\plasmaBlend"); if(weaponDefs[id].name.find("disintegrator")!=string::npos){ //fulhack weaponDefs[id].visuals.renderType = WEAPON_RENDERTYPE_FIREBALL;} @@ -365,7 +367,7 @@ //get some weapon specific defaults if(weaponDefs[id].type=="Cannon"){ //CExplosiveProjectile - weaponDefs[id].visuals.texture1 = &ph->weapondeftex; + weaponDefs[id].visuals.texture1 = &ph->plasmatex; weaponDefs[id].visuals.color=sunparser->GetFloat3(float3(1.0f,0.5f,0.0f),weaponname + "\\rgbcolor"); sunparser->GetDef(weaponDefs[id].intensity, "0.2", weaponname + "\\intensity"); } else if(weaponDefs[id].type=="Rifle"){ @@ -374,7 +376,7 @@ //... } else if(weaponDefs[id].type=="AircraftBomb"){ //CExplosiveProjectile or CTorpedoProjectile - weaponDefs[id].visuals.texture1 = &ph->weapondeftex; + weaponDefs[id].visuals.texture1 = &ph->plasmatex; } else if(weaponDefs[id].type=="Shield"){ weaponDefs[id].visuals.texture1 = &ph->perlintex; } else if(weaponDefs[id].type=="Flame"){ @@ -399,7 +401,7 @@ weaponDefs[id].visuals.texture2 = &ph->missiletrailtex; } else if(weaponDefs[id].type=="TorpedoLauncher"){ //CExplosiveProjectile or CTorpedoProjectile - weaponDefs[id].visuals.texture1 = &ph->weapondeftex; + weaponDefs[id].visuals.texture1 = &ph->plasmatex; } else if(weaponDefs[id].type=="LaserCannon"){ //CLaserProjectile weaponDefs[id].visuals.texture1 = &ph->laserfallofftex; @@ -424,7 +426,7 @@ sunparser->GetDef(weaponDefs[id].thickness, "0.8", weaponname + "\\thickness"); } else if(weaponDefs[id].type=="EmgCannon"){ //CEmgProjectile - weaponDefs[id].visuals.texture1 = &ph->weapondeftex; + weaponDefs[id].visuals.texture1 = &ph->plasmatex; weaponDefs[id].visuals.color=sunparser->GetFloat3(float3(0.9f,0.9f,0.2f),weaponname + "\\rgbcolor"); sunparser->GetDef(weaponDefs[id].size, "3", weaponname + "\\size"); } else if(weaponDefs[id].type=="DGun"){ @@ -436,8 +438,8 @@ weaponDefs[id].visuals.texture2 = &ph->sbtrailtex; weaponDefs[id].visuals.texture3 = &ph->explotex; }else { - weaponDefs[id].visuals.texture1 = &ph->weapondeftex; - weaponDefs[id].visuals.texture2 = &ph->weapondeftex; + weaponDefs[id].visuals.texture1 = &ph->plasmatex; + weaponDefs[id].visuals.texture2 = &ph->plasmatex; } std::string tmp; sunparser->GetDef(tmp, "", weaponname + "\\texture1"); Index: rts/Sim/Weapons/WeaponDefHandler.h =================================================================== --- rts/Sim/Weapons/WeaponDefHandler.h (revision 3625) +++ rts/Sim/Weapons/WeaponDefHandler.h (working copy) @@ -144,6 +144,8 @@ float tilelength; float scrollspeed; float pulseSpeed; + + bool plasmaBlend; }; Visuals visuals;