예제 #1
0
        public void Evaluate(int SpreadMax)
        {
            //if any of the inputs has changed
            //recompute the outputs
            FColladaModel = FColladaModelIn.SliceCount > 0 ? FColladaModelIn[0] : null;
            if (FColladaModel == null)
            {
                return;
            }

            if (FColladaModelIn.IsChanged || FIndex.IsChanged)
            {
                int index = FIndex[0];

                List <Model.SkinnedInstanceMesh> skinnedMeshes = new List <Model.SkinnedInstanceMesh>();
                foreach (Model.InstanceMesh mesh in FColladaModel.InstanceMeshes)
                {
                    if (mesh is Model.SkinnedInstanceMesh)
                    {
                        skinnedMeshes.Add((Model.SkinnedInstanceMesh)mesh);
                    }
                }

                if (skinnedMeshes.Count > 0)
                {
                    if (FSelectedMesh != skinnedMeshes[index % skinnedMeshes.Count])
                    {
                        FSelectedMesh = skinnedMeshes[index % skinnedMeshes.Count];
                    }
                }
                else
                {
                    FSelectedMesh = null;
                }
            }

            if (FSelectedMesh == null)
            {
                return;
            }

            if (FColladaModelIn.IsChanged || FIndex.IsChanged || FTimeInput.IsChanged)
            {
                float time = FTimeInput[0];

                if (FColladaModelIn.IsChanged || FIndex.IsChanged)
                {
                    FSkeleton.ClearAll();
                    CreateSkeleton(FSkeleton, FSelectedMesh.RootBone, FSelectedMesh.Bones);
                }

                foreach (Model.Bone bone in FSelectedMesh.Bones)
                {
                    FSkeleton.JointTable[bone.Name].BaseTransform = bone.GetTransformMatrix(time).ToMatrix4x4();
                }

                FSkeletonOutput.SetInterface(FSkeleton);
                FSkeletonOutput.MarkPinAsChanged();
            }
        }
예제 #2
0
        public void Unload()
        {
            //clear Skeleton
            FSkeleton.ClearAll();

            //reset frame data
            FFrames.Clear();

            //reset channel count
            FChannelCountOfSkeleton = 0;

            //reset JointCounter
            FJointCounter = 0;

            //reset current frame
            FCurrentFrame = 0;
        }
예제 #3
0
        public void Evaluate(int SpreadMax)
        {
            if (this.FInScene.PluginIO.IsConnected)
            {
                this.FSkeletonOutput.SliceCount = 1;

                if (this.FInScene.IsChanged || this.FInRoot.IsChanged)
                {
                    FSkeleton.ClearAll();

                    List <AssimpNode> allnodes = new List <AssimpNode>();
                    this.RecurseNodes(allnodes, this.FInScene[0].RootNode);

                    AssimpNode found = null;
                    foreach (AssimpNode node in allnodes)
                    {
                        if (node.Name == this.FInRoot[0])
                        {
                            found = node;
                        }
                    }

                    if (found != null)
                    {
                        int id = 0;
                        CreateSkeleton(ref FSkeleton, found, "", ref id);
                    }

                    FSkeletonOutput.SetInterface(FSkeleton);
                    FSkeletonOutput.MarkPinAsChanged();
                }
            }
            else
            {
                this.FSkeletonOutput.SliceCount = 0;
            }
        }