/// <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); }
// 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); }
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++; } }
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; }
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); }
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];
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); }
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; } }
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); } } }
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); }
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); }