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; }
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); }