Exemple #1
0
    void DiMotionSerializerImpl::WriteAnimation( const DiAnimation* pkAnimation )
    {
        WriteChunkHeader(DI_ANIMATION,CalcAnimationSize(pkAnimation));

        // name
        WriteString(pkAnimation->GetName());

        // length
        float len = pkAnimation->GetLength();
        WriteFloats(&len, 1);

        auto trackIt = pkAnimation->GetNodeClipsIterator();
        while(trackIt.HasMoreElements())
        {
            WriteNodeClip(trackIt.GetNext());
        }

        auto attachIt = pkAnimation->GetAttachClipsIterator();
        while(attachIt.HasMoreElements())
        {
            DiNodeClip * pAttach = attachIt.GetNext();
            WriteAttachClip(pAttach);
        }

    }
Exemple #2
0
    void DiMeshSerializerImpl::WriteSubMeshBoneWeights( DiSubMesh* pMesh )
    {
        const DiSubMesh::BoneWeightList& weights = pMesh->GetBoneWeights();

        uint32 weightsSize = weights.size();
        size_t chunkSize = MSTREAM_OVERHEAD_SIZE + sizeof(uint32) + weightsSize * sizeof(DiBoneWeight);
        
        WriteChunkHeader(DI_MESH_WEIGHTS, chunkSize);

        WriteInts(&weightsSize,1);

        DiSubMesh::BoneWeightList::const_iterator it;
        DiSubMesh::BoneWeightList::const_iterator itEnd = weights.end();

        for (it = weights.begin(); it != itEnd; ++it)
        {
            WriteInts(&it->second.vertexIndex,1);
            WriteShorts(&it->second.boneIndex,1);
            WriteFloats(&it->second.weight,1);
        }
    }
Exemple #3
0
    void DiMeshSerializerImpl::WriteBoundsInfo( const DiMesh* pMesh )
    {
        unsigned long size = MSTREAM_OVERHEAD_SIZE;

        size += sizeof(float) * 6;
        WriteChunkHeader(DI_MESH_BOUNDS, size);

        const DiVec3& min = pMesh->GetBounds().GetMinimum();
        const DiVec3& max = pMesh->GetBounds().GetMaximum();

        WriteFloats(&min.x, 1);
        WriteFloats(&min.y, 1);
        WriteFloats(&min.z, 1);

        WriteFloats(&max.x, 1);
        WriteFloats(&max.y, 1);
        WriteFloats(&max.z, 1);
    }
Exemple #4
0
    void DiMotionSerializerImpl::WriteAttachClip( const DiNodeClip* clip )
    {
        DiAttachNode * attach = (DiAttachNode *)clip->GetTargetNode();
        if (!attach)
        {
            DI_WARNING("No target node!");
            return;
        }

        WriteChunkHeader(DI_CLIPS_ATTACH,CalcAttachClipSize(clip));

        WriteString(attach->GetName());

        uint16 keyFrameNum = (uint16) clip->GetNumFrames();
        WriteShorts(&keyFrameNum,1);

        for (uint16 i = 0; i < keyFrameNum; ++i)
        {
            DiTransformKeyFrame* key = clip->GetNodeKeyFrame(i);

            float time = key->GetTime();
            WriteFloats(&time, 1);

            WriteObject(key->GetTranslate());

            WriteObject(key->GetRotation());

            bool hasScale = key->GetScale() != DiVec3::UNIT_SCALE;
            WriteBools(&hasScale,1);

            if (hasScale)
            {
                WriteObject(key->GetScale());
            }
        }
    }
Exemple #5
0
    void DiMotionSerializerImpl::WriteNodeClip( const DiNodeClip* pClip )
    {
        DiBone* bone = (DiBone*)pClip->GetTargetNode();
        if (!bone)
        {
            return;
        }

        WriteChunkHeader(DI_CLIPS_NODE,CalcNodeClipSize(pClip));

        uint16 boneid = (uint16)bone->GetHandle();
        WriteShorts(&boneid, 1);

        uint16 keyFrameNum = (uint16) pClip->GetNumFrames();
        WriteShorts(&keyFrameNum,1);
        
        for (uint16 i = 0; i < keyFrameNum; ++i)
        {
            DiTransformKeyFrame* key = pClip->GetNodeKeyFrame(i);

            float time = key->GetTime();
            WriteFloats(&time, 1);

            WriteObject(key->GetTranslate());

            WriteObject(key->GetRotation());
            
            bool hasScale = key->GetScale() != DiVec3::UNIT_SCALE;
            WriteBools(&hasScale,1);

            if (hasScale)
            {
                WriteObject(key->GetScale());
            }
        }
    }
Exemple #6
0
 void DiSerializer::WriteObject( const DiQuat& q )
 {
     float tmp[4] = { q.x, q.y, q.z, q.w };
     WriteFloats(tmp, 4);
 }
Exemple #7
0
 void DiSerializer::WriteObject( const DiVec3& vec )
 {
     WriteFloats(vec.ptr(), 3);
 }