OpenVDB 13.1.0
Loading...
Searching...
No Matches
IO.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: Apache-2.0
3
4/*!
5 \file nanovdb/putil/IO.h
6
7 \author Andrew Reidmeyer
8
9 \brief This file contains IO utilities for PNanoVDB.
10*/
11
12#ifndef NANOVDB_PUTILS_IO_H_HAS_BEEN_INCLUDED
13#define NANOVDB_PUTILS_IO_H_HAS_BEEN_INCLUDED
14
15#include <stdint.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19
20#if defined(__CUDACC__)
21#define PNANOVDB_IO_INLINE static __host__ __device__
22#elif defined(_WIN32)
23#define PNANOVDB_IO_INLINE static inline
24#else
25#define PNANOVDB_IO_INLINE static inline
26#endif
27
28// needs to match NANOVDB_DATA_ALIGNMENT from nanovdb/NanoVDB.h
29#define PNANOVDB_DATA_ALIGNMENT 32
30PNANOVDB_IO_INLINE void* pnanovdb_aligned_malloc(size_t alignment, size_t size)
31{
32 size_t aligned_size = size + alignment + sizeof(void*);
33 void* alloc_ptr = malloc(aligned_size);
34 void* ptr = 0;
35 if (alloc_ptr)
36 {
37 ptr = (void*)(alignment * (((size_t)alloc_ptr + sizeof(void*) + alignment - 1u) / alignment));
38 void** header_ptr = (void**)((size_t)ptr - sizeof(void*));
39 *header_ptr = alloc_ptr;
40 }
41 return ptr;
42}
44{
45 if (ptr)
46 {
47 void** header_ptr = (void**)((size_t)ptr - sizeof(void*));
48 free(*header_ptr);
49 }
50}
51
52// abstraction for file-like read/write
53typedef struct pnanovdb_io_buf_t
54{
55 void* file;
56 void(*read)(void* file, uint64_t offset, void* dst_data, uint64_t size);
57 void(*write)(void* file, uint64_t offset, void* src_data, uint64_t size);
59
60// implementation for fread/fwrite
61PNANOVDB_IO_INLINE void pnanovdb_io_buf_fread(void* file, uint64_t offset, void* dst_data, uint64_t size)
62{
63 fseek((FILE*)file, offset, SEEK_SET);
64 fread(dst_data, size, 1u, (FILE*)file);
65}
66PNANOVDB_IO_INLINE void pnanovdb_io_buf_fwrite(void* file, uint64_t offset, void* src_data, uint64_t size)
67{
68 fseek((FILE*)file, offset, SEEK_SET);
69 fwrite(src_data, size, 1u, (FILE*)file);
70}
71
72// implementation for dynamic buffer
79PNANOVDB_IO_INLINE void pnanovdb_io_dynamic_buf_read(void* file, uint64_t offset, void* dst_data, uint64_t size)
80{
82 uint8_t* dst8 = (uint8_t*)dst_data;
83 uint8_t* src8 = (uint8_t*)ptr->data;
84 uint64_t size_in_bounds = size;
85 if (offset >= ptr->size)
86 {
87 size_in_bounds = 0;
88 }
89 else if (offset + size > ptr->size)
90 {
91 size_in_bounds = ptr->size - offset;
92 }
93 memcpy(dst8, src8 + offset, size_in_bounds);
94 memset(dst8 + size_in_bounds, 0, size - size_in_bounds);
95}
96PNANOVDB_IO_INLINE void pnanovdb_io_dynamic_buf_write(void* file, uint64_t offset, void* src_data, uint64_t size)
97{
99 // grow capacity as needed
100 if (offset + size > ptr->capacity)
101 {
102 uint64_t new_capacity = 1024u;
103 while (new_capacity < offset + size)
104 {
105 new_capacity = (new_capacity << 1u) - (new_capacity >> 1u);
106 }
107 void* new_data = pnanovdb_aligned_malloc(PNANOVDB_DATA_ALIGNMENT, new_capacity);
108 memcpy(new_data, ptr->data, ptr->size);
109 if (ptr->capacity != 0u)
110 {
112 }
113 ptr->data = new_data;
114 ptr->capacity = new_capacity;
115 }
116 // expand size and zero initialize as needed
117 if (offset + size > ptr->size)
118 {
119 uint8_t* data8 = (uint8_t*)ptr->data;
120 memset(data8 + ptr->size, 0, offset + size - ptr->size);
121 ptr->size = offset + size;
122 }
123 // write data
124 uint8_t* src8 = (uint8_t*)src_data;
125 uint8_t* dst8 = (uint8_t*)ptr->data;
126 memcpy(dst8 + offset, src8, size);
127}
128
129#if defined(PNANOVDB_IO_BUF_CUSTOM)
130#define PNANOVDB_BUF_CUSTOM
131
132#define pnanovdb_buf_t pnanovdb_io_buf_t*
133PNANOVDB_IO_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
134{
135 uint32_t ret = 0u;
136 buf->read(buf->file, byte_offset, &ret, 4u);
137 return ret;
138}
139PNANOVDB_IO_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
140{
141 uint64_t ret = 0u;
142 buf->read(buf->file, byte_offset, &ret, 8u);
143 return ret;
144}
145PNANOVDB_IO_INLINE void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint64_t byte_offset, uint32_t value)
146{
147 buf->write(buf->file, byte_offset, &value, 4u);
148}
149PNANOVDB_IO_INLINE void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint64_t byte_offset, uint64_t value)
150{
151 buf->write(buf->file, byte_offset, &value, 8u);
152}
153#define pnanovdb_grid_type_t uint32_t
154#define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
155
156#endif
157
158#ifndef PNANOVDB_C
159#define PNANOVDB_C
160#endif
161#include <nanovdb/PNanoVDB.h>
162
164{
165 pnanovdb_uint64_t magic; // 8 bytes, 0
166 pnanovdb_uint32_t version; // 4 bytes, 8
167 pnanovdb_uint32_t grid_count_and_codec; // 4 bytes, 12
169
170#define PNANOVDB_IO_FILEHEADER_SIZE 16
171
173{
174 pnanovdb_uint64_t grid_size; // 8 bytes, 0
175 pnanovdb_uint64_t file_size; // 8 bytes, 8
176 pnanovdb_uint64_t name_key; // 8 bytes, 16
177 pnanovdb_uint64_t voxel_count; // 8 bytes, 24
178 pnanovdb_uint32_t grid_type; // 4 bytes, 32
179 pnanovdb_uint32_t grid_class; // 4 bytes, 36
180 double world_bbox[6u]; // 48 bytes, 40
181 pnanovdb_coord_t index_bbox_min; // 12 bytes, 88
182 pnanovdb_coord_t index_bbox_max; // 12 bytes, 100
183 double voxel_size[3u]; // 24 bytes, 112
184 pnanovdb_uint32_t name_size; // 4 bytes, 136
185 pnanovdb_uint32_t node_count_leaf; // 4 bytes, 140
186 pnanovdb_uint32_t node_count_lower; // 4 bytes, 144
187 pnanovdb_uint32_t node_count_upper; // 4 bytes, 148
188 pnanovdb_uint32_t node_count_root; // 4 bytes, 152
189 pnanovdb_uint32_t tile_count_lower; // 4 bytes, 156
190 pnanovdb_uint32_t tile_count_upper; // 4 bytes, 160
191 pnanovdb_uint32_t tile_count_root; // 4 bytes, 164
192 pnanovdb_uint32_t codec_and_padding; // 4 bytes, 168
193 pnanovdb_uint32_t version; // 4 bytes, 172
195
196#define PNANOVDB_IO_FILEMETADATA_SIZE 176
197
198#if defined(PNANOVDB_IO_BUF_CUSTOM)
199
200PNANOVDB_IO_INLINE pnanovdb_grid_handle_t pnanovdb_io_fread_fileheader(
201 pnanovdb_buf_t file,
202 pnanovdb_io_fileheader_t* dst_header,
203 pnanovdb_io_filemetadata_t* dst_metadatas,
204 pnanovdb_uint64_t dst_metadata_count)
205{
206 pnanovdb_grid_t local_grid = {};
207 file->read(file->file, 0u, &local_grid, PNANOVDB_GRID_SIZE);
208 pnanovdb_bool_t is_raw_grid = PNANOVDB_FALSE;
209 if (local_grid.magic == PNANOVDB_MAGIC_GRID ||
210 local_grid.data2 == PNANOVDB_MAGIC_GRID)
211 {
212 is_raw_grid = PNANOVDB_TRUE;
213 }
214 if (is_raw_grid)
215 {
216 pnanovdb_grid_handle_t raw_grid = {pnanovdb_address_null()};
217 return raw_grid;
218 }
219
220 pnanovdb_uint64_t offset = 0u;
221 pnanovdb_io_fileheader_t local_header = {};
222 file->read(file->file, offset, &local_header, PNANOVDB_IO_FILEHEADER_SIZE);
223 if (dst_header)
224 {
225 *dst_header = local_header;
226 }
228 pnanovdb_uint32_t grid_count = local_header.grid_count_and_codec & 0xFFFF;
229 for (uint32_t idx = 0u; idx < grid_count; idx++)
230 {
231 pnanovdb_io_filemetadata_t local_metadata = {};
232 file->read(file->file, offset, &local_metadata, PNANOVDB_IO_FILEMETADATA_SIZE);
233 if (idx < dst_metadata_count)
234 {
235 dst_metadatas[idx] = local_metadata;
236 }
238 // skip past name
239 offset += local_metadata.name_size;
240 }
241 pnanovdb_grid_handle_t first_grid = {pnanovdb_address_offset64(pnanovdb_address_null(), offset)};
242 return first_grid;
243}
244
245PNANOVDB_IO_INLINE void pnanovdb_io_memcpy(
246 pnanovdb_buf_t dst_buf, pnanovdb_address_t dst_addr,
247 pnanovdb_buf_t src_buf, pnanovdb_address_t src_addr,
248 pnanovdb_uint64_t num_bytes)
249{
250 pnanovdb_uint64_t num_words = (num_bytes >> 2u);
251 for (pnanovdb_uint64_t word_idx = 0u; word_idx < num_words; word_idx++)
252 {
253 pnanovdb_uint32_t val = pnanovdb_read_uint32(src_buf, pnanovdb_address_offset_product(src_addr, word_idx, 4u));
254 pnanovdb_write_uint32(dst_buf, pnanovdb_address_offset_product(dst_addr, word_idx, 4u), val);
255 }
256}
257
258PNANOVDB_IO_INLINE pnanovdb_uint32_t pnanovdb_io_get_leaf_size(pnanovdb_uint32_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
259{
260 pnanovdb_uint32_t size = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_size);
261 if (grid_type == PNANOVDB_GRID_TYPE_FPN)
262 {
263 pnanovdb_uint32_t flags = pnanovdb_leaf_get_bbox_dif_and_flags(buf, leaf) >> 24u;
264 pnanovdb_uint32_t value_log_bits = flags >> 5;
265 pnanovdb_uint32_t value_bits = 1u << value_log_bits;
266 pnanovdb_uint32_t table_bytes = value_bits << (9u - 3u);
267 size += table_bytes;
268 }
269 return size;
270}
271
272PNANOVDB_IO_INLINE void pnanovdb_io_copy_subregion(
273 pnanovdb_buf_t src_buf,
274 pnanovdb_grid_handle_t src_grid,
275 pnanovdb_buf_t dst_buf,
276 pnanovdb_grid_handle_t dst_grid,
277 pnanovdb_coord_t ijk_min,
278 pnanovdb_coord_t ijk_max)
279{
280 // leaf precise, not voxel precise for now
281 ijk_min.x &= ~7;
282 ijk_min.y &= ~7;
283 ijk_min.z &= ~7;
284 ijk_max.x |= 7;
285 ijk_max.y |= 7;
286 ijk_max.z |= 7;
287
288 pnanovdb_buf_t buf = src_buf;
289 pnanovdb_grid_handle_t grid = src_grid;
290
291 // copy grid
292 pnanovdb_io_memcpy(dst_buf, dst_grid.address, buf, grid.address, PNANOVDB_GRID_SIZE);
293
294 pnanovdb_grid_type_t grid_type = pnanovdb_grid_get_grid_type(buf, grid);
295
296 // copy tree
298 pnanovdb_tree_handle_t dst_tree = pnanovdb_grid_get_tree(dst_buf, dst_grid);
299 pnanovdb_io_memcpy(dst_buf, dst_tree.address, buf, tree.address, PNANOVDB_TREE_SIZE);
300
301 // copy root
303 pnanovdb_root_handle_t dst_root = pnanovdb_tree_get_root(dst_buf, dst_tree);
304 pnanovdb_io_memcpy(dst_buf, dst_root.address, buf, root.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_size));
305
306 // set new root to clipped bounds
307 pnanovdb_root_set_bbox_min(dst_buf, dst_root, &ijk_min);
308 pnanovdb_root_set_bbox_max(dst_buf, dst_root, &ijk_max);
309
310 // copy root tiles
311 pnanovdb_uint32_t tile_count = pnanovdb_root_get_tile_count(buf, root);
312 for (pnanovdb_uint32_t tile_idx = 0u; tile_idx < tile_count; tile_idx++)
313 {
314 pnanovdb_root_tile_handle_t root_tile = pnanovdb_root_get_tile(grid_type, root, tile_idx);
315 pnanovdb_root_tile_handle_t dst_root_tile = pnanovdb_root_get_tile(grid_type, dst_root, tile_idx);
316 pnanovdb_io_memcpy(dst_buf, dst_root_tile.address, buf, root_tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_size));
317 }
318
319 // copy upper
320 for (pnanovdb_uint32_t tile_idx = 0u; tile_idx < tile_count; tile_idx++)
321 {
322 pnanovdb_root_tile_handle_t root_tile = pnanovdb_root_get_tile(grid_type, root, tile_idx);
323 pnanovdb_root_tile_handle_t dst_root_tile = pnanovdb_root_get_tile(grid_type, dst_root, tile_idx);
324 if (pnanovdb_root_tile_get_child_mask(buf, root_tile))
325 {
326 pnanovdb_upper_handle_t upper = pnanovdb_root_get_child(grid_type, buf, root, root_tile);
327 pnanovdb_upper_handle_t dst_upper = pnanovdb_root_get_child(grid_type, dst_buf, dst_root, dst_root_tile);
328 pnanovdb_io_memcpy(dst_buf, dst_upper.address, buf, upper.address, PNANOVDB_GRID_TYPE_GET(grid_type, upper_size));
329 }
330 }
331
332 // copy lower
333 for (pnanovdb_uint32_t tile_idx = 0u; tile_idx < tile_count; tile_idx++)
334 {
335 pnanovdb_root_tile_handle_t root_tile = pnanovdb_root_get_tile(grid_type, root, tile_idx);
336 pnanovdb_root_tile_handle_t dst_root_tile = pnanovdb_root_get_tile(grid_type, dst_root, tile_idx);
337 if (pnanovdb_root_tile_get_child_mask(buf, root_tile))
338 {
339 pnanovdb_upper_handle_t upper = pnanovdb_root_get_child(grid_type, buf, root, root_tile);
340 pnanovdb_upper_handle_t dst_upper = pnanovdb_root_get_child(grid_type, dst_buf, dst_root, dst_root_tile);
341 for (pnanovdb_uint32_t upper_n = 0u; upper_n < PNANOVDB_UPPER_TABLE_COUNT; upper_n++)
342 {
343 if (pnanovdb_upper_get_child_mask(buf, upper, upper_n))
344 {
345 pnanovdb_lower_handle_t lower = pnanovdb_upper_get_child(grid_type, buf, upper, upper_n);
346 pnanovdb_lower_handle_t dst_lower = pnanovdb_upper_get_child(grid_type, dst_buf, dst_upper, upper_n);
347 pnanovdb_io_memcpy(dst_buf, dst_lower.address, buf, lower.address, PNANOVDB_GRID_TYPE_GET(grid_type, lower_size));
348 }
349 }
350 }
351 }
352
353 // copy leaf
354 pnanovdb_uint32_t dst_node_count_leaf = 0u;
355 pnanovdb_leaf_handle_t dst_current_leaf = {
356 pnanovdb_address_offset(dst_tree.address, pnanovdb_tree_get_node_offset_leaf(dst_buf, dst_tree))};
357 for (pnanovdb_uint32_t tile_idx = 0u; tile_idx < tile_count; tile_idx++)
358 {
359 pnanovdb_root_tile_handle_t root_tile = pnanovdb_root_get_tile(grid_type, root, tile_idx);
360 pnanovdb_root_tile_handle_t dst_root_tile = pnanovdb_root_get_tile(grid_type, dst_root, tile_idx);
361 if (pnanovdb_root_tile_get_child_mask(buf, root_tile))
362 {
363 pnanovdb_upper_handle_t upper = pnanovdb_root_get_child(grid_type, buf, root, root_tile);
364 pnanovdb_upper_handle_t dst_upper = pnanovdb_root_get_child(grid_type, dst_buf, dst_root, dst_root_tile);
365 for (pnanovdb_uint32_t upper_n = 0u; upper_n < PNANOVDB_UPPER_TABLE_COUNT; upper_n++)
366 {
367 if (pnanovdb_upper_get_child_mask(buf, upper, upper_n))
368 {
369 pnanovdb_lower_handle_t lower = pnanovdb_upper_get_child(grid_type, buf, upper, upper_n);
370 pnanovdb_lower_handle_t dst_lower = pnanovdb_upper_get_child(grid_type, dst_buf, dst_upper, upper_n);
371 for (pnanovdb_uint32_t lower_n = 0u; lower_n < PNANOVDB_LOWER_TABLE_COUNT; lower_n++)
372 {
373 if (pnanovdb_lower_get_child_mask(buf, lower, lower_n))
374 {
375 pnanovdb_leaf_handle_t leaf = pnanovdb_lower_get_child(grid_type, buf, lower, lower_n);
376
377 pnanovdb_coord_t leaf_ijk_min = pnanovdb_leaf_get_bbox_min(buf, leaf);
378 pnanovdb_uint32_t dif_and_flags = pnanovdb_leaf_get_bbox_dif_and_flags(buf, leaf);
379 pnanovdb_coord_t leaf_ijk_max = {
380 pnanovdb_uint32_as_int32(dif_and_flags & 255u) + leaf_ijk_min.x,
381 pnanovdb_uint32_as_int32((dif_and_flags >> 8u) & 255u) + leaf_ijk_min.y,
382 pnanovdb_uint32_as_int32((dif_and_flags >> 16u) & 255u) + leaf_ijk_min.z
383 };
384
385 // leaf precise, not voxel precise for now
386 leaf_ijk_min.x &= ~7;
387 leaf_ijk_min.y &= ~7;
388 leaf_ijk_min.z &= ~7;
389 leaf_ijk_max.x |= 7;
390 leaf_ijk_max.y |= 7;
391 leaf_ijk_max.z |= 7;
392
393 pnanovdb_bool_t pred = !(
394 leaf_ijk_max.x < ijk_min.x || leaf_ijk_min.x > ijk_max.x ||
395 leaf_ijk_max.y < ijk_min.y || leaf_ijk_min.y > ijk_max.y ||
396 leaf_ijk_max.z < ijk_min.z || leaf_ijk_min.z > ijk_max.z );
397 if (pred)
398 {
399 pnanovdb_uint32_t leaf_size = pnanovdb_io_get_leaf_size(grid_type, buf, leaf);
400 pnanovdb_io_memcpy(dst_buf, dst_current_leaf.address, buf, leaf.address, leaf_size);
401
402 pnanovdb_lower_set_child(grid_type, dst_buf, dst_lower, lower_n, dst_current_leaf);
403
404 // voxel precise
405 #if 0
406 for (pnanovdb_uint32_t leaf_n = 0u; leaf_n < PNANOVDB_LEAF_TABLE_COUNT; leaf_n++)
407 {
408 pnanovdb_coord_t voxel_ijk = {
409 (leaf_ijk_min.x & ~7) + (pnanovdb_uint32_as_int32(leaf_n >> 6u) & 7),
410 (leaf_ijk_min.y & ~7) + (pnanovdb_uint32_as_int32(leaf_n >> 3u) & 7),
411 (leaf_ijk_min.z & ~7) + (pnanovdb_uint32_as_int32(leaf_n >> 0u) & 7)
412 };
413
414 pnanovdb_bool_t voxel_pred = !(
415 voxel_ijk.x < ijk_min.x || voxel_ijk.x > ijk_max.x ||
416 voxel_ijk.y < ijk_min.y || voxel_ijk.y > ijk_max.y ||
417 voxel_ijk.z < ijk_min.z || voxel_ijk.z > ijk_max.z );
418 if (!voxel_pred)
419 {
420 pnanovdb_leaf_set_value_mask(dst_buf, dst_current_leaf, leaf_n, PNANOVDB_FALSE);
421 pnanovdb_address_t val_addr =
422 pnanovdb_leaf_get_table_address(grid_type, dst_buf, dst_current_leaf, leaf_n);
423 pnanovdb_address_t background_addr = pnanovdb_root_get_background_address(grid_type, buf, root);
424
425 pnanovdb_io_memcpy(dst_buf, val_addr, buf, background_addr, (PNANOVDB_GRID_TYPE_GET(grid_type, value_stride_bits) >> 3u));
426 }
427 }
428 #endif
429
430 dst_current_leaf.address = pnanovdb_address_offset(dst_current_leaf.address, leaf_size);
431 dst_node_count_leaf++;
432 }
433 else
434 {
435 pnanovdb_address_t background_addr = pnanovdb_root_get_background_address(grid_type, buf, root);
436 pnanovdb_uint64_t background_index = pnanovdb_read_uint64(buf, background_addr);
437 pnanovdb_lower_set_table_child(grid_type, dst_buf, dst_lower, lower_n, pnanovdb_uint64_as_int64(background_index));
438 pnanovdb_lower_set_child_mask(dst_buf, dst_lower, lower_n, PNANOVDB_FALSE);
439 pnanovdb_lower_set_value_mask(dst_buf, dst_lower, lower_n, PNANOVDB_FALSE);
440 }
441 }
442 }
443 }
444 }
445 }
446 }
447
448 //pnanovdb_grid_set_blind_metadata_count(dst_buf, dst_grid, 0u);
449
450 // need to update tree for new reduced leaf range
451 pnanovdb_tree_set_node_count_leaf(dst_buf, dst_tree, dst_node_count_leaf);
452
453 pnanovdb_uint32_t blindmetadata_count = pnanovdb_grid_get_blind_metadata_count(buf, grid);
454
455 pnanovdb_uint64_t dst_blind_metadata_offset =
456 dst_current_leaf.address.byte_offset -
457 dst_grid.address.byte_offset;
458 pnanovdb_grid_set_blind_metadata_offset(dst_buf, dst_grid, dst_blind_metadata_offset);
459
460 // copy blindmetadata headers
461 for (pnanovdb_uint32_t metadata_idx = 0u; metadata_idx < blindmetadata_count; metadata_idx++)
462 {
464 pnanovdb_gridblindmetadata_handle_t dst_metadata = pnanovdb_grid_get_gridblindmetadata(dst_buf, dst_grid, metadata_idx);
465
466 pnanovdb_io_memcpy(dst_buf, dst_metadata.address, buf, metadata.address, PNANOVDB_GRIDBLINDMETADATA_SIZE);
467 }
468
469#if 0
470 // copy blindmetadata
471 for (pnanovdb_uint32_t metadata_idx = 0u; metadata_idx < blindmetadata_count; metadata_idx++)
472 {
474 pnanovdb_gridblindmetadata_handle_t dst_metadata = pnanovdb_grid_get_gridblindmetadata(dst_buf, dst_grid, metadata_idx);
475
476 pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_data_offset(buf, metadata);
477 pnanovdb_address_t address = pnanovdb_address_offset64(metadata.address, pnanovdb_int64_as_uint64(byte_offset));
478
479 pnanovdb_int64_t dst_byte_offset = pnanovdb_gridblindmetadata_get_data_offset(dst_buf, dst_metadata);
480 pnanovdb_address_t dst_address = pnanovdb_address_offset64(dst_metadata.address, pnanovdb_int64_as_uint64(dst_byte_offset));
481
482 pnanovdb_uint32_t value_size = pnanovdb_gridblindmetadata_get_value_size(buf, metadata);
483 pnanovdb_uint64_t value_count = pnanovdb_gridblindmetadata_get_value_count(buf, metadata);
484
485 pnanovdb_io_memcpy(dst_buf, dst_address, buf, address, value_count * value_size);
486 }
487#else
488 for (pnanovdb_uint32_t metadata_idx = 0u; metadata_idx < blindmetadata_count; metadata_idx++)
489 {
491 pnanovdb_gridblindmetadata_handle_t dst_metadata = pnanovdb_grid_get_gridblindmetadata(dst_buf, dst_grid, metadata_idx);
492
493 pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_data_offset(buf, metadata);
494 pnanovdb_address_t address = pnanovdb_address_offset64(metadata.address, pnanovdb_int64_as_uint64(byte_offset));
495
496 pnanovdb_int64_t dst_byte_offset = pnanovdb_gridblindmetadata_get_data_offset(dst_buf, dst_metadata);
497 pnanovdb_address_t dst_address = pnanovdb_address_offset64(dst_metadata.address, pnanovdb_int64_as_uint64(dst_byte_offset));
498
499 pnanovdb_uint32_t value_size = pnanovdb_gridblindmetadata_get_value_size(buf, metadata);
500 pnanovdb_uint64_t value_count = pnanovdb_gridblindmetadata_get_value_count(buf, metadata);
501
502 pnanovdb_uint64_t dst_value_index = 0llu;
503 pnanovdb_uint64_t value_index = 0llu;
504
505 pnanovdb_address_t index_addr = pnanovdb_root_get_background_address(grid_type, buf, root);
506 value_index = pnanovdb_read_uint64(buf, index_addr);
507
508 pnanovdb_address_t dst_index_addr = pnanovdb_root_get_background_address(grid_type, dst_buf, dst_root);
509 pnanovdb_write_uint64(dst_buf, dst_index_addr, dst_value_index);
510
511 pnanovdb_uint64_t last_root_tile_index = value_index;
512 pnanovdb_uint64_t last_upper_tile_index = value_index;
513 pnanovdb_uint64_t last_lower_tile_index = value_index;
514 pnanovdb_uint64_t last_root_tile_dst_index = dst_value_index;
515 pnanovdb_uint64_t last_upper_tile_dst_index = dst_value_index;
516 pnanovdb_uint64_t last_lower_tile_dst_index = dst_value_index;
517
518 pnanovdb_io_memcpy(
519 dst_buf, pnanovdb_address_offset64_product(dst_address, dst_value_index, value_size),
520 buf, pnanovdb_address_offset64_product(address, value_index, value_size), value_size);
521 dst_value_index++;
522
523 // walk subregion, copy referenced blindmetadata
524 pnanovdb_uint32_t dst_tile_count = pnanovdb_root_get_tile_count(dst_buf, dst_root);
525 for (pnanovdb_uint32_t tile_idx = 0u; tile_idx < dst_tile_count; tile_idx++)
526 {
527 pnanovdb_root_tile_handle_t dst_root_tile = pnanovdb_root_get_tile(grid_type, dst_root, tile_idx);
528 pnanovdb_root_tile_handle_t root_tile = pnanovdb_root_get_tile(grid_type, root, tile_idx);
529
530 if (pnanovdb_root_tile_get_child_mask(dst_buf, dst_root_tile))
531 {
532 pnanovdb_upper_handle_t dst_upper = pnanovdb_root_get_child(grid_type, dst_buf, dst_root, dst_root_tile);
533 pnanovdb_upper_handle_t upper = pnanovdb_root_get_child(grid_type, buf, root, root_tile);
534 for (pnanovdb_uint32_t upper_n = 0u; upper_n < PNANOVDB_UPPER_TABLE_COUNT; upper_n++)
535 {
536 if (pnanovdb_upper_get_child_mask(dst_buf, dst_upper, upper_n))
537 {
538 pnanovdb_lower_handle_t dst_lower = pnanovdb_upper_get_child(grid_type, dst_buf, dst_upper, upper_n);
539 pnanovdb_lower_handle_t lower = pnanovdb_upper_get_child(grid_type, buf, upper, upper_n);
540 for (pnanovdb_uint32_t lower_n = 0u; lower_n < PNANOVDB_LOWER_TABLE_COUNT; lower_n++)
541 {
542 if (pnanovdb_lower_get_child_mask(dst_buf, dst_lower, lower_n))
543 {
544 pnanovdb_leaf_handle_t dst_leaf = pnanovdb_lower_get_child(grid_type, dst_buf, dst_lower, lower_n);
545 pnanovdb_leaf_handle_t leaf = pnanovdb_lower_get_child(grid_type, buf, lower, lower_n);
546
547 pnanovdb_uint32_t leaf_value_count = pnanovdb_leaf_onindex_get_value_count(dst_buf, dst_leaf);
548
549 dst_index_addr = pnanovdb_leaf_get_table_address(grid_type, dst_buf, dst_leaf, 0u);
550 pnanovdb_write_uint64(dst_buf, dst_index_addr, dst_value_index);
551
552 pnanovdb_address_t index_addr = pnanovdb_leaf_get_table_address(grid_type, buf, leaf, 0u);
553 value_index = pnanovdb_read_uint64(buf, index_addr);
554
555 pnanovdb_io_memcpy(
556 dst_buf, pnanovdb_address_offset64_product(dst_address, dst_value_index, value_size),
557 buf, pnanovdb_address_offset64_product(address, value_index, value_size), value_size * leaf_value_count);
558 dst_value_index+=leaf_value_count;
559 }
560 else if(pnanovdb_lower_get_child_mask(buf, lower, lower_n))
561 {
562 // this covers leaves disabled by pred above
563 pnanovdb_address_t background_addr = pnanovdb_root_get_background_address(grid_type, dst_buf, dst_root);
564 pnanovdb_uint64_t background_index = pnanovdb_read_uint64(buf, background_addr);
565
566 dst_index_addr = pnanovdb_lower_get_table_address(grid_type, dst_buf, dst_lower, lower_n);
567 pnanovdb_write_uint64(dst_buf, dst_index_addr, background_index);
568 }
569 else
570 {
571 pnanovdb_address_t index_addr = pnanovdb_lower_get_table_address(grid_type, buf, lower, lower_n);
572 value_index = pnanovdb_read_uint64(buf, index_addr);
573 if (last_lower_tile_index != value_index)
574 {
575 last_lower_tile_index = value_index;
576
577 dst_index_addr = pnanovdb_lower_get_table_address(grid_type, dst_buf, dst_lower, lower_n);
578 pnanovdb_write_uint64(dst_buf, dst_index_addr, dst_value_index);
579 last_lower_tile_dst_index = dst_value_index;
580
581 pnanovdb_io_memcpy(
582 dst_buf, pnanovdb_address_offset64_product(dst_address, dst_value_index, value_size),
583 buf, pnanovdb_address_offset64_product(address, value_index, value_size), value_size);
584 dst_value_index++;
585 }
586 else
587 {
588 dst_index_addr = pnanovdb_lower_get_table_address(grid_type, dst_buf, dst_lower, lower_n);
589 pnanovdb_write_uint64(dst_buf, dst_index_addr, last_lower_tile_dst_index);
590 }
591 }
592 }
593 }
594 else
595 {
596 pnanovdb_address_t index_addr = pnanovdb_upper_get_table_address(grid_type, buf, upper, upper_n);
597 value_index = pnanovdb_read_uint64(buf, index_addr);
598 if (last_upper_tile_index != value_index)
599 {
600 last_upper_tile_index = value_index;
601
602 dst_index_addr = pnanovdb_upper_get_table_address(grid_type, dst_buf, dst_upper, upper_n);
603 pnanovdb_write_uint64(dst_buf, dst_index_addr, dst_value_index);
604 last_upper_tile_dst_index = dst_value_index;
605
606 pnanovdb_io_memcpy(
607 dst_buf, pnanovdb_address_offset64_product(dst_address, dst_value_index, value_size),
608 buf, pnanovdb_address_offset64_product(address, value_index, value_size), value_size);
609 dst_value_index++;
610 }
611 else
612 {
613 dst_index_addr = pnanovdb_upper_get_table_address(grid_type, dst_buf, dst_upper, upper_n);
614 pnanovdb_write_uint64(dst_buf, dst_index_addr, last_upper_tile_dst_index);
615 }
616 }
617 }
618 }
619 else
620 {
621 pnanovdb_address_t index_addr = pnanovdb_root_tile_get_value_address(grid_type, buf, root_tile);
622 value_index = pnanovdb_read_uint64(buf, index_addr);
623 if (last_root_tile_index != value_index)
624 {
625 last_root_tile_index = value_index;
626
627 dst_index_addr = pnanovdb_root_tile_get_value_address(grid_type, dst_buf, dst_root_tile);
628 pnanovdb_write_uint64(dst_buf, dst_index_addr, dst_value_index);
629 last_root_tile_dst_index = dst_value_index;
630
631 pnanovdb_io_memcpy(
632 dst_buf, pnanovdb_address_offset64_product(dst_address, dst_value_index, value_size),
633 buf, pnanovdb_address_offset64_product(address, value_index, value_size), value_size);
634 dst_value_index++;
635 }
636 else
637 {
638 dst_index_addr = pnanovdb_root_tile_get_value_address(grid_type, dst_buf, dst_root_tile);
639 pnanovdb_write_uint64(dst_buf, dst_index_addr, last_root_tile_dst_index);
640 }
641 }
642 }
643
644 pnanovdb_gridblindmetadata_set_value_count(dst_buf, dst_metadata, dst_value_index);
645
646 pnanovdb_int64_t metadata_size_diff = pnanovdb_uint64_as_int64(dst_value_index - value_count) * value_size;
647 // compact later metadata ranges against new count
648 for (pnanovdb_uint32_t local_metadata_idx = metadata_idx + 1u; local_metadata_idx < blindmetadata_count; local_metadata_idx++)
649 {
650 pnanovdb_gridblindmetadata_handle_t local_dst_metadata = pnanovdb_grid_get_gridblindmetadata(dst_buf, dst_grid, metadata_idx);
651
652 pnanovdb_int64_t local_dst_byte_offset = pnanovdb_gridblindmetadata_get_data_offset(dst_buf, local_dst_metadata);
653 local_dst_byte_offset += metadata_size_diff;
654 pnanovdb_gridblindmetadata_set_data_offset(dst_buf, local_dst_metadata, local_dst_byte_offset);
655 }
656 }
657
658 // compute final grid size based on maximum of final leaf and final metadata
659 pnanovdb_uint64_t grid_size =
660 dst_current_leaf.address.byte_offset -
661 dst_grid.address.byte_offset;
662 for (pnanovdb_uint32_t metadata_idx = 0u; metadata_idx < blindmetadata_count; metadata_idx++)
663 {
664 pnanovdb_gridblindmetadata_handle_t dst_metadata = pnanovdb_grid_get_gridblindmetadata(dst_buf, dst_grid, metadata_idx);
665
666 pnanovdb_int64_t dst_byte_offset = pnanovdb_gridblindmetadata_get_data_offset(dst_buf, dst_metadata);
667 pnanovdb_address_t dst_address = pnanovdb_address_offset64(dst_metadata.address, pnanovdb_int64_as_uint64(dst_byte_offset));
668
669 pnanovdb_uint32_t value_size = pnanovdb_gridblindmetadata_get_value_size(dst_buf, dst_metadata);
670 pnanovdb_uint64_t value_count = pnanovdb_gridblindmetadata_get_value_count(dst_buf, dst_metadata);
671
672 pnanovdb_uint64_t cmp_grid_size =
673 dst_address.byte_offset + value_count * value_size -
674 dst_grid.address.byte_offset;
675 if (grid_size < cmp_grid_size)
676 {
677 grid_size = cmp_grid_size;
678 }
679 }
680 pnanovdb_grid_set_grid_size(dst_buf, dst_grid, grid_size);
681#endif
682}
683
684PNANOVDB_IO_INLINE void pnanovdb_io_print_slice(pnanovdb_io_buf_t* src_nanovdb, FILE* dst_bmp)
685{
686 pnanovdb_grid_handle_t grid = pnanovdb_io_fread_fileheader(src_nanovdb, 0, 0, 0u);
687
688 pnanovdb_buf_t buf = src_nanovdb;
689
690 // set grid at post header print offset
691 printf("pnanovdb_io_print_slice grid(%lld)\n", (long long int)grid.address.byte_offset);
692
693 printf("pnanovdb_io_print_slice magic(%llx)\n",
694 (unsigned long long int)pnanovdb_grid_get_magic(buf, grid));
695 printf("pnanovdb_io_print_slice version(%x)\n", pnanovdb_grid_get_version(buf, grid));
696
698 printf("pnanovdb_io_print_slice tree(%lld)\n", (long long int)tree.address.byte_offset);
699
700 printf("pnanovdb_io_print_slice node_count_leaf(%d)\n", pnanovdb_tree_get_node_count_leaf(buf, tree));
701 printf("pnanovdb_io_print_slice node_count_lower(%d)\n", pnanovdb_tree_get_node_count_lower(buf, tree));
702 printf("pnanovdb_io_print_slice node_count_upper(%d)\n", pnanovdb_tree_get_node_count_upper(buf, tree));
703
705 pnanovdb_grid_type_t grid_type = pnanovdb_grid_get_grid_type(buf, grid);
706
707 pnanovdb_coord_t bbox_min = pnanovdb_root_get_bbox_min(buf, root);
708 pnanovdb_coord_t bbox_max = pnanovdb_root_get_bbox_max(buf, root);
709
710 printf("pnanovdb_io_print_slice range([(%d, %d, %d),(%d, %d, %d)])\n",
711 bbox_min.x, bbox_min.y, bbox_min.z,
712 bbox_max.x, bbox_max.y, bbox_max.z);
713
714 pnanovdb_int32_t image_width = bbox_max.x - bbox_min.x;
715 pnanovdb_int32_t image_height = bbox_max.y - bbox_min.y;
716 pnanovdb_int32_t k = (bbox_max.z + bbox_min.z) / 2;
717
718 char headerField0 = 'B';
719 char headerField1 = 'M';
720 uint32_t size = 54 + image_width * image_height * 4u;
721 uint16_t reserved1 = 0;
722 uint16_t reserved2 = 0;
723 uint32_t offset = 54;
724 uint32_t headerSize = 40;
725 uint32_t width = image_width;
726 uint32_t height = image_height;
727 uint16_t colorPlanes = 1;
728 uint16_t bitsPerPixel = 32;
729 uint32_t compressionMethod = 0;
730 uint32_t imageSize = image_width * image_height * 4u;
731 uint32_t hRes = 2000;
732 uint32_t vRes = 2000;
733 uint32_t numColors = 0;
734 uint32_t numImportantColors = 0;
735
736 fwrite(&headerField0, 1, 1, dst_bmp);
737 fwrite(&headerField1, 1, 1, dst_bmp);
738 fwrite(&size, 4, 1, dst_bmp);
739 fwrite(&reserved1, 2, 1, dst_bmp);
740 fwrite(&reserved2, 2, 1, dst_bmp);
741 fwrite(&offset, 4, 1, dst_bmp);
742 fwrite(&headerSize, 4, 1, dst_bmp);
743 fwrite(&width, 4, 1, dst_bmp);
744 fwrite(&height, 4, 1, dst_bmp);
745 fwrite(&colorPlanes, 2, 1, dst_bmp);
746 fwrite(&bitsPerPixel, 2, 1, dst_bmp);
747 fwrite(&compressionMethod, 4, 1, dst_bmp);
748 fwrite(&imageSize, 4, 1, dst_bmp);
749 fwrite(&hRes, 4, 1, dst_bmp);
750 fwrite(&vRes, 4, 1, dst_bmp);
751 fwrite(&numColors, 4, 1, dst_bmp);
752 fwrite(&numImportantColors, 4, 1, dst_bmp);
753
754 for (pnanovdb_int32_t j = image_height - 1; j >= 0; j--)
755 {
756 for (pnanovdb_int32_t i = 0; i < image_width; i++)
757 {
758 pnanovdb_coord_t ijk = {
759 i + bbox_min.x,
760 j + bbox_min.y,
761 k
762 };
763
764 pnanovdb_address_t addr = pnanovdb_root_get_value_address(grid_type, buf, root, &ijk);
765
766 float density_value = 1.f;
767 float color_value = pnanovdb_read_float(buf, addr);
768
769 pnanovdb_uint32_t raw_value = pnanovdb_uint32_t(255.f * pnanovdb_max(0.f, pnanovdb_min(1.f, color_value))) |
770 (pnanovdb_uint32_t(255.f * pnanovdb_max(0.f, pnanovdb_min(1.f, color_value))) << 8u) |
771 (pnanovdb_uint32_t(255.f * pnanovdb_max(0.f, pnanovdb_min(1.f, color_value))) << 16u) |
772 (pnanovdb_uint32_t(255.f * pnanovdb_max(0.f, pnanovdb_min(1.f, density_value))) << 24u);
773
774 fwrite(&raw_value, 4u, 1u, dst_bmp);
775 }
776 }
777}
778
779#endif
780
781#endif // end of NANOVDB_PUTILS_IO_H_HAS_BEEN_INCLUDED
This file is a portable (e.g. pointer-less) C99/GLSL/HLSL port of NanoVDB.h, which is compatible with...
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2547
PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value)
Definition PNanoVDB.h:1855
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1471
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1477
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p)
Definition PNanoVDB.h:1639
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value)
Definition PNanoVDB.h:1800
#define PNANOVDB_TREE_SIZE
Definition PNanoVDB.h:1533
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_offset(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t blind_metadata_offset)
Definition PNanoVDB.h:1381
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_tile_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t root_tile)
Definition PNanoVDB.h:2519
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t grid_size)
Definition PNanoVDB.h:1363
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p)
Definition PNanoVDB.h:1636
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_leaf_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p)
Definition PNanoVDB.h:1838
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2396
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1474
PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_get_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1931
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1294
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1547
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2347
PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile)
Definition PNanoVDB.h:1983
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1332
#define PNANOVDB_GRID_TYPE_FPN
Definition PNanoVDB.h:1109
PNANOVDB_FORCE_INLINE void pnanovdb_write_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint64_t value)
Definition PNanoVDB.h:1050
PNANOVDB_FORCE_INLINE void pnanovdb_root_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min)
Definition PNanoVDB.h:1643
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n, pnanovdb_int64_t child)
Definition PNanoVDB.h:2390
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_tile_get_child_mask(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t tile)
Definition PNanoVDB.h:1978
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2434
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1288
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1559
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:946
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_leaf)
Definition PNanoVDB.h:1593
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value)
Definition PNanoVDB.h:1807
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1565
#define PNANOVDB_GRID_SIZE
Definition PNanoVDB.h:1267
PNANOVDB_FORCE_INLINE void pnanovdb_write_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t value)
Definition PNanoVDB.h:1046
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1562
PNANOVDB_FORCE_INLINE pnanovdb_root_handle_t pnanovdb_tree_get_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t tree)
Definition PNanoVDB.h:1955
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p)
Definition PNanoVDB.h:1633
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_background_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:2489
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index)
Definition PNanoVDB.h:1789
PNANOVDB_FORCE_INLINE void pnanovdb_root_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max)
Definition PNanoVDB.h:1646
#define PNANOVDB_LOWER_TABLE_COUNT
Definition PNanoVDB.h:1767
PNANOVDB_FORCE_INLINE pnanovdb_lower_handle_t pnanovdb_upper_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2446
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_read_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:950
#define PNANOVDB_LEAF_TABLE_COUNT
Definition PNanoVDB.h:1827
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint64_t value_count)
Definition PNanoVDB.h:1496
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_child_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index)
Definition PNanoVDB.h:1727
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2083
#define PNANOVDB_UPPER_TABLE_COUNT
Definition PNanoVDB.h:1705
PNANOVDB_FORCE_INLINE pnanovdb_leaf_handle_t pnanovdb_lower_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2359
#define PNANOVDB_MAGIC_GRID
Definition PNanoVDB.h:1086
PNANOVDB_FORCE_INLINE float pnanovdb_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:958
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_bbox_dif_and_flags(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p)
Definition PNanoVDB.h:1841
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_int64_t data_offset)
Definition PNanoVDB.h:1493
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_onindex_get_value_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2172
#define PNANOVDB_GRIDBLINDMETADATA_SIZE
Definition PNanoVDB.h:1461
PNANOVDB_FORCE_INLINE pnanovdb_tree_handle_t pnanovdb_grid_get_tree(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid)
Definition PNanoVDB.h:1948
PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root, pnanovdb_uint32_t n)
Definition PNanoVDB.h:1963
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1326
#define PNANOVDB_IO_FILEHEADER_SIZE
Definition IO.h:170
static void * pnanovdb_aligned_malloc(size_t alignment, size_t size)
Definition IO.h:30
static void pnanovdb_io_buf_fwrite(void *file, uint64_t offset, void *src_data, uint64_t size)
Definition IO.h:66
static void pnanovdb_aligned_free(void *ptr)
Definition IO.h:43
#define PNANOVDB_IO_FILEMETADATA_SIZE
Definition IO.h:196
static void pnanovdb_io_buf_fread(void *file, uint64_t offset, void *dst_data, uint64_t size)
Definition IO.h:61
static void pnanovdb_io_dynamic_buf_read(void *file, uint64_t offset, void *dst_data, uint64_t size)
Definition IO.h:79
#define PNANOVDB_IO_INLINE
Definition IO.h:25
static void pnanovdb_io_dynamic_buf_write(void *file, uint64_t offset, void *src_data, uint64_t size)
Definition IO.h:96
#define PNANOVDB_DATA_ALIGNMENT
Definition IO.h:29
Definition PNanoVDB.h:1264
pnanovdb_address_t address
Definition PNanoVDB.h:1264
Definition PNanoVDB.h:1243
pnanovdb_uint64_t magic
Definition PNanoVDB.h:1244
pnanovdb_uint64_t data2
Definition PNanoVDB.h:1261
Definition PNanoVDB.h:1458
pnanovdb_address_t address
Definition PNanoVDB.h:1458
Definition IO.h:54
void(* write)(void *file, uint64_t offset, void *src_data, uint64_t size)
Definition IO.h:57
void * file
Definition IO.h:55
void(* read)(void *file, uint64_t offset, void *dst_data, uint64_t size)
Definition IO.h:56
Definition IO.h:74
uint64_t capacity
Definition IO.h:77
void * data
Definition IO.h:75
uint64_t size
Definition IO.h:76
Definition IO.h:164
pnanovdb_uint64_t magic
Definition IO.h:165
pnanovdb_uint32_t grid_count_and_codec
Definition IO.h:167
pnanovdb_uint32_t version
Definition IO.h:166
Definition IO.h:173
pnanovdb_uint32_t node_count_leaf
Definition IO.h:185
pnanovdb_uint32_t grid_class
Definition IO.h:179
pnanovdb_uint32_t tile_count_lower
Definition IO.h:189
pnanovdb_uint64_t grid_size
Definition IO.h:174
double world_bbox[6u]
Definition IO.h:180
pnanovdb_uint32_t grid_type
Definition IO.h:178
pnanovdb_uint32_t version
Definition IO.h:193
pnanovdb_uint32_t codec_and_padding
Definition IO.h:192
pnanovdb_uint64_t voxel_count
Definition IO.h:177
double voxel_size[3u]
Definition IO.h:183
pnanovdb_uint32_t tile_count_upper
Definition IO.h:190
pnanovdb_coord_t index_bbox_max
Definition IO.h:182
pnanovdb_uint64_t name_key
Definition IO.h:176
pnanovdb_uint32_t node_count_root
Definition IO.h:188
pnanovdb_uint32_t tile_count_root
Definition IO.h:191
pnanovdb_coord_t index_bbox_min
Definition IO.h:181
pnanovdb_uint32_t node_count_upper
Definition IO.h:187
pnanovdb_uint32_t name_size
Definition IO.h:184
pnanovdb_uint32_t node_count_lower
Definition IO.h:186
pnanovdb_uint64_t file_size
Definition IO.h:175
Definition PNanoVDB.h:1824
pnanovdb_address_t address
Definition PNanoVDB.h:1824
Definition PNanoVDB.h:1764
pnanovdb_address_t address
Definition PNanoVDB.h:1764
Definition PNanoVDB.h:1624
pnanovdb_address_t address
Definition PNanoVDB.h:1624
Definition PNanoVDB.h:1662
pnanovdb_address_t address
Definition PNanoVDB.h:1662
Definition PNanoVDB.h:1530
pnanovdb_address_t address
Definition PNanoVDB.h:1530
Definition PNanoVDB.h:1702
pnanovdb_address_t address
Definition PNanoVDB.h:1702