//----------------------------------------------------------------------------
void KeyframeController::Save (OutStream& target) const
{
    WM5_BEGIN_DEBUG_STREAM_SAVE(target);

    TransformController::Save(target);

    target.Write(mNumCommonTimes);
    if (mNumCommonTimes > 0)
    {
        target.WriteN(mNumCommonTimes, mCommonTimes);
        target.WriteAggregateW(mNumTranslations, mTranslations);
        target.WriteAggregateW(mNumRotations, mRotations);
        target.WriteW(mNumScales, mScales);
    }
    else
    {
        target.WriteW(mNumTranslations, mTranslationTimes);
        target.WriteAggregateN(mNumTranslations, mTranslations);
        target.WriteW(mNumRotations, mRotationTimes);
        target.WriteAggregateN(mNumRotations, mRotations);
        target.WriteW(mNumScales, mScaleTimes);
        target.WriteN(mNumScales, mScales);
    }

    WM5_END_DEBUG_STREAM_SAVE(KeyframeController, target);
}
//----------------------------------------------------------------------------
void Float2Array::Save (OutStream& target) const
{
    WM5_BEGIN_DEBUG_STREAM_SAVE(target);

    Object::Save(target);

    target.WriteAggregateW(mNumElements, mElements);

    WM5_END_DEBUG_STREAM_SAVE(Float2Array, target);
}
//----------------------------------------------------------------------------
void PlanarShadowEffect::Save (OutStream& target) const
{
	WM5_BEGIN_DEBUG_STREAM_SAVE(target);

	GlobalEffect::Save(target);

	target.WriteAggregateW(mNumPlanes, mShadowColors);
	target.WritePointerN(mNumPlanes, mPlanes);
	target.WritePointerN(mNumPlanes, mProjectors);
	target.WritePointer(mShadowCaster);

	WM5_END_DEBUG_STREAM_SAVE(PlanarShadowEffect, target);
}