public static short TERotationShort(float rotation) { const double TWO_PI = Math.PI * 2.0d; double remainder = Math.IEEERemainder(rotation, TWO_PI); return (short)Math.Round((remainder / TWO_PI) * 32767.0d); }
/// <summary> /// /// </summary> /// <returns></returns> public byte[] ToBytes() { if (DefaultTexture == null) { return(new byte[0]); } MemoryStream memStream = new MemoryStream(); BinaryWriter binWriter = new BinaryWriter(memStream); #region Bitfield Setup uint[] textures = new uint[FaceTextures.Length]; InitializeArray(ref textures); uint[] rgbas = new uint[FaceTextures.Length]; InitializeArray(ref rgbas); uint[] repeatus = new uint[FaceTextures.Length]; InitializeArray(ref repeatus); uint[] repeatvs = new uint[FaceTextures.Length]; InitializeArray(ref repeatvs); uint[] offsetus = new uint[FaceTextures.Length]; InitializeArray(ref offsetus); uint[] offsetvs = new uint[FaceTextures.Length]; InitializeArray(ref offsetvs); uint[] rotations = new uint[FaceTextures.Length]; InitializeArray(ref rotations); uint[] materials = new uint[FaceTextures.Length]; InitializeArray(ref materials); uint[] medias = new uint[FaceTextures.Length]; InitializeArray(ref medias); uint[] glows = new uint[FaceTextures.Length]; InitializeArray(ref glows); for (int i = 0; i < FaceTextures.Length; i++) { if (FaceTextures[i] == null) { continue; } if (FaceTextures[i].TextureID != DefaultTexture.TextureID) { if (textures[i] == UInt32.MaxValue) { textures[i] = 0; } textures[i] |= (uint)(1 << i); } if (FaceTextures[i].RGBA != DefaultTexture.RGBA) { if (rgbas[i] == UInt32.MaxValue) { rgbas[i] = 0; } rgbas[i] |= (uint)(1 << i); } if (FaceTextures[i].RepeatU != DefaultTexture.RepeatU) { if (repeatus[i] == UInt32.MaxValue) { repeatus[i] = 0; } repeatus[i] |= (uint)(1 << i); } if (FaceTextures[i].RepeatV != DefaultTexture.RepeatV) { if (repeatvs[i] == UInt32.MaxValue) { repeatvs[i] = 0; } repeatvs[i] |= (uint)(1 << i); } if (Helpers.TEOffsetShort(FaceTextures[i].OffsetU) != Helpers.TEOffsetShort(DefaultTexture.OffsetU)) { if (offsetus[i] == UInt32.MaxValue) { offsetus[i] = 0; } offsetus[i] |= (uint)(1 << i); } if (Helpers.TEOffsetShort(FaceTextures[i].OffsetV) != Helpers.TEOffsetShort(DefaultTexture.OffsetV)) { if (offsetvs[i] == UInt32.MaxValue) { offsetvs[i] = 0; } offsetvs[i] |= (uint)(1 << i); } if (Helpers.TERotationShort(FaceTextures[i].Rotation) != Helpers.TERotationShort(DefaultTexture.Rotation)) { if (rotations[i] == UInt32.MaxValue) { rotations[i] = 0; } rotations[i] |= (uint)(1 << i); } if (FaceTextures[i].material != DefaultTexture.material) { if (materials[i] == UInt32.MaxValue) { materials[i] = 0; } materials[i] |= (uint)(1 << i); } if (FaceTextures[i].media != DefaultTexture.media) { if (medias[i] == UInt32.MaxValue) { medias[i] = 0; } medias[i] |= (uint)(1 << i); } if (Helpers.TEGlowByte(FaceTextures[i].Glow) != Helpers.TEGlowByte(DefaultTexture.Glow)) { if (glows[i] == UInt32.MaxValue) { glows[i] = 0; } glows[i] |= (uint)(1 << i); } } #endregion Bitfield Setup #region Texture binWriter.Write(DefaultTexture.TextureID.GetBytes()); for (int i = 0; i < textures.Length; i++) { if (textures[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(textures[i])); binWriter.Write(FaceTextures[i].TextureID.GetBytes()); } } binWriter.Write((byte)0); #endregion Texture #region Color // Serialize the color bytes inverted to optimize for zerocoding binWriter.Write(DefaultTexture.RGBA.GetBytes(true)); for (int i = 0; i < rgbas.Length; i++) { if (rgbas[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(rgbas[i])); // Serialize the color bytes inverted to optimize for zerocoding binWriter.Write(FaceTextures[i].RGBA.GetBytes(true)); } } binWriter.Write((byte)0); #endregion Color #region RepeatU binWriter.Write(DefaultTexture.RepeatU); for (int i = 0; i < repeatus.Length; i++) { if (repeatus[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(repeatus[i])); binWriter.Write(FaceTextures[i].RepeatU); } } binWriter.Write((byte)0); #endregion RepeatU #region RepeatV binWriter.Write(DefaultTexture.RepeatV); for (int i = 0; i < repeatvs.Length; i++) { if (repeatvs[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(repeatvs[i])); binWriter.Write(FaceTextures[i].RepeatV); } } binWriter.Write((byte)0); #endregion RepeatV #region OffsetU binWriter.Write(Helpers.TEOffsetShort(DefaultTexture.OffsetU)); for (int i = 0; i < offsetus.Length; i++) { if (offsetus[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(offsetus[i])); binWriter.Write(Helpers.TEOffsetShort(FaceTextures[i].OffsetU)); } } binWriter.Write((byte)0); #endregion OffsetU #region OffsetV binWriter.Write(Helpers.TEOffsetShort(DefaultTexture.OffsetV)); for (int i = 0; i < offsetvs.Length; i++) { if (offsetvs[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(offsetvs[i])); binWriter.Write(Helpers.TEOffsetShort(FaceTextures[i].OffsetV)); } } binWriter.Write((byte)0); #endregion OffsetV #region Rotation binWriter.Write(Helpers.TERotationShort(DefaultTexture.Rotation)); for (int i = 0; i < rotations.Length; i++) { if (rotations[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(rotations[i])); binWriter.Write(Helpers.TERotationShort(FaceTextures[i].Rotation)); } } binWriter.Write((byte)0); #endregion Rotation #region Material binWriter.Write(DefaultTexture.material); for (int i = 0; i < materials.Length; i++) { if (materials[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(materials[i])); binWriter.Write(FaceTextures[i].material); } } binWriter.Write((byte)0); #endregion Material #region Media binWriter.Write(DefaultTexture.media); for (int i = 0; i < medias.Length; i++) { if (medias[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(medias[i])); binWriter.Write(FaceTextures[i].media); } } binWriter.Write((byte)0); #endregion Media #region Glow binWriter.Write(Helpers.TEGlowByte(DefaultTexture.Glow)); for (int i = 0; i < glows.Length; i++) { if (glows[i] != UInt32.MaxValue) { binWriter.Write(GetFaceBitfieldBytes(glows[i])); binWriter.Write(Helpers.TEGlowByte(FaceTextures[i].Glow)); } } #endregion Glow return(memStream.ToArray()); }