Esempio n. 1
0
        public float DotRow(ref float[] vec, int i)
        {
            var d = SIMD.DotProduct(ref Data[i], ref vec);

            Debug.Assert(!float.IsNaN(d));
            return(d);
        }
Esempio n. 2
0
        public float DotRow(ref float[] vec, ref float[] data)
        {
            var d = SIMD.DotProduct(ref data, ref vec);

            Debug.Assert(!float.IsNaN(d));
            return(d);
        }
Esempio n. 3
0
        public float DotRow(ReadOnlySpan <float> vec, int i)
        {
            var d = SIMD.DotProduct(Data.AsSpan().Slice(i * Columns, Columns), vec);

            Debug.Assert(!float.IsNaN(d));
            return(d);
        }
Esempio n. 4
0
        public float DotRow(ReadOnlySpan <float> vec, ReadOnlySpan <float> other)
        {
            var d = SIMD.DotProduct(vec, other);

            Debug.Assert(!float.IsNaN(d));
            return(d);
        }
Esempio n. 5
0
        public float DotRow(ref float[] vec, int i)
        {
            var row = GetRowCopy(i);
            var d   = SIMD.DotProduct(ref row, ref vec);

            Debug.Assert(!float.IsNaN(d));
            return(d);
        }
Esempio n. 6
0
        public Matrix Uniform(float a)
        {
            float a2 = 2 * a;
            float an = -a;

            ThreadSafeFastRandom.NextFloats(Data.AsSpan());
            SIMD.Multiply(Data.AsSpan(), a2);
            SIMD.Add(Data.AsSpan(), an);

            return(this);
        }
Esempio n. 7
0
        public Matrix Uniform(float a)
        {
            float a2 = 2 * a;
            float an = -a;

            Parallel.For(0, Rows, (i) =>
            {
                ThreadSafeFastRandom.NextFloats(Data[i]);
                SIMD.Multiply(ref Data[i], a2);
                SIMD.Add(ref Data[i], an);
            });
            return(this);
        }
Esempio n. 8
0
        public void ResizeAndFillRows(int newRows, float a)
        {
            float a2 = 2 * a;
            float an = -a;

            Array.Resize(ref Data, newRows * Columns);
            var toFill = Data.AsSpan().Slice(Rows * Columns);

            ThreadSafeFastRandom.NextFloats(toFill);
            SIMD.Multiply(toFill, a2);
            SIMD.Add(toFill, an);

            Rows = newRows;
        }
Esempio n. 9
0
        public unsafe void Can_Add_Scalar_To_Vector()
        {
            var mem = Marshal.AllocHGlobal(16 * sizeof(float));
            var ptr = (float *)mem.ToPointer();

            for (var i = 0; i < 8; ++i)
            {
                *ptr++ = i;
            }

            SIMD.Add((ptr - 8), 10, ptr, 8);
            for (var i = 0; i < 8; ++i)
            {
                Assert.AreEqual((i + 10.0f).ToString(), (*ptr++).ToString());
            }
        }
Esempio n. 10
0
 public void AddToRow(ref float[] vec, int i)
 {
     SIMD.Add(ref Data[i], ref vec);
 }
Esempio n. 11
0
 public void AddToRow(float[] vec, int i, float a)
 {
     SIMD.MultiplyAndAdd(ref Data[i], ref vec, a);
 }
Esempio n. 12
0
 public void AddToRow(ReadOnlySpan <float> vec, int i)
 {
     SIMD.Add(Data.AsSpan().Slice(i * Columns, Columns), vec);
 }
Esempio n. 13
0
 public void AddToRow(float[] vec, int i)
 {
     SIMD.Add(Data[i], vec);
 }
 public static float Euclidean(ImmutableArray <float> lhs, ImmutableArray <float> rhs) => MathF.Sqrt(SIMD.Euclidean(lhs.AsSpan(), rhs.AsSpan()));
 public static float CosineForNormalizedVectors(ImmutableArray <float> lhs, ImmutableArray <float> rhs) => 1 - SIMD.DotProduct(lhs.AsSpan(), rhs.AsSpan());
 public static float Cosine(ImmutableArray <float> lhs, ImmutableArray <float> rhs) => 1 - (SIMD.DotProduct(lhs.AsSpan(), rhs.AsSpan()) / (SIMD.Magnitude(lhs.AsSpan()) * SIMD.Magnitude(rhs.AsSpan())));
