aboutsummaryrefslogblamecommitdiff
path: root/src/Sprites.cpp
blob: df8eeb1c5e98cc3b801b7fcf43ecb041de50526f (plain) (tree)
1
2
3
4
                    
                     
 
                        
































                                                                                                                                              
 
                 


















                                                                                                                                                          
 
                 

















                                                                             
 

                                                       
 
                 

 







                                                                                                                                                          
                                                                                                                                                              

















                                                                                                                                                                                                                
 
                                                                                                          
 



                                                                                                            
 






















                                                                                                                                                      



                                      
 
                                           
 














                                                                                                                                                                                        
 













                                                                                                                                                                                                                                       
 







                                                                                                               
 
                 
 



                                                                                                                         
                                                 
                                                          

                                                               
                                            
                                                               
                                 
 










                                                                                                       
 









                                                                                     
 


                                                                                     
 







                                                     
 



















                                                                                    
 

                                                                
                                                               

                                                                    
 
                                                                                                                                 
 










                                                                                                                                                                
                                      


                              
                       



                                            
 













                                      
#include "Sprites.h"
#include "Textures.h"

extern float multiplier;
extern bool slomo;
extern Fog fog;
extern bool blood;
extern float fogcolorr;
extern float fogcolorg;
extern float fogcolorb;
//Functions
extern float sinefluct;
extern int environment;
extern Model gunmodels[10];
extern Camera camera;
extern float precipitationhorz;
extern float precipitationvert;
extern float precipitationdensity;
extern float snowdelay;

int Sprites::MakeSprite(int atype, float abrightness, float acolor1, float acolor2, float acolor3, XYZ alocation, XYZ avelocity, float asize){
	type[howmanysprites]=atype;
	rotation[howmanysprites]=Random()%360;
	brightness[howmanysprites]=abrightness;
	color1[howmanysprites]=acolor1;
	color2[howmanysprites]=acolor2;
	color3[howmanysprites]=acolor3;
	location[howmanysprites]=alocation;
	oldlocation[howmanysprites]=alocation;
	velocity[howmanysprites]=avelocity;
	size[howmanysprites]=asize;
	initialsize[howmanysprites]=asize;
	initialbrightness[howmanysprites]=abrightness;
	initialvelocity[howmanysprites]=avelocity;
	alivetime[howmanysprites]=0;
	owner[howmanysprites]=0;
	if(howmanysprites<maxsprites){howmanysprites++;}

	return 0;
}

int Sprites::MakeSprite(int atype, float abrightness, float acolor1, float acolor2, float acolor3, XYZ alocation, XYZ avelocity, float asize, int aowner){
	type[howmanysprites]=atype;
	rotation[howmanysprites]=Random()%360;
	brightness[howmanysprites]=abrightness;
	color1[howmanysprites]=acolor1;
	color2[howmanysprites]=acolor2;
	color3[howmanysprites]=acolor3;
	location[howmanysprites]=alocation;
	oldlocation[howmanysprites]=alocation;
	velocity[howmanysprites]=avelocity;
	size[howmanysprites]=asize;
	initialsize[howmanysprites]=asize;
	initialbrightness[howmanysprites]=abrightness;
	initialvelocity[howmanysprites]=avelocity;
	alivetime[howmanysprites]=0;
	owner[howmanysprites]=aowner;
	if(howmanysprites<maxsprites){howmanysprites++;}

	return 0;
}

int Sprites::DeleteSprite(int which){
	if(which>=0){
		location[which]=location[howmanysprites-1];
		oldlocation[which]=oldlocation[howmanysprites-1];
		velocity[which]=velocity[howmanysprites-1];
		initialsize[which]=initialsize[howmanysprites-1];
		size[which]=size[howmanysprites-1];
		brightness[which]=brightness[howmanysprites-1];
		initialbrightness[which]=initialbrightness[howmanysprites-1];
		color1[which]=color1[howmanysprites-1];
		color2[which]=color2[howmanysprites-1];
		color3[which]=color3[howmanysprites-1];
		alivetime[which]=alivetime[howmanysprites-1];
		rotation[which]=rotation[howmanysprites-1];
		type[which]=type[howmanysprites-1];
		type[howmanysprites-1]=0;

		if(howmanysprites>0){howmanysprites--;}
	}

	return 0;
}

