public static int Deserialise(BinaryReader reader, GameObject parent) { GameObject go = new GameObject("SubMesh Group"); go.isStatic = true; SubMeshGroup group = go.AddComponent<SubMeshGroup>(); go.transform.SetParent(parent.transform); int NextOffset = reader.ReadInt32(); reader.SkipInt32(48); reader.SkipInt32(); //Length reader.SkipInt32(0); group.Unknown11 = reader.ReadInt16(); reader.SkipInt16(1); reader.SkipInt16(0); group.IsTransparent = reader.ReadInt16(); reader.SkipInt32(0); reader.SkipInt32(0); reader.SkipBytes(16, 0); int next; do { next = SubSubMeshGroup.Deserialise(reader, go); } while (next != 0); return NextOffset; }
public static MapShadows ReadShadowCasters(string path) { string assetPath = path.Replace(".kg2", ".asset"); GameObject subGO = Scene.BeginEditingPrefab(path, "Shadows"); try { MapShadows casters = subGO.AddComponent<MapShadows>(); BinaryReader reader = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)); if (reader.BaseStream.Length != 0) { //Master header reader.SkipInt32(); short casterCount = reader.ReadInt16(); reader.SkipBytes(10, 0); Matrix4x4 transMat = casters.GetComponentInParent<Scene>().GetSH3ToUnityMatrix(); //Reading casters for (int i = 0; i != casterCount; i++) { //Caster header reader.SkipInt32(0); /*short index = */reader.ReadInt16(); short shapeCounts = reader.ReadInt16(); reader.SkipBytes(16, 0); /*Vector3 mainPivot = */reader.ReadShortVector3(); /*short casterGroup = */reader.ReadInt16(); Matrix4x4 mainMatrix = reader.ReadMatrix4x4(); Vector3 debugPosition = Matrix4x4Utils.ExtractTranslationFromMatrix(ref mainMatrix); debugPosition.y = -debugPosition.y; Vector3 currentNormal = Vector3.zero; //reading shapes for (int j = 0; j != shapeCounts; j++) { short countOfPoints = reader.ReadInt16(); short UnknownS1 = reader.ReadInt16(); /*short UnknownS2 = */reader.ReadInt16(); reader.SkipInt16(countOfPoints); /*Vector3 pivot = */reader.ReadShortVector3(); short shapeGroup = reader.ReadInt16(); List<Vector3> _verts = new List<Vector3>(); List<Vector3> _norms = new List<Vector3>(); for (int k = 0; k != countOfPoints; ) { Vector3 v = reader.ReadShortVector3(); short flag = reader.ReadInt16(); if (flag == 0) { currentNormal = Vector3.Normalize(v); } else { _verts.Add(transMat.MultiplyPoint(v + debugPosition)); _norms.Add(currentNormal); k++; } } Mesh mesh = null; if (UnknownS1 == 6) { mesh = MeshUtils.MakeStripped(_verts, _norms, null, null, true); } else if (UnknownS1 == 5) { mesh = MeshUtils.MakeStrippedInverted(_verts, _norms); } else { mesh = MeshUtils.MakeSquare(_verts, _norms, null, null, true); } mesh.name = "shadowMesh_" + shapeGroup; GameObject go = new GameObject("Shadow mesh"); go.transform.SetParent(subGO.transform); go.AddComponent<MeshFilter>().sharedMesh = mesh; MeshRenderer mr = go.AddComponent<MeshRenderer>(); mr.sharedMaterial = MaterialRolodex.defaultDiffuse; mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly; if (reader.BaseStream.Position % 16 != 0) { reader.SkipBytes(8, 0); } } } } reader.Close(); foreach (MeshFilter mf in subGO.GetComponentsInChildren<MeshFilter>()) { AssetDatabase.AddObjectToAsset(mf.sharedMesh, assetPath); } Scene.FinishEditingPrefab(path, subGO); return casters; } catch (Exception e) { Debug.LogException(e); } return null; }
public static MapLights ReadLights(string path) { /*string assetPath = path.Replace(".ded", ".asset");*/ GameObject subGO = Scene.BeginEditingPrefab(path, "Lights"); try { MapLights lights = subGO.AddComponent<MapLights>(); BinaryReader reader = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)); reader.SkipInt16(); //Usually the area's code reader.SkipInt16(); //Usually 1, saw a 20 short globalLightsCount = reader.ReadInt16(); reader.SkipInt16(0); short globalLightsOffset = reader.ReadInt16(); reader.SkipInt16(0); reader.SkipBytes(8, 0); short weirdLightsCount = reader.ReadInt16(); reader.SkipInt16(0); short weirdLightsOffset = reader.ReadInt16(); reader.SkipInt16(0); reader.SkipBytes(8, 0); short lightsCount = reader.ReadInt16(); reader.SkipInt16(0); short lightsOffset = reader.ReadInt16(); reader.SkipInt16(0); reader.SkipBytes(40, 0); short ambientOffset = reader.ReadInt16(); reader.SkipBytes(24, 0); Matrix4x4 transMat = lights.GetComponentInParent<Scene>().GetSH3ToUnityMatrix(); reader.BaseStream.Position = globalLightsOffset; for (int i = 0; i != globalLightsCount; i++) { GlobalLight gl = new GlobalLight(); gl.rotation = reader.ReadQuaternion(); gl.Unknown1 = reader.ReadVector3(); reader.SkipInt16(0); gl.Unknown2 = reader.ReadInt16(); lights.globalLights.Add(gl); } reader.BaseStream.Position = weirdLightsOffset; for (int i = 0; i != weirdLightsCount; i++) { LocalLight ll = new LocalLight(); ll.color = reader.ReadColor(); ll.Unknown1 = reader.ReadSingle(); ll.Range = reader.ReadSingle(); reader.SkipBytes(8, 0); ll.position = reader.ReadVector3YInverted(); reader.SkipInt16(0x0); ll.Unknown2 = reader.ReadInt16(); lights.weirdLights.Add(ll); } reader.BaseStream.Position = lightsOffset; for (int i = 0; i != lightsCount; i++) { LocalLight ll = new LocalLight(); ll.color = reader.ReadColor(); ll.Unknown1 = reader.ReadSingle(); ll.Range = reader.ReadSingle(); reader.SkipBytes(8, 0); ll.position = reader.ReadVector3YInverted(); reader.SkipInt16(0x0); ll.Unknown2 = reader.ReadInt16(); lights.localLights.Add(ll); GameObject lightGO = new GameObject("Light " + i); lightGO.transform.SetParent(subGO.transform); lightGO.transform.localPosition = transMat.MultiplyPoint(ll.position); Light light = lightGO.AddComponent<Light>(); light.type = LightType.Point; light.range = ll.Range * Scene.GLOBAL_SCALE; light.color = ll.color; light.intensity = 8.0f; light.bounceIntensity = 1.0f; } reader.BaseStream.Position = ambientOffset; lights.Unknown1 = reader.ReadVector4(); lights.Unknown2 = reader.ReadVector4(); lights.ambientColor = reader.ReadColor(); lights.Unknown3 = reader.ReadVector4(); reader.Close(); Scene.FinishEditingPrefab(path, subGO); return lights; } catch (Exception e) { Debug.LogException(e); } return null; }
public static Texture2D[] ReadDDS(string baseName, BinaryReader reader) { reader.SkipInt32(2); int texturesSize = reader.ReadInt32(); reader.SkipInt32(0); reader.SkipInt32(0); reader.SkipInt32(0x19990901); //magic reader.SkipInt32(0); reader.SkipInt32(0); reader.SkipInt32(1); List<Texture2D> textures = new List<Texture2D>(); int i = 0; while (reader.BaseStream.Position < texturesSize) { short textureID = reader.ReadInt16(); reader.SkipInt16(0); short width = reader.ReadInt16(); short height = reader.ReadInt16(); reader.SkipInt16(512); reader.SkipInt16(512); int subgroupsCount = reader.ReadInt32(); //1 more? reader.SkipInt16(); reader.SkipInt16(); reader.SkipBytes(12); //Skips 0 0 0 int texLength = 0; for (int j = 0; j != subgroupsCount; j++) { //Subgroup thingie /*short subgroupID = */ reader.SkipInt16(); reader.SkipInt16(); reader.SkipInt16(0); reader.SkipInt16(0); reader.SkipInt16(512); reader.SkipInt16(512); reader.SkipInt16(256); reader.SkipInt16(0); texLength = reader.ReadInt32(); /*int texAndHeaderLength = */ reader.SkipInt32(); reader.SkipInt32(0); reader.SkipUInt32(0x99000000); } Texture2D text = new Texture2D(width, height, TextureFormat.DXT1, false); text.LoadRawTextureData(reader.ReadBytes(texLength)); text.Apply(); text.alphaIsTransparency = true; text.name = baseName + textureID.ToString("0000"); textures.Add(text); i++; } reader.SkipBytes(0x10); return textures.ToArray(); }
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); } }