Files
firestorm/Gameleap/code/mw4/Libraries/gosFX/PointLight.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

357 lines
8.4 KiB
C++

#include "gosFXHeaders.hpp"
#include <MLR\MLRPointLight.hpp>
gosFX::LightManager
*gosFX::LightManager::Instance = NULL;
gosFX::Light*
gosFX::LightManager::MakePointLight(
const char* light_map,
bool vertex_light
)
{
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);
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;
if (gfx_version >= 23)
*stream >> m_vertexLight;
else
m_vertexLight = true;
}
//------------------------------------------------------------------------------
//
gosFX::PointLight__Specification::PointLight__Specification():
Effect__Specification(PointLightClassID)
{
Check_Pointer(this);
m_twoSided = false;
m_vertexLight = true;
}
//------------------------------------------------------------------------------
//
gosFX::PointLight__Specification::~PointLight__Specification()
{
Check_Object(this);
}
//------------------------------------------------------------------------------
//
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 << m_vertexLight;
}
//------------------------------------------------------------------------------
//
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;
m_vertexLight = true;
}
//------------------------------------------------------------------------------
//
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_vertexLight = spec->m_vertexLight;
m_lightMap = spec->m_lightMap;
gos_PopCurrentHeap();
}
//############################################################################
//############################## gosFX::PointLight ################################
//############################################################################
gosFX::PointLight::ClassData*
gosFX::PointLight::DefaultData = NULL;
//------------------------------------------------------------------------------
//
void
gosFX::PointLight::InitializeClass()
{
Verify(!DefaultData);
DefaultData =
new ClassData(
PointLightClassID,
"gosFX::PointLight",
Effect::DefaultData,
(Effect::Factory)&Make,
(Specification::Factory)&Specification::Make
);
Check_Object(DefaultData);
}
//------------------------------------------------------------------------------
//
void
gosFX::PointLight::TerminateClass()
{
Check_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//------------------------------------------------------------------------------
//
gosFX::PointLight::PointLight(
Specification *spec,
unsigned flags
):
Effect(DefaultData, spec, flags)
{
Check_Object(spec);
m_light = NULL;
}
//------------------------------------------------------------------------------
//
gosFX::PointLight::~PointLight()
{
if (m_light)
{
Check_Pointer(m_light);
LightManager::Instance->DeleteLight(m_light);
m_light = NULL;
}
}
//------------------------------------------------------------------------------
//
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);
if (!m_light)
{
Specification *spec = GetSpecification();
Check_Object(spec);
Check_Object(LightManager::Instance);
m_light =
LightManager::Instance->MakePointLight(
spec->m_lightMap,
spec->m_vertexLight
);
Check_Pointer(m_light);
}
}
//------------------------------------------------------------------------------
//
bool
gosFX::PointLight::Execute(ExecuteInfo *info)
{
Check_Object(this);
Check_Object(info);
GFX_LOGIC("Execute::PointLight");
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));
}