Exemple #1
0
    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);
    }
Exemple #2
0
 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);
     }
 }
Exemple #3
0
    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;
        }
    }
Exemple #4
0
    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();
    }
Exemple #5
0
    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();
    }
Exemple #6
0
 public DensityCell Dl(int delta_layer)
 {
     return(DensityCell.FromXZLayer(m_x, m_z, m_layer_idx + delta_layer));
 }
Exemple #7
0
 public DensityCell Dz(int delta_z)
 {
     return(DensityCell.FromXZLayer(m_x, m_z + delta_z, m_layer_idx));
 }