Example #1
0
        /// <summary>
        /// Generates the lod mesh data.
        /// </summary>
        /// <param name="treeInfo">The tree information.</param>
        /// <returns>The mesh data.</returns>
        private static RenderGroup.MeshData GenerateLodMeshData(TreeInfo treeInfo)
        {
            // From game code at 2017-08-02.
            RenderGroup.VertexArrays vertexArrays = (RenderGroup.VertexArrays) 0;
            int vertexCount   = 0;
            int triangleCount = 0;
            int objectCount   = 0;

            TreeInstance.CalculateGroupData(ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays);
            RenderGroup.MeshData data1 = new RenderGroup.MeshData(vertexArrays, vertexCount, triangleCount);
            RenderGroup.MeshData data2 = new RenderGroup.MeshData(vertexArrays, vertexCount * 4, triangleCount * 4);
            RenderGroup.MeshData data3 = new RenderGroup.MeshData(vertexArrays, vertexCount * 8, triangleCount * 8);
            RenderGroup.MeshData data4 = new RenderGroup.MeshData(vertexArrays, vertexCount * 16, triangleCount * 16);
            Vector3 zero1               = Vector3.zero;
            Vector3 zero2               = Vector3.zero;
            float   maxRenderDistance   = 0.0f;
            float   maxInstanceDistance = 0.0f;
            //int vertexIndex1 = 0;
            //int triangleIndex1 = 0;
            //for (int index = 0; index < 1; ++index)
            //    TreeInstance.PopulateGroupData(treeInfo, new Vector3(0.0f, 0.0f, (float)index), 1f, 1f, ref vertexIndex1, ref triangleIndex1, Vector3.zero, data1, ref zero1, ref zero2, ref maxRenderDistance, ref maxInstanceDistance);
            //int vertexIndex2 = 0;
            //int triangleIndex2 = 0;
            //for (int index = 0; index < 4; ++index)
            //    TreeInstance.PopulateGroupData(treeInfo, new Vector3(0.0f, 0.0f, (float)index), 1f, 1f, ref vertexIndex2, ref triangleIndex2, Vector3.zero, data2, ref zero1, ref zero2, ref maxRenderDistance, ref maxInstanceDistance);
            //int vertexIndex3 = 0;
            //int triangleIndex3 = 0;
            //for (int index = 0; index < 8; ++index)
            //    TreeInstance.PopulateGroupData(treeInfo, new Vector3(0.0f, 0.0f, (float)index), 1f, 1f, ref vertexIndex3, ref triangleIndex3, Vector3.zero, data3, ref zero1, ref zero2, ref maxRenderDistance, ref maxInstanceDistance);
            int vertexIndex4   = 0;
            int triangleIndex4 = 0;

            for (int index = 0; index < 16; ++index)
            {
                TreeInstance.PopulateGroupData(treeInfo, new Vector3(0.0f, 0.0f, (float)index), 1f, 1f, ref vertexIndex4, ref triangleIndex4, Vector3.zero, data4, ref zero1, ref zero2, ref maxRenderDistance, ref maxInstanceDistance);
            }

            return(data4);
        }
