示例#1
0
        // from TransportLine

        public static bool UpdateMeshData(ref TransportLine transportLine, ushort lineID)
        {
            //return transportLine.UpdateMeshData(lineID);
            bool             flag      = true;
            int              num       = 0;
            int              num2      = 0;
            int              num3      = 0;
            float            num4      = 0f;
            TransportManager instance  = Singleton <TransportManager> .instance;
            NetManager       instance2 = Singleton <NetManager> .instance;
            PathManager      instance3 = Singleton <PathManager> .instance;
            ushort           stops     = transportLine.m_stops;
            ushort           num5      = stops;
            int              num6      = 0;

            while (num5 != 0)
            {
                ushort num7 = 0;
                for (int i = 0; i < 8; i++)
                {
                    ushort segment = instance2.m_nodes.m_buffer[(int)num5].GetSegment(i);
                    if (segment != 0 && instance2.m_segments.m_buffer[(int)segment].m_startNode == num5)
                    {
                        uint path = instance2.m_segments.m_buffer[(int)segment].m_path;
                        if (path != 0u)
                        {
                            byte pathFindFlags = instance3.m_pathUnits.m_buffer[(int)((UIntPtr)path)].m_pathFindFlags;
                            if ((pathFindFlags & 4) != 0)
                            {
                                if (!TransportLine.CalculatePathSegmentCount(path, ref num2, ref num3, ref num4))
                                {
                                    TransportInfo info = transportLine.Info;
                                    BusTransportLineAI.StartPathFind(segment, ref instance2.m_segments.m_buffer[(int)segment], info.m_netService, info.m_vehicleType, (transportLine.m_flags & TransportLine.Flags.Temporary) != TransportLine.Flags.None);
                                    flag = false;
                                }
                            }
                            else if ((pathFindFlags & 8) == 0)
                            {
                                flag = false;
                            }
                        }
                        num7 = instance2.m_segments.m_buffer[(int)segment].m_endNode;
                        break;
                    }
                }
                num++;
                num2++;
                num5 = num7;
                if (num5 == stops)
                {
                    break;
                }
                if (!flag)
                {
                    break;
                }
                if (++num6 >= 32768)
                {
                    CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace);

                    break;
                }
            }
            if (!flag)
            {
                return(flag);
            }
            RenderGroup.MeshData meshData = new RenderGroup.MeshData();
            meshData.m_vertices  = new Vector3[num2 * 8];
            meshData.m_normals   = new Vector3[num2 * 8];
            meshData.m_tangents  = new Vector4[num2 * 8];
            meshData.m_uvs       = new Vector2[num2 * 8];
            meshData.m_uvs1      = new Vector2[num2 * 8];
            meshData.m_colors    = new Color32[num2 * 8];
            meshData.m_triangles = new int[num2 * 30];
            TransportManager.LineSegment[] array = new TransportManager.LineSegment[num];
            Bezier3[] array2      = new Bezier3[num3];
            int       num8        = 0;
            int       num9        = 0;
            int       num10       = 0;
            float     lengthScale = Mathf.Ceil(num4 / 64f) / num4;
            float     num11       = 0f;

            num5 = stops;
            Vector3 vector  = new Vector3(100000f, 100000f, 100000f);
            Vector3 vector2 = new Vector3(-100000f, -100000f, -100000f);

            num6 = 0;
            while (num5 != 0)
            {
                ushort num12 = 0;
                for (int j = 0; j < 8; j++)
                {
                    ushort segment2 = instance2.m_nodes.m_buffer[(int)num5].GetSegment(j);
                    if (segment2 != 0 && instance2.m_segments.m_buffer[(int)segment2].m_startNode == num5)
                    {
                        uint path2 = instance2.m_segments.m_buffer[(int)segment2].m_path;
                        if (path2 != 0u && (instance3.m_pathUnits.m_buffer[(int)((UIntPtr)path2)].m_pathFindFlags & 4) != 0)
                        {
                            array[num8].m_curveStart = num10;
                            Vector3 vector3;
                            Vector3 vector4;
                            TransportLine.FillPathSegments(path2, meshData, array2, ref num9, ref num10, ref num11, lengthScale, out vector3, out vector4);
                            vector  = Vector3.Min(vector, vector3);
                            vector2 = Vector3.Max(vector2, vector4);
                            array[num8].m_bounds.SetMinMax(vector3, vector4);
                            array[num8].m_curveEnd = num10;
                        }
                        num12 = instance2.m_segments.m_buffer[(int)segment2].m_endNode;
                        break;
                    }
                }
                TransportLine.FillPathNode(instance2.m_nodes.m_buffer[(int)num5].m_position, meshData, num9);
                num8++;
                num9++;
                num5 = num12;
                if (num5 == stops)
                {
                    break;
                }
                if (++num6 >= 32768)
                {
                    CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace);

                    break;
                }
            }
            while (!Monitor.TryEnter(instance.m_lineMeshData, SimulationManager.SYNCHRONIZE_TIMEOUT))
            {
            }
            try
            {
                instance.m_lineMeshData[(int)lineID] = meshData;
                instance.m_lineSegments[(int)lineID] = array;
                instance.m_lineCurves[(int)lineID]   = array2;
                transportLine.m_bounds.SetMinMax(vector, vector2);
            }
            finally
            {
                Monitor.Exit(instance.m_lineMeshData);
            }

            return(flag);
        }
        private static bool UpdateMeshDataImpl(ref TransportLine line, ushort lineID)
        {
            bool             flag      = true;
            int              length1   = 0;
            int              num1      = 0;
            int              length2   = 0;
            float            num2      = 0.0f;
            TransportManager instance1 = Singleton <TransportManager> .instance;
            NetManager       instance2 = Singleton <NetManager> .instance;
            PathManager      instance3 = Singleton <PathManager> .instance;
            ushort           stops     = line.m_stops;
            ushort           num3      = stops;
            int              num4      = 0;

            while ((int)num3 != 0)
            {
                ushort num5 = 0;
                for (int index = 0; index < 8; ++index)
                {
                    ushort segment = instance2.m_nodes.m_buffer[(int)num3].GetSegment(index);
                    if ((int)segment != 0 && (int)instance2.m_segments.m_buffer[(int)segment].m_startNode == (int)num3)
                    {
                        uint path = instance2.m_segments.m_buffer[(int)segment].m_path;
                        if ((int)path != 0)
                        {
                            byte pathFindFlags = instance3.m_pathUnits.m_buffer[(int)path].m_pathFindFlags;
                            if (((int)pathFindFlags & 4) != 0)
                            {
                                if (!TransportLine.CalculatePathSegmentCount(path, ref num1, ref length2, ref num2))
                                {
                                    TransportLineAI.StartPathFind(segment, ref instance2.m_segments.m_buffer[(int)segment], line.Info.m_netService, line.Info.m_vehicleType, (uint)(line.m_flags & TransportLine.Flags.Temporary) > 0U);
                                    flag = false;
                                }
                            }
                            else if (((int)pathFindFlags & 8) == 0)
                            {
                                flag = false;
                            }
                        }
                        num5 = instance2.m_segments.m_buffer[(int)segment].m_endNode;
                        break;
                    }
                }
                ++length1;
                ++num1;
                num3 = num5;
                if ((int)num3 != (int)stops && flag)
                {
                    if (++num4 >= 32768)
                    {
                        CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace);

                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            TransportLineMod._lineData[(int)lineID].Length = num2;
            if (!flag)
            {
                return(flag);
            }
            RenderGroup.MeshData meshData = new RenderGroup.MeshData();
            meshData.m_vertices  = new Vector3[num1 * 8];
            meshData.m_normals   = new Vector3[num1 * 8];
            meshData.m_tangents  = new Vector4[num1 * 8];
            meshData.m_uvs       = new Vector2[num1 * 8];
            meshData.m_uvs2      = new Vector2[num1 * 8];
            meshData.m_colors    = new Color32[num1 * 8];
            meshData.m_triangles = new int[num1 * 30];
            TransportManager.LineSegment[] lineSegmentArray = new TransportManager.LineSegment[length1];
            Bezier3[] bezier3Array = new Bezier3[length2];
            int       index1       = 0;
            int       num6         = 0;
            int       num7         = 0;
            float     num8         = Mathf.Ceil(num2 / 64f) / num2;
            float     num9         = 0.0f;
            ushort    num10        = stops;
            Vector3   vector3_1    = new Vector3(100000f, 100000f, 100000f);
            Vector3   vector3_2    = new Vector3(-100000f, -100000f, -100000f);
            int       num11        = 0;

            while ((int)num10 != 0)
            {
                ushort num5 = 0;
                for (int index2 = 0; index2 < 8; ++index2)
                {
                    ushort segment = instance2.m_nodes.m_buffer[(int)num10].GetSegment(index2);
                    if ((int)segment != 0 && (int)instance2.m_segments.m_buffer[(int)segment].m_startNode == (int)num10)
                    {
                        uint path = instance2.m_segments.m_buffer[(int)segment].m_path;
                        if ((int)path != 0 && ((int)instance3.m_pathUnits.m_buffer[(int)path].m_pathFindFlags & 4) != 0)
                        {
                            lineSegmentArray[index1].m_curveStart = num7;
                            Vector3 vector3_3;
                            Vector3 vector3_4;
                            TransportLine.FillPathSegments(path, meshData, bezier3Array, ref num6, ref num7, ref num9, num8, ref vector3_3, ref vector3_4);
                            vector3_1 = Vector3.Min(vector3_1, vector3_3);
                            vector3_2 = Vector3.Max(vector3_2, vector3_4);
                            lineSegmentArray[index1].m_bounds.SetMinMax(vector3_3, vector3_4);
                            lineSegmentArray[index1].m_curveEnd = num7;
                        }
                        num5 = instance2.m_segments.m_buffer[(int)segment].m_endNode;
                        break;
                    }
                }
                TransportLine.FillPathNode(instance2.m_nodes.m_buffer[(int)num10].m_position, meshData, num6);
                ++index1;
                ++num6;
                num10 = num5;
                if ((int)num10 != (int)stops)
                {
                    if (++num11 >= 32768)
                    {
                        CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace);

                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            do
            {
                ;
            }while (!Monitor.TryEnter((object)instance1.m_lineMeshData, SimulationManager.SYNCHRONIZE_TIMEOUT));
            try
            {
                instance1.m_lineMeshData[(int)lineID] = (RenderGroup.MeshData[])meshData;
                instance1.m_lineSegments[(int)lineID] = lineSegmentArray;
                instance1.m_lineCurves[(int)lineID]   = bezier3Array;
                line.m_bounds.SetMinMax(vector3_1, vector3_2);
            }
            finally
            {
                Monitor.Exit((object)instance1.m_lineMeshData);
            }
            return(flag);
        }