From b4f77a4eceecfc220ef7b8aa4ff9667bb16cc20c Mon Sep 17 00:00:00 2001 From: Tazpn <tazpn@users.sourceforge.net> Date: Mon, 11 Sep 2006 02:54:51 +0000 Subject: [PATCH] Fix issues with NiControllerSequence in niflib. 1. StringOffset now defaults to -1 2. Search in StringPalette now finds exact matches rather than partial matches. 3. Reuse same StringPalette for Controller and all child blocks --- gen/ControllerLink.cpp | 2 +- obj/NiControllerSequence.cpp | 16 ++++++---------- obj/NiStringPalette.cpp | 3 ++- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/gen/ControllerLink.cpp b/gen/ControllerLink.cpp index 9f7c7273..16c84980 100644 --- a/gen/ControllerLink.cpp +++ b/gen/ControllerLink.cpp @@ -9,7 +9,7 @@ All rights reserved. Please see niflib.h for licence. */ using namespace Niflib; //Constructor -ControllerLink::ControllerLink() : controller(NULL), interpolator(NULL), unknownLink2(NULL), unknownShort0((ushort)0), priority_((byte)0), stringPalette(NULL), nodeNameOffset((uint)0), propertyTypeOffset((uint)0), controllerTypeOffset((uint)0), variableOffset1((uint)0), variableOffset2((uint)0) {}; +ControllerLink::ControllerLink() : controller(NULL), interpolator(NULL), unknownLink2(NULL), unknownShort0((ushort)0), priority_((byte)0), stringPalette(NULL), nodeNameOffset((uint)-1), propertyTypeOffset((uint)-1), controllerTypeOffset((uint)-1), variableOffset1((uint)-1), variableOffset2((uint)-1) {}; //Destructor ControllerLink::~ControllerLink() {}; diff --git a/obj/NiControllerSequence.cpp b/obj/NiControllerSequence.cpp index d1cc5921..f3eb8215 100644 --- a/obj/NiControllerSequence.cpp +++ b/obj/NiControllerSequence.cpp @@ -104,12 +104,8 @@ void NiControllerSequence::AddInterpolator( const Ref<NiSingleInterpolatorContro } //If there are existing ControllerLinks, use the same StringPalette they're using - NiStringPaletteRef str_pal; - if ( controlledBlocks.size() > 0 ) { - str_pal = controlledBlocks[0].stringPalette; - } else { - //No existing ones, so make a new one - str_pal = new NiStringPalette; + if ( stringPalette == NULL ) { + stringPalette = new NiStringPalette; } //Make a new ControllerLink and fill out necessary data @@ -117,15 +113,15 @@ void NiControllerSequence::AddInterpolator( const Ref<NiSingleInterpolatorContro cl.interpolator = interp; cl.priority_ = priority; - cl.stringPalette = str_pal; - cl.nodeNameOffset = str_pal->AddSubStr( target->GetName() ); + cl.stringPalette = stringPalette; + cl.nodeNameOffset = stringPalette->AddSubStr( target->GetName() ); NiPropertyRef prop = DynamicCast<NiProperty>(target); if ( prop != NULL ) { - cl.propertyTypeOffset = str_pal->AddSubStr( prop->GetType().GetTypeName() ); + cl.propertyTypeOffset = stringPalette->AddSubStr( prop->GetType().GetTypeName() ); } - cl.controllerTypeOffset = str_pal->AddSubStr( obj->GetType().GetTypeName() ); + cl.controllerTypeOffset = stringPalette->AddSubStr( obj->GetType().GetTypeName() ); //Add finished ControllerLink to list controlledBlocks.push_back( cl ); diff --git a/obj/NiStringPalette.cpp b/obj/NiStringPalette.cpp index 25aa2cb7..59183a69 100644 --- a/obj/NiStringPalette.cpp +++ b/obj/NiStringPalette.cpp @@ -64,7 +64,8 @@ string NiStringPalette::GetSubStr( short offset ) const { unsigned int NiStringPalette::AddSubStr( const string & n ) { //Search for the string - uint offset = (uint)palette.palette.find( n ); + // When searching for strings also search for ending null. + uint offset = (uint)palette.palette.find( n.c_str(), 0, n.size()+1 ); //If string was not found, append it if ( offset == 0xFFFFFFFF ) { -- GitLab