diff --git a/NifImport/ImportMeshAndSkin.cpp b/NifImport/ImportMeshAndSkin.cpp index 5083e019ef810f6a42493a887ecaaff16cb38ed2..5287ba3630f7b2c907202d471dcfdbc6fb551037 100644 --- a/NifImport/ImportMeshAndSkin.cpp +++ b/NifImport/ImportMeshAndSkin.cpp @@ -105,7 +105,8 @@ bool NifImporter::ImportMesh(ImpNode *node, TriObject *o, NiTriBasedGeomRef triG { Mesh& mesh = o->GetMesh(); - node->SetTransform(0,TOMATRIX3(triGeom->GetLocalTransform())); + Matrix44 baseTM = (importBones) ? triGeom->GetLocalTransform() : triGeom->GetWorldTransform(); + node->SetTransform(0,TOMATRIX3(baseTM)); // Vertex info { @@ -311,39 +312,32 @@ bool NifImporter::ImportSkin(ImpNode *node, NiTriBasedGeomRef triGeom) if (ISkin *skin = (ISkin *) skinMod->GetInterface(I_SKIN)){ ISkinImportData* iskinImport = (ISkinImportData*) skinMod->GetInterface(I_SKINIMPORTDATA); - Matrix3 m3; + Matrix3 m3(TRUE); if (applyOverallTransformToSkinAndBones) { - Matrix3 initNodeTM, initObjTM; - initNodeTM.IdentityMatrix(), initObjTM.IdentityMatrix(); - skin->GetSkinInitTM(tnode, initNodeTM, false); - skin->GetSkinInitTM(tnode, initObjTM, true); m3 = TOMATRIX3(data->GetOverallTransform()); - iskinImport->SetSkinTm(tnode, initNodeTM * m3, initObjTM * m3); + Matrix3 im3 = Inverse(m3); + iskinImport->SetSkinTm(tnode, im3, im3); // ??? } // Create Bone List Tab<INode*> bones; - int i=0; - for (vector<NiNodeRef>::iterator itr = nifBones.begin(), end = nifBones.end(); itr != end; ++itr, ++i){ - string name = (*itr)->GetName(); + for (size_t i=0; i<nifBones.size(); ++i){ + NiNodeRef bone = nifBones[i]; + Matrix3 b3 = TOMATRIX3(data->GetBoneTransform(i)); + Matrix3 ib3 = Inverse(b3); + + string name = bone->GetName(); if (INode *boneRef = gi->GetINodeByName(name.c_str())) { bones.Append(1, &boneRef); iskinImport->AddBoneEx(boneRef, TRUE); // Set Bone Transform if (applyOverallTransformToSkinAndBones) { - Matrix3 initNodeTM, initBoneTM; - initNodeTM.IdentityMatrix(), initBoneTM.IdentityMatrix(); - skin->GetBoneInitTM(boneRef, initNodeTM, false); - skin->GetBoneInitTM(boneRef, initBoneTM, true); - iskinImport->SetBoneTm(boneRef, initNodeTM * m3, initBoneTM * m3); + iskinImport->SetBoneTm(boneRef, ib3, ib3); } } } ObjectState os = tnode->EvalWorldState(0); - // Need to trigger ModifyObject in BonesDefMod prior to adding vertices or nothing is added - GetCOREInterface()->ForceCompleteRedraw(); - // Need to get a list of bones and weights for each vertex. vector<VertexHolder> vertexHolders; vertexHolders.resize(m.numVerts); @@ -372,6 +366,11 @@ bool NifImporter::ImportSkin(ImpNode *node, NiTriBasedGeomRef triGeom) add = add; } } + // This is a kludge to get skin transforms to update and avoid jumping around after modifying the transforms. + // Initially they show up incorrectly but magically fix up if you go to the modifier roll up. + // There is still an outstanding issue with skeleton and GetObjectTMBeforeWSM. + skinMod->DisableModInViews(); + skinMod->EnableModInViews(); } return ok; } diff --git a/NifImport/MaxNifTools.ini b/NifImport/MaxNifTools.ini index b40bf05f8b3d26b533d61d9ae71eee534debf604..b2fbbe20b94d19a848d981157b148a09cc8727f2 100644 --- a/NifImport/MaxNifTools.ini +++ b/NifImport/MaxNifTools.ini @@ -33,6 +33,8 @@ RemoveIllegalFaces=1 EnableSkinSupport=1 [BipedImport] +; Top level bone import setting. Default:1 +ImportBones=1 ; Biped Height. Default: 131.90 BipedHeight=131.90 ; Biped initial rotation. Default: 90.0 @@ -71,7 +73,7 @@ RequireMultipleKeys=1 ; Replace TCB Rotation with Bezier (workaround for unexpected behavior with TCB rotations) ReplaceTCBRotationWithBezier=1 ; Apply the overall transform to skin and bones. Default: 0 -ApplyOverallTransformToSkinAndBones=0 +ApplyOverallTransformToSkinAndBones=1 ; [Applications] ; RootPaths - Semicolon separated list of base directories to use when determining which app the imported file is from @@ -99,7 +101,6 @@ TextureRootPaths=${RootPath};${TextureRootPath} TextureExtensions=.dds; TextureSearchPaths=${RootPath}\Textures;${TextureRootPath}\Textures\Characters;${TextureRootPath}\Textures\Armor GoToSkeletonBindPosition=1 -ApplyOverallTransformToSkinAndBones=0 [Morrowind] InstallPath=[HKLM\SOFTWARE\Bethesda Softworks\Morrowind]=@"Installed Path" @@ -110,7 +111,6 @@ TextureRootPaths=${RootPath}\Textures;${ExtractFolder}\Textures TextureExtensions=.tga; TextureSearchPaths=${RootPath}\Textures GoToSkeletonBindPosition=1 -ApplyOverallTransformToSkinAndBones=1 [Civ4] InstallPath=[HKEY_LOCAL_MACHINE\SOFTWARE\Firaxis Games\Sid Meier's Civilization 4]=@"INSTALLDIR" @@ -122,7 +122,6 @@ TextureExtensions=.dds;.bmp TextureSearchPaths= GoToSkeletonBindPosition=1 DummyNodeMatches=MD;Bip;Bip??;* NonAccum;Effect*;Sound*;Dummy* -ApplyOverallTransformToSkinAndBones=0 [DAoC] Isles_InstallPath=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Dark Age of Camelot - Shrouded Isles_is1]=@"InstallLocation" @@ -133,4 +132,4 @@ TextureRootPaths=$(ExtractFolder) TextureExtensions=.dds;.bmp;.tga TextureSearchPaths= GoToSkeletonBindPosition=1 -ApplyOverallTransformToSkinAndBones=1 + diff --git a/NifImport/NIFImport.cpp b/NifImport/NIFImport.cpp index c9dc00e5a76e4585b999b5556e5aff6e35cbe8fc..b686e7896840d37445c2139c48b332a25aa921e4 100644 --- a/NifImport/NIFImport.cpp +++ b/NifImport/NIFImport.cpp @@ -62,7 +62,7 @@ void NifImporter::Initialize() { // Apply post processing checks after reading blocks if (isValid()){ - if (goToSkeletonBindPosition && !nodes.empty()) + if (goToSkeletonBindPosition && !nodes.empty() && importBones) GoToSkeletonBindPosition(nodes); // Only support biped if CreateNewBiped can be found. @@ -124,6 +124,7 @@ void NifImporter::LoadIniSettings() flipUVTextures = GetIniValue<bool>(NifImportSection, "FlipUVTextures", true); enableSkinSupport = GetIniValue<bool>(NifImportSection, "EnableSkinSupport", true); + importBones = GetIniValue<bool>(BipedImportSection, "ImportBones", true); bipedHeight = GetIniValue<float>(BipedImportSection, "BipedHeight", 131.90f); bipedAngle = GetIniValue<float>(BipedImportSection, "BipedAngle", 90.0f); bipedAnkleAttach = GetIniValue<float>(BipedImportSection, "BipedAnkleAttach", 0.2f); @@ -192,7 +193,7 @@ bool NifImporter::DoImport() else { vector<string> importedBones; - if (importSkeleton) + if (importSkeleton && importBones) { if (browseForSkeleton) { @@ -239,15 +240,17 @@ bool NifImporter::DoImport() } } } - } else if (hasSkeleton && useBiped) { + } else if (hasSkeleton && useBiped && importBones) { ImportBipeds(nodes); } if (isValid()) { - if (strmatch(rootNode->GetName(), "Scene Root")) - ImportBones(DynamicCast<NiNode>(rootNode->GetChildren())); - else - ImportBones(rootNode); + if (importBones) { + if (strmatch(rootNode->GetName(), "Scene Root")) + ImportBones(DynamicCast<NiNode>(rootNode->GetChildren())); + else + ImportBones(rootNode); + } ok = ImportMeshes(rootNode); diff --git a/NifImport/NIFImporter.h b/NifImport/NIFImporter.h index e570592ff955b5f8a53c15e6d520547eabe652dd..c268b4499e9ac6ee61950ab090c10cdc2856b184 100644 --- a/NifImport/NIFImporter.h +++ b/NifImport/NIFImporter.h @@ -30,6 +30,7 @@ public: bool goToSkeletonBindPosition; // Biped/Bones related settings + bool importBones; string skeleton; float bipedHeight; string skeletonCheck; diff --git a/NifImport/niutils.cpp b/NifImport/niutils.cpp index 5c7cc39742d2e0a46f5a2e4e4b72a7da70e3eae3..cd680d361f3182080807116bc41be96f61f62222 100644 --- a/NifImport/niutils.cpp +++ b/NifImport/niutils.cpp @@ -494,3 +494,37 @@ void FindImages(NameValueCollection& images, const string& rootPath, const strin } +// Debugger Trace Window Utilities +TSTR PrintMatrix3(Matrix3& m) +{ + Point3 pt = m.GetTrans(); + float y,p,r; + m.GetYawPitchRoll(&y,&p,&r); + return FormatText("Matrix3: [%g,%g,%g] <%g,%g,%g>\n" + ,pt.x, pt.y, pt.z + ,TODEG(y), TODEG(p), TODEG(r) + ); +} + +void DumpMatrix3(Matrix3& m) +{ + OutputDebugString(PrintMatrix3(m)); +} + +TSTR PrintMatrix44(Matrix44& m) +{ + Vector3 p; Matrix33 rot; float sc; + m.Decompose(p, rot, sc); + Quaternion q = rot.AsQuaternion(); + Float3 f = q.AsEulerYawPitchRoll(); + + return FormatText("Matrix3: [%g,%g,%g] <%g,%g,%g> (%g)\n" + ,p.x, p.y, p.z + ,TODEG(f[0]), TODEG(f[1]), TODEG(f[2]) + ,sc + ); +} +void DumpMatrix44(Matrix44& m) +{ + OutputDebugString(PrintMatrix44(m)); +} \ No newline at end of file diff --git a/NifImport/niutils.h b/NifImport/niutils.h index 1035cc63d3b0c796168b7a066cb1931d23396980..56685f368553feaa74a0d9145c29f0fb887c37c3 100644 --- a/NifImport/niutils.h +++ b/NifImport/niutils.h @@ -303,4 +303,7 @@ inline Niflib::Ref<U> SelectFirstObjectOfType( list<Niflib::Ref<T> > const & obj return Niflib::Ref<U>(); } +TSTR PrintMatrix3(Matrix3& m); +TSTR PrintMatrix44(Niflib::Matrix44& m); + #endif // _NIUTILS_H_ \ No newline at end of file