public bool TryGetDensityCellFromWorldPosition(Vector3 world_pos, out DensityCell density_cell) { var layer_idx = (int)(world_pos.y / m_cell_size_in_meters.y); if (layer_idx < 0 || layer_idx >= m_layers.Length) { density_cell = default; return(false); } var x = (int)(world_pos.x / (float)m_cell_size_in_meters.x); if (x < 0 || x >= m_dimensions_in_cells.x) { density_cell = default; return(false); } var z = (int)(world_pos.z / (float)m_cell_size_in_meters.z); if (z < 0 || z >= m_dimensions_in_cells.z) { density_cell = default; return(false); } ; density_cell = new DensityCell { m_x = x, m_layer_idx = layer_idx, m_z = z }; return(true); }
public bool TryGetDensity(DensityCell cell, out float density) { if (cell.IsInBounds(m_dimensions_in_cells)) { var cell_idx = cell.ToCellIdx(m_dimensions_in_cells); density = m_layers[cell.m_layer_idx][cell_idx]; return(true); } else { density = default; return(false); } }
void ShowCellFoldout(string cell_name, DensityCell cell, ref bool is_expanded, SolidSimulation solid_simulation, LiquidSimulation liquid_simulation) { if (is_expanded = EditorGUILayout.Foldout(is_expanded, cell_name)) { EditorGUI.indentLevel += 2; EditorGUILayout.LabelField($"x={cell.m_x}, z={cell.m_z}, l={cell.m_layer_idx}"); ShowCellLine("C", cell, solid_simulation, liquid_simulation); ShowCellLine("L", cell.Dx(-1), solid_simulation, liquid_simulation); ShowCellLine("R", cell.Dx(+1), solid_simulation, liquid_simulation); ShowCellLine("N", cell.Dz(-1), solid_simulation, liquid_simulation); ShowCellLine("F", cell.Dz(+1), solid_simulation, liquid_simulation); ShowCellLine("B", cell.Dl(-1), solid_simulation, liquid_simulation); ShowCellLine("A", cell.Dl(+1), solid_simulation, liquid_simulation); EditorGUI.indentLevel -= 2; } }
void ShowCellLine(string cell_name, DensityCell cell, SolidSimulation solid_simulation, LiquidSimulation liquid_simulation) { bool is_valid = solid_simulation.TryGetDensity(cell, out var solid_density); liquid_simulation.TryGetDensity(cell, out var liquid_density); string text = $"{cell_name}: sd={solid_density}, ld={liquid_density}"; EditorGUILayout.BeginHorizontal(); if (is_valid) { EditorGUILayout.LabelField(text); if (GUILayout.Button("->")) { CellDebugger.s_debug_cell = cell; } } else { EditorGUILayout.LabelField($"{cell_name}: INVALID"); } EditorGUILayout.EndHorizontal(); }
public void Update(List <DensityCell> dirty_density_cells, HashSet <Vector3Int> dirty_chunk_ids) { if (m_density_changes.Count <= 0) { return; } for (int layer_idx = 0; layer_idx < m_dimensions_in_cells.y; ++layer_idx) { var layer = m_layers[layer_idx]; foreach (var density_change in m_density_changes) { if (density_change.m_layer_idx != layer_idx) { continue; } int radius = 0; if (density_change.m_amount > 0) { radius = 1; } for (int range_offset_z = -radius; range_offset_z <= radius; ++range_offset_z) { for (int range_offset_x = -radius; range_offset_x <= radius; ++range_offset_x) { float amount_multiplier = 1f; bool is_center = range_offset_x == 0 && range_offset_z == 0; if (!is_center) { amount_multiplier = 0.5f; } var pos = density_change.m_position; var x = (int)(pos.x / (float)m_cell_size_in_meters.x) + range_offset_x; if (x < 0 || x >= m_dimensions_in_cells.x) { continue; } var z = (int)(pos.z / (float)m_cell_size_in_meters.z) + range_offset_z; if (z < 0 || z >= m_dimensions_in_cells.z) { continue; } var cell_idx = z * m_dimensions_in_cells.x + x; var previous_density = layer[cell_idx]; float amount = density_change.m_amount * amount_multiplier; if (amount > 0) { if (is_center) { amount = 1f; } else { amount = 0.5f; } } var new_density = Mathf.Clamp01(previous_density + amount); if (new_density != previous_density) { layer[cell_idx] = new_density; dirty_density_cells.Add(DensityCell.FromXZLayer(x, z, layer_idx)); for (int j = -2; j <= 2; ++j) { for (int i = -2; i <= 2; ++i) { var offset_x = Math.Min(Math.Max(x + i, 0), m_dimensions_in_cells.x - 1); var offset_z = Math.Min(Math.Max(z + j, 0), m_dimensions_in_cells.z - 1); var chunk_grid_x = (int)(offset_x * m_one_over_chunk_dimensions_in_cells); var chunk_grid_z = (int)(offset_z * m_one_over_chunk_dimensions_in_cells); dirty_chunk_ids.Add(new Vector3Int(chunk_grid_x, layer_idx, chunk_grid_z)); } } } } } } } m_density_changes.Clear(); }
public DensityCell Dl(int delta_layer) { return(DensityCell.FromXZLayer(m_x, m_z, m_layer_idx + delta_layer)); }
public DensityCell Dz(int delta_z) { return(DensityCell.FromXZLayer(m_x, m_z + delta_z, m_layer_idx)); }