HighMap library (C++)
Loading...
Searching...
No Matches
virtual_array.hpp
Go to the documentation of this file.
1/* Copyright (c) 2025 Otto Link. Distributed under the terms of the GNU General
2 Public License. The full license is in the file LICENSE, distributed with
3 this software. */
4
10#pragma once
11#include <future>
12#include <thread>
13
14#include "macrologger.h"
15
16#include "highmap/array.hpp"
17#include "highmap/math.hpp"
20
21namespace hmap
22{
23
24// =====================================
25// Peripheric classes
26// =====================================
27
28enum ForEachMode : int
29{
30 VA_SEQUENTIAL, // tile-by-tile, single thread
31 VA_DISTRIBUTED, // tile-by-tile, multi-threaded
32 VA_SINGLE_ARRAY // full array materialized at once
33};
34
35inline std::string to_string(ForEachMode m)
36{
37 switch (m)
38 {
39 case ForEachMode::VA_SEQUENTIAL: return "VA_SEQUENTIAL";
40 case ForEachMode::VA_DISTRIBUTED: return "VA_DISTRIBUTED";
41 case ForEachMode::VA_SINGLE_ARRAY: return "VA_SINGLE_ARRAY";
42 }
43 return "UNKNOWN";
44}
45
46static std::map<std::string, int> for_each_mode_as_string = {
47 {"Distributed", ForEachMode::VA_DISTRIBUTED},
48 {"Sequential", ForEachMode::VA_SEQUENTIAL},
49 {"Single array", ForEachMode::VA_SINGLE_ARRAY}};
50
52{
54 bool trim_storage = false;
55};
56
57// =====================================
58// VirtualArray class
59// =====================================
60
62{
63 // --- Ctor...
64
65 VirtualArray() = default;
66
67 VirtualArray(glm::ivec2 shape,
68 glm::vec4 bbox, // (x1, x2, y1, y2)
69 glm::ivec2 tile_shape,
70 int halo,
71 std::unique_ptr<TileStorage> storage);
72
73 VirtualArray(glm::ivec2 shape,
74 glm::vec4 bbox,
75 glm::ivec2 tile_shape,
76 int halo,
77 StorageMode storage_mode = StorageMode::VA_RAM);
78
79 VirtualArray(glm::ivec2 shape,
80 glm::ivec2 tile_shape,
81 int halo,
82 StorageMode storage_mode = StorageMode::VA_RAM);
83
84 // --- Duplicate
85
86 std::unique_ptr<VirtualArray> clone(const ComputeMode &cm,
87 bool deep_copy = false);
88 void copy_from(VirtualArray &src,
89 const ComputeMode &cm,
90 bool copy_src_data = true);
91
92 // --- Access individual cells (slower)
93
94 float get(int global_i, int global_j) const;
95 float get_bilinear(float x, float y) const;
96 float get_nearest(float x, float y) const;
97 void set(int global_i, int global_j, float v);
98 glm::ivec2 get_max_tiles() const;
99 int get_ntiles() const;
100 std::string info_string(const ComputeMode &cm, int indent = 0) const;
101
102 void fill(float value, const ComputeMode &cm);
103 void from_array(const Array &array, const ComputeMode &cm);
104 Array to_array(const glm::ivec2 array_shape, const ComputeMode &cm) const;
105 Array to_array(const ComputeMode &cm) const;
106 Array to_array_dbg() const;
107
108 // --- Processing methods
109
110 float max(const ComputeMode &cm) const;
111 float mean(const ComputeMode &cm) const;
112 float min(const ComputeMode &cm) const;
113 float sum(const ComputeMode &cm) const;
114
115 void inverse(const ComputeMode &cm);
116 void remap(float vmin, float vmax, const ComputeMode &cm);
117 void remap(float vmin,
118 float vmax,
119 float from_min,
120 float from_max,
121 const ComputeMode &cm);
122
123 std::vector<float> unique_values(const ComputeMode &cm) const;
124
126
127 // Find which tile covers a given index
128 glm::vec2 tile_region_global_position(const TileRegion &region) const;
129 glm::ivec2 tile_region_global_indices(const TileRegion &region) const;
130 TileRegion tile_region_from_global_index(int global_i, int global_j) const;
131 TileRegion tile_region_from_tile_coords(int tile_x, int tile_y) const;
132 glm::ivec2 local_indices(const TileRegion &region,
133 int global_i,
134 int global_j) const;
135
136 void trim_storage();
137
138 // --- Members
139
140 glm::ivec2 shape;
141 glm::vec4 bbox; // (x1, x2, y1, y2)
142 glm::ivec2 tile_shape;
143 int halo;
144 std::unique_ptr<TileStorage> storage;
145};
146
147// actual implementation
149
150// functions
151void copy_data(VirtualArray &src, VirtualArray &dst, const ComputeMode &cm);
152
153} // namespace hmap
Declaration of the Array class for 2D floating-point arrays with various mathematical operations and ...
Array class, helper to manipulate 2D float array with "(i, j)" indexing.
Definition array.hpp:32
Provides core mathematical utilities for procedural generation, including trigonometry,...
Definition algebra.hpp:22
std::string to_string(StorageMode m)
Definition tile_storage.hpp:36
void copy_data(VirtualArray &src, VirtualArray &dst, const ComputeMode &cm)
Definition virtual_array.cpp:440
StorageMode
Definition tile_storage.hpp:29
@ VA_RAM
Definition tile_storage.hpp:30
ForEachMode
Definition virtual_array.hpp:29
@ VA_DISTRIBUTED
Definition virtual_array.hpp:31
@ VA_SEQUENTIAL
Definition virtual_array.hpp:30
@ VA_SINGLE_ARRAY
Definition virtual_array.hpp:32
Definition virtual_array.hpp:52
ForEachMode mode
Definition virtual_array.hpp:53
bool trim_storage
Definition virtual_array.hpp:54
Definition tile_region.hpp:38
Definition virtual_array.hpp:62
Array to_array_dbg() const
Definition virtual_array.cpp:422
glm::ivec2 local_indices(const TileRegion &region, int global_i, int global_j) const
Definition virtual_array.cpp:224
TileRegion tile_region_from_tile_coords(int tile_x, int tile_y) const
Definition virtual_array.cpp:329
int get_ntiles() const
Definition virtual_array.cpp:192
void inverse(const ComputeMode &cm)
Definition virtual_array_processing.cpp:17
int halo
Definition virtual_array.hpp:143
glm::ivec2 tile_shape
Definition virtual_array.hpp:142
TileRegion tile_region_from_global_index(int global_i, int global_j) const
Definition virtual_array.cpp:319
VirtualArray()=default
void copy_from(VirtualArray &src, const ComputeMode &cm, bool copy_src_data=true)
Definition virtual_array.cpp:52
void smooth_overlap_buffers()
Definition virtual_array.cpp:250
glm::vec4 bbox
Definition virtual_array.hpp:141
Array to_array(const glm::ivec2 array_shape, const ComputeMode &cm) const
Definition virtual_array.cpp:388
float min(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:55
void trim_storage()
Definition virtual_array.cpp:433
std::vector< float > unique_values(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:124
float max(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:32
float get(int global_i, int global_j) const
Definition virtual_array.cpp:129
void remap(float vmin, float vmax, const ComputeMode &cm)
Definition virtual_array_processing.cpp:72
void set(int global_i, int global_j, float v)
Definition virtual_array.cpp:241
glm::ivec2 shape
Definition virtual_array.hpp:140
std::unique_ptr< VirtualArray > clone(const ComputeMode &cm, bool deep_copy=false)
Definition virtual_array.cpp:68
void from_array(const Array &array, const ComputeMode &cm)
Definition virtual_array.cpp:97
std::unique_ptr< TileStorage > storage
Definition virtual_array.hpp:144
float mean(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:49
glm::ivec2 get_max_tiles() const
Definition virtual_array.cpp:140
glm::vec2 tile_region_global_position(const TileRegion &region) const
Definition virtual_array.cpp:370
float get_bilinear(float x, float y) const
Definition virtual_array.cpp:148
void fill(float value, const ComputeMode &cm)
Definition virtual_array.cpp:89
float get_nearest(float x, float y) const
Definition virtual_array.cpp:178
std::string info_string(const ComputeMode &cm, int indent=0) const
Definition virtual_array.cpp:198
float sum(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:93
glm::ivec2 tile_region_global_indices(const TileRegion &region) const
Definition virtual_array.cpp:380