예제 #1
0
        private void WriteKeyframeFloats_Float16(IList <EAN_Keyframe> keyframes, bool hasFirstKeyframe, bool hasFinalKeyframe, EAN_Keyframe defaultKeyframe)
        {
            if (!hasFirstKeyframe)
            {
                EAN_Keyframe defaultFirstKeyframe = (keyframes.Count == 0) ? defaultKeyframe : keyframes[0];
                bytes.AddRange(Half.GetBytes((Half)defaultFirstKeyframe.X));
                bytes.AddRange(Half.GetBytes((Half)defaultFirstKeyframe.Y));
                bytes.AddRange(Half.GetBytes((Half)defaultFirstKeyframe.Z));
                bytes.AddRange(Half.GetBytes((Half)defaultFirstKeyframe.W));
            }

            for (int i = 0; i < keyframes.Count; i++)
            {
                bytes.AddRange(Half.GetBytes((Half)keyframes[i].X));
                bytes.AddRange(Half.GetBytes((Half)keyframes[i].Y));
                bytes.AddRange(Half.GetBytes((Half)keyframes[i].Z));
                bytes.AddRange(Half.GetBytes((Half)keyframes[i].W));
            }

            if (!hasFinalKeyframe)
            {
                EAN_Keyframe defaultFinalKeyframe = (keyframes.Count == 0) ? defaultKeyframe : keyframes[keyframes.Count - 1];
                bytes.AddRange(Half.GetBytes((Half)defaultFinalKeyframe.X));
                bytes.AddRange(Half.GetBytes((Half)defaultFinalKeyframe.Y));
                bytes.AddRange(Half.GetBytes((Half)defaultFinalKeyframe.Z));
                bytes.AddRange(Half.GetBytes((Half)defaultFinalKeyframe.W));
            }
        }
예제 #2
0
 public void Write(Half value, Endianes endianes)
 {
     _tmp = Half.GetBytes(value);
     if (endianes == Endianes.Little)
     {
         Array.Reverse(_tmp);
     }
     Write(_tmp);
 }
예제 #3
0
        public void GetBytesTest()
        {
            Half value = Half.ToHalf(0x1234);

            byte[] expected = { 0x34, 0x12 };
            byte[] actual   = Half.GetBytes(value);
            Assert.Equal(expected[0], actual[0]);
            Assert.Equal(expected[1], actual[1]);
        }
예제 #4
0
 private void SetSignalRateLimit(Half LimitMCPS)
 {
     if (LimitMCPS < 0 || LimitMCPS > 511.99)
     {
         throw new ArgumentOutOfRangeException("MCPS Limit must be within 0 to 512.");
     }
     LimitMCPS *= (1 << 7);
     byte[] Data = Half.GetBytes(LimitMCPS);
     this.Bus.WriteRegister(this.Address, (byte)Registers.FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, Data);
 }
예제 #5
0
        /// <summary>
        /// Write UV Data to buffer. uvNum is either TexCoord 0, 1, 2, 7
        /// </summary>
        /// <param name="uvNum"></param>
        /// <returns></returns>
        public void WriteUvData(byte[] data, int i, int uvNum)
        {
            byte[] tempPosData;

            //Do X
            tempPosData = Half.GetBytes(UVs[uvNum].X);
            Array.Copy(tempPosData, 0, data, i, 2);

            //Do Y
            UVs[uvNum].Y = -uvs[uvNum].Y;
            tempPosData  = Half.GetBytes(UVs[uvNum].Y);
            Array.Copy(tempPosData, 0, data, i + 2, 2);
        }
