📄 effect.cpp
字号:
#include "gosFXHeaders.hpp"
//==========================================================================//
// File: gosFX_Effect.cpp //
// Contents: Base gosFX::Effect Component //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved. //
//===========================================================================//
//############################################################################
//######################## EffectSpecification #############################
//############################################################################
//------------------------------------------------------------------------------
//
gosFX::Event::Event(const Event& event):
Plug(DefaultData)
{
Check_Pointer(this);
Verify(gos_GetCurrentHeap() == Heap);
m_time = event.m_time;
m_flags = event.m_flags;
m_effectID = event.m_effectID;
}
//------------------------------------------------------------------------------
//
gosFX::Event::Event(
Stuff::MemoryStream *stream,
int gfx_version
):
Plug(DefaultData)
{
Check_Pointer(this);
Check_Object(stream);
Verify(gos_GetCurrentHeap() == Heap);
*stream >> m_time >> m_flags >> m_effectID >> m_localToParent;
}
//------------------------------------------------------------------------------
//
gosFX::Event*
gosFX::Event::Make(
Stuff::MemoryStream *stream,
int gfx_version
)
{
Check_Object(stream);
gos_PushCurrentHeap(Heap);
Event *event = new Event(stream, gfx_version);
gos_PopCurrentHeap();
return event;
}
//------------------------------------------------------------------------------
//
void
gosFX::Event::Save(Stuff::MemoryStream *stream)
{
Check_Object(this);
*stream << m_time << m_flags << m_effectID << m_localToParent;
}
//############################################################################
//######################## EffectSpecification #############################
//############################################################################
//------------------------------------------------------------------------------
//
gosFX::Effect__Specification::Effect__Specification(
Stuff::RegisteredClass::ClassID class_id,
Stuff::MemoryStream *stream,
int gfx_version
):
m_events(NULL)
{
Check_Pointer(this);
Check_Object(stream);
Verify(gos_GetCurrentHeap() == Heap);
if (gfx_version < 9)
{
STOP(("This version of gosFX is no longer supported"));
return;
}
//
//--------------
// Read the name
//--------------
//
m_class = class_id;
*stream >> m_name;
//
//--------------------------------------------------------------------
// Read the events. If we are using an array, no events will be saved
//--------------------------------------------------------------------
//
unsigned event_count;
*stream >> event_count;
while (event_count-- > 0)
{
Event *event = Event::Make(stream, gfx_version);
Register_Object(event);
m_events.Add(event);
}
//
//--------------------------------------------------------
// Load the curves, variances, and MLRState if appropriate
//--------------------------------------------------------
//
m_lifeSpan.Load(stream, gfx_version);
m_minimumChildSeed.Load(stream, gfx_version);
m_maximumChildSeed.Load(stream, gfx_version);
m_state.Load(stream, MidLevelRenderer::ReadMLRVersion(stream));
if (gfx_version < 14)
{
m_state.SetRenderPermissionMask(
m_state.GetRenderPermissionMask() | MidLevelRenderer::MLRState::TextureMask
);
}
if (
m_state.GetAlphaMode() != MidLevelRenderer::MLRState::OneZeroMode
&& m_state.GetPriority() < MidLevelRenderer::MLRState::AlphaPriority
)
m_state.SetPriority(MidLevelRenderer::MLRState::AlphaPriority);
}
//------------------------------------------------------------------------------
//
gosFX::Effect__Specification::Effect__Specification(
Stuff::RegisteredClass::ClassID class_id
):
m_events(NULL)
{
Check_Pointer(this);
Verify(gos_GetCurrentHeap() == Heap);
m_class = class_id;
}
//------------------------------------------------------------------------------
//
gosFX::Effect__Specification::~Effect__Specification()
{
Check_Pointer(this);
Stuff::ChainIteratorOf<Event*> events(&m_events);
events.DeletePlugs();
}
//------------------------------------------------------------------------------
//
gosFX::Effect__Specification*
gosFX::Effect__Specification::Make(
Stuff::MemoryStream *stream,
int gfx_version
)
{
Check_Object(stream);
gos_PushCurrentHeap(Heap);
Effect__Specification *spec =
new gosFX::Effect__Specification(EffectClassID, stream, gfx_version);
gos_PopCurrentHeap();
return spec;
}
//------------------------------------------------------------------------------
//
void
gosFX::Effect__Specification::BuildDefaults()
{
Check_Object(this);
m_lifeSpan.SetCurve(1.0f);
m_minimumChildSeed.SetCurve(0.0f);
m_maximumChildSeed.SetCurve(1.0f);
}
//------------------------------------------------------------------------------
//
bool
gosFX::Effect__Specification::IsDataValid(bool fix_data)
{
Check_Object(this);
Stuff::Scalar minv,maxv;
m_lifeSpan.ExpensiveComputeRange(&minv,&maxv);
if(minv<0.0f)
if(fix_data)
{
m_lifeSpan.SetCurve(1.0f);
PAUSE(("Warning: Curve \"lifespan\" in Effect \"%s\" Is Out of Range and has been Reset",(char *)m_name));
}
else
return false;
return true;
}
//------------------------------------------------------------------------------
//
gosFX::Effect__Specification*
gosFX::Effect__Specification::Create(
Stuff::MemoryStream *stream,
int gfx_version
)
{
Check_Object(stream);
Stuff::RegisteredClass::ClassID class_id;
*stream >> class_id;
gosFX::Effect::ClassData* class_data =
Cast_Pointer(
gosFX::Effect::ClassData*,
Stuff::RegisteredClass::FindClassData(class_id)
);
Check_Object(class_data);
Check_Pointer(class_data->specificationFactory);
gosFX::Effect__Specification *spec =
(*class_data->specificationFactory)(stream, gfx_version);
Register_Object(spec);
return spec;
}
//------------------------------------------------------------------------------
//
void
gosFX::Effect__Specification::Save(Stuff::MemoryStream *stream)
{
Check_Object(this);
*stream << m_class << m_name;
Stuff::ChainIteratorOf<Event*> events(&m_events);
unsigned count = events.GetSize();
*stream << count;
Event *event;
while ((event = events.ReadAndNext()) != NULL)
{
Check_Object(event);
event->Save(stream);
}
m_lifeSpan.Save(stream);
m_minimumChildSeed.Save(stream);
m_maximumChildSeed.Save(stream);
MidLevelRenderer::WriteMLRVersion(stream);
m_state.Save(stream);
}
//------------------------------------------------------------------------------
//
void
gosFX::Effect__Specification::Copy(Effect__Specification *spec)
{
Check_Object(this);
Check_Object(spec);
gos_PushCurrentHeap(Heap);
Verify(spec->m_class == m_class);
m_name = spec->m_name;
//
//----------------------------------------------
// Copy the events after delete our current ones
//----------------------------------------------
//
Stuff::ChainIteratorOf<Event*> old_events(&m_events);
old_events.DeletePlugs();
Stuff::ChainIteratorOf<Event*> new_events(&spec->m_events);
Event* event;
while ((event = new_events.ReadAndNext()) != NULL)
{
Check_Object(event);
Event *new_event = new Event(*event);
Register_Object(new_event);
AdoptEvent(new_event);
}
//
//---------------------------------------------------
// Now copy the curves, variance modes, and MLR state
//---------------------------------------------------
//
m_lifeSpan = spec->m_lifeSpan;
m_minimumChildSeed = spec->m_minimumChildSeed;
m_maximumChildSeed = spec->m_maximumChildSeed;
m_state = spec->m_state;
gos_PopCurrentHeap();
}
//------------------------------------------------------------------------------
//
void
gosFX::Effect__Specification::AdoptEvent(Event *event)
{
Check_Object(this);
Check_Object(event);
Verify(event->m_time >= 0.0f && event->m_time <= 1.0f);
Verify(gos_GetCurrentHeap() == Heap);
//
//-----------------------------------------------------------
// The event must be inserted into the chain in order of time
//-----------------------------------------------------------
//
Stuff::ChainIteratorOf<Event*> events(&m_events);
Event *insert = NULL;
while ((insert = events.GetCurrent()) != NULL)
{
Check_Object(insert);
if (insert->m_time > event->m_time)
{
events.Insert(event);
return;
}
events.Next();
}
m_events.Add(event);
}
//############################################################################
//############################## gosFX::Effect ###################################
//############################################################################
gosFX::Effect::ClassData*
gosFX::Effect::DefaultData = NULL;
//------------------------------------------------------------------------------
//
void
gosFX::Effect::InitializeClass()
{
Verify(!DefaultData);
Verify(gos_GetCurrentHeap() == Heap);
DefaultData =
new ClassData(
EffectClassID,
"gosFX::Effect",
Node::DefaultData,
&Make,
&Specification::Make
);
Register_Object(DefaultData);
}
//------------------------------------------------------------------------------
//
void
gosFX::Effect::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
gosFX::Effect::Effect(
ClassData *class_data,
Specification *spec,
unsigned flags
):
Node(class_data),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -