/
GeekNerd
/
ServerModelingProject
Обзор
Документация
Войти
/
GeekNerd
/
ServerModelingProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/OptimizationLogic/View/HeatMapRenderer.cs
115 строк
4 KB
Gorney-Alex
Init
30 май 2026, 19:05
30 май 2026, 19:05
3cdcc49
Код
Авторство
О чём код?
using System.Collections.Generic; using DataClasses; using DataClasses.Algorithm; using UnityEngine; namespace OptimizationLogic.View { [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public sealed class HeatMapRenderer : MonoBehaviour { [SerializeField] private Material heatMapMaterial; [Header("Threshold Colors")] [SerializeField] private Color coldColor = new Color32(0x21, 0x96, 0xF3, 0xFF); // #2196F3 [SerializeField] private Color normalColor = new Color32(0x4C, 0xAF, 0x50, 0xFF); // #4CAF50 [SerializeField] private Color warnColor = new Color32(0xFF, 0xC1, 0x07, 0xFF); // #FFC107 [SerializeField] private Color criticalColor = new Color32(0xF4, 0x43, 0x36, 0xFF); // #F44336 private MeshFilter _mf; private MeshRenderer _mr; private Mesh _mesh; private void Awake() { _mf = GetComponent<MeshFilter>(); _mr = GetComponent<MeshRenderer>(); _mesh = new Mesh { name = "HeatMap" }; _mesh.MarkDynamic(); _mf.sharedMesh = _mesh; if (heatMapMaterial != null) _mr.sharedMaterial = heatMapMaterial; } public void Clear() { if (_mesh != null) _mesh.Clear(); } public void Render( RoomConfig room, IReadOnlyList<PlacementZone> zones, IReadOnlyDictionary<int, float> zoneTemperatures) { Clear(); if (room == null || zones == null || zoneTemperatures == null) return; float step = room.GridStep > 0f ? room.GridStep : 0.6f; float half = step * 0.5f; float tsupply = room.SupplyTemp; float tlimit = room.TempLimit > 0f ? room.TempLimit : 27f; var vertices = new List<Vector3>(4096); var colors = new List<Color>(4096); var triangles = new List<int>(6144); for (int z = 0; z < zones.Count; z++) { PlacementZone zone = zones[z]; if (!zoneTemperatures.TryGetValue(zone.ZoneId, out float t)) continue; Color c = TemperatureToColor(t, tsupply, tlimit); List<Vector2> cells = zone.CandidatePositions; if (cells == null || cells.Count == 0) continue; for (int i = 0; i < cells.Count; i++) { Vector2 p = cells[i]; int baseIndex = vertices.Count; vertices.Add(new Vector3(p.x - half, 0.01f, p.y - half)); vertices.Add(new Vector3(p.x - half, 0.01f, p.y + half)); vertices.Add(new Vector3(p.x + half, 0.01f, p.y + half)); vertices.Add(new Vector3(p.x + half, 0.01f, p.y - half)); colors.Add(c); colors.Add(c); colors.Add(c); colors.Add(c); triangles.Add(baseIndex + 0); triangles.Add(baseIndex + 1); triangles.Add(baseIndex + 2); triangles.Add(baseIndex + 0); triangles.Add(baseIndex + 2); triangles.Add(baseIndex + 3); } } _mesh.SetVertices(vertices); _mesh.SetTriangles(triangles, 0); _mesh.SetColors(colors); _mesh.RecalculateNormals(); if (heatMapMaterial != null) _mr.sharedMaterial = heatMapMaterial; else Debug.LogWarning("[HeatMapRenderer] heatMapMaterial is not assigned (vertex colors may not be visible). "); } private Color TemperatureToColor(float t, float tsupply, float tlimit) { if (t < tsupply + 3f) return coldColor; if (t <= tlimit) return normalColor; if (t <= tlimit + 5f) return warnColor; return criticalColor; } } }