//===========================================================================// // Copyright (C) Microsoft Corporation. All rights reserved. // //===========================================================================// #include "MLRHeaders.hpp" //############################################################################# //######################### MLRLookUpLight ################################ //############################################################################# MLRLookUpLight::ClassData* MLRLookUpLight::DefaultData = NULL; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRLookUpLight::InitializeClass() { Verify(!DefaultData); Verify(gos_GetCurrentHeap() == StaticHeap); DefaultData = new ClassData( MLRLookUpLightClassID, "MidLevelRenderer::MLRLookUpLight", MLRInfiniteLight::DefaultData ); Check_Object(DefaultData); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRLookUpLight::TerminateClass() { Check_Object(DefaultData); delete DefaultData; DefaultData = NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRLookUpLight::MLRLookUpLight() : MLRInfiniteLight(DefaultData) { Verify(gos_GetCurrentHeap() == Heap); mapOrigin.x = 0.0f; mapOrigin.y = 0.0f; mapOrigin.z = 0.0f; mapZoneCountX = 1, mapZoneCountZ = 1; zoneSizeX = 1260.0f, zoneSizeZ = 1260.0f; one_Over_zoneSizeX = 1.0f/zoneSizeX; one_Over_zoneSizeZ = 1.0f/zoneSizeZ; maps = NULL; mapName = ""; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRLookUpLight::MLRLookUpLight( Stuff::MemoryStream *stream, int version ) : MLRInfiniteLight(DefaultData, stream, version) { Check_Object(stream); Verify(gos_GetCurrentHeap() == Heap); *stream >> mapOrigin; *stream >> mapZoneCountX >> mapZoneCountZ; *stream >> zoneSizeX >> zoneSizeZ; *stream >> mapName; one_Over_zoneSizeX = 1.0f/zoneSizeX; one_Over_zoneSizeZ = 1.0f/zoneSizeZ; maps = new unsigned char * [mapZoneCountX * mapZoneCountZ]; Check_Pointer(maps); for(int i=0;iReadBytes(maps[i], 256*256); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRLookUpLight::MLRLookUpLight(Stuff::Page *page): MLRInfiniteLight(DefaultData, page) { Check_Object(page); Verify(gos_GetCurrentHeap() == Heap); maps = NULL; const char *data; mapOrigin.x = 0.0f; mapOrigin.y = 0.0f; mapOrigin.z = 0.0f; if (page->GetEntry("MapOrigin", &data)) { sscanf(data, "%f %f %f", &mapOrigin.x, &mapOrigin.y, &mapOrigin.z); } mapZoneCountX = 1, mapZoneCountZ = 1; if(page->GetEntry("MapSize", &data)) { sscanf(data, "%d %d", &mapZoneCountX, &mapZoneCountZ); } zoneSizeX = 1280.0f, zoneSizeZ = 1280.0f; if(page->GetEntry("ZoneSize", &data)) { sscanf(data, "%f %f", &zoneSizeX, &zoneSizeX); } one_Over_zoneSizeX = 1.0f/zoneSizeX; one_Over_zoneSizeZ = 1.0f/zoneSizeZ; mapName = ""; if(page->GetEntry("MapName", &data)) { mapName = data; } LoadMap(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRLookUpLight::~MLRLookUpLight() { if(maps!=NULL) { for(int i=0;iWriteBytes(maps[i], 256*256); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRLookUpLight::Write(Stuff::Page *page) { Check_Object(this); Check_Object(page); MLRInfiniteLight::Write(page); char data[256]; sprintf(data, "%f %f %f", mapOrigin.x, mapOrigin.y, mapOrigin.z); Verify(strlen(data) < sizeof(data)); page->SetEntry("MapOrigin", data); sprintf(data, "%d %d", mapZoneCountX, mapZoneCountZ); Verify(strlen(data) < sizeof(data)); page->SetEntry("MapSize", data); sprintf(data, "%f %f", zoneSizeX, zoneSizeZ); Verify(strlen(data) < sizeof(data)); page->SetEntry("ZoneSize", data); page->SetEntry("MapName", mapName); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRLookUpLight::SetMapSizeAndName(int x, int z, const char *name) { Check_Object(this); if(maps!=NULL) { for(int i=0;i=0 && map_x=0 && map_z=0 && off_x < 256); Verify(off_z>=0 && off_z < 256); Scalar mapIntensity = maps[map_z*mapZoneCountX+map_x][(off_z<<8)+off_x]*One_Over_255; // //------------------------------------------------------------------- // Now we reduce the light level falling on the vertex based upon the // cosine of the angle between light and normal //------------------------------------------------------------------- // Scalar cosine = -(light_z * (*vertexData.normal))*mapIntensity*intensity; #if COLOR_AS_DWORD TO_DO; #else // COLOR_AS_DWORD RGBColor light_color(color); if (cosine > SMALL) { light_color.red *= cosine; light_color.green *= cosine; light_color.blue *= cosine; vertexData.color->red += light_color.red; vertexData.color->green += light_color.green; vertexData.color->blue += light_color.blue; } #endif // COLOR_AS_DWORD }