Esempio n. 17
0
        public bool ExportAnim(Stream animStream, List <Archive> archives, FileInfo outfile, bool isGLBinary = true)
        {
            var cr2w = _wolvenkitFileService.TryReadRED4File(animStream);

            if (!cr2w.Chunks.Select(_ => _.Data).OfType <animAnimSet>().Any())
            {
                return(false);
            }
            var blob = cr2w.Chunks.Select(_ => _.Data).OfType <animAnimSet>().First();

            List <MemoryStream> animDataBuffers = new List <MemoryStream>();

            foreach (var chk in blob.AnimationDataChunks)
            {
                UInt16 bufferIdx = chk.Buffer.Buffer.Value;
                var    b         = cr2w.Buffers[bufferIdx - 1];
                animStream.Seek(b.Offset, SeekOrigin.Begin);
                var ms = new MemoryStream();
                animStream.DecompressAndCopySegment(ms, b.DiskSize, b.MemSize);
                animDataBuffers.Add(ms);
            }

            var Rig  = new RawArmature();
            var hash = FNV1A64HashAlgorithm.HashString(blob.Rig.DepotPath);

            foreach (var ar in archives)
            {
                if (ar.Files.ContainsKey(hash))
                {
                    var ms = new MemoryStream();
                    ModTools.ExtractSingleToStream(ar, hash, ms);
                    Rig = RIG.ProcessRig(_wolvenkitFileService.TryReadRED4File(ms));
                    break;
                }
            }

            if (Rig is null)
            {
                return(false);
            }

            if (Rig.BoneCount < 1)
            {
                return(false);
            }

            var model = ModelRoot.CreateModel();
            var skin  = model.CreateSkin();

            skin.BindJoints(RIG.ExportNodes(ref model, Rig).Values.ToArray());

            for (int i = 0; i < blob.Animations.Count; i++)
            {
                var setEntry    = (blob.Animations[i].GetReference().Data as animAnimSetEntry);
                var animAnimDes = (setEntry.Animation.GetReference().Data as animAnimation);
                if (animAnimDes.AnimationType.Value != Enums.animAnimationType.Normal)
                {
                    continue;
                }
                switch (animAnimDes.AnimBuffer.GetReference().REDType)
                {
                case "animAnimationBufferSimd":
                {
                    var animBuff       = (animAnimDes.AnimBuffer.GetReference().Data as animAnimationBufferSimd);
                    var defferedBuffer = new MemoryStream();
                    if (animBuff.InplaceCompressedBuffer.IsSerialized)
                    {
                        var bufferIdx = animBuff.InplaceCompressedBuffer.Buffer.Value;
                        var b         = cr2w.Buffers[bufferIdx - 1];
                        animStream.Seek(b.Offset, SeekOrigin.Begin);
                        animStream.DecompressAndCopySegment(defferedBuffer, b.DiskSize, b.MemSize);
                        var br = new BinaryReader(defferedBuffer);
                        br.BaseStream.Seek(0, SeekOrigin.Begin);
                        if (br.ReadUInt32() == OodleHelper.KARK)
                        {
                            uint size   = br.ReadUInt32();
                            var  input  = br.ReadBytes((int)(br.BaseStream.Length - 8));
                            var  output = new Byte[size];
                            OodleHelper.Decompress(input, output);
                            defferedBuffer = new MemoryStream(output);
                        }
                    }
                    else
                    {
                        var bufferIdx = animBuff.DefferedBuffer.Buffer.Value;
                        var b         = cr2w.Buffers[bufferIdx - 1];
                        animStream.Seek(b.Offset, SeekOrigin.Begin);
                        animStream.DecompressAndCopySegment(defferedBuffer, b.DiskSize, b.MemSize);
                    }
                    defferedBuffer.Seek(0, SeekOrigin.Begin);
                    SIMD.AddAnimationSIMD(ref model, animBuff, animAnimDes.Name.Value, defferedBuffer, animAnimDes);
                }
                break;

                case "animAnimationBufferCompressed":
                {
                    var animBuff       = (animAnimDes.AnimBuffer.GetReference().Data as animAnimationBufferCompressed);
                    var defferedBuffer = new MemoryStream();
                    if (animBuff.InplaceCompressedBuffer.IsSerialized)
                    {
                        var bufferIdx = animBuff.InplaceCompressedBuffer.Buffer.Value;
                        var b         = cr2w.Buffers[bufferIdx - 1];
                        animStream.Seek(b.Offset, SeekOrigin.Begin);
                        animStream.DecompressAndCopySegment(defferedBuffer, b.DiskSize, b.MemSize);
                        var br = new BinaryReader(defferedBuffer);
                        br.BaseStream.Seek(0, SeekOrigin.Begin);
                        if (br.ReadUInt32() == OodleHelper.KARK)
                        {
                            uint size   = br.ReadUInt32();
                            var  input  = br.ReadBytes((int)(br.BaseStream.Length - 8));
                            var  output = new Byte[size];
                            OodleHelper.Decompress(input, output);
                            defferedBuffer = new MemoryStream(output);
                        }
                    }
                    else if (animBuff.DataAddress.IsSerialized)
                    {
                        var    dataAddr = animBuff.DataAddress;
                        Byte[] bytes    = new Byte[dataAddr.ZeInBytes.Value];
                        animDataBuffers[(int)dataAddr.UnkIndex.Value].Seek(dataAddr.FsetInBytes.Value, SeekOrigin.Begin);
                        animDataBuffers[(int)dataAddr.UnkIndex.Value].Read(bytes, 0, (int)dataAddr.ZeInBytes.Value);
                        defferedBuffer = new MemoryStream(bytes);
                    }
                    else if (animBuff.DefferedBuffer.IsSerialized)
                    {
                        var bufferIdx = animBuff.DefferedBuffer.Buffer.Value;
                        var b         = cr2w.Buffers[bufferIdx - 1];
                        animStream.Seek(b.Offset, SeekOrigin.Begin);
                        animStream.DecompressAndCopySegment(defferedBuffer, b.DiskSize, b.MemSize);
                    }
                    defferedBuffer.Seek(0, SeekOrigin.Begin);
                    SPLINE.AddAnimationSpline(ref model, animBuff, animAnimDes.Name.Value, defferedBuffer, animAnimDes);
                }
                break;
                }
            }
            if (isGLBinary)
            {
                model.SaveGLB(outfile.FullName);
            }
            else
            {
                model.SaveGLTF(outfile.FullName);
            }

            return(true);
        }
