123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- //===========================================================================//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- #include "gosFXHeaders.hpp"
- #include <MLR\MLRPointLight.hpp>
- gosFX::LightManager
- *gosFX::LightManager::Instance = NULL;
- gosFX::Light*
- gosFX::LightManager::MakePointLight(const char* light_map)
- {
- return reinterpret_cast<Light*>(this);
- }
- void
- gosFX::LightManager::ChangeLight(
- Light *light,
- Info *info
- )
- {
- }
- void
- gosFX::LightManager::DeleteLight(Light *light)
- {
- }
- //############################################################################
- //######################## gosFX::PointLight__Specification #############################
- //############################################################################
- //------------------------------------------------------------------------------
- //
- gosFX::PointLight__Specification::PointLight__Specification(
- Stuff::MemoryStream *stream,
- int gfx_version
- ):
- Effect__Specification(PointLightClassID, stream, gfx_version)
- {
- Check_Pointer(this);
- Verify(m_class == PointLightClassID);
- Verify(gos_GetCurrentHeap() == Heap);
- m_red.Load(stream, gfx_version);
- m_green.Load(stream, gfx_version);
- m_blue.Load(stream, gfx_version);
- m_intensity.Load(stream, gfx_version);
- if (gfx_version>15)
- {
- m_innerRadius.Load(stream, gfx_version);
- m_outerRadius.Load(stream, gfx_version);
- if (gfx_version>16)
- *stream >> m_lightMap;
- }
- else
- {
- m_innerRadius.SetCurve(0.0f);
- m_outerRadius.SetCurve(25.0f);
- }
- *stream >> m_twoSided;
- }
- //------------------------------------------------------------------------------
- //
- gosFX::PointLight__Specification::PointLight__Specification():
- Effect__Specification(PointLightClassID)
- {
- Check_Pointer(this);
- Verify(gos_GetCurrentHeap() == Heap);
- m_twoSided = false;
- }
- //------------------------------------------------------------------------------
- //
- gosFX::PointLight__Specification*
- gosFX::PointLight__Specification::Make(
- Stuff::MemoryStream *stream,
- int gfx_version
- )
- {
- Check_Object(stream);
- gos_PushCurrentHeap(Heap);
- PointLight__Specification *spec =
- new gosFX::PointLight__Specification(stream, gfx_version);
- gos_PopCurrentHeap();
- return spec;
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight__Specification::Save(Stuff::MemoryStream *stream)
- {
- Check_Object(this);
- Check_Object(stream);
- Effect__Specification::Save(stream);
- m_red.Save(stream);
- m_green.Save(stream);
- m_blue.Save(stream);
- m_intensity.Save(stream);
- m_innerRadius.Save(stream);
- m_outerRadius.Save(stream);
- *stream << m_lightMap << m_twoSided;
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight__Specification::BuildDefaults()
- {
- Check_Object(this);
- Effect__Specification::BuildDefaults();
- m_red.SetCurve(1.0f);
- m_green.SetCurve(1.0f);
- m_blue.SetCurve(1.0f);
- m_intensity.SetCurve(1.0f);
- m_innerRadius.SetCurve(0.0f);
- m_outerRadius.SetCurve(10.0f);
- m_twoSided = false;
- }
- //------------------------------------------------------------------------------
- //
- bool
- gosFX::PointLight__Specification::IsDataValid(bool fix_data)
- {
- Check_Object(this);
- return Effect__Specification::IsDataValid(fix_data);
- /*
- m_red.SetCurve(1.0f);
- m_green.SetCurve(1.0f);
- m_blue.SetCurve(1.0f);
- m_intensity.SetCurve(1.0f);
- m_innerRadius.SetCurve(0.0f);
- m_outerRadius.SetCurve(10.0f);
- m_twoSided = false;
- */
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight__Specification::Copy(PointLight__Specification *spec)
- {
- Check_Object(this);
- Check_Object(spec);
- Effect__Specification::Copy(spec);
- gos_PushCurrentHeap(Heap);
- m_red = spec->m_red;
- m_green = spec->m_green;
- m_blue = spec->m_blue;
- m_intensity = spec->m_intensity;
- m_twoSided = spec->m_twoSided;
- m_lightMap = spec->m_lightMap;
- gos_PopCurrentHeap();
- }
- //############################################################################
- //############################## gosFX::PointLight ################################
- //############################################################################
- gosFX::PointLight::ClassData*
- gosFX::PointLight::DefaultData = NULL;
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight::InitializeClass()
- {
- Verify(!DefaultData);
- Verify(gos_GetCurrentHeap() == Heap);
- DefaultData =
- new ClassData(
- PointLightClassID,
- "gosFX::PointLight",
- Effect::DefaultData,
- (Effect::Factory)&Make,
- (Specification::Factory)&Specification::Make
- );
- Register_Object(DefaultData);
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight::TerminateClass()
- {
- if ( DefaultData )
- {
- Unregister_Object(DefaultData);
- delete DefaultData;
- DefaultData = NULL;
- }
- }
- //------------------------------------------------------------------------------
- //
- gosFX::PointLight::PointLight(
- Specification *spec,
- unsigned flags
- ):
- Effect(DefaultData, spec, flags)
- {
- Check_Object(spec);
- Verify(gos_GetCurrentHeap() == Heap);
- }
- //------------------------------------------------------------------------------
- //
- gosFX::PointLight::~PointLight()
- {
- if (m_light)
- {
- Check_Pointer(m_light);
- LightManager::Instance->DeleteLight(m_light);
- }
- }
- //------------------------------------------------------------------------------
- //
- gosFX::PointLight*
- gosFX::PointLight::Make(
- Specification *spec,
- unsigned flags
- )
- {
- Check_Object(spec);
- gos_PushCurrentHeap(Heap);
- PointLight *obj = new gosFX::PointLight(spec, flags);
- gos_PopCurrentHeap();
- return obj;
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight::Start(ExecuteInfo *info)
- {
- Check_Object(this);
- Check_Object(info);
- Effect::Start(info);
- Specification *spec = GetSpecification();
- Check_Object(spec);
- Check_Object(LightManager::Instance);
- m_light = LightManager::Instance->MakePointLight(spec->m_lightMap);
- Check_Pointer(m_light);
- }
- //------------------------------------------------------------------------------
- //
- bool
- gosFX::PointLight::Execute(ExecuteInfo *info)
- {
- Check_Object(this);
- Check_Object(info);
- if (!IsExecuted())
- return false;
- //
- //------------------------
- // Do the effect animation
- //------------------------
- //
- if (!Effect::Execute(info))
- return false;
- //
- //-----------------------------------------
- // Animate the parent then get our pointers
- //-----------------------------------------
- //
- Specification *spec = GetSpecification();
- Check_Object(spec);
- //
- //--------------------------------
- // Animate the color and intensity
- //--------------------------------
- //
- Stuff::LinearMatrix4D local_to_world;
- //
- //-----------------------------------------------------------
- // Construct the info object and send it to the light manager
- //-----------------------------------------------------------
- //
- LightManager::Info light_info;
- light_info.m_color.red = spec->m_red.ComputeValue(m_age, m_seed);
- light_info.m_color.green = spec->m_green.ComputeValue(m_age, m_seed);
- light_info.m_color.blue = spec->m_blue.ComputeValue(m_age, m_seed);
- light_info.m_origin.Multiply(m_localToParent, *info->m_parentToWorld);
- light_info.m_intensity = spec->m_intensity.ComputeValue(m_age, m_seed);
- light_info.m_inner = spec->m_innerRadius.ComputeValue(m_age, m_seed);
- light_info.m_outer = spec->m_outerRadius.ComputeValue(m_age, m_seed);
- Check_Pointer(m_light);
- Check_Object(LightManager::Instance);
- LightManager::Instance->ChangeLight(m_light, &light_info);
- return true;
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight::Kill()
- {
- Check_Object(this);
- Effect::Kill();
- Check_Pointer(m_light);
- LightManager::Instance->DeleteLight(m_light);
- m_light = NULL;
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::PointLight::TestInstance() const
- {
- Verify(IsDerivedFrom(DefaultData));
- }
|