void Sprites::DoStuff()
{
	for(int i=0;i<howmanysprites;i++){
		if(type[i]!=bullet&&type[i]!=bulletinstant&&type[i]!=grenadesprite&&type[i]!=pinsprite&&type[i]!=grenadesprite)oldlocation[i]=location[i];
		if(type[i]==muzzleflashsprite)brightness[i]-=multiplier*10;
		if(type[i]==flashsprite)brightness[i]-=multiplier*10;
		if(type[i]==smokesprite||type[i]==smokespritenoup||type[i]==bloodspritedown||type[i]==particlesspritedown)brightness[i]-=multiplier*.5;
		if(type[i]==bloodspritenoup)brightness[i]-=multiplier*.9;
		if(type[i]==smokesprite)size[i]=initialsize[i]*abs(sqrt(sqrt((float)abs(initialbrightness[i]-brightness[i]))));//velocity[i].y+=multiplier*20;
		if(type[i]==bloodspritenoup||type[i]==particlesspritedown)size[i]=initialsize[i]*(initialbrightness[i]-brightness[i]+.4)*(initialbrightness[i]-brightness[i]+.4);//velocity[i].y+=multiplier*20;
		if(type[i]==bloodspritenoup||type[i]==particlesspritedown)velocity[i]=initialvelocity[i]*brightness[i];//velocity[i].y+=multiplier*20;
		if(type[i]==bullet)brightness[i]-=multiplier;
		if(type[i]==snowsprite)rotation[i]+=multiplier*50;
		if(type[i]==smokesprite)rotation[i]+=multiplier*30;
		if(type[i]==smokespritenoup)rotation[i]+=multiplier*30;
		if(type[i]==bulletinstant){
			brightness[i]=0;
		}
		if(type[i]==grenadesprite||type[i]==spoonsprite||type[i]==pinsprite){
			if(findLengthfast(velocity[i])>0){
				velocity[i].y+=gravity*multiplier;
				rotation[i]+=multiplier*2;
			}
		}
		if(type[i]==bloodspritedown||type[i]==particlesspritedown){
			velocity[i].y+=gravity*multiplier;
		}

		if(type[i]!=bulletinstant&&type[i]!=bullet)location[i]=location[i]+velocity[i]*multiplier;

		alivetime[i]+=multiplier;
		if(brightness[i]<=0)DeleteSprite(i);
		if(type[i]==snowsprite&&(location[i].y<-.1||environment!=snowy_environment))DeleteSprite(i);
		if(type[i]==rainsprite&&(location[i].y<-.1||environment!=rainy_environment))DeleteSprite(i);

		if(type[i]==snowsprite){
			if(location[i].x<camera.position.x-precipitationhorz){location[i].x+=precipitationhorz*2;}
			if(location[i].z<camera.position.z-precipitationhorz){location[i].z+=precipitationhorz*2;}
			if(location[i].y<camera.position.y-precipitationvert){location[i].y+=precipitationvert*2;snowdelay+=1/precipitationdensity*2;}
			if(location[i].x>camera.position.x+precipitationhorz){location[i].x-=precipitationhorz*2;}
			if(location[i].z>camera.position.z+precipitationhorz){location[i].z-=precipitationhorz*2;}
			if(location[i].y>camera.position.y+precipitationvert){location[i].y-=precipitationvert*2;}
		}
		if(type[i]==rainsprite){
			if(location[i].x<camera.position.x-precipitationhorz*.5){location[i].x+=precipitationhorz;}
			if(location[i].z<camera.position.z-precipitationhorz*.5){location[i].z+=precipitationhorz;}
			if(location[i].y<camera.position.y-precipitationvert){location[i].y+=precipitationvert*2;snowdelay+=1/precipitationdensity/4;}
			if(location[i].x>camera.position.x+precipitationhorz*.5){location[i].x-=precipitationhorz;}
			if(location[i].z>camera.position.z+precipitationhorz*.5){location[i].z-=precipitationhorz;}
			if(location[i].y>camera.position.y+precipitationvert){location[i].y-=precipitationvert*2;}
		}
	}
}

