Esempio n. 1
0
void Skybox::BuildProceduralSky (IVector rSunlightVector, TimeOfDay* rpTimeOfDay)
{
	// Procedurally build an image for each of the 6 faces of the skybox
	IImage* pImageU = new IImage ();
	IImage* pImageD = new IImage ();
	IImage* pImageL = new IImage ();
	IImage* pImageR = new IImage ();
	IImage* pImageF = new IImage ();
	IImage* pImageB = new IImage ();

	unsigned const int Width = 64;
	unsigned const int Height = 64;
	unsigned const int BitsPerPixel = 3;
	unsigned const int ImageSize = Width * Height * 3;
	
	// For now, ignore the sun;
	// later on, we'll calculate the sky's color based on the sun's position
	unsigned char BitmapU[ImageSize];
	unsigned char BitmapD[ImageSize];
	unsigned char BitmapL[ImageSize];
	unsigned char BitmapR[ImageSize];
	unsigned char BitmapF[ImageSize];
	unsigned char BitmapB[ImageSize];

	Color TopOfSkyColor = GetTopOfSkyColor (rpTimeOfDay);
	// Don't generate a new color if we already have one
	if (mTopOfSkyColor.mR == TopOfSkyColor.mR
			&& mTopOfSkyColor.mG == TopOfSkyColor.mG
			&& mTopOfSkyColor.mB == TopOfSkyColor.mB)
		return;
	mTopOfSkyColor = TopOfSkyColor;
	Color BottomOfSkyColor = GetBottomOfSkyColor (rpTimeOfDay);
	
	// Hand the work off to helper functions, which color the bitmaps
	GenerateUpBitmap (BitmapU, ImageSize, TopOfSkyColor);
	GenerateDownBitmap (BitmapD, ImageSize, BottomOfSkyColor);
	GenerateSideBitmap (BitmapL, ImageSize, Height, BottomOfSkyColor,
											TopOfSkyColor);
	GenerateSideBitmap (BitmapR, ImageSize, Height, BottomOfSkyColor,
											TopOfSkyColor);
	GenerateSideBitmap (BitmapF, ImageSize, Height, BottomOfSkyColor,
											TopOfSkyColor);
	GenerateSideBitmap (BitmapB, ImageSize, Height, BottomOfSkyColor,
											TopOfSkyColor);

	// Copy our bitmap data into into an engine-readable format
	pImageU->SetData (BitmapU, Width, Height);
	pImageD->SetData (BitmapD, Width, Height);
	pImageL->SetData (BitmapL, Width, Height);
	pImageR->SetData (BitmapR, Width, Height);
	pImageF->SetData (BitmapF, Width, Height);
	pImageB->SetData (BitmapB, Width, Height);

	// Load the textures into the texture manager
	// (delete existing textures if there are any)
	if (mTextureU != -1) mpTextureManager->DeleteTexture (mTextureU);
	mTextureU = mpTextureManager->LoadIImageFile (pImageU);
	if (mTextureD != -1) mpTextureManager->DeleteTexture (mTextureD);
	mTextureD = mpTextureManager->LoadIImageFile (pImageD);
	if (mTextureL != -1) mpTextureManager->DeleteTexture (mTextureL);
	mTextureL = mpTextureManager->LoadIImageFile (pImageL);
	if (mTextureR != -1) mpTextureManager->DeleteTexture (mTextureR);
	mTextureR = mpTextureManager->LoadIImageFile (pImageR);
	if (mTextureF != -1) mpTextureManager->DeleteTexture (mTextureF);
	mTextureF = mpTextureManager->LoadIImageFile (pImageF);
	if (mTextureB != -1) mpTextureManager->DeleteTexture (mTextureB);
	mTextureB = mpTextureManager->LoadIImageFile (pImageB);

	delete pImageU;
	delete pImageD;
	delete pImageL;
	delete pImageR;
	delete pImageF;
	delete pImageB;
}