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