예제 #6
0
 private void WriteKeyframeFloats_Float16(ObservableCollection <EAN_Keyframe> keyframes)
 {
     for (int i = 0; i < keyframes.Count(); i++)
     {
         int size = bytes.Count();
         bytes.AddRange(Half.GetBytes((Half)keyframes[i].X));
         bytes.AddRange(Half.GetBytes((Half)keyframes[i].Y));
         bytes.AddRange(Half.GetBytes((Half)keyframes[i].Z));
         bytes.AddRange(Half.GetBytes((Half)keyframes[i].W));
         if (size + 8 != bytes.Count())
         {
             throw new Exception(String.Format("Assert Fail: Float16 struct is wrong size! (expected 8, was {0}).\nSave failed.", bytes.Count() - size));
         }
     }
 }
    public void SaveTextureAsKTX(RenderTexture rtex, String name, bool tile3D = false)
    {
        int texDepth  = rtex.volumeDepth;
        int texWidth  = rtex.width;
        int texHeight = rtex.height;
        int floatSize = sizeof(float);
        int channels  = 4;

        bool tileEnabled = tile3D && texDepth > 1;

        if (tileEnabled)
        {
            texWidth *= texDepth;
            texDepth  = 1;
        }


        int texSize = texWidth * texHeight * texDepth;

        ComputeBuffer buffer = new ComputeBuffer(texSize, floatSize * channels); // 4 bytes for float and 4 channels

        CBUtility.ReadFromRenderTexture(rtex, channels, buffer, FrostbiteReadShader);

        float[] data = new float[texSize * channels];

        buffer.GetData(data);

        Byte[] header =
        {
            0xAB, 0x4B, 0x54, 0x58, // first four bytes of Byte[12] identifier
            0x20, 0x31, 0x31, 0xBB, // next four bytes of Byte[12] identifier
            0x0D, 0x0A, 0x1A, 0x0A, // final four bytes of Byte[12] identifier
            0x01, 0x02, 0x03, 0x04, // Byte[4] endianess (Big endian in this case)
        };

        FileStream   fs     = new FileStream("Assets/Textures/" + name + ".ktx", FileMode.OpenOrCreate);
        BinaryWriter writer = new BinaryWriter(fs);

        writer.Write(header);

        UInt32 glType               = 0x140B; // HALF
        UInt32 glTypeSize           = 2;      // 2 bytes
        UInt32 glFormat             = 0x1908; // RGBA
        UInt32 glInterformat        = 0x881A; // RGBA FLOAT16
        UInt32 glBaseInternalFormat = 0x1908; // RGBA
        UInt32 width         = (UInt32)texWidth;
        UInt32 height        = (UInt32)texHeight;
        UInt32 depth         = (UInt32)(texDepth == 1 ? 0 : texDepth);
        UInt32 numOfArrElem  = 0;
        UInt32 numOfFace     = 1;
        UInt32 numOfMip      = 1;
        UInt32 bytesOfKeyVal = 0;

        writer.Write(glType);
        writer.Write(glTypeSize);
        writer.Write(glFormat);
        writer.Write(glInterformat);
        writer.Write(glBaseInternalFormat);
        writer.Write(width);
        writer.Write(height);
        writer.Write(depth);
        writer.Write(numOfArrElem);
        writer.Write(numOfFace);
        writer.Write(numOfMip);
        writer.Write(bytesOfKeyVal);

        UInt32 imageSize = (UInt32)(texSize * channels * glTypeSize);

        writer.Write(imageSize);

        if (tileEnabled)
        {
            for (int j = 0; j < rtex.height; j++)
            {
                for (int k = 0; k < rtex.volumeDepth; k++)
                {
                    for (int i = 0; i < rtex.width; i++)
                    {
                        int startIndex = k * rtex.width * rtex.height * channels + j * rtex.width * channels + i * channels;
                        writer.Write(Half.GetBytes((Half)data[startIndex]));
                        writer.Write(Half.GetBytes((Half)data[startIndex + 1]));
                        writer.Write(Half.GetBytes((Half)data[startIndex + 2]));
                        writer.Write(Half.GetBytes((Half)data[startIndex + 3]));
                    }
                }
            }
        }
        else
        {
            for (int i = 0; i < data.Length; ++i)
            {
                writer.Write(Half.GetBytes((Half)data[i]));
            }
        }

        writer.Close();
        fs.Close();
        buffer.Release();
    }
