Exemplo n.º 1
0
/*
=================
R_InitBloomTextures
=================
*/
void R_InitBloomTextures( void )
{
    BLOOM_SIZE = 0;

    if( r_bloomscreentexture )
        FREE_TEXTURE( r_bloomscreentexture );
    if( r_bloomeffecttexture )
        FREE_TEXTURE( r_bloomeffecttexture );
    if( r_bloombackuptexture )
        FREE_TEXTURE( r_bloombackuptexture );
    if( r_bloomdownsamplingtexture )
        FREE_TEXTURE( r_bloomdownsamplingtexture );

    r_bloomscreentexture = r_bloomeffecttexture = 0;
    r_bloombackuptexture = r_bloomdownsamplingtexture = 0;

    if( !r_bloom->value )
        return;

    R_Bloom_InitTextures();
}
Exemplo n.º 2
0
// Startup Stuff.
void hack_init (xstuff_t * XStuff)	// Called right after the window is created, and OpenGL is initialized.
{
	// Reset the matrix to something we know.
	hack_reshape (XStuff);

	if (!dWireframe) {
		if (dTexture) {
			unsigned char *l_tex;
			unsigned int tex;

			glGenTextures (1, &tex);

			glBindTexture (GL_TEXTURE_2D, tex);

			glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
			glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
			glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
			glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

			if (dTexture == 1) {
				LOAD_TEXTURE (l_tex, swirlmap, swirlmap_compressedsize, swirlmap_size)
				gluBuild2DMipmaps (GL_TEXTURE_2D, 3, 128, 128, GL_RGB, GL_UNSIGNED_BYTE, l_tex);
			} else {
				LOAD_TEXTURE (l_tex, marblemap, marblemap_compressedsize, marblemap_size)
				gluBuild2DMipmaps (GL_TEXTURE_2D, 3, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, l_tex);
			}
			FREE_TEXTURE (l_tex)

				glEnable (GL_TEXTURE_2D);
		}
	}

	glCullFace (GL_FRONT);	// reject fliped faces
	glEnable (GL_CULL_FACE);
	glDisable (GL_DEPTH_TEST);	// no zbuffer

	THole = 0.0;
	TVit = 8000.0;
	HoleInit ();		// initialise tunnel pos
}
Exemplo n.º 3
0
void R_FreeCinematics( void )
{
	int i;
	for( i = 0; i < MAX_MOVIES; i++ )
	{
		if( tr.cinematics[i].state )
		{
			ALERT( at_notice, "release cinematic %s\n", tr.cinematics[i].name );
			FREE_CINEMATIC( tr.cinematics[i].state );
		}
	}

	memset( tr.cinematics, 0, sizeof( tr.cinematics ));

	for( i = 0; i < MAX_MOVIE_TEXTURES; i++ )
	{
		if( !tr.cinTextures[i] ) break;
		FREE_TEXTURE( tr.cinTextures[i] );
	}

	memset( tr.cinTextures, 0, sizeof( tr.cinTextures ));
}
Exemplo n.º 4
0
void initTextures ()
{
	unsigned char *l_tex;

	glGenTextures (2, texture_id);

	switch (dTexture) {
	case 1:
		LOAD_TEXTURE (l_tex, indtex1, indtex1_compressedsize, indtex1_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, TEXSIZE, TEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		LOAD_TEXTURE (l_tex, indtex2, indtex2_compressedsize, indtex2_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[1]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, TEXSIZE, TEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		break;

	case 2:
		LOAD_TEXTURE (l_tex, crystex, crystex_compressedsize, crystex_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, TEXSIZE, TEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		break;

	case 3:
		LOAD_TEXTURE (l_tex, chrometex, chrometex_compressedsize, chrometex_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, TEXSIZE, TEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		break;

	case 4:
		LOAD_TEXTURE (l_tex, brasstex, brasstex_compressedsize, brasstex_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, TEXSIZE, TEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		break;

	case 5:
		LOAD_TEXTURE (l_tex, shinytex, shinytex_compressedsize, shinytex_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 4, TEXSIZE, TEXSIZE, GL_RGBA, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		break;

	case 6:
		LOAD_TEXTURE (l_tex, ghostlytex, ghostlytex_compressedsize, ghostlytex_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, GL_ALPHA, TEXSIZE, TEXSIZE, GL_ALPHA, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		break;

	case 7:
		LOAD_TEXTURE (l_tex, circuittex, circuittex_compressedsize, circuittex_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, GL_ALPHA, TEXSIZE, TEXSIZE, GL_ALPHA, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)

		break;

	case 8:
		LOAD_TEXTURE (l_tex, doughtex, doughtex_compressedsize, doughtex_size)
		glBindTexture (GL_TEXTURE_2D, texture_id[0]);
		glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 4, TEXSIZE, TEXSIZE, GL_RGBA, GL_UNSIGNED_BYTE, l_tex);
		FREE_TEXTURE (l_tex)
	}
}
Exemplo n.º 5
0
/*
==================
R_NewMap

Called always when map is changed or restarted
==================
*/
void R_NewMap( void )
{
	int	i;

	// get the actual screen size
	glState.width = RENDER_GET_PARM( PARM_SCREEN_WIDTH, 0 );
	glState.height = RENDER_GET_PARM( PARM_SCREEN_HEIGHT, 0 );

	// release old mirror textures
	for( i = 0; i < MAX_MIRRORS; i++ )
	{
		if( !tr.mirrorTextures[i] ) break;
		FREE_TEXTURE( tr.mirrorTextures[i] );
	}

	for( i = 0; i < MAX_MIRRORS; i++ )
	{
		if( !tr.portalTextures[i] ) break;
		FREE_TEXTURE( tr.portalTextures[i] );
	}

	for( i = 0; i < MAX_MIRRORS; i++ )
	{
		if( !tr.screenTextures[i] ) break;
		FREE_TEXTURE( tr.screenTextures[i] );
	}

	for( i = 0; i < MAX_SHADOWS; i++ )
	{
		if( !tr.shadowTextures[i] ) break;
		FREE_TEXTURE( tr.shadowTextures[i] );
	}

	for( i = 0; i < tr.num_framebuffers; i++ )
	{
		if( !tr.frame_buffers[i].init ) break;
		R_FreeFrameBuffer( i );
	}

	CL_ClearPlights();

	R_FreeCinematics(); // free old cinematics

	memset( tr.mirrorTextures, 0, sizeof( tr.mirrorTextures ));
	memset( tr.portalTextures, 0, sizeof( tr.portalTextures ));
	memset( tr.screenTextures, 0, sizeof( tr.screenTextures ));
	memset( tr.shadowTextures, 0, sizeof( tr.shadowTextures ));
	memset( tr.frame_buffers, 0, sizeof( tr.frame_buffers ));
	tr.num_framebuffers = 0;

	r_viewleaf = r_viewleaf2 = NULL;
	tr.framecount = tr.visframecount = 1;	// no dlight cache

	if( GL_Support( R_FRAMEBUFFER_OBJECT ))
	{
		// allocate FBO's
		tr.fbo[FBO_MIRRORS] = R_AllocFrameBuffer();
		tr.fbo[FBO_SCREENS] = R_AllocFrameBuffer();
		tr.fbo[FBO_PORTALS] = R_AllocFrameBuffer();
	}

	// setup the skybox sides
	for( i = 0; i < 6; i++ )
		tr.skyboxTextures[i] = RENDER_GET_PARM( PARM_TEX_SKYBOX, i );

	tr.skytexturenum = RENDER_GET_PARM( PARM_TEX_SKYTEXNUM, 0 ); // not a gl_texturenum!

	v_intermission_spot = NULL;

	R_InitCinematics();

	R_InitBloomTextures();

	if( Q_stricmp( worldmodel->name, tr.worldname ))
	{
		Q_strncpy( tr.worldname, worldmodel->name, sizeof( tr.worldname ));
		R_ParseGrassFile();
	}
}
Exemplo n.º 6
0
void initWorld ()
{
	int i, j;
	float x, y, z;
	unsigned int startex;
	unsigned int moontex;
	unsigned int moonglowtex;
	unsigned int sunsettex;
	unsigned char *tex;

	// Initialize cloud texture object even if clouds are not turned on.
	// Sunsets and shockwaves can also use cloud texture.
	glGenTextures (1, &cloudtex);
	glBindTexture (GL_TEXTURE_2D, cloudtex);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	LOAD_TEXTURE (tex, cloudmap, cloudmap_compressedsize, cloudmap_size)
		gluBuild2DMipmaps (GL_TEXTURE_2D, 2, CLOUDTEXSIZE, CLOUDTEXSIZE, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, tex);
	FREE_TEXTURE (tex)
		// initialize star texture
		if (dStardensity) {
		unsigned char starmap[STARTEXSIZE][STARTEXSIZE][3];

		for (i = 0; i < STARTEXSIZE; i++) {
			for (j = 0; j < STARTEXSIZE; j++) {
				starmap[i][j][0] = starmap[i][j][1] = starmap[i][j][2] = 0;
			}
		}
		int u, v;
		unsigned int rgb[3];

		for (i = 0; i < (dStardensity * 20); i++) {
			u = rsRandi (STARTEXSIZE - 4) + 2;
			v = rsRandi (STARTEXSIZE - 4) + 2;
			rgb[0] = 220 + rsRandi (36);
			rgb[1] = 220 + rsRandi (36);
			rgb[2] = 220 + rsRandi (36);
			rgb[rsRandi (3)] = 255;
			starmap[u][v][0] = rgb[0];
			starmap[u][v][1] = rgb[1];
			starmap[u][v][2] = rgb[2];
			switch (rsRandi (6)) {	// different stars
			case 0:	// small
			case 1:
			case 2:
				starmap[u][v][0] /= 2;
				starmap[u][v][1] /= 2;
				starmap[u][v][2] /= 2;
				starmap[u + 1][v][0] = starmap[u - 1][v][0] = starmap[u][v + 1][0] = starmap[u][v - 1][0] = rgb[0] / (3 + rsRandi (6));
				starmap[u + 1][v][1] = starmap[u - 1][v][1] = starmap[u][v + 1][1] = starmap[u][v - 1][1] = rgb[1] / (3 + rsRandi (6));
				starmap[u + 1][v][2] = starmap[u - 1][v][2] = starmap[u][v + 1][2] = starmap[u][v - 1][2] = rgb[2] / (3 + rsRandi (6));
				break;
			case 3:	// medium
			case 4:
				starmap[u + 1][v][0] = starmap[u - 1][v][0] = starmap[u][v + 1][0] = starmap[u][v - 1][0] = rgb[0] / 2;
				starmap[u + 1][v][1] = starmap[u - 1][v][1] = starmap[u][v + 1][1] = starmap[u][v - 1][1] = rgb[1] / 2;
				starmap[u + 1][v][2] = starmap[u - 1][v][2] = starmap[u][v + 1][2] = starmap[u][v - 1][2] = rgb[2] / 2;
				break;
			case 5:	// large
				starmap[u + 1][v][0] = starmap[u - 1][v][0] = starmap[u][v + 1][0] = starmap[u][v - 1][0] = char (float (rgb[0]) * 0.75f);
				starmap[u + 1][v][1] = starmap[u - 1][v][1] = starmap[u][v + 1][1] = starmap[u][v - 1][1] = char (float (rgb[1]) * 0.75f);
				starmap[u + 1][v][2] = starmap[u - 1][v][2] = starmap[u][v + 1][2] = starmap[u][v - 1][2] = char (float (rgb[2]) * 0.75f);

				starmap[u + 1][v + 1][0] = starmap[u + 1][v - 1][0] = starmap[u - 1][v + 1][0] = starmap[u - 1][v - 1][0] = rgb[0] / 4;
				starmap[u + 1][v + 1][1] = starmap[u + 1][v - 1][1] = starmap[u - 1][v + 1][1] = starmap[u - 1][v - 1][1] = rgb[1] / 4;
				starmap[u + 1][v + 1][2] = starmap[u + 1][v - 1][2] = starmap[u - 1][v + 1][2] = starmap[u - 1][v - 1][2] = rgb[2] / 4;
			}
		}
		glGenTextures (1, &startex);
		glBindTexture (GL_TEXTURE_2D, startex);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, STARTEXSIZE, STARTEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, starmap);
	}
	//initialize moon texture
	if (dMoon) {
		unsigned char moonmap[MOONTEXSIZE][MOONTEXSIZE][4];
		unsigned char *mtint;
		unsigned char *malpha;

		LOAD_TEXTURE (mtint, moontint, moontint_compressedsize, moontint_size)
			LOAD_TEXTURE (malpha, moonalpha, moonalpha_compressedsize, moonalpha_size)

			for (i = 0; i < MOONTEXSIZE; i++) {
			for (j = 0; j < MOONTEXSIZE; j++) {
				moonmap[i][j][0] = moonmap[i][j][1] = moonmap[i][j][2] = mtint[i * MOONTEXSIZE + j];
				moonmap[i][j][3] = malpha[i * MOONTEXSIZE + j];
			}
		}

		FREE_TEXTURE (mtint)
			FREE_TEXTURE (malpha)

			glGenTextures (1, &moontex);
		glBindTexture (GL_TEXTURE_2D, moontex);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 4, MOONTEXSIZE, MOONTEXSIZE, GL_RGBA, GL_UNSIGNED_BYTE, moonmap);
	}
	//initialize moon glow texture
	if (dMoonglow) {
		unsigned char moonglowmap[MOONGLOWTEXSIZE][MOONGLOWTEXSIZE][4];

		float temp1, temp2, temp3, u, v;

		for (i = 0; i < MOONGLOWTEXSIZE; i++) {
			for (j = 0; j < MOONGLOWTEXSIZE; j++) {
				u = float (i - MOONGLOWTEXSIZE / 2) / float (MOONGLOWTEXSIZE / 2);
				v = float (j - MOONGLOWTEXSIZE / 2) / float (MOONGLOWTEXSIZE / 2);

				temp1 = 4.0f * ((u * u) + (v * v)) * (1.0f - ((u * u) + (v * v)));
				if (temp1 > 1.0f)
					temp1 = 1.0f;
				if (temp1 < 0.0f)
					temp1 = 0.0f;
				temp1 = temp1 * temp1 * temp1 * temp1;
				u *= 1.2f;
				v *= 1.2f;
				temp2 = 4.0f * ((u * u) + (v * v)) * (1.0f - ((u * u) + (v * v)));
				if (temp2 > 1.0f)
					temp2 = 1.0f;
				if (temp2 < 0.0f)
					temp2 = 0.0f;
				temp2 = temp2 * temp2 * temp2 * temp2;
				u *= 1.25f;
				v *= 1.25f;
				temp3 = 4.0f * ((u * u) + (v * v)) * (1.0f - ((u * u) + (v * v)));
				if (temp3 > 1.0f)
					temp3 = 1.0f;
				if (temp3 < 0.0f)
					temp3 = 0.0f;
				temp3 = temp3 * temp3 * temp3 * temp3;
				moonglowmap[i][j][0] = char (255.0f * (temp1 * 0.4f + temp2 * 0.4f + temp3 * 0.48f));
				moonglowmap[i][j][1] = char (255.0f * (temp1 * 0.4f + temp2 * 0.48f + temp3 * 0.38f));
				moonglowmap[i][j][2] = char (255.0f * (temp1 * 0.48f + temp2 * 0.4f + temp3 * 0.38f));
				moonglowmap[i][j][3] = char (255.0f * (temp1 * 0.48f + temp2 * 0.48f + temp3 * 0.48f));
			}
		}
		glGenTextures (1, &moonglowtex);
		glBindTexture (GL_TEXTURE_2D, moonglowtex);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 4, MOONGLOWTEXSIZE, MOONGLOWTEXSIZE, GL_RGBA, GL_UNSIGNED_BYTE, moonglowmap);

	}
	// do a sunset?
	doSunset = 1;
	if (!rsRandi (4))
		doSunset = 0;

	// initialize sunset texture
	if (doSunset) {
		unsigned char *sunsetmap;
		unsigned char rgb[3];
		float temp;

		sunsetmap = (unsigned char *)malloc (CLOUDTEXSIZE * CLOUDTEXSIZE * 3);

		if (rsRandi (3))
			rgb[0] = 60 + rsRandi (42);
		else
			rgb[0] = rsRandi (102);
		rgb[1] = rsRandi (rgb[0]);
		rgb[2] = 0;
		if (rgb[1] < 50)
			rgb[2] = 100 - rsRandi (rgb[0]);
		for (j = 0; j < CLOUDTEXSIZE; j++) {
			for (i = 0; i < CLOUDTEXSIZE; i++) {
				sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 0] = rgb[0];
				sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 1] = rgb[1];
				sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 2] = rgb[2];
			}
		}
		// clouds in sunset
		if (rsRandi (3)) {
			float cloudinf;	// influence of clouds
			int xoffset = rsRandi (CLOUDTEXSIZE);
			int yoffset = rsRandi (CLOUDTEXSIZE);
			int x, y;

			for (i = 0; i < CLOUDTEXSIZE; i++) {
				for (j = 0; j < CLOUDTEXSIZE; j++) {
					x = (i + xoffset) % CLOUDTEXSIZE;
					y = (j + yoffset) % CLOUDTEXSIZE;
					cloudinf = float (cloudmap[x * CLOUDTEXSIZE * 2 + y * 2 + 1]) / 256.0f;
					temp = float (sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 0]) / 256.0f;

					temp *= cloudinf;
					sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 0] = char (temp * 256.0f);
					cloudinf *= float (cloudmap[x * CLOUDTEXSIZE * 2 + y * 2]) / 256.0f;
					temp = float (sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 1]) / 256.0f;

					temp *= cloudinf;
					sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 1] = char (temp * 256.0f);
				}
			}
		}
		// Fractal mountain generation
		int mountains[CLOUDTEXSIZE + 1];

		mountains[0] = mountains[CLOUDTEXSIZE] = rsRandi (10) + 5;
		makeHeights (0, CLOUDTEXSIZE, mountains);
		for (i = 0; i < CLOUDTEXSIZE; i++) {
			for (j = 0; j <= mountains[i]; j++) {
				sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 0] = 0;
				sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 1] = 0;
				sunsetmap[i * CLOUDTEXSIZE * 3 + j * 3 + 2] = 0;
			}
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 1) * 3 + 0] /= 4;
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 1) * 3 + 1] /= 4;
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 1) * 3 + 2] /= 4;
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 2) * 3 + 0] /= 2;
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 2) * 3 + 1] /= 2;
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 2) * 3 + 2] /= 2;
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 3) * 3 + 0] = char (float (sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 3) * 3 + 0]) * 0.75f);
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 3) * 3 + 1] = char (float (sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 3) * 3 + 1]) * 0.75f);
			sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 3) * 3 + 2] = char (float (sunsetmap[i * CLOUDTEXSIZE * 3 + (mountains[i] + 3) * 3 + 2]) * 0.75f);
		}
		// build texture object
		glGenTextures (1, &sunsettex);
		glBindTexture (GL_TEXTURE_2D, sunsettex);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, CLOUDTEXSIZE, CLOUDTEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, sunsetmap);

		free (sunsetmap);
	}
	//initialize earth texture
	if (dEarth) {
		glGenTextures (1, &earthneartex);
		glBindTexture (GL_TEXTURE_2D, earthneartex);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		LOAD_TEXTURE (tex, earthnearmap, earthnearmap_compressedsize, earthnearmap_size)
			gluBuild2DMipmaps (GL_TEXTURE_2D, 3, EARTHNEARSIZE, EARTHNEARSIZE, GL_RGB, GL_UNSIGNED_BYTE, tex);
		FREE_TEXTURE (tex)
			glGenTextures (1, &earthfartex);
		glBindTexture (GL_TEXTURE_2D, earthfartex);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		LOAD_TEXTURE (tex, earthfarmap, earthfarmap_compressedsize, earthfarmap_size)
			gluBuild2DMipmaps (GL_TEXTURE_2D, 3, EARTHFARSIZE, EARTHFARSIZE, GL_RGB, GL_UNSIGNED_BYTE, tex);
		FREE_TEXTURE (tex)
			glGenTextures (1, &earthlighttex);
		glBindTexture (GL_TEXTURE_2D, earthlighttex);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		LOAD_TEXTURE (tex, earthlightmap, earthlightmap_compressedsize, earthlightmap_size)
			gluBuild2DMipmaps (GL_TEXTURE_2D, 3, EARTHFARSIZE, EARTHFARSIZE, GL_RGB, GL_UNSIGNED_BYTE, tex);
		FREE_TEXTURE (tex)
	}
	// initialize star geometry
	if (dStardensity) {
		float stars[STARMESH + 1][STARMESH / 2][6];	// 6 = x,y,z,u,v,bright

		for (j = 0; j < STARMESH / 2; j++) {
			y = sin (RS_PIo2 * float (j) / float (STARMESH / 2));

			for (i = 0; i <= STARMESH; i++) {
				x = cos (RS_PIx2 * float (i) / float (STARMESH)) * cos (RS_PIo2 * float (j) / float (STARMESH / 2));
				z = sin (RS_PIx2 * float (i) / float (STARMESH)) * cos (RS_PIo2 * float (j) / float (STARMESH / 2));

				// positions
				stars[i][j][0] = x * 20000.0f;
				stars[i][j][1] = 1500.0f + 18500.0f * y;
				stars[i][j][2] = z * 20000.0f;
				// tex coords
				stars[i][j][3] = 1.2f * x * (2.5f - y);
				stars[i][j][4] = 1.2f * z * (2.5f - y);
				// brightness
				if (stars[i][j][1] < 1501.0f)
					stars[i][j][5] = 0.0f;
				else
					stars[i][j][5] = 1.0f;
			}
		}
		starlist = glGenLists (1);
		glNewList (starlist, GL_COMPILE);
		glBindTexture (GL_TEXTURE_2D, startex);
		for (j = 0; j < (STARMESH / 2 - 1); j++) {
			glBegin (GL_TRIANGLE_STRIP);
			for (i = 0; i <= STARMESH; i++) {
				glColor3f (stars[i][j + 1][5], stars[i][j + 1][5], stars[i][j + 1][5]);
				glTexCoord2f (stars[i][j + 1][3], stars[i][j + 1][4]);
				glVertex3fv (stars[i][j + 1]);
				glColor3f (stars[i][j][5], stars[i][j][5], stars[i][j][5]);
				glTexCoord2f (stars[i][j][3], stars[i][j][4]);
				glVertex3fv (stars[i][j]);
			}
			glEnd ();
		}
		j = STARMESH / 2 - 1;
		glBegin (GL_TRIANGLE_FAN);
		glColor3f (1.0f, 1.0f, 1.0f);
		glTexCoord2f (0.0f, 0.0f);
		glVertex3f (0.0f, 20000.0f, 0.0f);
		for (i = 0; i <= STARMESH; i++) {
			glColor3f (stars[i][j][5], stars[i][j][5], stars[i][j][5]);
			glTexCoord2f (stars[i][j][3], stars[i][j][4]);
			glVertex3fv (stars[i][j]);
		}
		glEnd ();
		glEndList ();
	}
	// initialize moon geometry
	if (dMoon) {
		moonlist = glGenLists (1);
		glNewList (moonlist, GL_COMPILE);
		glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
		glBindTexture (GL_TEXTURE_2D, moontex);
		glBegin (GL_TRIANGLE_STRIP);
		glTexCoord2f (0.0f, 0.0f);
		glVertex3f (-800.0f, -800.0f, 0.0f);
		glTexCoord2f (1.0f, 0.0f);
		glVertex3f (800.0f, -800.0f, 0.0f);
		glTexCoord2f (0.0f, 1.0f);
		glVertex3f (-800.0f, 800.0f, 0.0f);
		glTexCoord2f (1.0f, 1.0f);
		glVertex3f (800.0f, 800.0f, 0.0f);
		glEnd ();
		glEndList ();
	}
	// initialize moon glow geometry
	if (dMoonglow) {
		moonglowlist = glGenLists (1);
		glNewList (moonglowlist, GL_COMPILE);
		glBindTexture (GL_TEXTURE_2D, moonglowtex);
		glBegin (GL_TRIANGLE_STRIP);
		glTexCoord2f (0.0f, 0.0f);
		glVertex3f (-7000.0f, -7000.0f, 0.0f);
		glTexCoord2f (1.0f, 0.0f);
		glVertex3f (7000.0f, -7000.0f, 0.0f);
		glTexCoord2f (0.0f, 1.0f);
		glVertex3f (-7000.0f, 7000.0f, 0.0f);
		glTexCoord2f (1.0f, 1.0f);
		glVertex3f (7000.0f, 7000.0f, 0.0f);
		glEnd ();
		glEndList ();
	}
	// initialize cloud geometry
	if (dClouds) {
		for (j = 0; j <= CLOUDMESH; j++) {
			for (i = 0; i <= CLOUDMESH; i++) {
				x = float (i - (CLOUDMESH / 2));
				z = float (j - (CLOUDMESH / 2));

				clouds[i][j][0] = x * (40000.0f / float (CLOUDMESH));
				clouds[i][j][2] = z * (40000.0f / float (CLOUDMESH));
				x = float (fabs (x / float (CLOUDMESH / 2)));
				z = float (fabs (z / float (CLOUDMESH / 2)));
				clouds[i][j][1] = 2000.0f - 1000.0f * float (x * x + z * z);
				clouds[i][j][3] = float (-i) / float (CLOUDMESH / 6);	// tex coords
				clouds[i][j][4] = float (-j) / float (CLOUDMESH / 6);
				clouds[i][j][5] = (clouds[i][j][1] - 1000.0f) * 0.00001f * float (dAmbient);	// brightness

				if (clouds[i][j][5] < 0.0f)
					clouds[i][j][5] = 0.0f;
			}
		}
	}
	// initialize sunset geometry
	if (doSunset) {
		sunsetlist = glGenLists (1);
		float vert[6] = { 0.0f, 7654.0f, 8000.0f, 14142.0f, 18448.0f, 20000.0f };

		glNewList (sunsetlist, GL_COMPILE);
		glBindTexture (GL_TEXTURE_2D, sunsettex);
		glBegin (GL_TRIANGLE_STRIP);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.0f);
		glVertex3f (vert[0], vert[2], vert[5]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (0.0f, 0.0f);
		glVertex3f (vert[0], vert[0], vert[5]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.125f);
		glVertex3f (-vert[1], vert[2], vert[4]);
		glColor3f (0.25f, 0.25f, 0.25f);
		glTexCoord2f (0.0f, 0.125f);
		glVertex3f (-vert[1], vert[0], vert[4]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.25f);
		glVertex3f (-vert[3], vert[2], vert[3]);
		glColor3f (0.5f, 0.5f, 0.5f);
		glTexCoord2f (0.0f, 0.25f);
		glVertex3f (-vert[3], vert[0], vert[3]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.375f);
		glVertex3f (-vert[4], vert[2], vert[1]);
		glColor3f (0.75f, 0.75f, 0.75f);
		glTexCoord2f (0.0f, 0.375f);
		glVertex3f (-vert[4], vert[0], vert[1]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.5f);
		glVertex3f (-vert[5], vert[2], vert[0]);
		glColor3f (1.0f, 1.0f, 1.0f);
		glTexCoord2f (0.0f, 0.5f);
		glVertex3f (-vert[5], vert[0], vert[0]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.625f);
		glVertex3f (-vert[4], vert[2], -vert[1]);
		glColor3f (0.75f, 0.75f, 0.75f);
		glTexCoord2f (0.0f, 0.625f);
		glVertex3f (-vert[4], vert[0], -vert[1]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.75f);
		glVertex3f (-vert[3], vert[2], -vert[3]);
		glColor3f (0.5f, 0.5f, 0.5f);
		glTexCoord2f (0.0f, 0.75f);
		glVertex3f (-vert[3], vert[0], -vert[3]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 0.875f);
		glVertex3f (-vert[1], vert[2], -vert[4]);
		glColor3f (0.25f, 0.25f, 0.25f);
		glTexCoord2f (0.0f, 0.875f);
		glVertex3f (-vert[1], vert[0], -vert[4]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (1.0f, 1.0f);
		glVertex3f (vert[0], vert[2], -vert[5]);
		glColor3f (0.0f, 0.0f, 0.0f);
		glTexCoord2f (0.0f, 1.0f);
		glVertex3f (vert[0], vert[0], -vert[5]);
		glEnd ();
		glEndList ();
	}
	// initialize earth geometry
	if (dEarth) {
		earthlist = glGenLists (1);
		earthnearlist = glGenLists (1);
		earthfarlist = glGenLists (1);
		float lit[] = { float (dAmbient) * 0.01f, float (dAmbient) * 0.01f, float (dAmbient) * 0.01f };
		float unlit[] = { 0.0f, 0.0f, 0.0f };
		float vert[2] = { 839.68f, 8396.8f };
		float tex[4] = { 0.0f, 0.45f, 0.55f, 1.0f };

		glNewList (earthnearlist, GL_COMPILE);
		glColor3fv (lit);
		glBegin (GL_TRIANGLE_STRIP);
		glTexCoord2f (tex[0], tex[0]);
		glVertex3f (-vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[0], tex[3]);
		glVertex3f (-vert[0], 0.0f, vert[0]);
		glTexCoord2f (tex[3], tex[0]);
		glVertex3f (vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[3], tex[3]);
		glVertex3f (vert[0], 0.0f, vert[0]);
		glEnd ();
		glEndList ();
		glNewList (earthfarlist, GL_COMPILE);
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[1], tex[1]);
		glVertex3f (-vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[2], tex[1]);
		glVertex3f (vert[0], 0.0f, -vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[0], tex[0]);
		glVertex3f (-vert[1], 0.0f, -vert[1]);
		glTexCoord2f (tex[3], tex[0]);
		glVertex3f (vert[1], 0.0f, -vert[1]);
		glEnd ();
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[1], tex[2]);
		glVertex3f (-vert[0], 0.0f, vert[0]);
		glTexCoord2f (tex[1], tex[1]);
		glVertex3f (-vert[0], 0.0f, -vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[0], tex[3]);
		glVertex3f (-vert[1], 0.0f, vert[1]);
		glTexCoord2f (tex[0], tex[0]);
		glVertex3f (-vert[1], 0.0f, -vert[1]);
		glEnd ();
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[2], tex[2]);
		glVertex3f (vert[0], 0.0f, vert[0]);
		glTexCoord2f (tex[1], tex[2]);
		glVertex3f (-vert[0], 0.0f, vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[3], tex[3]);
		glVertex3f (vert[1], 0.0f, vert[1]);
		glTexCoord2f (tex[0], tex[3]);
		glVertex3f (-vert[1], 0.0f, vert[1]);
		glEnd ();
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[2], tex[1]);
		glVertex3f (vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[2], tex[2]);
		glVertex3f (vert[0], 0.0f, vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[3], tex[0]);
		glVertex3f (vert[1], 0.0f, -vert[1]);
		glTexCoord2f (tex[3], tex[3]);
		glVertex3f (vert[1], 0.0f, vert[1]);
		glEnd ();
		glEndList ();
		glNewList (earthlist, GL_COMPILE);
		lit[0] = lit[1] = lit[2] = 0.4f;
		glColor3fv (lit);
		glBegin (GL_TRIANGLE_STRIP);
		glTexCoord2f (tex[1], tex[1]);
		glVertex3f (-vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[1], tex[2]);
		glVertex3f (-vert[0], 0.0f, vert[0]);
		glTexCoord2f (tex[2], tex[1]);
		glVertex3f (vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[2], tex[2]);
		glVertex3f (vert[0], 0.0f, vert[0]);
		glEnd ();
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[1], tex[1]);
		glVertex3f (-vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[2], tex[1]);
		glVertex3f (vert[0], 0.0f, -vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[0], tex[0]);
		glVertex3f (-vert[1], 0.0f, -vert[1]);
		glTexCoord2f (tex[3], tex[0]);
		glVertex3f (vert[1], 0.0f, -vert[1]);
		glEnd ();
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[1], tex[2]);
		glVertex3f (-vert[0], 0.0f, vert[0]);
		glTexCoord2f (tex[1], tex[1]);
		glVertex3f (-vert[0], 0.0f, -vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[0], tex[3]);
		glVertex3f (-vert[1], 0.0f, vert[1]);
		glTexCoord2f (tex[0], tex[0]);
		glVertex3f (-vert[1], 0.0f, -vert[1]);
		glEnd ();
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[2], tex[2]);
		glVertex3f (vert[0], 0.0f, vert[0]);
		glTexCoord2f (tex[1], tex[2]);
		glVertex3f (-vert[0], 0.0f, vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[3], tex[3]);
		glVertex3f (vert[1], 0.0f, vert[1]);
		glTexCoord2f (tex[0], tex[3]);
		glVertex3f (-vert[1], 0.0f, vert[1]);
		glEnd ();
		glBegin (GL_TRIANGLE_STRIP);
		glColor3fv (lit);
		glTexCoord2f (tex[2], tex[1]);
		glVertex3f (vert[0], 0.0f, -vert[0]);
		glTexCoord2f (tex[2], tex[2]);
		glVertex3f (vert[0], 0.0f, vert[0]);
		glColor3fv (unlit);
		glTexCoord2f (tex[3], tex[0]);
		glVertex3f (vert[1], 0.0f, -vert[1]);
		glTexCoord2f (tex[3], tex[3]);
		glVertex3f (vert[1], 0.0f, vert[1]);
		glEnd ();
		glEndList ();
	}
}
Exemplo n.º 7
0
void hack_init (xstuff_t * XStuff)
{
	int i, j;
	float x, y, temp;
	unsigned char *tex;

	// Window initialization
	hack_reshape (XStuff);

	glDisable (GL_DEPTH_TEST);
	glEnable (GL_BLEND);
	glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);

	// Clear the buffers and test for type of buffer swapping
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glXSwapBuffers (XStuff->display, XStuff->window);	// wglSwapLayerBuffers(hdc, WGL_SWAP_MAIN_PLANE);
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	unsigned char pixel[1] = { 255 };

	glRasterPos2i (0, 0);
	glDrawPixels (1, 1, GL_RED, GL_UNSIGNED_BYTE, pixel);
	glXSwapBuffers (XStuff->display, XStuff->window);	// wglSwapLayerBuffers(hdc, WGL_SWAP_MAIN_PLANE);
	glReadPixels (0, 0, 1, 1, GL_RED, GL_UNSIGNED_BYTE, pixel);

	if (pixel[0] == 0) {	// Color was swapped out of the back buffer
		pfd_swap_exchange = 1;
	} else {		// Color remains in back buffer
		pfd_swap_exchange = 0;
	}

	// Init light texture
	for (i = 0; i < LIGHTSIZE; i++) {
		for (j = 0; j < LIGHTSIZE; j++) {
			x = float (i - LIGHTSIZE / 2) / float (LIGHTSIZE / 2);
			y = float (j - LIGHTSIZE / 2) / float (LIGHTSIZE / 2);
			temp = 1.0f - float (sqrt ((x * x) + (y * y)));

			if (temp > 1.0f)
				temp = 1.0f;
			if (temp < 0.0f)
				temp = 0.0f;
			lightTexture[i][j] = char (255.0f * temp * temp);
		}
	}

	glBindTexture (GL_TEXTURE_2D, 1);
	glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	gluBuild2DMipmaps (GL_TEXTURE_2D, 1, LIGHTSIZE, LIGHTSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, lightTexture);
	glBindTexture (GL_TEXTURE_2D, 2);
	glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

	LOAD_TEXTURE (tex, spheremap, spheremap_compressedsize, spheremap_size)
		gluBuild2DMipmaps (GL_TEXTURE_2D, 3, TEXSIZE, TEXSIZE, GL_RGB, GL_UNSIGNED_BYTE, tex);
	FREE_TEXTURE (tex)

		glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
	glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
	glEnable (GL_TEXTURE_2D);

	// Initialize light display list
	glNewList (1, GL_COMPILE);
	glBindTexture (GL_TEXTURE_2D, 1);
	glBegin (GL_TRIANGLES);
	glTexCoord2f (0.0f, 0.0f);
	glVertex3f (-0.5f, -0.5f, 0.0f);
	glTexCoord2f (1.0f, 0.0f);
	glVertex3f (0.5f, -0.5f, 0.0f);
	glTexCoord2f (1.0f, 1.0f);
	glVertex3f (0.5f, 0.5f, 0.0f);
	glTexCoord2f (0.0f, 0.0f);
	glVertex3f (-0.5f, -0.5f, 0.0f);
	glTexCoord2f (1.0f, 1.0f);
	glVertex3f (0.5f, 0.5f, 0.0f);
	glTexCoord2f (0.0f, 1.0f);
	glVertex3f (-0.5f, 0.5f, 0.0f);
	glEnd ();
	glEndList ();

	// Initialize particles
	elist = new emitter[dEmitters];
	alist = new attracter[dAttracters];
	ilist = new ion[dIons];

	// Initialize surface
	if (dSurface) {
		volume = new impCubeVolume;
		volume->init (50, 50, 50, 35.0f);
		volume->function = surfaceFunction;
		surface = volume->getSurface();

		spheres = new impSphere[dEmitters + dAttracters];

		float sphereScaleFactor = 1.0f / sqrtf (double (2 * dEmitters + dAttracters));
		for (i = 0; i < dEmitters; i++)
			spheres[i].setThickness (400.0f * sphereScaleFactor);
		for (i = 0; i < dAttracters; i++)
			spheres[i + dEmitters].setThickness (200.0f * sphereScaleFactor);
	}
}