DaymareOn / hdtSMP64

hdt-smp for 64 bit Skyrim
MIT License
32 stars 18 forks source link

[BUG] bone name case sensitive problem #138

Closed s4e8 closed 5 months ago

s4e8 commented 5 months ago

FSMP bone name use the string cache, which is case insensitive, but bone name in xml is case sensitive. eg: armor1 has a bone name "skirta1", armor2 has a bone name "SkirtA1". After load armor1, "skirta1" being cached. If load armor2 later, bone "SkirtA1" become "skirta1", which don't match the name in HDT xml, produce bad physics behavior.

s4e8 commented 5 months ago

hdtSMP64.log: meshes\R18pn\lingerie\D\outfit.xml(131,2):Node named SkirtA1 doesn't exist, skipped, no bone created meshes\R18pn\lingerie\D\outfit.xml(227,2):constraint SkirtA1 <-> hdtSSEPhysics_AutoRename_Armor_0000000B SkirtA0 : bone for bodyA doesn't exist, will try to create it meshes\R18pn\lingerie\D\outfit.xml(227,2):Node named SkirtA1 doesn't exist, skipped, no bone created meshes\R18pn\lingerie\D\outfit.xml(228,2):constraint hdtSSEPhysics_AutoRename_Armor_0000000B SkirtA2 <-> SkirtA1 : bone for bodyB doesn't exist, will try to create it meshes\R18pn\lingerie\D\outfit.xml(228,2):Node named SkirtA1 doesn't exist, skipped, no bone created meshes\R18pn\lingerie\D\outfit.xml(312,2):constraint hdtSSEPhysics_AutoRename_Armor_0000000B SkirtB1 <-> SkirtA1 : bone for bodyB doesn't exist, will try to create it meshes\R18pn\lingerie\D\outfit.xml(312,2):Node named SkirtA1 doesn't exist, skipped, no bone created meshes\R18pn\lingerie\D\outfit.xml(321,2):constraint SkirtA1 <-> hdtSSEPhysics_AutoRename_Armor_0000000B SkirtJ1 : bone for bodyA doesn't exist, will try to create it meshes\R18pn\lingerie\D\outfit.xml(321,2):Node named SkirtA1 doesn't exist, skipped, no bone created meshes\R18pn\lingerie\D\outfit.xml(410,2):Created bone hdtSSEPhysics_AutoRename_Armor_0000000B skirta1 added to body skirt2, created without default values

DaymareOn commented 5 months ago

We have no guarantee that the string cache will provide a lowercase or uppercase string. So I guess the solution might be to systematically lowercase our inputs when looking.

Maybe the renameMap has been introduced to manage this.

DaymareOn commented 5 months ago

From what I understand, this is a skyrim bug we can't solve in FSMP. These 2 bones' names will always collide in Skyrim.

The only solution is to not have collidable names.

s4e8 commented 5 months ago

From what I understand, this is a skyrim bug we can't solve in FSMP. These 2 bones' names will always collide in Skyrim.

The only solution is to not have collidable names.

NiNode hdt::findNode(NiNode obj, const BSFixedString& name) bone name as BSFixedString, should be correct cased. There's some error lies somewhere.

DaymareOn commented 5 months ago

It's based on: virtual NiAVObject * GetObjectByName(const char ** name); That one is implemented in Skyrim and the error lies in it. Or do I miss something?