// 仮 private static void MakeBaseGeometry(Section section, LayerSubMesh sm, AltitudeLayer altitudeLayer) { sm.Clear(MeshParts.Verts | MeshParts.Tris); CellRect cellRect = new CellRect(section.botLeft.x, section.botLeft.z, 17, 17); cellRect.ClipInsideMap(section.map); float y = Altitudes.AltitudeFor(altitudeLayer); sm.verts.Capacity = cellRect.Area * 9; for (int i = cellRect.minX; i <= cellRect.maxX; i++) { for (int j = cellRect.minZ; j <= cellRect.maxZ; j++) { sm.verts.Add(new Vector3((float)i, y, (float)j)); sm.verts.Add(new Vector3((float)i, y, (float)j + 0.5f)); sm.verts.Add(new Vector3((float)i, y, (float)(j + 1))); sm.verts.Add(new Vector3((float)i + 0.5f, y, (float)(j + 1))); sm.verts.Add(new Vector3((float)(i + 1), y, (float)(j + 1))); sm.verts.Add(new Vector3((float)(i + 1), y, (float)j + 0.5f)); sm.verts.Add(new Vector3((float)(i + 1), y, (float)j)); sm.verts.Add(new Vector3((float)i + 0.5f, y, (float)j)); sm.verts.Add(new Vector3((float)i + 0.5f, y, (float)j + 0.5f)); } } int num = cellRect.Area * 8 * 3; sm.tris.Capacity = num; int num2 = 0; while (sm.tris.Count < num) { sm.tris.Add(num2 + 7); sm.tris.Add(num2); sm.tris.Add(num2 + 1); sm.tris.Add(num2 + 1); sm.tris.Add(num2 + 2); sm.tris.Add(num2 + 3); sm.tris.Add(num2 + 3); sm.tris.Add(num2 + 4); sm.tris.Add(num2 + 5); sm.tris.Add(num2 + 5); sm.tris.Add(num2 + 6); sm.tris.Add(num2 + 7); sm.tris.Add(num2 + 7); sm.tris.Add(num2 + 1); sm.tris.Add(num2 + 8); sm.tris.Add(num2 + 1); sm.tris.Add(num2 + 3); sm.tris.Add(num2 + 8); sm.tris.Add(num2 + 3); sm.tris.Add(num2 + 5); sm.tris.Add(num2 + 8); sm.tris.Add(num2 + 5); sm.tris.Add(num2 + 7); sm.tris.Add(num2 + 8); num2 += 9; } sm.FinalizeMesh(MeshParts.Verts | MeshParts.Tris); }
/// <summary> /// Обновить указанный слой посредством дополнения (небольшая нагрузка) /// </summary> /// <param name="layer">Слой</param> /// <param name="material">Материал для поиска подслоя</param> /// <param name="subMeshes">Список подслоев</param> /// <param name="b">Биом</param> public void UpdateLayer(WorldLayer layer, Material material, List <LayerSubMesh> subMeshes, BiomeDef b) { int subMeshIndex; LayerSubMesh subMesh = GetSubMesh(material, subMeshes, out subMeshIndex); List <int> tileIds = new List <int>(); List <Tile> tiles = Find.WorldGrid.tiles.Where(tile => tile.biome == b).ToList(); for (int i3 = 0; i3 < Find.WorldGrid.TilesCount; i3++) { Tile temp = Find.WorldGrid[i3]; if (tiles.Contains(temp)) { tileIds.Add(i3); } } World world = Find.World; WorldGrid grid = world.grid; List <int> tileIDToVerts_offsets = grid.tileIDToVerts_offsets; List <Vector3> verts = grid.verts; List <List <int> > triangleIndexToTileID = new List <List <int> >(); List <Vector3> elevationValues = new List <Vector3>(); triangleIndexToTileID.Clear(); subMesh.Clear(MeshParts.All); foreach (int tileID in tileIds) { int colorsAndUVsIndex = 0; Tile tile = tiles[tileID]; BiomeDef biome = tile.biome; while (subMeshIndex >= triangleIndexToTileID.Count) { triangleIndexToTileID.Add(new List <int>()); } int count = subMesh.verts.Count; int num = 0; int num2 = (tileID + 1 >= tileIDToVerts_offsets.Count) ? verts.Count : tileIDToVerts_offsets[tileID + 1]; for (int j = tileIDToVerts_offsets[tileID]; j < num2; j++) { subMesh.verts.Add(verts[j]); subMesh.uvs.Add(elevationValues[colorsAndUVsIndex]); colorsAndUVsIndex++; if (j < num2 - 2) { subMesh.tris.Add(count + num + 2); subMesh.tris.Add(count + num + 1); subMesh.tris.Add(count); triangleIndexToTileID[subMeshIndex].Add(tileID); } num++; } } FinalizeMesh(MeshParts.All, subMesh); }
public static bool ShouldDraw(SectionLayer __instance) { TerrainDef def = TerrainDef.Named("HardVacuum"); Map map = Find.CurrentMap; // if we aren't in space, abort! if (map.terrainGrid.TerrainAt(IntVec3.Zero).defName != def.defName) { return(true); } if (__instance.GetType().Name == "SectionLayer_SunShadows") { return(false); } if (__instance.GetType().Name == "SectionLayer_LightingOverlay") { oldSkyGlow = map.skyManager.CurSkyGlow; MatBases.LightOverlay.color = new Color(1.0f, 1.0f, 1.0f); map.skyManager.ForceSetCurSkyGlow(1.0f); } if (__instance.GetType().Name == "SectionLayer_Terrain") { float num = (float)UI.screenWidth / (float)UI.screenHeight; Vector3 center = Find.CameraDriver.GetComponent <Camera>().transform.position; float cellsHigh = UI.screenHeight / Find.CameraDriver.CellSizePixels; float cellsWide = cellsHigh * num; //recalculate uvs for planet texture. LayerSubMesh mesh = __instance.GetSubMesh(RenderPlanetBehindMap.PlanetMaterial); if (mesh != null) { mesh.Clear(MeshParts.UVs); for (int i = 0; i < mesh.verts.Count; i++) { float xdiff = mesh.verts[i].x - center.x; float xfromEdge = xdiff + cellsWide / 2f; float zdiff = mesh.verts[i].z - center.z; float zfromEdge = zdiff + cellsHigh / 2f; mesh.uvs.Add(new Vector3(xfromEdge / cellsWide, zfromEdge / cellsHigh, 0.0f)); } mesh.FinalizeMesh(MeshParts.UVs); } } return(true); }
/* * public override void DrawLayer() * { * if (!this.Visible) * { * return; * } * int count = this.subMeshes.Count; * for (int i = 0; i < count; i++) * { * LayerSubMesh layerSubMesh = this.subMeshes[i]; * Vector3 s = new Vector3(.28f, 1f, .28f); * Matrix4x4 matrix = default(Matrix4x4); * matrix.SetTRS(vector, Quaternion.AngleAxis(angle, Vector3.up), s); * if (layerSubMesh.finalized && !layerSubMesh.disabled) * { * Graphics.DrawMesh(layerSubMesh.mesh, Vector3.zero, Quaternion.identity, layerSubMesh.material, 0); * } * } * } */ // Token: 0x060047BA RID: 18362 RVA: 0x0021ADFC File Offset: 0x002191FC public override void Regenerate() { LayerSubMesh subMesh = base.GetSubMesh(AMXBMatBases.Hive); if (subMesh.mesh.vertexCount == 0) { SectionLayerGeometryMaker_Solid.MakeBaseGeometry(this.section, subMesh, AltitudeLayer.Terrain); } subMesh.Clear(MeshParts.Colors); MapComponent_HiveGrid _AvPHiveCreep = base.Map.GetComponent <MapComponent_HiveGrid>(); // Log.Message(string.Format(" 6 {0}", _AvPHiveCreep.DepthGridDirect_Unsafe)); float[] depthGridDirect_Unsafe = _AvPHiveCreep.DepthGridDirect_Unsafe; CellRect cellRect = this.section.CellRect; int num = base.Map.Size.z - 1; int num2 = base.Map.Size.x - 1; bool flag = false; CellIndices cellIndices = base.Map.cellIndices; for (int i = cellRect.minX; i <= cellRect.maxX; i++) { for (int j = cellRect.minZ; j <= cellRect.maxZ; j++) { float num3 = depthGridDirect_Unsafe[cellIndices.CellToIndex(i, j)]; int num4 = cellIndices.CellToIndex(i, j - 1); float num5 = (j <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i - 1, j - 1); float num6 = (j <= 0 || i <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i - 1, j); float num7 = (i <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i - 1, j + 1); float num8 = (j >= num || i <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i, j + 1); float num9 = (j >= num) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i + 1, j + 1); float num10 = (j >= num || i >= num2) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i + 1, j); float num11 = (i >= num2) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i + 1, j - 1); float num12 = (j <= 0 || i >= num2) ? num3 : depthGridDirect_Unsafe[num4]; this.vertDepth[0] = (num5 + num6 + num7 + num3) / 4f; this.vertDepth[1] = (num7 + num3) / 2f; this.vertDepth[2] = (num7 + num8 + num9 + num3) / 4f; this.vertDepth[3] = (num9 + num3) / 2f; this.vertDepth[4] = (num9 + num10 + num11 + num3) / 4f; this.vertDepth[5] = (num11 + num3) / 2f; this.vertDepth[6] = (num11 + num12 + num5 + num3) / 4f; this.vertDepth[7] = (num5 + num3) / 2f; this.vertDepth[8] = num3; for (int k = 0; k < 9; k++) { if (this.vertDepth[k] > 0.01f) { ; flag = true; } subMesh.colors.Add(SectionLayer_Hive.HiveDepthColor(this.vertDepth[k])); } } } if (flag) { subMesh.disabled = false; subMesh.FinalizeMesh(MeshParts.Colors); } else { subMesh.disabled = true; } }
private static void _Regenerate(this object obj) { if (!MatBases.SunShadow.shader.isSupported) { return; } Section section = obj.Section(); var sectionLayer = obj as SectionLayer; LayerSubMesh subMesh = sectionLayer.GetSubMesh(MatBases.IndoorMask); subMesh.Clear(MeshParts.All); Building[] innerArray = Find.EdificeGrid.InnerArray; CellRect cellRect = new CellRect( section.botLeft.x, section.botLeft.z, 17, 17); cellRect.ClipInsideMap(); subMesh.verts.Capacity = cellRect.Area * 2; subMesh.tris.Capacity = cellRect.Area * 4; float y = Altitudes.AltitudeFor(AltitudeLayer.MetaOverlays); for (int index1 = cellRect.minX; index1 <= cellRect.maxX; ++index1) { for (int index2 = cellRect.minZ; index2 <= cellRect.maxZ; ++index2) { IntVec3 c1 = new IntVec3(index1, 0, index2); if (!(bool)_HideRainPrimary.Invoke(obj, new System.Object[] { c1 })) { bool flag1 = c1.Roofed(); bool flag2 = false; if (flag1) { for (int index3 = 0; index3 < 8; ++index3) { IntVec3 c2 = c1 + GenAdj.AdjacentCells[index3]; if ( (c2.InBounds()) && (!(bool)_HideRainPrimary.Invoke(obj, new System.Object[] { c2 })) ) { flag2 = true; break; } } } if ( (!flag1) || (!flag2) ) { continue; } } Thing thing = innerArray[CellIndices.CellToIndex(index1, index2)]; float num = (thing == null) || (thing.def.passability != Traversability.Impassable) && ( (thing.def.thingClass != typeof(Building_Door)) || (!thing.def.thingClass.IsSubclassOf(typeof(Building_Door))) ) ? 0.16f : 0.0f; subMesh.verts.Add(new Vector3((float)index1 - num, y, (float)index2 - num)); subMesh.verts.Add(new Vector3((float)index1 - num, y, (float)(index2 + 1) + num)); subMesh.verts.Add(new Vector3((float)(index1 + 1) + num, y, (float)(index2 + 1) + num)); subMesh.verts.Add(new Vector3((float)(index1 + 1) + num, y, (float)index2 - num)); int count = subMesh.verts.Count; subMesh.tris.Add(count - 4); subMesh.tris.Add(count - 3); subMesh.tris.Add(count - 2); subMesh.tris.Add(count - 4); subMesh.tris.Add(count - 2); subMesh.tris.Add(count - 1); } } if (subMesh.verts.Count <= 0) { return; } subMesh.FinalizeMesh(MeshParts.Verts | MeshParts.Tris); }
public override void Regenerate() { LayerSubMesh subMesh = base.GetSubMesh(Verse.MatBases.Snow); // LayerSubMesh subMesh = base.GetSubMesh(MatBases.Frost); // for some reason the custom one was causing a huge memory issue and rendering in giant squares :( if (subMesh.mesh.vertexCount == 0) { // SectionLayerGeometryMaker_Solid.MakeBaseGeometry(this.section, subMesh, AltitudeLayer.MoteLow); SectionLayerGeometryMaker_Solid.MakeBaseGeometry(this.section, subMesh, AltitudeLayer.LayingPawn); //so frost forms over items/plants } subMesh.Clear(MeshParts.Colors); float[] depthGridDirect_Unsafe = base.Map.GetComponent <FrostGrid>().DepthGridDirect_Unsafe; CellRect cellRect = this.section.CellRect; int num = base.Map.Size.z - 1; int num2 = base.Map.Size.x - 1; bool flag = false; CellIndices cellIndices = base.Map.cellIndices; for (int i = cellRect.minX; i <= cellRect.maxX; i++) // this is what renders it all blobby, I think { for (int j = cellRect.minZ; j <= cellRect.maxZ; j++) { float num3 = depthGridDirect_Unsafe[cellIndices.CellToIndex(i, j)]; int num4 = cellIndices.CellToIndex(i, j - 1); float num5 = (j <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i - 1, j - 1); float num6 = (j <= 0 || i <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i - 1, j); float num7 = (i <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i - 1, j + 1); float num8 = (j >= num || i <= 0) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i, j + 1); float num9 = (j >= num) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i + 1, j + 1); float num10 = (j >= num || i >= num2) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i + 1, j); float num11 = (i >= num2) ? num3 : depthGridDirect_Unsafe[num4]; num4 = cellIndices.CellToIndex(i + 1, j - 1); float num12 = (j <= 0 || i >= num2) ? num3 : depthGridDirect_Unsafe[num4]; this.vertDepth[0] = (num5 + num6 + num7 + num3) / 4f; this.vertDepth[1] = (num7 + num3) / 2f; this.vertDepth[2] = (num7 + num8 + num9 + num3) / 4f; this.vertDepth[3] = (num9 + num3) / 2f; this.vertDepth[4] = (num9 + num10 + num11 + num3) / 4f; this.vertDepth[5] = (num11 + num3) / 2f; this.vertDepth[6] = (num11 + num12 + num5 + num3) / 4f; this.vertDepth[7] = (num5 + num3) / 2f; this.vertDepth[8] = num3; for (int k = 0; k < 9; k++) { if (this.vertDepth[k] > 0.01f) { flag = true; } subMesh.colors.Add(SectionLayer_Frost.FrostDepthColor(this.vertDepth[k])); } } } if (flag) { subMesh.disabled = false; subMesh.FinalizeMesh(MeshParts.Colors); } else { subMesh.disabled = true; } }