[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