Exemple #1
0
        /*
         * 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);
        }