Example #2
0
 // NetSegment
 public static bool CalculateArrowGroupData(ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
 {
     vertexCount   += 4;
     triangleCount += 6;
     objectCount++;
     vertexArrays |= RenderGroup.VertexArrays.Vertices | RenderGroup.VertexArrays.Normals | RenderGroup.VertexArrays.Uvs;
     return(true);
 }
Example #3
0
        public static void PopulateGroupData(NetInfo info, NetInfo.Segment segmentInfo, Matrix4x4 leftMatrix, Matrix4x4 rightMatrix, Vector4 meshScale, Vector4 objectIndex,
                                             ref int vertexIndex, ref int triangleIndex, Vector3 groupPosition, RenderGroup.MeshData meshData, ref bool requireSurfaceMaps)
        {
            if (segmentInfo.m_requireSurfaceMaps)
            {
                requireSurfaceMaps = true;
            }
            RenderGroup.MeshData meshData2 = segmentInfo.m_combinedLod.m_key.m_mesh.m_data;
            int[] triangles = meshData2.m_triangles;
            int   num       = triangles.Length;

            for (int i = 0; i < num; i++)
            {
                meshData.m_triangles[triangleIndex++] = triangles[i] + vertexIndex;
            }
            RenderGroup.VertexArrays vertexArrays = meshData2.VertexArrayMask();
            Vector3[] vertices = meshData2.m_vertices;
            Vector3[] normals  = meshData2.m_normals;
            Vector4[] tangents = meshData2.m_tangents;
            Vector2[] uvs      = meshData2.m_uvs;
            Vector2[] uvs2     = meshData2.m_uvs3;
            Color32[] colors   = meshData2.m_colors;
            int       num2     = vertices.Length;
            Vector2   vector   = new Vector2(objectIndex.x, objectIndex.y);
            Vector2   vector2  = new Vector2(objectIndex.z, objectIndex.w);

            for (int i = 0; i < num2; i++)
            {
                Vector3 vertex = vertices[i];
                vertex.x = vertex.x * meshScale.x + 0.5f;
                vertex.z = vertex.z * meshScale.y + 0.5f;
                Vector4   vector4  = new Vector4(vertex.z, 1f - vertex.z, 3f * vertex.z, 0f - vertex.z);
                Vector4   vector5  = new Vector4(vector4.y * vector4.y * vector4.y, vector4.z * vector4.y * vector4.y, vector4.z * vector4.x * vector4.y, vector4.x * vector4.x * vector4.x);
                Vector4   vector6  = new Vector4(vector4.y * (-1f - vector4.w) * 3f, vector4.y * (1f - vector4.z) * 3f, vector4.x * (2f - vector4.z) * 3f, vector4.x * (0f - vector4.w) * 3f);
                Vector4   vector7  = leftMatrix * vector5;
                Vector4   vector8  = vector7 + (rightMatrix * vector5 - vector7) * vertex.x;
                Vector4   vector9  = leftMatrix * vector6;
                Vector3   vector10 = Vector3.Normalize(vector9 + (rightMatrix * vector6 - vector9) * vertex.x);
                Vector3   vector11 = Vector3.Normalize(new Vector3(vector10.z, 0f, 0f - vector10.x));
                Matrix4x4 matrix4x = default(Matrix4x4);
                matrix4x.SetColumn(0, vector11);
                matrix4x.SetColumn(1, Vector3.Cross(vector10, vector11));
                matrix4x.SetColumn(2, vector10);
                if (segmentInfo.m_requireHeightMap)
                {
                    vector8.y = Singleton <TerrainManager> .instance.SampleDetailHeight((Vector3)vector8 + groupPosition);
                }
                meshData.m_vertices[vertexIndex] = new Vector3(vector8.x, vector8.y + vertex.y, vector8.z);
                if ((vertexArrays & RenderGroup.VertexArrays.Normals) != 0)
                {
                    meshData.m_normals[vertexIndex] = matrix4x.MultiplyVector(normals[i]);
                }
                else
                {
                    meshData.m_normals[vertexIndex] = new Vector3(0f, 1f, 0f);
                }
                if ((vertexArrays & RenderGroup.VertexArrays.Tangents) != 0)
                {
                    Vector4 vector12 = tangents[i];
                    Vector3 vector13 = matrix4x.MultiplyVector(vector12);
                    vector12.x = vector13.x;
                    vector12.y = vector13.y;
                    vector12.z = vector13.z;
                    meshData.m_tangents[vertexIndex] = vector12;
                }
                else
                {
                    meshData.m_tangents[vertexIndex] = new Vector4(1f, 0f, 0f, 1f);
                }
                Color32 color = (((vertexArrays & RenderGroup.VertexArrays.Colors) == 0) ? new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue) : colors[i]);
                if ((vertexArrays & RenderGroup.VertexArrays.Uvs) != 0)
                {
                    Vector2 vector14 = uvs[i];
                    vector14.y = Mathf.Lerp(vector14.y, vector8.w, (float)(int)color.g * 0.003921569f);
                    meshData.m_uvs[vertexIndex] = vector14;
                }
                else
                {
                    Vector2 vector15 = default(Vector2);
                    vector15.y = Mathf.Lerp(vector15.y, vector8.w, (float)(int)color.g * 0.003921569f);
                    meshData.m_uvs[vertexIndex] = vector15;
                }
                meshData.m_colors[vertexIndex] = info.m_netAI.GetGroupVertexColor(segmentInfo, i);
                meshData.m_uvs2[vertexIndex]   = vector;
                meshData.m_uvs4[vertexIndex]   = vector2;
                if ((vertexArrays & RenderGroup.VertexArrays.Uvs3) != 0)
                {
                    meshData.m_uvs3[vertexIndex] = uvs2[i];
                }
                vertexIndex++;
            }
        }