예제 #8
0
        /// <summary>
        /// Exports SkyParameters to an pcsp file.
        /// </summary>
        /// <param name="texture">The Unity Texture2D to export.</param>
        /// <param name="exportPath">File path to export to.</param>
        public static void ExportSkyParameters(UnityEngine.Texture2D texture, string exportPath)
        {
            Assert.IsTrue(texture.width == 128, "texture width must be equal to 128.");
            Assert.IsTrue(texture.height == 64, "texture height must be equal to 64.");
            Assert.IsNotNull(exportPath, "exportPath must not be null.");

            FoxLib.Core.HalfColorRGBA[] precomputedSkyParameters = Utils.FoxUtils.UnityTexture2DToFoxHalfColorRGBA(texture, 0);

            using (var writer = new BinaryWriter(new FileStream(exportPath, FileMode.Create)))
            {
                var writeFunction = new FoxLib.PrecomputedSkyParameters.WriteFunctions(new Action <Half>(half => writer.Write(Half.GetBytes(half))), writer.Write);
                FoxLib.PrecomputedSkyParameters.Write(precomputedSkyParameters, writeFunction);
            }
        }
예제 #9
0
        public List <byte> GetBytes(VTX_FLAGS flags)
        {
            List <byte> bytes = new List <byte>();
            int         size  = 0;

            if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_POS))
            {
                bytes.AddRange(BitConverter.GetBytes(PositionX));
                bytes.AddRange(BitConverter.GetBytes(PositionY));
                bytes.AddRange(BitConverter.GetBytes(PositionZ));
                size += 12;
            }

            if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_NORM))
            {
                if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_COMPRESSED_FORMAT))
                {
                    bytes.AddRange(Half.GetBytes((Half)NormalX));
                    bytes.AddRange(Half.GetBytes((Half)NormalY));
                    bytes.AddRange(Half.GetBytes((Half)NormalZ));
                    bytes.AddRange(new byte[2]);
                    size += 8;
                }
                else
                {
                    bytes.AddRange(BitConverter.GetBytes(NormalX));
                    bytes.AddRange(BitConverter.GetBytes(NormalY));
                    bytes.AddRange(BitConverter.GetBytes(NormalZ));
                    size += 12;
                }
            }

            if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_TANGENT))
            {
                if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_COMPRESSED_FORMAT))
                {
                    bytes.AddRange(Half.GetBytes((Half)TangentX));
                    bytes.AddRange(Half.GetBytes((Half)TangentY));
                    bytes.AddRange(Half.GetBytes((Half)TangentZ));
                    bytes.AddRange(new byte[2]);
                    size += 8;
                }
                else
                {
                    bytes.AddRange(BitConverter.GetBytes(TangentX));
                    bytes.AddRange(BitConverter.GetBytes(TangentY));
                    bytes.AddRange(BitConverter.GetBytes(TangentZ));
                    size += 12;
                }
            }

            if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_TEX))
            {
                if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_COMPRESSED_FORMAT))
                {
                    bytes.AddRange(Half.GetBytes((Half)TextureU));
                    bytes.AddRange(Half.GetBytes((Half)TextureV));
                    size += 4;
                }
                else
                {
                    bytes.AddRange(BitConverter.GetBytes(TextureU));
                    bytes.AddRange(BitConverter.GetBytes(TextureV));
                    size += 8;
                }
            }

            if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_TEX2))
            {
                if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_COMPRESSED_FORMAT))
                {
                    bytes.AddRange(Half.GetBytes((Half)Texture2U));
                    bytes.AddRange(Half.GetBytes((Half)Texture2V));
                    size += 4;
                }
                else
                {
                    bytes.AddRange(BitConverter.GetBytes(Texture2U));
                    bytes.AddRange(BitConverter.GetBytes(Texture2V));
                    size += 8;
                }
            }

            if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_COLOR))
            {
                bytes.Add(ColorR);
                bytes.Add(ColorG);
                bytes.Add(ColorB);
                bytes.Add(ColorA);
                size += 4;
            }

            if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_BLEND_WEIGHT))
            {
                bytes.Add(BlendIndexes[0]);
                bytes.Add(BlendIndexes[1]);
                bytes.Add(BlendIndexes[2]);
                bytes.Add(BlendIndexes[3]);
                size += 4;

                if (flags.HasFlag(VTX_FLAGS.EMD_VTX_FLAG_COMPRESSED_FORMAT))
                {
                    bytes.AddRange(Half.GetBytes((Half)BlendWeights[0]));
                    bytes.AddRange(Half.GetBytes((Half)BlendWeights[1]));
                    bytes.AddRange(Half.GetBytes((Half)BlendWeights[2]));
                    bytes.AddRange(Half.GetBytes((Half)0f));
                    size += 8; //An additional 2 bytes of padding added at the end
                }
                else
                {
                    bytes.AddRange(BitConverter.GetBytes(BlendWeights[0]));
                    bytes.AddRange(BitConverter.GetBytes(BlendWeights[1]));
                    bytes.AddRange(BitConverter.GetBytes(BlendWeights[2]));
                    bytes.AddRange(BitConverter.GetBytes(0f));
                    size += 16;
                }
            }

            if (size != bytes.Count)
            {
                throw new Exception(String.Format("EMD_Vertex size mismatch. Expected a size of {0}, but it was {1}. (Flags: {2})", size, bytes.Count, flags));
            }

            return(bytes);
        }
