/// <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); }
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); }
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); }
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()); }