ParticleEmitter::ParticleEmitter(int width, int height, int FOV, int numEmitters, int maxParticles) : 
	ParticleFX(width, height, maxParticles+numEmitters, FOV)
{

	this->maxParticles = maxParticles;

	setZOffset(0);
	
	//temp = new unsigned short[width*height];
	//buffer = new unsigned short[width*height];

	int i;
	
	unsigned char *texture = new unsigned char[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE*3];

	Texture::createFlareTexture(texture, 224, 191, 64, 4.0f, TEXTURESIZE_PARTICLE);
	
	flareTexture[0] = new unsigned short[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE];
	flareTexture[1] = new unsigned short[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE];
	flareTexture[2] = new unsigned short[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE];

	for (i = 0; i < TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE*3; i++)
		texture[i]>>=1;
	
	for (i = 0; i < TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE; i++) {
		//texture[i*3] = texture[i*3+1] = 0;
		
		flareTexture[0][i] = RGB2SHORT(texture[i*3],texture[i*3+1],texture[i*3+2]);
	
		flareTexture[1][i] = RGB2SHORT(texture[i*3+2],texture[i*3+1],texture[i*3]);

		flareTexture[2][i] = RGB2SHORT(texture[i*3+1],texture[i*3+2],texture[i*3]);
	}

	delete[] texture;

	emitterTexture[0] = new unsigned short[64*64];
#ifdef LENSE_REFLECTION
	emitterTexture[1] = new unsigned short[64*64];
	emitterTexture[2] = new unsigned short[64*64];
	emitterTexture[3] = new unsigned short[64*64];
	emitterTexture[4] = new unsigned short[64*64];
	emitterTexture[5] = new unsigned short[64*64];
#endif

	texture = new unsigned char[64*64*3];

	Texture::createFlareTexture(texture, 224, 191, 64, 4.0f, 64);

	float len = (float)sqrt((float)32*32*2);

	for (i = 0; i < 64; i++)
	{

		float dist = (float)pow((float)(len-sqrt((double)((i-32)*(i-32)*2)))/len,2);

		int r = texture[(i*64+i)*3];
		int g = texture[(i*64+i)*3+1];
		int b = texture[(i*64+i)*3+2];
		r+=(int)(255*dist); if (r>255) r = 255;
		g+=(int)(191*dist); if (g>255) g = 255;
		b+=(int)(64*dist); if (b>255) b = 255;

		texture[(i*64+i)*3] = r;
		texture[(i*64+i)*3+1] = g;
		texture[(i*64+i)*3+2] = b;

		r = texture[(i*64+63-i)*3];
		g = texture[(i*64+63-i)*3+1];
		b = texture[(i*64+63-i)*3+2];
		r+=(int)(255*dist); if (r>255) r = 255;
		g+=(int)(191*dist); if (g>255) g = 255;
		b+=(int)(64*dist); if (b>255) b = 255;		

		texture[(i*64+63-i)*3] = r;
		texture[(i*64+63-i)*3+1] = g;
		texture[(i*64+63-i)*3+2] = b;
		
		r = texture[(i*64+31)*3];
		g = texture[(i*64+31)*3+1];
		b = texture[(i*64+31)*3+2];
		r+=(int)(255*dist); if (r>255) r = 255;
		g+=(int)(191*dist); if (g>255) g = 255;
		b+=(int)(64*dist); if (b>255) b = 255;		

		texture[(i*64+31)*3] = r;
		texture[(i*64+31)*3+1] = g;
		texture[(i*64+31)*3+2] = b;
		
		r = texture[(31*64+i)*3];
		g = texture[(31*64+i)*3+1];
		b = texture[(31*64+i)*3+2];
		r+=(int)(255*dist); if (r>255) r = 255;
		g+=(int)(191*dist); if (g>255) g = 255;
		b+=(int)(64*dist); if (b>255) b = 255;		

		texture[(32*64+i)*3] = r;
		texture[(32*64+i)*3+1] = g;
		texture[(32*64+i)*3+2] = b;
	}

	// spikey
	Texture::blur24(texture, 64, 64, 2);
	Texture::convert24to16(emitterTexture[0], texture, 64*64, 0);

#ifdef LENSE_REFLECTION
	// green ring
	createRingTexture(texture, 64, 28, 19, 64>>1, 224>>1, 96>>1, 0.0f);
	Texture::convert24to16(emitterTexture[1], texture, 64*64, 0);

	// blue ring
	createRingTexture(texture, 64, 28, 19, 0, 96>>1, 224>>1, 0.4f);
	Texture::convert24to16(emitterTexture[2], texture, 64*64, 0);

	// orange ring
	createRingTexture(texture, 64, 28, 19, 224>>1, 128>>1, 32>>1, 0.4f);
	Texture::convert24to16(emitterTexture[3], texture, 64*64, 0);

	// blue ball
	Texture::createFlareTexture(texture, 0, 96>>1, 224>>1, 1.0f, 64);
	Texture::convert24to16(emitterTexture[4], texture, 64*64, 0);

	// red ball
	Texture::createFlareTexture(texture, 255>>1, 96>>1, 32>>1, 1.0f, 64);
	Texture::convert24to16(emitterTexture[5], texture, 64*64, 0);
#endif

	delete[] texture;

	this->numEmitters = numEmitters;

	emitters = new Particle[numEmitters];

	// create emitters
	for (i = 0; i < numEmitters; i++)
	{
		emitters[i].pos.x = 0;
		emitters[i].pos.y = 0;
		emitters[i].pos.z = 0;
		emitters[i].size = 65536*4;
		emitters[i].texture = emitterTexture[0];
		emitters[i].textureHeight = emitters[i].textureWidth = 64;
	}

	for (i = 0; i < maxParticles+numEmitters; i++)
	{
		particles[i].pos.x = particles[i].pos.y = particles[i].pos.z = 0;
		particles[i].texture = flareTexture[0];
		particles[i].size = 0;
		particles[i].grow = 0;
	}

	currentParticleIndex = numEmitters;
}
Example #2
0
void TCBSplineTest::render(unsigned short* vscreen, unsigned int pitch)
{
	int i;
	
	memset(buffer,0, width*height*3*sizeof(float));
	
	for (i = 0; i < MAX_KEYS; i++)
	{
		int x = rand()%width;
		int y = rand()%height;

		VectorFloat v((float)x, (float)y, 0.0f);

		spline->setKey(i, v, (int)(((1.0f/((float)MAX_KEYS-1.0f))*(float)i)*MAX_TIME));
	}

	/*keys[0].v.set(159.0f-40.0f,119.0f-40.0f,0.0f);
	keys[0].ti = 0.0f*MAX_TIME;
	keys[0].t = 0.5f;

	keys[1].v.set(159.0f+40.0f,119.0f-40.0f,0.0f);
	keys[1].ti = 0.25f*MAX_TIME;
	keys[1].t = 0.5f;
	
	keys[2].v.set(159.0f+40.0f,119.0f+40.0f,0.0f);
	keys[2].ti = 0.5f*MAX_TIME;
	keys[2].t = 0.5f;

	keys[3].v.set(159.0f-40.0f,119.0f+40.0f,0.0f);
	keys[3].ti = 0.75f*MAX_TIME;
	keys[3].t = 0.5f;

	keys[4].v.set(159.0f-40.0f,119.0f-40.0f,0.0f);
	keys[4].ti = 1.0f*MAX_TIME;
	keys[4].t = 0.5f;*/

	drawSplines(spline, 100000, MAX_TIME, buffer, width, height, (5.0f/255.0f)*1.0f, (4.0f/255.0f)*1.0f, (2.0f/255.0f)*1.0f);

	for (i = 0; i < MAX_KEYS; i++)
	{
		int x = rand()%width;
		int y = rand()%height;

		VectorFloat v((float)x, (float)y, 0.0f);

		spline->setKey(i, v, (int)(((1.0f/((float)MAX_KEYS-1.0f))*(float)i)*MAX_TIME));
	}

	drawSplines(spline, 100000, MAX_TIME, buffer, width, height, (0.0f/255.0f)*1.0f, (1.0f/255.0f)*1.0f, (4.0f/255.0f)*1.0f);

	int offs = 0;
	for (i = 0; i < height; i++)
		for (int j = 0; j < width; j++)
		{
			vscreen[i*pitch+j] = RGB2SHORT((int)(buffer[offs]*127.0f),(int)(buffer[offs+1]*127.0f),(int)(buffer[offs+2]*127.0f));
			offs+=3;
		}


	//Filter::applyRadial(vscreen, 320, 240, 320, 159, 119, 8192, 1);

}