Esempio n. 18
0
 public void AddToRow(ReadOnlySpan <float> vec, int i, float a)
 {
     SIMD.MultiplyAndAdd(Data.AsSpan().Slice(i * Columns, Columns), vec, a);
 }
Esempio n. 19
0
        public bool ExportAnim(Stream animStream, List <Archive> archives, FileInfo outfile, bool isGLBinary = true)
        {
            var cr2w = _wolvenkitFileService.ReadRed4File(animStream);

            if (cr2w == null || cr2w.RootChunk is not animAnimSet blob)
            {
                return(false);
            }

            var animDataBuffers = new List <MemoryStream>();

            foreach (var chk in blob.AnimationDataChunks)
            {
                var ms = new MemoryStream();
                ms.Write(chk.Buffer.Buffer.GetBytes());

                animDataBuffers.Add(ms);
            }

            var Rig  = new RawArmature();
            var hash = FNV1A64HashAlgorithm.HashString(blob.Rig.DepotPath);

            foreach (var ar in archives)
            {
                if (ar.Files.ContainsKey(hash))
                {
                    var ms = new MemoryStream();
                    ModTools.ExtractSingleToStream(ar, hash, ms);
                    Rig = RIG.ProcessRig(_wolvenkitFileService.ReadRed4File(ms));
                    break;
                }
            }

            if (Rig is null)
            {
                return(false);
            }

            if (Rig.BoneCount < 1)
            {
                return(false);
            }

            var model = ModelRoot.CreateModel();
            var skin  = model.CreateSkin();

            skin.BindJoints(RIG.ExportNodes(ref model, Rig).Values.ToArray());

            for (var i = 0; i < blob.Animations.Count; i++)
            {
                var setEntry    = blob.Animations[i].Chunk;
                var animAnimDes = setEntry.Animation.Chunk;
                if (animAnimDes.AnimationType.Value != Enums.animAnimationType.Normal)
                {
                    continue;
                }

                if (animAnimDes.AnimBuffer.Chunk is animAnimationBufferSimd)
                {
                    var          animBuff = (animAnimDes.AnimBuffer.Chunk as animAnimationBufferSimd);
                    MemoryStream defferedBuffer;
                    if (animBuff.InplaceCompressedBuffer != null)
                    {
                        defferedBuffer = new MemoryStream(animBuff.InplaceCompressedBuffer.Buffer.GetBytes());
                    }
                    else
                    {
                        defferedBuffer = new MemoryStream(animBuff.DefferedBuffer.Buffer.GetBytes());
                    }
                    defferedBuffer.Seek(0, SeekOrigin.Begin);
                    SIMD.AddAnimationSIMD(ref model, animBuff, animAnimDes.Name, defferedBuffer, animAnimDes);
                }
                else if (animAnimDes.AnimBuffer.Chunk is animAnimationBufferCompressed)
                {
                    var animBuff       = (animAnimDes.AnimBuffer.Chunk as animAnimationBufferCompressed);
                    var defferedBuffer = new MemoryStream();
                    if (animBuff.InplaceCompressedBuffer != null)
                    {
                        defferedBuffer = new MemoryStream(animBuff.InplaceCompressedBuffer.Buffer.GetBytes());
                    }
                    else if (animBuff.DataAddress != null)
                    {
                        var dataAddr = animBuff.DataAddress;
                        var bytes    = new byte[dataAddr.ZeInBytes];
                        animDataBuffers[(int)((uint)dataAddr.UnkIndex)].Seek(dataAddr.FsetInBytes, SeekOrigin.Begin);
                        animDataBuffers[(int)((uint)dataAddr.UnkIndex)].Read(bytes, 0, (int)((uint)dataAddr.ZeInBytes));
                        defferedBuffer = new MemoryStream(bytes);
                    }
                    else if (animBuff.DefferedBuffer.Buffer.MemSize > 0)
                    {
                        defferedBuffer.Write(animBuff.DefferedBuffer.Buffer.GetBytes());
                    }
                    defferedBuffer.Seek(0, SeekOrigin.Begin);
                    SPLINE.AddAnimationSpline(ref model, animBuff, animAnimDes.Name, defferedBuffer, animAnimDes);
                }
            }
            if (isGLBinary)
            {
                model.SaveGLB(outfile.FullName);
            }
            else
            {
                model.SaveGLTF(outfile.FullName);
            }

            return(true);
        }