/* * public static bool CheckMeshEquivalence(SerializableVector3[] savedVertices, Vector3[] meshVertices) * { * // avoid NullRefException, suppose they are different * if (savedVertices == null || meshVertices == null) * return false; * * if (savedVertices.Length != meshVertices.Length) * return false; * for (int i = 0; i < savedVertices.Length; i++) * { * if (savedVertices[i].ToVector3() != meshVertices[i]) * return false; * } * // return true if everything is equivalent * return true; * } */ public static Dictionary <ProceduralObject, Vector3> ConstructSubBuildings(ProceduralObject obj, List <ProceduralObject> allObjects) { if (obj.baseInfoType != "BUILDING") { var d = new Dictionary <ProceduralObject, Vector3>(); d.Add(obj, Vector3.zero); return(d); } var dict = new Dictionary <ProceduralObject, Vector3>(); dict.Add(obj, Vector3.zero); var subs = obj._baseBuilding.m_subBuildings; for (int i = 0; i < subs.Length; i++) { if (subs[i] == null) { continue; } if (subs[i].m_buildingInfo == null) { continue; } ProceduralObject sub = new ProceduralObject(); sub.ConstructObject(subs[i].m_buildingInfo, allObjects.GetNextUnusedId()); float a = -(subs[i].m_angle * Mathf.Rad2Deg) % 360f; if (a < 0) { a += 360f; } sub.m_rotation.eulerAngles = new Vector3(sub.m_rotation.eulerAngles.x, a, sub.m_rotation.eulerAngles.z); sub.m_position = obj.m_position + subs[i].m_position; dict.Add(sub, subs[i].m_position); } return(dict); }
public static POGroup ConstructSubBuildings(ProceduralObject obj) { var logic = ProceduralObjectsLogic.instance; if (obj.baseInfoType != "BUILDING") { return(null); } var pos = new List <ProceduralObject>(); pos.Add(obj); // Sub buildings var subBuildings = obj._baseBuilding.m_subBuildings; if (subBuildings.Length >= 1) { for (int i = 0; i < subBuildings.Length; i++) { var subB = subBuildings[i]; if (subB == null) { continue; } if (subB.m_buildingInfo == null) { continue; } if (subB.m_buildingInfo.m_mesh == null) { continue; } if (!subB.m_buildingInfo.m_mesh.isReadable) { continue; } int id = 0; try { ProceduralObject sub = new ProceduralObject(); id = logic.proceduralObjects.GetNextUnusedId(); sub.ConstructObject(subB.m_buildingInfo, id); float a = -(subB.m_angle * Mathf.Rad2Deg) % 360f; if (a < 0) { a += 360f; } sub.m_rotation = Quaternion.Euler(sub.m_rotation.eulerAngles.x, a, sub.m_rotation.eulerAngles.z) * obj.m_rotation; sub.m_position = VertexUtils.RotatePointAroundPivot(subB.m_position + obj.m_position, obj.m_position, obj.m_rotation); pos.Add(sub); logic.proceduralObjects.Add(sub); } catch { if (id != 0) { if (logic.activeIds.Contains(id)) { logic.activeIds.Remove(id); } } } } } if (pos.Count < 2) { return(null); } var group = POGroup.MakeGroup(logic, pos, pos[0]); return(group); }