From f57b3686ff060b33ae6a7501d1f0e204159c6c2e Mon Sep 17 00:00:00 2001 From: Shon Ferguson <shonferg@users.sourceforge.net> Date: Sun, 3 Jun 2007 01:05:11 +0000 Subject: [PATCH] NiKeyframeController is now the parent of NiTransformController. Added more NormalizeKeys functions. Added some other functions to some controllers to expose their data. --- include/obj/NiAlphaController.h | 21 ++++++++++ include/obj/NiKeyframeController.h | 4 +- include/obj/NiTextureTransformController.h | 45 ++++++++++++++++++++++ include/obj/NiTransformController.h | 4 +- src/gen/register.cpp | 4 +- src/obj/NiAlphaController.cpp | 23 +++++++++++ src/obj/NiKeyframeController.cpp | 38 ++++++++++-------- src/obj/NiTextureTransformController.cpp | 40 +++++++++++++++++++ src/obj/NiTransformController.cpp | 12 +++--- src/obj/NiVisController.cpp | 4 +- 10 files changed, 166 insertions(+), 29 deletions(-) diff --git a/include/obj/NiAlphaController.h b/include/obj/NiAlphaController.h index 6d741aab..943ab424 100644 --- a/include/obj/NiAlphaController.h +++ b/include/obj/NiAlphaController.h @@ -58,6 +58,27 @@ public: NIFLIB_API virtual const Type & GetType() const; //--BEGIN MISC CUSTOM CODE--// + + /*! + * Retrives the alpha data used by this controller. + * \return The alpha data. + */ + NIFLIB_API Ref<NiFloatData> GetData() const; + + /*! + * Sets the alpha data used by this controller. + * \param[in] n The new alpha data. + */ + NIFLIB_API void SetData( NiFloatData * n ); + + /*! + * This function will adjust the times in all the keys in the data objects + * referenced by this controller and any of its interpolators such that the + * phase will equal 0 and frequency will equal one. In other words, it + * will cause the key times to be in seconds starting from zero. + */ + NIFLIB_API virtual void NormalizeKeys(); + //--END CUSTOM CODE--// protected: /*! Alpha controller data index. */ diff --git a/include/obj/NiKeyframeController.h b/include/obj/NiKeyframeController.h index 69905dad..41fa6ee0 100644 --- a/include/obj/NiKeyframeController.h +++ b/include/obj/NiKeyframeController.h @@ -13,7 +13,7 @@ All rights reserved. Please see niflib.h for license. */ //--BEGIN FILE HEAD CUSTOM CODE--// //--END CUSTOM CODE--// -#include "NiTimeController.h" +#include "NiSingleInterpController.h" // Include structures #include "../Ref.h" @@ -25,7 +25,7 @@ class NiKeyframeController; typedef Ref<NiKeyframeController> NiKeyframeControllerRef; /*! A time controller object for animation key frames. */ -class NiKeyframeController : public NiTimeController { +class NiKeyframeController : public NiSingleInterpController { public: /*! Constructor */ NIFLIB_API NiKeyframeController(); diff --git a/include/obj/NiTextureTransformController.h b/include/obj/NiTextureTransformController.h index f5bcd812..b02142b9 100644 --- a/include/obj/NiTextureTransformController.h +++ b/include/obj/NiTextureTransformController.h @@ -58,6 +58,51 @@ public: NIFLIB_API virtual const Type & GetType() const; //--BEGIN MISC CUSTOM CODE--// + + /* + * Retreives the texture slot that is the target of this texture transform controller. + * \return The texture slot that will be animated by this controller. + */ + NIFLIB_API TexType GetTargetTextureSlot(); + + /* + * Retreives the texture slot that will be the target of this texture transform controller. + * \param[in] n The new texture slot that will be animated by this controller. + */ + NIFLIB_API void SetTargetTextureSlot( TexType n ); + + /* + * Retreives the type of texture transformation that this controller applies. + * \return The way this controller will animate the target texture. + */ + NIFLIB_API TexTransform GetTextureTransformType(); + + /* + * Sets the type of texture transformation that this controller applies. + * \param[in] n The new way that this controller will animate the target texture. + */ + NIFLIB_API void SetTextureTransformType( TexTransform n ); + + /*! + * Retrives the float data used by this controller. + * \return The float data. + */ + NIFLIB_API Ref<NiFloatData> GetData() const; + + /*! + * Sets the float data used by this controller. + * \param[in] n The new float data. + */ + NIFLIB_API void SetData( NiFloatData * n ); + + /*! + * This function will adjust the times in all the keys in the data objects + * referenced by this controller and any of its interpolators such that the + * phase will equal 0 and frequency will equal one. In other words, it + * will cause the key times to be in seconds starting from zero. + */ + NIFLIB_API virtual void NormalizeKeys(); + //--END CUSTOM CODE--// protected: /*! Unknown. */ diff --git a/include/obj/NiTransformController.h b/include/obj/NiTransformController.h index 237bc4d0..e88065a3 100644 --- a/include/obj/NiTransformController.h +++ b/include/obj/NiTransformController.h @@ -13,14 +13,14 @@ All rights reserved. Please see niflib.h for license. */ //--BEGIN FILE HEAD CUSTOM CODE--// //--END CUSTOM CODE--// -#include "NiSingleInterpController.h" +#include "NiKeyframeController.h" namespace Niflib { class NiTransformController; typedef Ref<NiTransformController> NiTransformControllerRef; /*! NiTransformController replaces the NiKeyframeController. */ -class NiTransformController : public NiSingleInterpController { +class NiTransformController : public NiKeyframeController { public: /*! Constructor */ NIFLIB_API NiTransformController(); diff --git a/src/gen/register.cpp b/src/gen/register.cpp index 2152c518..f08a8443 100644 --- a/src/gen/register.cpp +++ b/src/gen/register.cpp @@ -72,6 +72,7 @@ All rights reserved. Please see niflib.h for license. */ #include "../../include/obj/NiMultiTargetTransformController.h" #include "../../include/obj/NiGeomMorpherController.h" #include "../../include/obj/NiSingleInterpController.h" +#include "../../include/obj/NiKeyframeController.h" #include "../../include/obj/NiTransformController.h" #include "../../include/obj/NiPSysModifierCtlr.h" #include "../../include/obj/NiPSysEmitterCtlr.h" @@ -152,7 +153,6 @@ All rights reserved. Please see niflib.h for license. */ #include "../../include/obj/NiIntegerExtraData.h" #include "../../include/obj/BSXFlags.h" #include "../../include/obj/NiIntegersExtraData.h" -#include "../../include/obj/NiKeyframeController.h" #include "../../include/obj/BSKeyframeController.h" #include "../../include/obj/NiKeyframeData.h" #include "../../include/obj/NiLookAtController.h" @@ -324,6 +324,7 @@ namespace Niflib { ObjectRegistry::RegisterObject( "NiMultiTargetTransformController", NiMultiTargetTransformController::Create ); ObjectRegistry::RegisterObject( "NiGeomMorpherController", NiGeomMorpherController::Create ); ObjectRegistry::RegisterObject( "NiSingleInterpController", NiSingleInterpController::Create ); + ObjectRegistry::RegisterObject( "NiKeyframeController", NiKeyframeController::Create ); ObjectRegistry::RegisterObject( "NiTransformController", NiTransformController::Create ); ObjectRegistry::RegisterObject( "NiPSysModifierCtlr", NiPSysModifierCtlr::Create ); ObjectRegistry::RegisterObject( "NiPSysEmitterCtlr", NiPSysEmitterCtlr::Create ); @@ -404,7 +405,6 @@ namespace Niflib { ObjectRegistry::RegisterObject( "NiIntegerExtraData", NiIntegerExtraData::Create ); ObjectRegistry::RegisterObject( "BSXFlags", BSXFlags::Create ); ObjectRegistry::RegisterObject( "NiIntegersExtraData", NiIntegersExtraData::Create ); - ObjectRegistry::RegisterObject( "NiKeyframeController", NiKeyframeController::Create ); ObjectRegistry::RegisterObject( "BSKeyframeController", BSKeyframeController::Create ); ObjectRegistry::RegisterObject( "NiKeyframeData", NiKeyframeData::Create ); ObjectRegistry::RegisterObject( "NiLookAtController", NiLookAtController::Create ); diff --git a/src/obj/NiAlphaController.cpp b/src/obj/NiAlphaController.cpp index 6836fe7c..5ffc46bd 100644 --- a/src/obj/NiAlphaController.cpp +++ b/src/obj/NiAlphaController.cpp @@ -8,6 +8,7 @@ All rights reserved. Please see niflib.h for license. */ //-----------------------------------NOTICE----------------------------------// //--BEGIN FILE HEAD CUSTOM CODE--// +#include "../../include/obj/NiFloatInterpolator.h" //--END CUSTOM CODE--// #include "../../include/FixLink.h" @@ -110,4 +111,26 @@ std::list<NiObjectRef> NiAlphaController::GetRefs() const { } //--BEGIN MISC CUSTOM CODE--// + +Ref<NiFloatData> NiAlphaController::GetData() const { + return data; +} + +void NiAlphaController::SetData( NiFloatData * n ) { + data = n; +} + +void NiAlphaController::NormalizeKeys() { + // If data is not the same as The interpolator data, which will be + // normalized by the call to NiSingleInterpController's version of + // this function, then normalize it here. + NiFloatInterpolatorRef interp = DynamicCast<NiFloatInterpolator>(interpolator); + if ( (interp->GetData() != data) && ( data != NULL ) ) { + data->NormalizeKeys( this->phase, this->frequency ); + } + + //Call the parent version of this function to finish up + NiSingleInterpController::NormalizeKeys(); +} + //--END CUSTOM CODE--// diff --git a/src/obj/NiKeyframeController.cpp b/src/obj/NiKeyframeController.cpp index b14a5523..0c8c4f78 100644 --- a/src/obj/NiKeyframeController.cpp +++ b/src/obj/NiKeyframeController.cpp @@ -18,7 +18,7 @@ All rights reserved. Please see niflib.h for license. */ using namespace Niflib; //Definition of TYPE constant -const Type NiKeyframeController::TYPE("NiKeyframeController", &NiTimeController::TYPE ); +const Type NiKeyframeController::TYPE("NiKeyframeController", &NiSingleInterpController::TYPE ); NiKeyframeController::NiKeyframeController() : data(NULL) { //--BEGIN CONSTRUCTOR CUSTOM CODE--// @@ -43,9 +43,11 @@ void NiKeyframeController::Read( istream& in, list<unsigned int> & link_stack, c //--END CUSTOM CODE--// unsigned int block_num; - NiTimeController::Read( in, link_stack, info ); - NifStream( block_num, in, info ); - link_stack.push_back( block_num ); + NiSingleInterpController::Read( in, link_stack, info ); + if ( info.version <= 0x0A010000 ) { + NifStream( block_num, in, info ); + link_stack.push_back( block_num ); + }; //--BEGIN POST-READ CUSTOM CODE--// //--END CUSTOM CODE--// @@ -55,16 +57,18 @@ void NiKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned i //--BEGIN PRE-WRITE CUSTOM CODE--// //--END CUSTOM CODE--// - NiTimeController::Write( out, link_map, info ); - if ( info.version < VER_3_3_0_13 ) { - NifStream( (unsigned int)&(*data), out, info ); - } else { - if ( data != NULL ) { - NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info ); + NiSingleInterpController::Write( out, link_map, info ); + if ( info.version <= 0x0A010000 ) { + if ( info.version < VER_3_3_0_13 ) { + NifStream( (unsigned int)&(*data), out, info ); } else { - NifStream( 0xFFFFFFFF, out, info ); + if ( data != NULL ) { + NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info ); + } else { + NifStream( 0xFFFFFFFF, out, info ); + } } - } + }; //--BEGIN POST-WRITE CUSTOM CODE--// //--END CUSTOM CODE--// @@ -76,7 +80,7 @@ std::string NiKeyframeController::asString( bool verbose ) const { stringstream out; unsigned int array_output_count = 0; - out << NiTimeController::asString(); + out << NiSingleInterpController::asString(); out << " Data: " << data << endl; return out.str(); @@ -88,8 +92,10 @@ void NiKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objec //--BEGIN PRE-FIXLINKS CUSTOM CODE--// //--END CUSTOM CODE--// - NiTimeController::FixLinks( objects, link_stack, info ); - data = FixLink<NiKeyframeData>( objects, link_stack, info ); + NiSingleInterpController::FixLinks( objects, link_stack, info ); + if ( info.version <= 0x0A010000 ) { + data = FixLink<NiKeyframeData>( objects, link_stack, info ); + }; //--BEGIN POST-FIXLINKS CUSTOM CODE--// //--END CUSTOM CODE--// @@ -97,7 +103,7 @@ void NiKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objec std::list<NiObjectRef> NiKeyframeController::GetRefs() const { list<Ref<NiObject> > refs; - refs = NiTimeController::GetRefs(); + refs = NiSingleInterpController::GetRefs(); if ( data != NULL ) refs.push_back(StaticCast<NiObject>(data)); return refs; diff --git a/src/obj/NiTextureTransformController.cpp b/src/obj/NiTextureTransformController.cpp index 15bc7401..05717676 100644 --- a/src/obj/NiTextureTransformController.cpp +++ b/src/obj/NiTextureTransformController.cpp @@ -8,6 +8,7 @@ All rights reserved. Please see niflib.h for license. */ //-----------------------------------NOTICE----------------------------------// //--BEGIN FILE HEAD CUSTOM CODE--// +#include "../../include/obj/NiFloatInterpolator.h" //--END CUSTOM CODE--// #include "../../include/FixLink.h" @@ -119,4 +120,43 @@ std::list<NiObjectRef> NiTextureTransformController::GetRefs() const { } //--BEGIN MISC CUSTOM CODE--// + +TexType NiTextureTransformController::GetTargetTextureSlot() { + return textureSlot; +} + +void NiTextureTransformController::SetTargetTextureSlot( TexType n ) { + textureSlot = n; +} + +TexTransform NiTextureTransformController::GetTextureTransformType() { + return operation; +} + +void NiTextureTransformController::SetTextureTransformType( TexTransform n ) { + operation = n; +} + +Ref<NiFloatData> NiTextureTransformController::GetData() const { + return data; +} + +void NiTextureTransformController::SetData( NiFloatData * n ) { + data = n; +} + +void NiTextureTransformController::NormalizeKeys() { + // If data is not the same as The interpolator data, which will be + // normalized by the call to NiSingleInterpController's version of + // this function, then normalize it here. + NiFloatInterpolatorRef interp = DynamicCast<NiFloatInterpolator>(interpolator); + if ( (interp->GetData() != data) && ( data != NULL ) ) { + data->NormalizeKeys( this->phase, this->frequency ); + } + + //Call the parent version of this function to finish up + NiSingleInterpController::NormalizeKeys(); +} + + //--END CUSTOM CODE--// diff --git a/src/obj/NiTransformController.cpp b/src/obj/NiTransformController.cpp index 7dcd659d..47d07dba 100644 --- a/src/obj/NiTransformController.cpp +++ b/src/obj/NiTransformController.cpp @@ -17,7 +17,7 @@ All rights reserved. Please see niflib.h for license. */ using namespace Niflib; //Definition of TYPE constant -const Type NiTransformController::TYPE("NiTransformController", &NiSingleInterpController::TYPE ); +const Type NiTransformController::TYPE("NiTransformController", &NiKeyframeController::TYPE ); NiTransformController::NiTransformController() { //--BEGIN CONSTRUCTOR CUSTOM CODE--// @@ -41,7 +41,7 @@ void NiTransformController::Read( istream& in, list<unsigned int> & link_stack, //--BEGIN PRE-READ CUSTOM CODE--// //--END CUSTOM CODE--// - NiSingleInterpController::Read( in, link_stack, info ); + NiKeyframeController::Read( in, link_stack, info ); //--BEGIN POST-READ CUSTOM CODE--// //--END CUSTOM CODE--// @@ -51,7 +51,7 @@ void NiTransformController::Write( ostream& out, const map<NiObjectRef,unsigned //--BEGIN PRE-WRITE CUSTOM CODE--// //--END CUSTOM CODE--// - NiSingleInterpController::Write( out, link_map, info ); + NiKeyframeController::Write( out, link_map, info ); //--BEGIN POST-WRITE CUSTOM CODE--// //--END CUSTOM CODE--// @@ -63,7 +63,7 @@ std::string NiTransformController::asString( bool verbose ) const { stringstream out; unsigned int array_output_count = 0; - out << NiSingleInterpController::asString(); + out << NiKeyframeController::asString(); return out.str(); //--BEGIN POST-STRING CUSTOM CODE--// @@ -74,7 +74,7 @@ void NiTransformController::FixLinks( const map<unsigned int,NiObjectRef> & obje //--BEGIN PRE-FIXLINKS CUSTOM CODE--// //--END CUSTOM CODE--// - NiSingleInterpController::FixLinks( objects, link_stack, info ); + NiKeyframeController::FixLinks( objects, link_stack, info ); //--BEGIN POST-FIXLINKS CUSTOM CODE--// //--END CUSTOM CODE--// @@ -82,7 +82,7 @@ void NiTransformController::FixLinks( const map<unsigned int,NiObjectRef> & obje std::list<NiObjectRef> NiTransformController::GetRefs() const { list<Ref<NiObject> > refs; - refs = NiSingleInterpController::GetRefs(); + refs = NiKeyframeController::GetRefs(); return refs; } diff --git a/src/obj/NiVisController.cpp b/src/obj/NiVisController.cpp index 0f51d039..37f99d12 100644 --- a/src/obj/NiVisController.cpp +++ b/src/obj/NiVisController.cpp @@ -121,7 +121,9 @@ void NiVisController::SetData( NiVisData * n ) { void NiVisController::NormalizeKeys() { - //Normalize any keys that are stored in Morph Data + //Normalize any keys that are stored any NiVisData + //Future NIF versions use BoolData to store this, + //so no comparison to the Interpolator data is necessary. if ( data != NULL ) { data->NormalizeKeys( this->phase, this->frequency ); } -- GitLab