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/filters.hpp"
18#include "highmap/math.hpp"
21
22namespace hmap
23{
24
25// =====================================
26// Peripheric classes
27// =====================================
28
29enum ForEachMode : int
30{
31 VA_SEQUENTIAL, // tile-by-tile, single thread
32 VA_DISTRIBUTED, // tile-by-tile, multi-threaded
33 VA_SINGLE_ARRAY, // full array materialized at once
34 VA_SINGLE_ARRAY_DOWNSCALED // full array materialized at once
35};
36
37inline std::string to_string(ForEachMode m)
38{
39 switch (m)
40 {
41 case ForEachMode::VA_SEQUENTIAL: return "VA_SEQUENTIAL";
42 case ForEachMode::VA_DISTRIBUTED: return "VA_DISTRIBUTED";
43 case ForEachMode::VA_SINGLE_ARRAY: return "VA_SINGLE_ARRAY";
45 return "VA_SINGLE_ARRAY_DOWNSCALED";
46 }
47 return "UNKNOWN";
48}
49
50static std::map<std::string, int> for_each_mode_as_string = {
51 {"Distributed", ForEachMode::VA_DISTRIBUTED},
52 {"Sequential", ForEachMode::VA_SEQUENTIAL},
53 {"Single array", ForEachMode::VA_SINGLE_ARRAY},
54 {"Single array downscaled", ForEachMode::VA_SINGLE_ARRAY_DOWNSCALED}};
55
57{
59 bool trim_storage = false;
60 int stride = 1;
61 float k_cutoff = 1.f; // freq. cut-off ratio in ]0, 1]
62};
63
64// =====================================
65// VirtualArray class
66// =====================================
67
69{
70 // --- Ctor...
71
72 VirtualArray() = default;
73
74 VirtualArray(glm::ivec2 shape,
75 glm::vec4 bbox, // (x1, x2, y1, y2)
76 glm::ivec2 tile_shape,
77 int halo,
78 std::unique_ptr<TileStorage> storage);
79
80 VirtualArray(glm::ivec2 shape,
81 glm::vec4 bbox,
82 glm::ivec2 tile_shape,
83 int halo,
84 StorageMode storage_mode = StorageMode::VA_RAM);
85
86 VirtualArray(glm::ivec2 shape,
87 glm::ivec2 tile_shape,
88 int halo,
89 StorageMode storage_mode = StorageMode::VA_RAM);
90
91 // --- Duplicate
92
93 std::unique_ptr<VirtualArray> clone(const ComputeMode &cm,
94 bool deep_copy = false);
95 void copy_from(VirtualArray &src,
96 const ComputeMode &cm,
97 bool copy_src_data = true);
98
99 // --- Access individual cells (slower)
100
101 float get(int global_i, int global_j) const;
102 float get_bilinear(float x, float y) const;
103 float get_nearest(float x, float y) const;
104 void set(int global_i, int global_j, float v);
105 glm::ivec2 get_max_tiles() const;
106 int get_ntiles() const;
107 std::string info_string(const ComputeMode &cm, int indent = 0) const;
108
109 void fill(float value, const ComputeMode &cm);
110 void from_array(const Array &array, const ComputeMode &cm);
111 void from_array_bilinear(const Array &array, const ComputeMode &cm);
112 void from_array_bicubic(const Array &array, const ComputeMode &cm);
113 Array to_array(const glm::ivec2 &array_shape, const ComputeMode &cm) const;
114 Array to_array(const ComputeMode &cm) const;
115 Array to_array_dbg() const;
116
117 // --- Processing methods
118
119 float max(const ComputeMode &cm) const;
120 float mean(const ComputeMode &cm) const;
121 float min(const ComputeMode &cm) const;
122 float sum(const ComputeMode &cm) const;
123
124 void inverse(const ComputeMode &cm);
125 void remap(float vmin, float vmax, const ComputeMode &cm);
126 void remap(float vmin,
127 float vmax,
128 float from_min,
129 float from_max,
130 const ComputeMode &cm);
131
132 std::vector<float> unique_values(const ComputeMode &cm) const;
133
135
136 // Find which tile covers a given index
137 glm::vec2 tile_region_global_position(const TileRegion &region) const;
138 glm::ivec2 tile_region_global_indices(const TileRegion &region) const;
139 TileRegion tile_region_from_global_index(int global_i, int global_j) const;
140 TileRegion tile_region_from_tile_coords(int tile_x, int tile_y) const;
141 glm::ivec2 local_indices(const TileRegion &region,
142 int global_i,
143 int global_j) const;
144
145 void trim_storage() const;
146
147 // --- Members
148
149 glm::ivec2 shape;
150 glm::vec4 bbox; // (x1, x2, y1, y2)
151 glm::ivec2 tile_shape;
152 int halo;
153 std::unique_ptr<TileStorage> storage;
154};
155
156// actual implementation
158
159// functions
160void copy_data(VirtualArray &src, VirtualArray &dst, const ComputeMode &cm);
161
162} // 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
Header file for filter-related functions and classes.
Provides core mathematical utilities for procedural generation, including trigonometry,...
Definition algebra.hpp:23
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:526
StorageMode
Definition tile_storage.hpp:29
@ VA_RAM
Definition tile_storage.hpp:30
ForEachMode
Definition virtual_array.hpp:30
@ VA_SINGLE_ARRAY_DOWNSCALED
Definition virtual_array.hpp:34
@ VA_DISTRIBUTED
Definition virtual_array.hpp:32
@ VA_SEQUENTIAL
Definition virtual_array.hpp:31
@ VA_SINGLE_ARRAY
Definition virtual_array.hpp:33
Definition virtual_array.hpp:57
float k_cutoff
Definition virtual_array.hpp:61
int stride
Definition virtual_array.hpp:60
ForEachMode mode
Definition virtual_array.hpp:58
bool trim_storage
Definition virtual_array.hpp:59
Definition tile_region.hpp:38
Definition virtual_array.hpp:69
Array to_array_dbg() const
Definition virtual_array.cpp:508
glm::ivec2 local_indices(const TileRegion &region, int global_i, int global_j) const
Definition virtual_array.cpp:302
TileRegion tile_region_from_tile_coords(int tile_x, int tile_y) const
Definition virtual_array.cpp:407
int get_ntiles() const
Definition virtual_array.cpp:270
void inverse(const ComputeMode &cm)
Definition virtual_array_processing.cpp:17
int halo
Definition virtual_array.hpp:152
glm::ivec2 tile_shape
Definition virtual_array.hpp:151
TileRegion tile_region_from_global_index(int global_i, int global_j) const
Definition virtual_array.cpp:397
VirtualArray()=default
void copy_from(VirtualArray &src, const ComputeMode &cm, bool copy_src_data=true)
Definition virtual_array.cpp:51
void from_array_bilinear(const Array &array, const ComputeMode &cm)
Definition virtual_array.cpp:127
void smooth_overlap_buffers()
Definition virtual_array.cpp:328
void from_array_bicubic(const Array &array, const ComputeMode &cm)
Definition virtual_array.cpp:167
glm::vec4 bbox
Definition virtual_array.hpp:150
float min(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:57
std::vector< float > unique_values(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:128
Array to_array(const glm::ivec2 &array_shape, const ComputeMode &cm) const
Definition virtual_array.cpp:466
float max(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:32
void trim_storage() const
Definition virtual_array.cpp:519
float get(int global_i, int global_j) const
Definition virtual_array.cpp:207
void remap(float vmin, float vmax, const ComputeMode &cm)
Definition virtual_array_processing.cpp:76
void set(int global_i, int global_j, float v)
Definition virtual_array.cpp:319
glm::ivec2 shape
Definition virtual_array.hpp:149
std::unique_ptr< VirtualArray > clone(const ComputeMode &cm, bool deep_copy=false)
Definition virtual_array.cpp:67
void from_array(const Array &array, const ComputeMode &cm)
Definition virtual_array.cpp:96
std::unique_ptr< TileStorage > storage
Definition virtual_array.hpp:153
float mean(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:51
glm::ivec2 get_max_tiles() const
Definition virtual_array.cpp:218
glm::vec2 tile_region_global_position(const TileRegion &region) const
Definition virtual_array.cpp:448
float get_bilinear(float x, float y) const
Definition virtual_array.cpp:226
void fill(float value, const ComputeMode &cm)
Definition virtual_array.cpp:88
float get_nearest(float x, float y) const
Definition virtual_array.cpp:256
std::string info_string(const ComputeMode &cm, int indent=0) const
Definition virtual_array.cpp:276
float sum(const ComputeMode &cm) const
Definition virtual_array_processing.cpp:97
glm::ivec2 tile_region_global_indices(const TileRegion &region) const
Definition virtual_array.cpp:458