/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */ #include "stdh.h" #include "Skeleton.h" #include #include #include #include #include #include #define SKELETON_VERSION 6 #define SKELETON_ID "SKEL" CStaticArray _aSortArray; INDEX ctSortBones; CSkeleton::CSkeleton() { } CSkeleton::~CSkeleton() { } // Find bone in skeleton lod INDEX CSkeleton::FindBoneInLOD(INDEX iBoneID,INDEX iSkeletonLod) { ASSERT(iSkeletonLod>=0); INDEX ctslods = skl_aSkeletonLODs.Count(); if(ctslods < 1) return -1; SkeletonLOD &slod = skl_aSkeletonLODs[iSkeletonLod]; INDEX ctb = slod.slod_aBones.Count(); // for each bone in skeleton for(INDEX isb=0;isb (-1)) { SkeletonBone &sbParent = slod.slod_aBones[iParentIndex]; MatrixMultiplyCP(sb.sb_mAbsPlacement,sbParent.sb_mAbsPlacement,sb.sb_mAbsPlacement); } } } // Add skeleton lod to skeleton void CSkeleton::AddSkletonLod(SkeletonLOD &slod) { INDEX ctlods = skl_aSkeletonLODs.Count(); skl_aSkeletonLODs.Expand(ctlods+1); skl_aSkeletonLODs[ctlods] = slod; } // Remove skleton lod form skeleton void CSkeleton::RemoveSkeletonLod(SkeletonLOD *pslodRemove) { INDEX ctslod = skl_aSkeletonLODs.Count(); // create temp space for skeleton lods CStaticArray aTempSLODs; aTempSLODs.New(ctslod-1); INDEX iIndexSrc=0; // for each skeleton lod in skeleton for(INDEX islod=0;islodWriteID_t(CChunkID(SKELETON_ID)); // write version (*ostrFile)<<(INDEX)SKELETON_VERSION; // write lods count (*ostrFile)<Write_t(&sb.sb_mAbsPlacement,sizeof(FLOAT)*12); // write RelPlacement Qvect stuct ostrFile->Write_t(&sb.sb_qvRelPlacement,sizeof(QVect)); // write offset len (*ostrFile)<ExpectID_t(CChunkID(SKELETON_ID)); // check file version (*istrFile)>>iFileVersion; if(iFileVersion != SKELETON_VERSION) { ThrowF_t(TRANS("File '%s'.\nInvalid skeleton file version.\nExpected Ver \"%d\" but found \"%d\"\n"), (const char*)istrFile->GetDescription(),SKELETON_VERSION,iFileVersion); } // read skeleton lod count (*istrFile)>>ctslods; if(ctslods>0) { skl_aSkeletonLODs.Expand(ctslods); } // for each skeleton lod for(INDEX islod=0;islod>slod.slod_fnSourceFile; // read MaxDistance (*istrFile)>>slod.slod_fMaxDistance; // read bone count INDEX ctb; (*istrFile)>>ctb; // create bone array slod.slod_aBones.New(ctb); // read skeleton bones for(INDEX ib=0;ib>strNameID; // read Parent ID (*istrFile)>>strParentID; //(*istrFile)>>slod.slod_aBones[ib].sb_iParentIndex ; sb.sb_iID = ska_GetIDFromStringTable(strNameID); sb.sb_iParentID = ska_GetIDFromStringTable(strParentID); // read AbsPlacement matrix istrFile->Read_t(&sb.sb_mAbsPlacement,sizeof(FLOAT)*12); // read RelPlacement Qvect stuct istrFile->Read_t(&sb.sb_qvRelPlacement,sizeof(QVect)); // read offset len (*istrFile)>>sb.sb_fOffSetLen; // read bone length (*istrFile)>>sb.sb_fBoneLength; } } } // Clear skeleton void CSkeleton::Clear(void) { // for each LOD for (INDEX islod=0; islod