public override void ContinueParse(int npos, Oni.BinaryReader rawReader) { m_pClass = rawReader.ReadString(64).Replace("\0", ""); rawReader.Skip(48); rawReader.Skip(2); float l_sX = rawReader.ReadSingle(); float l_sY = rawReader.ReadSingle(); if (m_particleClasses.ContainsKey(m_pClass)) { m_class = m_particleClasses[m_pClass]; m_go = GameObject.CreatePrimitive(PrimitiveType.Plane); GameObject.Destroy(m_go.collider); m_go.name = m_pClass; if (BinaryDatReader.m_textures.ContainsKey(m_particleClasses[m_pClass].m_header.m_textureName)) { m_go.renderer.material.mainTexture = BinaryDatReader.m_textures[m_particleClasses[m_pClass].m_header.m_textureName].Surface_0; m_go.renderer.material.shader = Shader.Find("Particles/Additive"); } } else { Debug.LogError("NO KEY FOR " + m_pClass); } //Debug.Log(rawReader.ReadString(48));//particle name //throw new System.NotImplementedException(); }
public override void ContinueParse(int npos, Oni.BinaryReader rawReader) { if (!m_lockFlag) { m_doorType = rawReader.ReadString(63); m_doorID = (short)BinaryDatReader.l_int16(rawReader.ReadBytes(2), 2); m_keyID = (short)BinaryDatReader.l_int16(rawReader.ReadBytes(2), 2); //Debug.Log(m_doorID + "|" + m_keyID); rawReader.Skip(2); m_pos.x = (float)BinaryDatReader.l_float(rawReader.ReadBytes(4).ReverseBytes(), 4); m_pos.y = (float)BinaryDatReader.l_float(rawReader.ReadBytes(4).ReverseBytes(), 4); m_pos.z = (float)BinaryDatReader.l_float(rawReader.ReadBytes(4).ReverseBytes(), 4); m_activationRadius = rawReader.ReadSingle(); m_doortex = rawReader.ReadString(63); Binary.DOOR l_doorClass = null; if ((l_doorClass = Round2.Generated.Binary.DOOR.PendDoorClass(m_doorType)) != null) { Door l_d = new GameObject().AddComponent <Door>(); l_d.m_proto = this; } } else { Debug.LogError("Attempt to reinitialize already locked object. Skipped."); } m_lockFlag = true; }
static System.Func <Round2.BinaryInitializable> InitializeLoader(int id, Oni.InstanceDescriptor ides, string resultTypeName) { try { if (ides.IsPlaceholder) { return(null); } Oni.BinaryReader reader = ides.OpenRead(); Oni.InstanceFile l_file = ides.File; //using () { List <byte> l_bytes = new List <byte>(System.BitConverter.GetBytes(ides.Index)); l_bytes.AddRange(System.BitConverter.GetBytes(-1));//re-define for current level usage //Oni.BinaryReader l_reader = null; l_bytes.AddRange(reader.ReadBytes(ides.DataSize)); System.Type l_t = typeof(Round2.BinaryInitializable).Assembly.GetType(resultTypeName);//add Round2.Generated.Binary. before typename! object l_res = System.Activator.CreateInstance(l_t); m_bytesUsed += l_bytes.Count; (l_res as Round2.BinaryInitializable).m_sourceFile = l_file; System.Func <Round2.BinaryInitializable> l_resultingLoader = () => { try { (l_res as Round2.BinaryInitializable).Convert(l_bytes.ToArray()); m_descriptors.Remove(ides); m_descriptors.Add(ides, () => l_res as Round2.BinaryInitializable); return(l_res as Round2.BinaryInitializable); } catch (System.Exception ee) { if (ee is System.IndexOutOfRangeException) { Debug.LogError("! bytes[" + l_bytes.Count + "]"); } throw; } }; m_descriptors.Add(ides, l_resultingLoader); return(l_resultingLoader); } reader.Dispose(); } catch (System.Exception ee) { Debug.Log("Exception at id : " + id + "\n" + ee.ToString() + "\n" + ee.InnerException); } return(null); }
public abstract void ContinueParse(int npos, Oni.BinaryReader rawReader);
private static Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM ParseOBJCMember(string objType, int npos, Oni.BinaryReader rawReader, int objID) { Round2.Generated.Binary.Namespaces.BINA.OBJC.Header l_objh = new Round2.Generated.Binary.Namespaces.BINA.OBJC.Header(); switch (objType) { case "DOOR": { Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM l_res = new Round2.Generated.Binary.Namespaces.BINA.OBJC.DOOR() { m_header = l_objh }; l_res.ContinueParse(npos, rawReader); return(l_res); } break; case "PART": { Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM l_res = new Round2.Generated.Binary.Namespaces.BINA.OBJC.PART() { m_header = l_objh }; l_res.ContinueParse(npos, rawReader); //Debug.Log(l_res.m_header.m_pos.x); return(l_res); } break; case "FURN": { //Debug.DrawLine(Vector3.up * 10, new Vector3(-l_objh.m_pos.x, l_objh.m_pos.y, l_objh.m_pos.z), Color.green, 15f); } break; default: Debug.LogWarning("[UNSUPPORTED TAG : " + objType + "]"); break; } return(null); }
static void ParseBINA(Round2.BinaryInitializable obj, Oni.InstanceDescriptor ides) { Round2.Generated.Binary.BINA l_bina = (Round2.Generated.Binary.BINA)obj; using (Oni.BinaryReader l_rawReader = ides.GetRawReader(l_bina.m_Offset_C)) { int l_tag = l_rawReader.ReadInt32(); switch ((Oni.Metadata.BinaryTag)l_tag) { case Oni.Metadata.BinaryTag.OBJC: { int l_size = l_rawReader.ReadInt32(); int l_version = l_rawReader.ReadInt32(); for (int l_nextSize = l_rawReader.ReadInt32(); l_nextSize != 0; l_nextSize = l_rawReader.ReadInt32()) { int l_npos = l_rawReader.Position + l_nextSize; //calculate next position string l_objType = (string)l_str(l_rawReader.ReadBytes(4).ReverseBytes(), 4); int l_objID = l_rawReader.ReadInt32(); int l_flags = l_rawReader.ReadInt32(); float l_xPos = l_rawReader.ReadSingle(); float l_yPos = l_rawReader.ReadSingle(); float l_zPos = l_rawReader.ReadSingle(); float l_xRot = l_rawReader.ReadSingle(); float l_yRot = l_rawReader.ReadSingle(); float l_zRot = l_rawReader.ReadSingle(); Round2.Generated.Binary.Namespaces.BINA.OBJC.OBJCM l_obj = ParseOBJCMember(l_objType, l_npos, l_rawReader, l_objID); if (l_obj != null) { l_obj.m_header.m_type = l_objType; l_obj.m_header.m_id = l_objID; l_obj.m_header.m_flags = l_flags; l_obj.m_header.m_pos = new Vector3(l_xPos, l_yPos, l_zPos); l_obj.m_header.m_rot = new Vector3(l_xRot, l_yRot, l_zRot); //TODO : casually refactor //TODO : replace plane with quad. Fix scale after if (l_obj is Round2.Generated.Binary.Namespaces.BINA.OBJC.PART) { (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_go.transform.position = new UnityEngine.Vector3(-l_obj.m_header.m_pos.x, l_obj.m_header.m_pos.y, l_obj.m_header.m_pos.z); (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_go.transform.eulerAngles = l_obj.m_header.m_rot; (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_go.transform.localScale = new UnityEngine.Vector3((l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_class.m_header.m_xScale / 5f, 1, (l_obj as Round2.Generated.Binary.Namespaces.BINA.OBJC.PART).m_class.m_header.m_yScale / 5f); Debug.DrawLine(Vector3.up * 10, new Vector3(-l_obj.m_header.m_pos.x, l_obj.m_header.m_pos.y, l_obj.m_header.m_pos.z), Color.green, 15f); } //Debug.LogWarning(l_nextSize + ":" + l_objType + ":" + ides.GetHashCode() + "{" + l_obj.m_header.m_pos + "}" + "[" + l_obj.m_header.m_rot + "]"); } l_rawReader.Position = l_npos; } } break; case Oni.Metadata.BinaryTag.PAR3: { int l_initPos = l_rawReader.Position; Round2.Generated.Binary.Namespaces.BINA.OBJC.PAR3.Header l_header = new Round2.Generated.Binary.Namespaces.BINA.OBJC.PAR3.Header(); int l_completeParticleLength = l_rawReader.ReadInt32(); l_rawReader.Skip(2); //skip length duplicate int l_version = l_rawReader.ReadInt16(); l_rawReader.ReadInt32(); //flags l_rawReader.ReadInt32(); //flags2 l_rawReader.ReadInt32(); //unused l_header.m_variableCount = l_rawReader.ReadInt16(); //amout of variables l_header.m_eventsCount = l_rawReader.ReadInt16(); //amount of events l_header.m_emittersCount = l_rawReader.ReadInt16(); //amount of emitters l_rawReader.ReadInt16(); //unknown //Debug.Log(l_header.m_eventsCount.ToString("X") + " : PAR3 : " + ides.Name); l_rawReader.Skip(16 * 4); //skip slots. currently, they aren't used l_rawReader.Position = l_initPos + 0x120 - 4; l_header.m_textureName = l_rawReader.ReadString(64); l_rawReader.Position = l_initPos + 0xB4 - 4; l_header.m_xScale = l_rawReader.ReadSingle(); l_rawReader.Position = l_initPos + 0xD0 - 4; l_header.m_yScale = l_rawReader.ReadSingle(); Round2.Generated.Binary.Namespaces.BINA.OBJC.PART.RegisterParticleClass(new Round2.Generated.Binary.Namespaces.BINA.OBJC.PAR3() { m_header = l_header }, ides.Name); //Debug.LogError(">>>" + l_header.m_textureName);//texture name here } break; default: Debug.LogWarning("Cannot handle this tag yet"); break; } } }