示例#1
0
        /// <summary>
        /// Replace the geometries in the scene with the ones contained in the given Assimp scene.
        /// </summary>
        /// <param name="scene"></param>
        public void ReplaceGeometries(Assimp.Scene scene)
        {
            var skinToBoneMatrices = ComputeSkinToBoneMatrices(scene);

            GeometryList.Clear();
            Atomics.Clear();

            for (var i = 0; i < scene.Meshes.Count; i++)
            {
                var assimpMesh = scene.Meshes[i];

                var rootNode = FindMeshRootNode(scene.RootNode, i) ?? scene.RootNode;
                TransformMeshVertices(assimpMesh, rootNode);

                var geometryNode = new RwGeometryNode(this, assimpMesh, scene.Materials[assimpMesh.MaterialIndex], FrameList, skinToBoneMatrices, out bool singleWeight);
                GeometryList.Add(geometryNode);

                var atomicNode = new RwAtomicNode(this, 0, i, 5);
                if (singleWeight)
                {
                    if (assimpMesh.Bones.Count != 0)
                    {
                        atomicNode.FrameIndex = FrameList.GetFrameIndexByName(assimpMesh.Bones[0].Name);
                    }
                    else if (rootNode != null)
                    {
                        atomicNode.FrameIndex = FrameList.GetFrameIndexByName(rootNode.Name);
                    }
                }

                Atomics.Add(atomicNode);
            }

            mStructNode = new RwClumpStructNode(this);
        }
示例#2
0
        private Matrix4x4[] ComputeSkinToBoneMatricesFromExistingSkin()
        {
            for (var i = 0; i < GeometryList.Count; i++)
            {
                var mesh = GeometryList[i];

                if (mesh.ExtensionNodes.Count != 0)
                {
                    var skinPlugin =
                        ( RwSkinNode )mesh.ExtensionNodes.SingleOrDefault(x => x.Id == RwNodeId.RwSkinNode);

                    if (skinPlugin != null)
                    {
                        var rootFrameWorldTransform = FrameList[Atomics.Find(x => x.GeometryIndex == i).FrameIndex].WorldTransform;

                        for (int j = 0; j < skinPlugin.SkinToBoneMatrices.Length; j++)
                        {
                            Matrix4x4.Invert(skinPlugin.SkinToBoneMatrices[j], out Matrix4x4 boneMatrix);
                            boneMatrix *= rootFrameWorldTransform;
                            Matrix4x4.Invert(boneMatrix, out boneMatrix);
                            skinPlugin.SkinToBoneMatrices[j] = boneMatrix;
                        }

                        return(skinPlugin.SkinToBoneMatrices);
                    }
                }
            }

            return(null);
        }
示例#3
0
 public MinimumInterval([NotNull] IClock clock, long minimumInterval)
 {
     if (minimumInterval < 0)
     {
         throw new ArgumentException($"Parameter '{nameof(minimumInterval)}' must be non-negative.");
     }
     _clock           = clock;
     _minimumInterval = minimumInterval;
     _nextAt          = Atomics.Long(_clock.Time);
 }
示例#4
0
        public void Test()
        {
            var            atomicInt    = Atomics.Int();
            Supplier <int> baseSupplier = () => atomicInt.IncrementAndGet();

            var memoizingSupplier = baseSupplier.Memoize();
            var memoizingWithExpirationSupplier = baseSupplier.MemoizeWithExpiration(TimeSpan.FromSeconds(5));

            Assert.AreEqual(1, baseSupplier());
            Assert.AreEqual(2, baseSupplier());
            Assert.AreEqual(3, memoizingSupplier());
            Assert.AreEqual(3, memoizingSupplier());
            Assert.AreEqual(4, memoizingWithExpirationSupplier());
            Assert.AreEqual(4, memoizingWithExpirationSupplier());
            Thread.Sleep(TimeSpan.FromSeconds(3));
            Assert.AreEqual(4, memoizingWithExpirationSupplier());
            Thread.Sleep(TimeSpan.FromSeconds(3));
            Assert.AreEqual(5, memoizingWithExpirationSupplier());
            Assert.AreEqual(3, memoizingSupplier());
            Assert.AreEqual(5, atomicInt.Value);
            Assert.AreEqual(6, baseSupplier());
        }