[Bf-blender-cvs] SVN commit: bf-blender [62505] trunk/lib/linux_centos7_x86_64/nanovdb: Linux: Add nanovdb library
Sergey Sharybin
sergey.vfx at gmail.com
Fri Oct 30 16:34:54 CET 2020
Revision: 62505
https://developer.blender.org/rBL62505
Author: sergey
Date: 2020-10-30 16:34:53 +0100 (Fri, 30 Oct 2020)
Log Message:
-----------
Linux: Add nanovdb library
Added Paths:
-----------
trunk/lib/linux_centos7_x86_64/nanovdb/
trunk/lib/linux_centos7_x86_64/nanovdb/include/
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/CNanoVDB.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/NanoVDB.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/CSampleFromVoxels.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/CudaDeviceBuffer.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/ForEach.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/GridBuilder.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/GridChecksum.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/GridHandle.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/GridStats.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/GridValidator.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/HDDA.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/HostBuffer.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/IO.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/Invoke.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/NanoToOpenVDB.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/OpenToNanoVDB.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/Range.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/Ray.h
trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/util/SampleFromVoxels.h
Added: trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/CNanoVDB.h
===================================================================
--- trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/CNanoVDB.h (rev 0)
+++ trunk/lib/linux_centos7_x86_64/nanovdb/include/nanovdb/CNanoVDB.h 2020-10-30 15:34:53 UTC (rev 62505)
@@ -0,0 +1,624 @@
+// Copyright Contributors to the OpenVDB Project
+// SPDX-License-Identifier: MPL-2.0
+
+//
+// Simple C-wrapper for the nanovdb structure
+// Meant for systems where you lack a C++ compiler.
+//
+#ifndef __CNANOVDB__
+#define __CNANOVDB__
+
+#define CNANOVDB_DATA_ALIGNMENT 32
+#define CNANOVDB_ALIGNMENT_PADDING(x, n) (-(x) & ((n)-1))
+
+#define USE_SINGLE_ROOT_KEY
+
+#ifdef __OPENCL_VERSION__
+
+#define CNANOVDB_GLOBAL __global
+#define RESTRICT restrict
+
+// OpenCL doesn't define these basic types:
+typedef unsigned long uint64_t;
+typedef long int64_t;
+typedef unsigned int uint32_t;
+typedef int int32_t;
+typedef short int16_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+
+#else
+
+#define CNANOVDB_GLOBAL
+#define RESTRICT __restrict
+
+#endif
+
+
+enum cnanovdb_GridType
+{
+ cnanovdb_GridType_Unknown = 0,
+ cnanovdb_GridType_Float = 1,
+ cnanovdb_GridType_Double = 2,
+ cnanovdb_GridType_Int16 = 3,
+ cnanovdb_GridType_Int32 = 4,
+ cnanovdb_GridType_Int64 = 5,
+ cnanovdb_GridType_Vec3f = 6,
+ cnanovdb_GridType_Vec3d = 7,
+ cnanovdb_GridType_Mask = 8,
+ cnanovdb_GridType_FP16 = 9,
+ cnanovdb_GridType_End = 10
+};
+
+#define ROOT_LEVEL 3
+
+#define DEFINEMASK_int(LOG2DIM, SIZE) \
+typedef struct \
+{ \
+ uint64_t mWords[SIZE >> 6]; \
+} cnanovdb_mask##LOG2DIM; \
+\
+void cnanovdb_mask##LOG2DIM##_clear(CNANOVDB_GLOBAL cnanovdb_mask##LOG2DIM *RESTRICT mask) \
+{ for (uint32_t i = 0; i < (SIZE >> 6); i++) mask->mWords[i] = 0; } \
+\
+bool cnanovdb_mask##LOG2DIM##_isOn(const CNANOVDB_GLOBAL cnanovdb_mask##LOG2DIM *RESTRICT mask, uint32_t n) \
+{ return 0 != (mask->mWords[n >> 6] & (((uint64_t)(1)) << (n & 63))); } \
+/**/
+
+#define DEFINEMASK(LOG2DIM) \
+ DEFINEMASK_int(LOG2DIM, (1U << (3*LOG2DIM)))
+
+#define INSTANTIATE(LOG2DIM) \
+ DEFINEMASK(LOG2DIM)
+
+INSTANTIATE(3)
+INSTANTIATE(4)
+INSTANTIATE(5)
+
+typedef struct
+{
+ float mMatF[9]; // r,c = 3*r + c
+ float mInvMatF[9]; // r,c = 3*r + c
+ float mVecF[3];
+ float mTaperF;
+ double mMatD[9]; // r,c = 3*r + c
+ double mInvMatD[9]; // r,c = 3*r + c
+ double mVecD[3];
+ double mTaperD;
+} cnanovdb_map;
+
+typedef struct
+{
+ float mVec[3];
+} cnanovdb_Vec3F;
+
+typedef struct
+{
+ int32_t mVec[3];
+} cnanovdb_coord;
+
+int
+cnanovdb_coord_compare(const CNANOVDB_GLOBAL cnanovdb_coord *a, const cnanovdb_coord *b)
+{
+ if (a->mVec[0] < b->mVec[0])
+ return -1;
+ if (a->mVec[0] > b->mVec[0])
+ return 1;
+ if (a->mVec[1] < b->mVec[1])
+ return -1;
+ if (a->mVec[1] > b->mVec[1])
+ return 1;
+ if (a->mVec[2] < b->mVec[2])
+ return -1;
+ if (a->mVec[2] > b->mVec[2])
+ return 1;
+ return 0;
+}
+
+#ifdef USE_SINGLE_ROOT_KEY
+uint64_t
+cnanovdb_coord_to_key(const cnanovdb_coord *RESTRICT ijk)
+{
+ // Define to workaround a bug with 64-bit shifts in the AMD OpenCL compiler.
+#if defined(AVOID_64BIT_SHIFT)
+ uint2 key = (uint2)( ((uint32_t)ijk->mVec[2]) >> 12, 0) |
+ (uint2)((((uint32_t)ijk->mVec[1]) >> 12) << 21,
+ ((uint32_t)ijk->mVec[1]) >> 23) |
+ (uint2)(0, (((uint32_t)ijk->mVec[0]) >> 12) << 10);
+ return *(uint64_t *)&key;
+#else
+ return ((uint64_t) (((uint32_t)ijk->mVec[2]) >> 12)) |
+ (((uint64_t) (((uint32_t)ijk->mVec[1]) >> 12)) << 21) |
+ (((uint64_t) (((uint32_t)ijk->mVec[0]) >> 12)) << 42);
+#endif
+}
+#else
+void
+cnanovdb_coord_to_key(cnanovdb_coord *RESTRICT key, const cnanovdb_coord *RESTRICT ijk)
+{
+ key->mVec[0] = ijk->mVec[0] & ~((1u << 12) - 1u);
+ key->mVec[1] = ijk->mVec[1] & ~((1u << 12) - 1u);
+ key->mVec[2] = ijk->mVec[2] & ~((1u << 12) - 1u);
+}
+#endif
+
+void
+cnanovdb_map_apply(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_map *RESTRICT map, const cnanovdb_Vec3F *src)
+{
+ float sx = src->mVec[0];
+ float sy = src->mVec[1];
+ float sz = src->mVec[2];
+ dst->mVec[0] = sx * map->mMatF[0] + sy * map->mMatF[1] + sz * map->mMatF[2] + map->mVecF[0];
+ dst->mVec[1] = sx * map->mMatF[3] + sy * map->mMatF[4] + sz * map->mMatF[5] + map->mVecF[1];
+ dst->mVec[2] = sx * map->mMatF[6] + sy * map->mMatF[7] + sz * map->mMatF[8] + map->mVecF[2];
+}
+
+void
+cnanovdb_map_applyInverse(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_map *RESTRICT map, const cnanovdb_Vec3F *src)
+{
+ float sx = src->mVec[0] - map->mVecF[0];
+ float sy = src->mVec[1] - map->mVecF[1];
+ float sz = src->mVec[2] - map->mVecF[2];
+ dst->mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[1] + sz * map->mInvMatF[2];
+ dst->mVec[1] = sx * map->mInvMatF[3] + sy * map->mInvMatF[4] + sz * map->mInvMatF[5];
+ dst->mVec[2] = sx * map->mInvMatF[6] + sy * map->mInvMatF[7] + sz * map->mInvMatF[8];
+}
+
+void
+cnanovdb_map_applyJacobi(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_map *RESTRICT map, const cnanovdb_Vec3F *src)
+{
+ float sx = src->mVec[0];
+ float sy = src->mVec[1];
+ float sz = src->mVec[2];
+ dst->mVec[0] = sx * map->mMatF[0] + sy * map->mMatF[1] + sz * map->mMatF[2];
+ dst->mVec[1] = sx * map->mMatF[3] + sy * map->mMatF[4] + sz * map->mMatF[5];
+ dst->mVec[2] = sx * map->mMatF[6] + sy * map->mMatF[7] + sz * map->mMatF[8];
+}
+
+void
+cnanovdb_map_applyInverseJacobi(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_map *RESTRICT map, const cnanovdb_Vec3F *src)
+{
+ float sx = src->mVec[0];
+ float sy = src->mVec[1];
+ float sz = src->mVec[2];
+ dst->mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[1] + sz * map->mInvMatF[2];
+ dst->mVec[1] = sx * map->mInvMatF[3] + sy * map->mInvMatF[4] + sz * map->mInvMatF[5];
+ dst->mVec[2] = sx * map->mInvMatF[6] + sy * map->mInvMatF[7] + sz * map->mInvMatF[8];
+}
+
+void
+cnanovdb_map_applyIJT(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_map *RESTRICT map, const cnanovdb_Vec3F *src)
+{
+ float sx = src->mVec[0];
+ float sy = src->mVec[1];
+ float sz = src->mVec[2];
+ dst->mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[3] + sz * map->mInvMatF[6];
+ dst->mVec[1] = sx * map->mInvMatF[1] + sy * map->mInvMatF[4] + sz * map->mInvMatF[7];
+ dst->mVec[2] = sx * map->mInvMatF[2] + sy * map->mInvMatF[5] + sz * map->mInvMatF[8];
+}
+
+typedef struct
+{
+ int64_t mByteOffset; // byte offset to the blind data, relative to the GridData.
+ uint64_t mElementCount; // number of elements, e.g. point count
+ uint32_t mFlags; // flags
+ uint32_t mSemantic; // semantic meaning of the data.
+ uint32_t mDataClass; // 4 bytes
+ uint32_t mDataType; // 4 bytes
+ char mName[256];
+ uint8_t _reserved[CNANOVDB_ALIGNMENT_PADDING(sizeof(int64_t)+sizeof(uint64_t)+2*sizeof(uint32_t)+2*sizeof(uint32_t)+256*sizeof(char), CNANOVDB_DATA_ALIGNMENT)];
+} cnanovdb_gridblindmetadata;
+
+typedef struct
+{
+ uint64_t mMagic; // 8B magic to validate it is valid grid data.
+ uint64_t mChecksum; // 8B. Checksum of grid buffer.
+ uint32_t mMajor;// 4B. major version number.
+ uint32_t mFlags; // 4B. flags for grid.
+ uint64_t mGridSize; // 8B. byte count of entire grid buffer.
+ char mGridName[256]; // 256B
+ cnanovdb_map mMap; // 264B. affine transformation between index and world space in both single and double precision
+ double mBBox[6]; // 48B. floating-point bounds of active values in WORLD SPACE
+ double mVoxelSize[3]; // 24B. size of a voxel in world units
+ uint32_t mGridClass; // 4B.
+ uint32_t mGridType; // 4B.
+ uint64_t mBlindMetadataOffset; // 8B. offset of GridBlindMetaData structures.
+ uint32_t mBlindMetadataCount; // 4B. count of GridBlindMetaData structures.
+ uint32_t _reserved[CNANOVDB_ALIGNMENT_PADDING(8 + 8 + 4 + 4 + 8 + 256 + 24 + 24 + sizeof(cnanovdb_map) + 24 + 4 + 4 + 8 + 4, CNANOVDB_DATA_ALIGNMENT) / 4];
+} cnanovdb_griddata;
+
+void
+cnanovdb_griddata_worldToIndex(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_griddata *RESTRICT grid, const cnanovdb_Vec3F *src)
+{
+ cnanovdb_map_applyInverse(dst, &grid->mMap, src);
+}
+
+void
+cnanovdb_griddata_indexToWorld(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_griddata *RESTRICT grid, const cnanovdb_Vec3F *src)
+{
+ cnanovdb_map_apply(dst, &grid->mMap, src);
+}
+
+void
+cnanovdb_griddata_worldToIndexDir(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_griddata *RESTRICT grid, const cnanovdb_Vec3F *src)
+{
+ cnanovdb_map_applyInverseJacobi(dst, &grid->mMap, src);
+}
+
+void
+cnanovdb_griddata_indexToWorldDir(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_griddata *RESTRICT grid, const cnanovdb_Vec3F *src)
+{
+ cnanovdb_map_applyJacobi(dst, &grid->mMap, src);
+}
+
+void
+cnanovdb_griddata_applyIJT(cnanovdb_Vec3F *dst, const CNANOVDB_GLOBAL cnanovdb_griddata *RESTRICT grid, const cnanovdb_Vec3F *src)
+{
+ cnanovdb_map_applyIJT(dst, &grid->mMap, src);
+}
+
+typedef struct
+{
+ uint64_t mBytes[ROOT_LEVEL + 1];
+ uint32_t mCount[ROOT_LEVEL + 1];
+ uint8_t _reserved[CNANOVDB_ALIGNMENT_PADDING(4*(sizeof(uint64_t)+sizeof(uint32_t)), CNANOVDB_DATA_ALIGNMENT)];
+} cnanovdb_treedata;
+
+const CNANOVDB_GLOBAL cnanovdb_treedata *
+cnanovdb_griddata_tree(const CNANOVDB_GLOBAL cnanovdb_griddata *RESTRICT griddata)
+{
+ return (const CNANOVDB_GLOBAL cnanovdb_treedata *)(griddata + 1);
+}
+
+#define CREATE_TILEENTRY(VALUETYPE, SUFFIX) \
+typedef union \
+{ \
+ VALUETYPE value; \
+ uint32_t childID; \
+} cnanovdb_tileentry##SUFFIX; \
+/**/
+
+typedef struct
+{
+ cnanovdb_coord mKey;
+ const CNANOVDB_GLOBAL void *mNode[4];
+} cnanovdb_readaccessor;
+
+
+void
+cnanovdb_readaccessor_insert(cnanovdb_readaccessor *RESTRICT acc, int childlevel, const CNANOVDB_GLOBAL void *RESTRICT node, const cnanovdb_coord *RESTRICT ijk)
+{
+ acc->mNode[childlevel] = node;
+ acc->mKey.mVec[0] = ijk->mVec[0];
+ acc->mKey.mVec[1] = ijk->mVec[1];
+ acc->mKey.mVec[2] = ijk->mVec[2];
+}
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list