Example #4
0
 public static void CalculateGroupData(NetInfo.Segment segmentInfo, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
 {
     RenderGroup.MeshData meshData = segmentInfo.m_combinedLod.m_key.m_mesh.m_data;
     vertexCount   += meshData.m_vertices.Length;
     triangleCount += meshData.m_triangles.Length;
     objectCount++;
     vertexArrays |= meshData.VertexArrayMask() | RenderGroup.VertexArrays.Colors | RenderGroup.VertexArrays.Uvs2 | RenderGroup.VertexArrays.Uvs4;
 }
Example #5
0
        public bool CalculateGroupData(ushort segmentID, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
        {
            bool    result   = false;
            bool    hasProps = false;
            NetInfo info     = Info;

            if (m_problems != Notification.Problem.None && layer == Singleton <NotificationManager> .instance.m_notificationLayer && Notification.CalculateGroupData(ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
            {
                result = true;
            }
            if (info.m_hasForwardVehicleLanes != info.m_hasBackwardVehicleLanes && layer == Singleton <NetManager> .instance.m_arrowLayer && CalculateArrowGroupData(ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
            {
                result = true;
            }
            if (info.m_lanes != null)
            {
                bool          invert;
                NetNode.Flags flags;
                NetNode.Flags flags2;
                if ((m_flags & Flags.Invert) != 0)
                {
                    invert = true;
                    m_endNode.ToNode().Info.m_netAI.GetNodeFlags(m_endNode, ref m_endNode.ToNode(), segmentID, ref this, out flags);
                    m_startNode.ToNode().Info.m_netAI.GetNodeFlags(m_startNode, ref m_startNode.ToNode(), segmentID, ref this, out flags2);
                }
                else
                {
                    invert = false;
                    m_startNode.ToNode().Info.m_netAI.GetNodeFlags(m_startNode, ref m_startNode.ToNode(), segmentID, ref this, out flags);
                    m_endNode.ToNode().Info.m_netAI.GetNodeFlags(m_endNode, ref m_endNode.ToNode(), segmentID, ref this, out flags2);
                }
                bool destroyed = (m_flags & Flags.Collapsed) != 0;
                uint laneID    = m_lanes;
                for (int i = 0; i < info.m_lanes.Length; i++)
                {
                    if (laneID == 0)
                    {
                        break;
                    }
                    if (laneID.ToLane().CalculateGroupData(laneID, info.m_lanes[i], destroyed, flags, flags2, invert, layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays, ref hasProps))
                    {
                        result = true;
                    }
                    laneID = laneID.ToLane().m_nextLane;
                }
            }
            if ((info.m_netLayers & (1 << layer)) != 0)
            {
                bool hasSegments = !info.m_segments.IsNullorEmpty();
                if (hasSegments || hasProps)
                {
                    result = true;
                    if (hasSegments)
                    {
                        for (int i = 0; i < info.m_segments.Length; i++)
                        {
                            NetInfo.Segment segmentInfo = info.m_segments[i];
                            if (segmentInfo.m_layer == layer && segmentInfo.CheckFlags(m_flags, out _) && segmentInfo.m_combinedLod != null)
                            {
                                CalculateGroupData(segmentInfo, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays);
                            }
                        }
                    }
                }
            }
            return(result);
        }
Example #6
0
        public static void AfterCalculateGroupData(BuildingManager __instance, int groupX, int groupZ, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays, ref bool __result)
        {
            if (LoadingManager.instance.m_currentlyLoading)
            {
                return;
            }

            if (WriteTheSignsMod.Controller?.BuildingPropsSingleton == null)
            {
                return;
            }

            int num  = groupX * 270 / 45;
            int num2 = groupZ * 270 / 45;
            int num3 = (groupX + 1) * 270 / 45 - 1;
            int num4 = (groupZ + 1) * 270 / 45 - 1;

            for (int i = num2; i <= num4; i++)
            {
                for (int j = num; j <= num3; j++)
                {
                    int    num5 = i * 270 + j;
                    ushort num6 = __instance.m_buildingGrid[num5];
                    int    num7 = 0;
                    while (num6 != 0)
                    {
                        if (WriteTheSignsMod.Controller.BuildingPropsSingleton.CalculateGroupData(num6, layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
                        {
                            __result = true;
                        }
                        num6 = __instance.m_buildings.m_buffer[num6].m_nextGridBuilding;
                        if (++num7 >= 49152)
                        {
                            CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace);

                            break;
                        }
                    }
                }
            }
        }
 public bool CalculateGroupData(ushort buildingID, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
 {
     // LogUtils.DoLog("Building: CalculateGroupData {0}", buildingID);
     if (Data.BoardsContainers[buildingID, 0, 0] == null)
     {
         return(false);
     }
     bool         result   = false;
     ref Building building = ref BuildingManager.instance.m_buildings.m_buffer[buildingID];
Example #8
0
        public override bool CalculateGroupData(int groupX, int groupZ, int layer, ref int vertexCount,
                                                ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
        {
            bool flag = false;
            int  num1 = groupX * 270 / 45;
            int  num2 = groupZ * 270 / 45;
            int  num3 = (groupX + 1) * 270 / 45 - 1;
            int  num4 = (groupZ + 1) * 270 / 45 - 1;

            for (int index1 = num2; index1 <= num4; ++index1)
            {
                for (int index2 = num1; index2 <= num3; ++index2)
                {
                    ushort buildingID = this.m_buildingGrid[index1 * 270 + index2];
                    int    num5       = 0;
                    while ((int)buildingID != 0)
                    {
                        //add null check
                        //begin mod
                        if (this.m_buildings.m_buffer[(int)buildingID].Info != null)
                        {
                            if (this.m_buildings.m_buffer[(int)buildingID].CalculateGroupData(buildingID, layer,
                                                                                              ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
                            {
                                flag = true;
                            }
                        }
                        //end mod
                        buildingID = this.m_buildings.m_buffer[(int)buildingID].m_nextGridBuilding;
                        if (++num5 >= 49152)
                        {
                            CODebugBase <LogChannel> .Error(LogChannel.Core,
                                                            "Invalid list detected!\n" + System.Environment.StackTrace);

                            break;
                        }
                    }
                }
            }
            return(flag);
        }
Example #9
0
        public override bool CalculateGroupData(int groupX, int groupZ, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
        {
            bool      result          = false;
            const int resolutionRatio = NODEGRID_RESOLUTION / RenderManager.GROUP_RESOLUTION; // = 270/45 = 6
            int       net_x0          = groupX * resolutionRatio;
            int       net_z0          = groupZ * resolutionRatio;
            int       net_x1          = (groupX + 1) * resolutionRatio - 1;
            int       net_z1          = (groupZ + 1) * resolutionRatio - 1;

            for (int net_z = net_z0; net_z <= net_z1; net_z++)
            {
                for (int net_x = net_x0; net_x <= net_x1; net_x++)
                {
                    ushort nodeID   = m_nodeGrid[net_z * NODEGRID_RESOLUTION + net_x];
                    int    watchdog = 0;
                    while (nodeID != 0)
                    {
                        if (nodeID.ToNode().CalculateGroupData(nodeID, layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
                        {
                            result = true;
                        }
                        nodeID = nodeID.ToNode().m_nextGridNode;
                        if (++watchdog >= 32768)
                        {
                            CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace);

                            break;
                        }
                    }
                }
            }
            for (int net_z = net_z0; net_z <= net_z1; net_z++)
            {
                for (int net_x = net_x0; net_x <= net_x1; net_x++)
                {
                    ushort segmentID = m_segmentGrid[net_z * 270 + net_x];
                    int    watchdog  = 0;
                    while (segmentID != 0)
                    {
                        if (segmentID.ToSegment().CalculateGroupData(segmentID, layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
                        {
                            result = true;
                        }
                        segmentID = segmentID.ToSegment().m_nextGridSegment;
                        if (++watchdog >= 36864)
                        {
                            CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace);

                            break;
                        }
                    }
                }
            }
            return(result);
        }
		private static bool CalculateGroupData(TreeManager tm, int groupX, int groupZ, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
		{
			unsafe
			{
				bool flag = false;
				if (layer != tm.m_treeLayer)
				{
					return flag;
				}
				int num = groupX * 540 / 45;
				int num1 = groupZ * 540 / 45;
				int num2 = (groupX + 1) * 540 / 45 - 1;
				int num3 = (groupZ + 1) * 540 / 45 - 1;
				for (int i = num1; i <= num3; i++)
				{
					for (int j = num; j <= num2; j++)
					{
						uint mTreeGrid = tm.m_treeGrid[i * 540 + j];
						int num4 = 0;
						while (mTreeGrid != 0)
						{
							if (tm.m_trees.m_buffer[mTreeGrid].CalculateGroupData(mTreeGrid, layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
							{
								flag = true;
							}
							mTreeGrid = tm.m_trees.m_buffer[mTreeGrid].m_nextGridTree;
							int num5 = num4 + 1;
							num4 = num5;
							if (num5 < LimitTreeManager.Helper.TreeLimit)
							{
								continue;
							}
							CODebugBase<LogChannel>.Error(LogChannel.Core, string.Concat("Invalid list detected!\n", Environment.StackTrace));
							break;
						}
					}
				}
				return flag;
			}
		}
Example #11
0
        internal bool CalculateGroupData(ushort nodeID, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
        {
            var result = false;

            for (int y = 0; y < Data.BoardsContainers.GetLength(1); y++)
            {
                for (int z = 0; z < Data.BoardsContainers.GetLength(2); z++)
                {
                    ref CacheRoadNodeItem item = ref Data.BoardsContainers[nodeID, y, z];
                    if (item?.m_renderPlate ?? false)
                    {
                        ref BoardInstanceRoadNodeXml targetDescriptor = ref item.m_currentDescriptor;
                        if (targetDescriptor?.Descriptor?.PropName == null)
                        {
                            continue;
                        }

                        WTSDynamicTextRenderingRules.GetColorForRule(nodeID, y, z, targetDescriptor.Descriptor, targetDescriptor, out bool rendered);
                        if (rendered && !(item.m_currentDescriptor.Descriptor?.CachedProp is null))
                        {
                            result = PropInstance.CalculateGroupData(item.m_currentDescriptor.Descriptor.CachedProp, layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays);
                        }
                    }
                }
Example #12
0
        public static bool CalculateGroupData(PropInfo info, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
        {
            //added null check
            //begin mod
            if (info == null)
            {
                return(false);
            }
            //end mod
            if (info.m_prefabDataLayer == layer)
            {
                return(true);
            }
            if (info.m_effectLayer != layer)
            {
                return(false);
            }
            bool flag = false;

            for (int index = 0; index < info.m_effects.Length; ++index)
            {
                if (info.m_effects[index].m_effect.CalculateGroupData(layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
                {
                    flag = true;
                }
            }
            return(flag);
        }
Example #13
0
        public override bool CalculateGroupData(int groupX, int groupZ, int layer, ref int vertexCount, ref int triangleCount, ref int objectCount, ref RenderGroup.VertexArrays vertexArrays)
        {
            bool flag = false;
            int  num1 = groupX * 270 / 45;
            int  num2 = groupZ * 270 / 45;
            int  num3 = (groupX + 1) * 270 / 45 - 1;
            int  num4 = (groupZ + 1) * 270 / 45 - 1;

            for (int index1 = num2; index1 <= num4; ++index1)
            {
                for (int index2 = num1; index2 <= num3; ++index2)
                {
                    ushort nodeID = this.m_nodeGrid[index1 * 270 + index2];
                    int    num5   = 0;
                    while ((int)nodeID != 0)
                    {
                        //swallow exceptions
                        //begin mod
                        try
                        {
                            if (this.m_nodes.m_buffer[(int)nodeID].CalculateGroupData(nodeID, layer, ref vertexCount,
                                                                                      ref triangleCount, ref objectCount, ref vertexArrays))
                            {
                                flag = true;
                            }
                        }
                        catch
                        {
                            //swallow
                        }
                        //end mod
                        nodeID = this.m_nodes.m_buffer[(int)nodeID].m_nextGridNode;
                        if (++num5 >= 32768)
                        {
                            CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace);

                            break;
                        }
                    }
                }
            }
            for (int index1 = num2; index1 <= num4; ++index1)
            {
                for (int index2 = num1; index2 <= num3; ++index2)
                {
                    ushort segmentID = this.m_segmentGrid[index1 * 270 + index2];
                    int    num5      = 0;
                    while ((int)segmentID != 0)
                    {
                        //swallow exceptions
                        //begin mod
                        try
                        {
                            if (this.m_segments.m_buffer[(int)segmentID].CalculateGroupData(segmentID, layer, ref vertexCount, ref triangleCount, ref objectCount, ref vertexArrays))
                            {
                                flag = true;
                            }
                        }
                        catch
                        {
                            //swallow
                        }
                        //end mod
                        segmentID = this.m_segments.m_buffer[(int)segmentID].m_nextGridSegment;
                        if (++num5 >= 36864)
                        {
                            CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace);

                            break;
                        }
                    }
                }
            }
            return(flag);
        }