예제 #10
0
 public void WriteFloat16_4(RealQuaternion v)
 {
     Write(v.ToArray(), 4, e => Writer.Write(Half.GetBytes(new Half(e))));
 }
예제 #11
0
        public byte[] Write()
        {
            List <byte> bytes = new List <byte>();

            int        animCount       = GetIndexedAnimationCount();
            List <int> animNameOffsets = new List <int>();

            //Header
            bytes.AddRange(BitConverter.GetBytes(EMA_SIGNATURE));
            bytes.AddRange(BitConverter.GetBytes((ushort)65534));
            bytes.AddRange(BitConverter.GetBytes((ushort)32));
            bytes.AddRange(BitConverter.GetBytes((int)Version));
            bytes.AddRange(new byte[4]); //Skeleton offset
            bytes.AddRange(BitConverter.GetBytes((ushort)animCount));
            bytes.AddRange(BitConverter.GetBytes(I_18));
            bytes.AddRange(BitConverter.GetBytes(I_20));
            bytes.AddRange(BitConverter.GetBytes(I_24));
            bytes.AddRange(BitConverter.GetBytes(I_28));

            //Animation pointers
            bytes.AddRange(new byte[4 * animCount]);

            //Animations
            foreach (var anim in Animations)
            {
                int animStartOffset = bytes.Count;
                bytes = Utils.ReplaceRange(bytes, BitConverter.GetBytes(bytes.Count), 32 + (anim.Index * 4));

                List <float> values = anim.GetValues();

                bytes.AddRange(BitConverter.GetBytes(anim.I_00));
                bytes.AddRange(BitConverter.GetBytes((ushort)anim.CommandCount));
                bytes.AddRange(BitConverter.GetBytes((int)values.Count));
                bytes.AddRange(BitConverter.GetBytes((ushort)anim.I_08));
                bytes.AddRange(BitConverter.GetBytes((ushort)anim.I_10));
                animNameOffsets.Add(bytes.Count);
                bytes.AddRange(new byte[4]); //Name offset
                bytes.AddRange(new byte[4]); //value offset
                bytes.AddRange(new byte[4 * anim.CommandCount]);

                //Commands
                for (int i = 0; i < anim.CommandCount; i++)
                {
                    int startCommandOffset = bytes.Count;
                    bytes = Utils.ReplaceRange(bytes, BitConverter.GetBytes(bytes.Count - animStartOffset), animStartOffset + 20 + (i * 4));

                    anim.Commands[i].SetFlags(); //Calculate the known flags

                    if (HasSkeleton)
                    {
                        bytes.AddRange(BitConverter.GetBytes((ushort)GetBoneIndex(anim.Commands[i].BoneName)));
                    }
                    else
                    {
                        bytes.AddRange(new byte[2]);
                    }

                    bytes.Add(anim.Commands[i].I_02);

                    var bitArray_b = new BitArray(new bool[8] {
                        anim.Commands[i].I_03_b1, anim.Commands[i].I_03_b2_Int16ForTime, anim.Commands[i].I_03_b3_Int16ForValueIndex, anim.Commands[i].I_03_b4, false, false, false, false
                    });
                    var bitArray_a = new BitArray(new byte[1] {
                        anim.Commands[i].I_03_a
                    });

                    bitArray_a[3] = anim.Commands[i].I_03_a4;
                    bytes.Add((byte)Int4Converter.GetByte(Utils.ConvertToByte(bitArray_a), Utils.ConvertToByte(bitArray_b)));
                    bytes.AddRange(BitConverter.GetBytes((ushort)anim.Commands[i].KeyframeCount));
                    bytes.AddRange(new byte[2]);

                    //Sort keyframes
                    if (anim.Commands[i].KeyframeCount > 0)
                    {
                        var sortedList = anim.Commands[i].Keyframes.ToList();
                        sortedList.Sort((x, y) => x.Time - y.Time);
                        anim.Commands[i].Keyframes = new ObservableCollection <EMA_Keyframe>(sortedList);
                    }

                    //Write Time
                    for (int a = 0; a < anim.Commands[i].KeyframeCount; a++)
                    {
                        if (anim.Commands[i].I_03_b2_Int16ForTime)
                        {
                            bytes.AddRange(BitConverter.GetBytes(anim.Commands[i].Keyframes[a].Time));
                        }
                        else
                        {
                            bytes.Add((byte)anim.Commands[i].Keyframes[a].Time);
                        }
                    }

                    //Add padding
                    bytes.AddRange(new byte[Utils.CalculatePadding(bytes.Count - startCommandOffset, 4)]);

                    //Write value/index
                    bytes = Utils.ReplaceRange(bytes, BitConverter.GetBytes((ushort)(bytes.Count - startCommandOffset)), startCommandOffset + 6);
                    for (int a = 0; a < anim.Commands[i].KeyframeCount; a++)
                    {
                        if (anim.Commands[i].I_03_b3_Int16ForValueIndex)
                        {
                            bytes.AddRange(BitConverter.GetBytes((ushort)anim.Commands[i].Keyframes[a].index));
                            bytes.AddRange(BitConverter.GetBytes((ushort)anim.Commands[i].Keyframes[a].Flags));
                        }
                        else
                        {
                            bytes.Add((byte)anim.Commands[i].Keyframes[a].index);
                            bytes.Add((byte)anim.Commands[i].Keyframes[a].Flags);
                        }
                    }

                    //Add padding
                    bytes.AddRange(new byte[Utils.CalculatePadding(bytes.Count - startCommandOffset, 4)]);
                }

                //Values
                int valuesStartOffset = bytes.Count;
                bytes = Utils.ReplaceRange(bytes, BitConverter.GetBytes(bytes.Count - animStartOffset), animStartOffset + 16);
                foreach (var value in values)
                {
                    if (anim.I_10 == ValueType.Float16)
                    {
                        bytes.AddRange(Half.GetBytes((Half)value));
                    }
                    else if (anim.I_10 == ValueType.Float32 || anim.I_10 == ValueType.Float32_2)
                    {
                        bytes.AddRange(BitConverter.GetBytes(value));
                    }
                    else
                    {
                        throw new InvalidDataException("Unknown ValueType. Cannot continue.");
                    }
                }
                bytes.AddRange(new byte[Utils.CalculatePadding(bytes.Count - valuesStartOffset, 4)]);
            }

            //Skeleton
            if (HasSkeleton)
            {
                bytes.AddRange(new byte[Utils.CalculatePadding(bytes.Count, 16)]);
                bytes = Utils.ReplaceRange(bytes, BitConverter.GetBytes(bytes.Count), 12);
                bytes.AddRange(skeleton.Write());
            }

            //Strings (animations)
            for (int i = 0; i < Animations.Count; i++)
            {
                if (!String.IsNullOrWhiteSpace(Animations[i].Name))
                {
                    bytes = Utils.ReplaceRange(bytes, BitConverter.GetBytes(bytes.Count - animNameOffsets[i] + 12), animNameOffsets[i]);
                    bytes.AddRange(new byte[10]);
                    bytes.Add((byte)Animations[i].Name.Length);
                    bytes.AddRange(Encoding.ASCII.GetBytes(Animations[i].Name));
                    bytes.Add(0);
                }
            }

            return(bytes.ToArray());
        }
