public FogDefinition(byte[] inData) { using (MemoryStream ms = new MemoryStream(inData)) { using (BinaryReader br = new BinaryReader(ms)) { this.EndRadius = br.ReadSingle(); this.StartMultiplier = br.ReadSingle(); this.Colour = br.ReadBGRA(); } } }
public int MeshFlags; // 60 is normal, 124 is decal public static int Deserialise(BinaryReader reader, GameObject parent) { GameObject go = new GameObject("Mesh Part"); MeshPart part = go.AddComponent<MeshPart>(); part.transform.SetParent(parent.transform); long offset = reader.BaseStream.Position; int NextOffset = reader.ReadInt32(); reader.SkipInt32(64); reader.SkipInt32();//Length reader.SkipInt32(0); int VertexCount = reader.ReadInt32(); part.ObjectType = reader.ReadInt32(); //1 = static, 2 = can be or not there, 3 = can move int val = reader.ReadInt32(); part.OcclusionGroup = "0x" + val.ToString("X") + " 0b" + Convert.ToString(val, 2); part.MeshFlags = reader.ReadInt32(); reader.SkipBytes(32, 0); go.isStatic = part.ObjectType != 3; Matrix4x4 matrix = part.GetComponentInParent<Scene>().GetSH3ToUnityMatrix(); List<Vector3> _verts = new List<Vector3>(); List<Vector3> _norms = new List<Vector3>(); List<Vector2> _uvs = new List<Vector2>(); List<Color32> _colors = new List<Color32>(); for (int i = 0; i != VertexCount; i++) { Vector3 temp = reader.ReadVector3(); temp.y = -temp.y; _verts.Add(matrix.MultiplyPoint(temp)); temp = reader.ReadVector3(); temp.x = -temp.x; temp.z = -temp.z; _norms.Add(temp); _uvs.Add(reader.ReadVector2()); _colors.Add(reader.ReadBGRA()); } Mesh mesh = MeshUtils.MakeStripped(_verts, _norms, _uvs, _colors); mesh.name = "mesh_" + offset; go.AddComponent<MeshFilter>().sharedMesh = mesh; go.AddComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; return NextOffset; }
public void LoadBinaryData(byte[] inData) { using (MemoryStream ms = new MemoryStream(inData)) { using (BinaryReader br = new BinaryReader(ms)) { while (ms.Position < ms.Length) { this.VertexColours.Add(br.ReadBGRA()); } } } }
public DoodadInstance(byte[] inData) { using (MemoryStream ms = new MemoryStream(inData)) { using (BinaryReader br = new BinaryReader(ms)) { byte[] finalNameBytes = new byte[4]; byte[] nameOffsetBytes = br.ReadBytes(3); Buffer.BlockCopy(nameOffsetBytes, 0, finalNameBytes, 0, 3); this.NameOffset= BitConverter.ToUInt32(finalNameBytes, 0); this.Flags = (DoodadInstanceFlags) br.ReadByte(); this.Position = br.ReadVector3f(); // TODO: Investigate whether or not this is a Quat16 in >= BC this.Orientation = br.ReadQuaternion32(); this.Scale = br.ReadSingle(); this.StaticLightingColour = br.ReadBGRA(); } } }
public static Texture2D[] ReadTex32(string baseName, BinaryReader reader) { reader.SkipBytes(12); //Skips -1 0 32 /*int texGroupLength = */reader.ReadInt32(); reader.SkipBytes(4); //Skips 0 int texCount = reader.ReadInt32(); reader.SkipBytes(8); //Skips 0 0 List<Texture2D> textures = new List<Texture2D>(texCount); for (int i = 0; i != texCount; i++) { reader.SkipBytes(8); //Skips -1 0 short width = reader.ReadInt16(); short height = reader.ReadInt16(); byte bits = reader.ReadByte(); byte buffer = reader.ReadByte(); reader.SkipBytes(2); //skips 0x0000 int lengthOfTex = reader.ReadInt32(); /*int nextDataRelativeOffset = */reader.ReadInt32(); reader.SkipBytes(24 + buffer); //skips -1 0 0 0 0 0 + buffer Color32[] _pixels = null; if (bits == 32) { _pixels = new Color32[lengthOfTex / 4]; for (int j = 0; j != lengthOfTex / 4; j++) { _pixels[j] = reader.ReadBGRA(); } } else if (bits == 16) { _pixels = new Color32[lengthOfTex / 2]; for (int j = 0; j != lengthOfTex / 2; j ++) { _pixels[j] = reader.ReadRGBA5551(); } } Texture2D text = new Texture2D(width, height, TextureFormat.RGBA32, false); text.SetPixels32(_pixels); text.Apply(); text.alphaIsTransparency = true; text.name = baseName + i; textures.Add(text); } return textures.ToArray(); }
public StaticLight(byte[] inData) { using (MemoryStream ms = new MemoryStream(inData)) { using (BinaryReader br = new BinaryReader(ms)) { this.Type = (LightType) br.ReadByte(); this.bUseAttenuation = br.ReadBoolean(); this.bUseUnknown1 = br.ReadBoolean(); this.bUseUnknown2 = br.ReadBoolean(); this.Colour = br.ReadBGRA(); this.Position = br.ReadVector3f(); this.Intensity = br.ReadSingle(); this.AttenuationStartRadius = br.ReadSingle(); this.AttenuationEndRadius = br.ReadSingle(); this.Unknown1StartRadius = br.ReadSingle(); this.Unknown1EndRadius = br.ReadSingle(); this.Unknown2StartRadius = br.ReadSingle(); this.Unknown2EndRadius = br.ReadSingle(); } } }
static void ReadSH2Map(BinaryReader reader, Map scene, string path) { GameObject subGO = scene.gameObject; string assetPath = path.Replace(".map", ".asset"); int fileID = reader.ReadInt32(); int fileSize = reader.ReadInt32(); int Unknown1 = reader.ReadInt32(); reader.SkipInt32(0); //Textures Texture[] textures = TextureUtils.ReadDDS(Path.GetFileName(path).Replace(".map", "_tex"), reader); //Meshes reader.SkipInt32(1); reader.SkipInt32(); //Length from magic to bottom reader.SkipInt32(0); reader.SkipInt32(0); long magicPosition = reader.BaseStream.Position; reader.SkipInt32(0x20010730); //Magic number? reader.SkipInt32(1); int materialsOffset = reader.ReadInt32() + (int)magicPosition; int meshCount = reader.ReadInt32(); reader.SkipInt32(0); reader.SkipInt32(); // Length of elements from 0^ reader.SkipInt32(20); reader.SkipInt32(0); reader.SkipInt32(0); reader.SkipInt32(1); reader.SkipInt32(8); long v1offset = reader.BaseStream.Position; reader.ReadVector3YInverted(); //V1 reader.SkipInt32(0); reader.ReadVector3YInverted(); //V2 reader.SkipInt32(0); int headerLength = reader.ReadInt32(); //From v1 to vertexLength int indicesOffset = reader.ReadInt32() + (int)v1offset; int indicesLength = reader.ReadInt32(); int Unknown = reader.ReadInt32(); reader.SkipInt32(meshCount); List<MeshGroupSH2> groups = new List<MeshGroupSH2>(); for (int i = 0; i != meshCount; i++) { groups.Add(MeshGroupSH2.Initialise(reader, subGO)); } int vertexLength = reader.ReadInt32(); reader.SkipInt32(1); reader.SkipInt32(0); int elementLength = reader.ReadInt32(); reader.SkipInt32(vertexLength); int vertexElementsCount = vertexLength / elementLength; List<Vector3> verts = new List<Vector3>(); List<Vector3> norms = new List<Vector3>(); List<Color32> colors = new List<Color32>(); List<Vector2> uvs = new List<Vector2>(); for (int i = 0; i != vertexElementsCount; i++) { verts.Add(reader.ReadVector3YInverted() * Scene.GLOBAL_SCALE); norms.Add(reader.ReadVector3YInverted()); if (elementLength == 36) { colors.Add(reader.ReadBGRA()); } uvs.Add(reader.ReadVector2()); } reader.BaseStream.Position = indicesOffset; List<short[]> indices = new List<short[]>(groups.Count); //stupid for (int i = 0; i != groups.Count; i++) { indices.Add(null); } for(int i = 0; i != groups.Count; i++) { MeshGroupSH2 group = groups[i]; indices[group.MainID] = new short[group.indexCount]; for (int j = 0; j != group.indexCount ; j++) { indices[group.MainID][j] = reader.ReadInt16(); } Debug.Log("End of i = " + reader.BaseStream.Position.ToString("X")); } reader.BaseStream.Position = materialsOffset; //Mesh renderer MaterialRolodex rolodex = MaterialRolodex.GetOrCreateAt(assetPath); rolodex.AddTextures(textures); MeshRenderer mr = subGO.AddComponent<MeshRenderer>(); Material[] mats = new Material[groups.Count]; for (int i = 0; i != groups.Count; i++) { reader.SkipInt16(); MaterialRolodex.TexMatsPair tmp = rolodex.GetWithSH2ID(reader.ReadInt16()); mats[i] = tmp.GetOrCreateDiffuse(); reader.SkipBytes(12); } mr.sharedMaterials = mats; reader.Close(); //Mesh filter subGO.AddComponent<MeshFilter>().sharedMesh = MeshUtils.MakeIndexedStrip(verts, indices, norms, uvs, colors); foreach (MeshFilter mf in subGO.GetComponentsInChildren<MeshFilter>()) { AssetDatabase.AddObjectToAsset(mf.sharedMesh, assetPath); } }