void Sprites::draw()
{
	float M[16];
	XYZ begProj,endProj,avgProj,persp;
	float oolen,dx,dy;
	float bulletsize;
	XYZ point;
	glAlphaFunc(GL_GREATER, 0.01);

	//glEnable(GL_POLYGON_OFFSET_FILL);

	glEnable(GL_BLEND);
	glDisable(GL_CULL_FACE);
	glEnable(GL_TEXTURE_2D);
	glDisable(GL_LIGHTING);
	glDepthMask(0);
	glAlphaFunc(GL_GREATER, 0.01);
	for(int i=0;i<howmanysprites;i++){
		if(type[i]==muzzleflashsprite){fog.TempFog(0,0,0); glBindTexture(GL_TEXTURE_2D, muzzleflaretextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE);}
		if(type[i]==flashsprite){fog.TempFog(0,0,0); glBindTexture(GL_TEXTURE_2D, flaretextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE);}
		if(type[i]==smokesprite||type[i]==smokespritenoup){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  smoketextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
		if(type[i]==bloodspritedown||type[i]==bloodspritenoup){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  smoketextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
		if(type[i]==particlesspritedown){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  bloodtextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
		if(type[i]==snowsprite){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  snowtextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
		if(type[i]==rainsprite){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  raintextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
		if(type[i]==bullet||type[i]==bulletinstant){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  bullettextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}

		glPushMatrix();
		if(type[i]==muzzleflashsprite||type[i]==flashsprite||type[i]==smokesprite||type[i]==smokespritenoup||type[i]==snowsprite||type[i]==particlesspritedown||((type[i]==bloodspritenoup||type[i]==bloodspritedown)&&blood)){
			glColor4f(color1[i]*fogcolorr*1.6,color2[i]*fogcolorg*1.6,color3[i]*fogcolorb*1.6,brightness[i]);
			glTranslatef(location[i].x,location[i].y,location[i].z);
			if(type[i]==snowsprite){
				glTranslatef(sinefluct*rotation[i]/400,0,sinefluct*rotation[i]/400);
			}
			glGetFloatv(GL_MODELVIEW_MATRIX,M);
			point.x=M[12];
			point.y=M[13];
			point.z=M[14];
			glLoadIdentity();
			glTranslatef(point.x, point.y, point.z);
			glRotatef(rotation[i],0,0,1);

			glBegin(GL_TRIANGLES);
					glTexCoord2f(1.0f, 1.0f); glVertex3f( .3f*size[i], .3f*size[i], 0.0f);
					glTexCoord2f(0.0f, 1.0f); glVertex3f(-.3f*size[i], .3f*size[i], 0.0f);
					glTexCoord2f(1.0f, 0.0f); glVertex3f( .3f*size[i],-.3f*size[i], 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(-.3f*size[i],-.3f*size[i], 0.0f);
					glTexCoord2f(1.0f, 0.0f); glVertex3f( .3f*size[i], -.3f*size[i], 0.0f);
					glTexCoord2f(0.0f, 1.0f); glVertex3f(-.3f*size[i], .3f*size[i], 0.0f);
				glEnd();

		}

		if(type[i]==rainsprite){
			glColor4f(color1[i]*fogcolorr*1.6,color2[i]*fogcolorg*1.6,color3[i]*fogcolorb*1.6,brightness[i]);
			glTranslatef(location[i].x,location[i].y,location[i].z);
			glGetFloatv(GL_MODELVIEW_MATRIX,M);
			for( int k=0; k<3; k+=2 )
				for( int j=0; j<3; j++ ) {
					if ( k==j )
						M[k*4+j] = 1.0;
					else
						M[k*4+j] = 0.0;
				}

			glLoadMatrixf(M);
			glScalef(.2,abs(velocity[i].y)*multiplier,.2);
			glBegin(GL_TRIANGLES);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( .3f*size[i], .3f*size[i], 0.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-.3f*size[i], .3f*size[i], 0.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( .3f*size[i],-.3f*size[i], 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-.3f*size[i],-.3f*size[i], 0.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( .3f*size[i], -.3f*size[i], 0.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-.3f*size[i], .3f*size[i], 0.0f);
			glEnd();
		}

		if(type[i]==grenadesprite||type[i]==spoonsprite||type[i]==pinsprite){
			glTranslatef(location[i].x,location[i].y+.2,location[i].z);
			glDisable(GL_BLEND);
			glEnable(GL_FOG);
			glEnable(GL_CULL_FACE);
			glDisable(GL_TEXTURE_2D);
			glEnable(GL_LIGHTING);
			glEnable(GL_COLOR_MATERIAL);
			glDepthMask(1);
			glRotatef(rotation[i],1,.6,.3);

			if(type[i]==grenadesprite)gunmodels[grenadebasemodel].draw();
			if(type[i]==spoonsprite)gunmodels[grenadespoonmodel].draw();
			if(type[i]==pinsprite)gunmodels[grenadepinmodel].draw();

			glEnable(GL_BLEND);
			glDisable(GL_FOG);
			glDisable(GL_CULL_FACE);
			glEnable(GL_TEXTURE_2D);
			glDisable(GL_LIGHTING);
			glDisable(GL_COLOR_MATERIAL);
			glDepthMask(0);
		}

		if(type[i]==bullet||type[i]==bulletinstant){
			bulletsize=size[i];
			glPushMatrix();
				begProj=location[i];
				endProj=velocity[i];
				glPushMatrix();
					glTranslatef(begProj.x,begProj.y,begProj.z);
					glGetFloatv(GL_MODELVIEW_MATRIX,M);
					begProj.x=M[12];
					begProj.y=M[13];
					begProj.z=M[14];
				glPopMatrix();
				glPushMatrix();
					glTranslatef(endProj.x,endProj.y,endProj.z);
					glGetFloatv(GL_MODELVIEW_MATRIX,M);
					endProj.x=M[12];
					endProj.y=M[13];
					endProj.z=M[14];
				glPopMatrix();
				avgProj=(endProj+begProj)/2;

				dx	= endProj.x - begProj.x;
				dy	= endProj.y - begProj.y;
				oolen= 1/sqrt(dx*dx+dy*dy)*0.5;
				persp=0;
				persp.x=-dy*oolen; persp.y=dx*oolen;

				glColor4f(color1[i]*fogcolorr*1.6,color2[i]*fogcolorg*1.6,color3[i]*fogcolorb*1.6,brightness[i]);

				glPushMatrix();
					glLoadIdentity();
					glBegin(GL_TRIANGLES);
						glTexCoord2f(0.0f, 1.0f); glVertex3f(endProj.x-persp.x*bulletsize/2, endProj.y-persp.y*bulletsize/2, endProj.z);
						glTexCoord2f(1.0f, 0.0f); glVertex3f(begProj.x+persp.x*bulletsize/2, begProj.y+persp.y*bulletsize/2, begProj.z);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(begProj.x-persp.x*bulletsize/2, begProj.y-persp.y*bulletsize/2, begProj.z);
						glTexCoord2f(1.0f, 0.0f); glVertex3f(begProj.x+persp.x*bulletsize/2, begProj.y+persp.y*bulletsize/2, begProj.z);
						glTexCoord2f(0.0f, 1.0f); glVertex3f(endProj.x-persp.x*bulletsize/2, endProj.y-persp.y*bulletsize/2, endProj.z);
						glTexCoord2f(1.0f, 1.0f); glVertex3f(endProj.x+persp.x*bulletsize/2, endProj.y+persp.y*bulletsize/2, endProj.z);
					glEnd();
				glPopMatrix();
			glPopMatrix();
		}
		glPopMatrix();
	}
	fog.ResetFog();
	glDepthMask(1);
	glDisable(GL_TEXTURE_2D);
	glEnable(GL_CULL_FACE);
	//glDisable(GL_POLYGON_OFFSET_FILL);
}

Sprites::~Sprites()
{
	const GLuint textures[] {
		muzzleflaretextureptr,
		flaretextureptr,
		bullettextureptr,
		smoketextureptr,
		bloodtextureptr,
		raintextureptr,
		snowtextureptr,
	};
	glDeleteTextures(7, textures);
};