예제 #12
0
 public void WriteFloat16_2(RealVector2d v)
 {
     Write(v.ToArray(), 2, e => Writer.Write(Half.GetBytes(new Half(e))));
 }
예제 #13
0
 public void WriteFloat16_4(Vector4 v)
 {
     Write(v.ToArray(), 4, e => _writer.Write(Half.GetBytes(new Half(e))));
 }
    private void SaveCloudTexAsKTX(int origWidth, int origHeight, int origDepth, float[] data, String name, bool tile3D)
    {
        int texWidth  = origWidth;
        int texHeight = origHeight;
        int texDepth  = origDepth;

        int channels = 1;

        bool tileEnabled = tile3D && texDepth > 1;

        if (tileEnabled)
        {
            texWidth *= texDepth;
            texDepth  = 1;
        }


        int texSize = texWidth * texHeight * texDepth;

        Byte[] header =
        {
            0xAB, 0x4B, 0x54, 0x58, // first four bytes of Byte[12] identifier
            0x20, 0x31, 0x31, 0xBB, // next four bytes of Byte[12] identifier
            0x0D, 0x0A, 0x1A, 0x0A, // final four bytes of Byte[12] identifier
            0x01, 0x02, 0x03, 0x04, // Byte[4] endianess (Big endian in this case)
        };

        FileStream   fs     = new FileStream("Assets/Textures/" + name + ".ktx", FileMode.OpenOrCreate);
        BinaryWriter writer = new BinaryWriter(fs);

        writer.Write(header);

        UInt32 glType               = 0x140B; // HALF
        UInt32 glTypeSize           = 2;      // 2 bytes
        UInt32 glFormat             = 0x1903; // RED
        UInt32 glInterformat        = 0x822D; // R_FLOAT16
        UInt32 glBaseInternalFormat = 0x1903; // RED
        UInt32 width         = (UInt32)texWidth;
        UInt32 height        = (UInt32)texHeight;
        UInt32 depth         = (UInt32)(texDepth == 1 ? 0 : texDepth);
        UInt32 numOfArrElem  = 0;
        UInt32 numOfFace     = 1;
        UInt32 numOfMip      = 1;
        UInt32 bytesOfKeyVal = 0;

        writer.Write(glType);
        writer.Write(glTypeSize);
        writer.Write(glFormat);
        writer.Write(glInterformat);
        writer.Write(glBaseInternalFormat);
        writer.Write(width);
        writer.Write(height);
        writer.Write(depth);
        writer.Write(numOfArrElem);
        writer.Write(numOfFace);
        writer.Write(numOfMip);
        writer.Write(bytesOfKeyVal);

        UInt32 imageSize = (UInt32)(texSize * channels * glTypeSize);

        writer.Write(imageSize);

        if (tileEnabled)
        {
            for (int j = 0; j < origHeight; j++)
            {
                for (int k = 0; k < origDepth; k++)
                {
                    for (int i = 0; i < origWidth; i++)
                    {
                        int startIndex = k * origWidth * origHeight * channels + j * origWidth * channels + i * channels;
                        writer.Write(Half.GetBytes((Half)data[startIndex]));
                    }
                }
            }
        }
        else
        {
            for (int i = 0; i < data.Length; ++i)
            {
                writer.Write(Half.GetBytes((Half)data[i]));
            }
        }

        writer.Close();
        fs.Close();
    }
예제 #15
0
        private static byte[] GetHalfBytes_(float value)
        {
            var half = new Half(value);

            return(Half.GetBytes(half));
        }
예제 #16
0
        public byte[] SetFreqValueMessage(float freqValue)
        {
            var floatToByte = Half.GetBytes((Half)freqValue).Reverse().ToArray();

            return(GetWriteRegisterMessage(BedFreqPosition, floatToByte));
        }
예제 #17
0
        public byte[] SetMaxAngleValueMessage(float maxAngleValue)
        {
            var floatToByte = Half.GetBytes((Half)maxAngleValue).Reverse().ToArray();

            return(GetWriteRegisterMessage(BedMaxAnglePosition, floatToByte));
        }