// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #pragma once #include template class MaxKrakatoaReferenceTarget : public BaseClass { protected: IParamBlock2* m_pblock; protected: virtual ClassDesc2* GetClassDesc() = 0; public: MaxKrakatoaReferenceTarget(); virtual ~MaxKrakatoaReferenceTarget(); // From Animatable virtual Class_ID ClassID(); #if MAX_VERSION_MAJOR >= 24 virtual void GetClassName( MSTR& s, bool localized ); #else virtual void GetClassName( MSTR& s ); #endif virtual int NumRefs(); virtual ReferenceTarget* GetReference( int i ); virtual void SetReference( int i, ReferenceTarget* r ); virtual int NumSubs(); virtual Animatable* SubAnim( int i ); #if MAX_VERSION_MAJOR >= 24 virtual TSTR SubAnimName( int i, bool localized ); #else virtual TSTR SubAnimName( int i ); #endif virtual int NumParamBlocks(); virtual IParamBlock2* GetParamBlock( int i ); virtual IParamBlock2* GetParamBlockByID( BlockID i ); virtual void BeginEditParams( IObjParam* ip, ULONG flags, Animatable* prev = NULL ); virtual void EndEditParams( IObjParam* ip, ULONG flags, Animatable* next = NULL ); virtual void DeleteThis(); // From ReferenceMaker virtual RefResult NotifyRefChanged( const Interval& changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message, BOOL propagate ) = 0; #if MAX_VERSION_MAJOR < 17 virtual RefResult NotifyRefChanged( Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message ) { return this->NotifyRefChanged( changeInt, hTarget, partID, message, TRUE ); } #endif // From ReferenceTarget virtual ReferenceTarget* Clone( RemapDir& remap ); }; template MaxKrakatoaReferenceTarget::MaxKrakatoaReferenceTarget() { m_pblock = NULL; } template MaxKrakatoaReferenceTarget::~MaxKrakatoaReferenceTarget() {} template Class_ID MaxKrakatoaReferenceTarget::ClassID() { return GetClassDesc()->ClassID(); } template #if MAX_VERSION_MAJOR < 24 void MaxKrakatoaReferenceTarget::GetClassName( MSTR& s ) { #else void MaxKrakatoaReferenceTarget::GetClassName( MSTR& s, bool localized ) { #endif s = GetClassDesc()->ClassName(); } template int MaxKrakatoaReferenceTarget::NumRefs() { return 1; } template ReferenceTarget* MaxKrakatoaReferenceTarget::GetReference( int i ) { return ( i == 0 ) ? m_pblock : NULL; } template void MaxKrakatoaReferenceTarget::SetReference( int i, ReferenceTarget* r ) { if( i == 0 ) m_pblock = static_cast( r ); } template int MaxKrakatoaReferenceTarget::NumSubs() { return 1; } template Animatable* MaxKrakatoaReferenceTarget::SubAnim( int i ) { return ( i == 0 ) ? m_pblock : NULL; } template #if MAX_VERSION_MAJOR < 24 TSTR MaxKrakatoaReferenceTarget::SubAnimName( int i ) { #else TSTR MaxKrakatoaReferenceTarget::SubAnimName( int i, bool localized ) { #endif return ( i == 0 ) ? m_pblock->GetLocalName() : _T(""); } template int MaxKrakatoaReferenceTarget::NumParamBlocks() { return 1; } template IParamBlock2* MaxKrakatoaReferenceTarget::GetParamBlock( int i ) { return ( i == 0 ) ? m_pblock : NULL; } template IParamBlock2* MaxKrakatoaReferenceTarget::GetParamBlockByID( BlockID i ) { return ( i == m_pblock->ID() ) ? m_pblock : NULL; } template void MaxKrakatoaReferenceTarget::BeginEditParams( IObjParam* ip, ULONG flags, Animatable* prev = NULL ) { GetClassDesc()->BeginEditParams( ip, this, flags, prev ); } template void MaxKrakatoaReferenceTarget::EndEditParams( IObjParam* ip, ULONG flags, Animatable* next = NULL ) { GetClassDesc()->EndEditParams( ip, this, flags, next ); } template void MaxKrakatoaReferenceTarget::DeleteThis() { delete this; } template ReferenceTarget* MaxKrakatoaReferenceTarget::Clone( RemapDir& remap ) { ChildClass* pOldObj = static_cast( this ); ChildClass* pNewObj = new ChildClass; for( int i = 0, iEnd = pNewObj->NumRefs(); i < iEnd; ++i ) pNewObj->ReplaceReference( i, remap.CloneRef( pOldObj->GetReference( i ) ) ); pOldObj->BaseClone( pOldObj, pNewObj, remap ); return pNewObj; }