| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright Contributors to the OpenVDB Project | ||
| 2 | // SPDX-License-Identifier: MPL-2.0 | ||
| 3 | |||
| 4 | /// @file codegen/PointFunctions.cc | ||
| 5 | /// | ||
| 6 | /// @authors Nick Avramoussis, Richard Jones | ||
| 7 | /// | ||
| 8 | /// @brief Contains the function objects that define the functions used in | ||
| 9 | /// point compute function generation, to be inserted into the | ||
| 10 | /// FunctionRegistry. These define the functions available when operating | ||
| 11 | /// on points. Also includes the definitions for the point attribute | ||
| 12 | /// retrieval and setting. | ||
| 13 | /// | ||
| 14 | |||
| 15 | #include "Functions.h" | ||
| 16 | #include "FunctionTypes.h" | ||
| 17 | #include "Types.h" | ||
| 18 | #include "Utils.h" | ||
| 19 | #include "PointLeafLocalData.h" | ||
| 20 | |||
| 21 | #include "openvdb_ax/ast/Tokens.h" | ||
| 22 | #include "openvdb_ax/compiler/CompilerOptions.h" | ||
| 23 | #include "openvdb_ax/Exceptions.h" | ||
| 24 | |||
| 25 | #include <openvdb/openvdb.h> | ||
| 26 | #include <openvdb/points/PointDataGrid.h> | ||
| 27 | |||
| 28 | #include <unordered_map> | ||
| 29 | |||
| 30 | namespace openvdb { | ||
| 31 | OPENVDB_USE_VERSION_NAMESPACE | ||
| 32 | namespace OPENVDB_VERSION_NAME { | ||
| 33 | |||
| 34 | namespace ax { | ||
| 35 | namespace codegen { | ||
| 36 | |||
| 37 | namespace | ||
| 38 | { | ||
| 39 | |||
| 40 | #define OPENVDB_AX_CHECK_MODULE_CONTEXT(B) \ | ||
| 41 | { \ | ||
| 42 | const llvm::Function* F = B.GetInsertBlock()->getParent(); \ | ||
| 43 | const llvm::Module* M = F ? F->getParent() : nullptr; \ | ||
| 44 | if (!M || M->getName() != "ax.point.module") { \ | ||
| 45 | OPENVDB_THROW(AXCompilerError, "Function \"" << (F ? F->getName().str() : "unknown") << \ | ||
| 46 | "\" cannot be called for the current target:\"" << (M ? M->getName().str() : "unknown") << \ | ||
| 47 | "\". This function only runs on OpenVDB Point Grids."); \ | ||
| 48 | } \ | ||
| 49 | } | ||
| 50 | |||
| 51 | /// @brief Retrieve a group handle from an expected vector of handles using the offset | ||
| 52 | /// pointed to by the engine data. Note that HandleT should only ever be a GroupHandle | ||
| 53 | /// or GroupWriteHandle object | ||
| 54 | template <typename HandleT> | ||
| 55 | inline HandleT* | ||
| 56 | groupHandle(const std::string& name, void** groupHandles, const void* const data) | ||
| 57 | { | ||
| 58 | const openvdb::points::AttributeSet* const attributeSet = | ||
| 59 | static_cast<const openvdb::points::AttributeSet*>(data); | ||
| 60 | |||
| 61 |
2/4✓ Branch 1 taken 49 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 47 times.
✗ Branch 5 not taken.
|
96 | const size_t groupIdx = attributeSet->groupOffset(name); |
| 62 |
4/4✓ Branch 0 taken 7 times.
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 17 times.
✓ Branch 3 taken 30 times.
|
96 | if (groupIdx == openvdb::points::AttributeSet::INVALID_POS) return nullptr; |
| 63 | |||
| 64 | 24 | return static_cast<HandleT*>(groupHandles[groupIdx]); | |
| 65 | } | ||
| 66 | |||
| 67 | } | ||
| 68 | |||
| 69 | /////////////////////////////////////////////////////////////////////////////// | ||
| 70 | /////////////////////////////////////////////////////////////////////////////// | ||
| 71 | |||
| 72 | 24 | inline FunctionGroup::UniquePtr ax_ingroup(const FunctionOptions& op) | |
| 73 | { | ||
| 74 | static auto ingroup = | ||
| 75 | 59 | [](const codegen::String* const name, | |
| 76 | const uint64_t index, | ||
| 77 | void** groupHandles, | ||
| 78 | const void* const leafDataPtr, | ||
| 79 | const void* const data) -> bool | ||
| 80 | { | ||
| 81 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 59 times.
|
59 | assert(name); |
| 82 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 59 times.
|
59 | assert(index < static_cast<uint64_t>(std::numeric_limits<openvdb::Index>::max())); |
| 83 | |||
| 84 |
1/2✓ Branch 0 taken 59 times.
✗ Branch 1 not taken.
|
59 | if (name->size() == 0) return false; |
| 85 |
2/2✓ Branch 0 taken 47 times.
✓ Branch 1 taken 12 times.
|
59 | if (!groupHandles) return false; |
| 86 | |||
| 87 | const std::string nameStr = name->str(); | ||
| 88 | const openvdb::points::GroupHandle* handle = | ||
| 89 | groupHandle<openvdb::points::GroupHandle>(nameStr, groupHandles, data); | ||
| 90 |
2/4✓ Branch 0 taken 17 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 17 times.
✗ Branch 4 not taken.
|
17 | if (handle) return handle->get(static_cast<openvdb::Index>(index)); |
| 91 | |||
| 92 | // If the handle doesn't exist, check to see if any new groups have | ||
| 93 | // been added | ||
| 94 | const codegen_internal::PointLeafLocalData* const leafData = | ||
| 95 | static_cast<const codegen_internal::PointLeafLocalData*>(leafDataPtr); | ||
| 96 | 30 | handle = leafData->get(nameStr); | |
| 97 |
4/6✓ Branch 0 taken 4 times.
✓ Branch 1 taken 26 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
|
30 | return handle ? handle->get(static_cast<openvdb::Index>(index)) : false; |
| 98 | }; | ||
| 99 | |||
| 100 | using InGroup = bool(const codegen::String* const, | ||
| 101 | const uint64_t, | ||
| 102 | void**, | ||
| 103 | const void* const, | ||
| 104 | const void* const); | ||
| 105 | |||
| 106 | 48 | return FunctionBuilder("_ingroup") | |
| 107 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addSignature<InGroup>(ingroup) |
| 108 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addParameterAttribute(0, llvm::Attribute::ReadOnly) |
| 109 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addParameterAttribute(2, llvm::Attribute::ReadOnly) |
| 110 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addParameterAttribute(2, llvm::Attribute::NoAlias) |
| 111 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addParameterAttribute(3, llvm::Attribute::ReadOnly) |
| 112 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addParameterAttribute(3, llvm::Attribute::NoAlias) |
| 113 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addParameterAttribute(4, llvm::Attribute::ReadOnly) |
| 114 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addParameterAttribute(4, llvm::Attribute::NoAlias) |
| 115 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | .addFunctionAttribute(llvm::Attribute::ReadOnly) |
| 116 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
|
24 | .addFunctionAttribute(llvm::Attribute::NoRecurse) |
| 117 | // @note handle->get can throw, so no unwind. Maybe use getUnsafe? | ||
| 118 | .setConstantFold(false) | ||
| 119 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
|
24 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 120 | .setDocumentation("Internal function for querying point group data") | ||
| 121 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
48 | .get(); |
| 122 | } | ||
| 123 | |||
| 124 | 7 | inline FunctionGroup::UniquePtr axingroup(const FunctionOptions& op) | |
| 125 | { | ||
| 126 | static auto generate = | ||
| 127 |
1/2✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
|
18 | [op](const std::vector<llvm::Value*>& args, |
| 128 | llvm::IRBuilder<>& B) -> llvm::Value* | ||
| 129 | { | ||
| 130 |
11/26✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 17 times.
✓ Branch 5 taken 1 times.
✓ Branch 7 taken 17 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
|
25 | OPENVDB_AX_CHECK_MODULE_CONTEXT(B); |
| 131 | // Pull out parent function arguments | ||
| 132 | llvm::Function* compute = B.GetInsertBlock()->getParent(); | ||
| 133 |
2/4✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
|
17 | llvm::Value* point_index = extractArgument(compute, "point_index"); |
| 134 |
2/4✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
|
17 | llvm::Value* group_handles = extractArgument(compute, "group_handles"); |
| 135 |
2/4✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
|
17 | llvm::Value* leaf_data = extractArgument(compute, "leaf_data"); |
| 136 |
2/4✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
|
17 | llvm::Value* attribute_set = extractArgument(compute, "attribute_set"); |
| 137 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
|
17 | assert(point_index); |
| 138 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
|
17 | assert(group_handles); |
| 139 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
|
17 | assert(leaf_data); |
| 140 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
|
17 | assert(attribute_set); |
| 141 | |||
| 142 | 17 | std::vector<llvm::Value*> input(args); | |
| 143 |
1/2✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
|
17 | input.emplace_back(point_index); |
| 144 |
1/2✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
|
17 | input.emplace_back(group_handles); |
| 145 |
1/2✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
|
17 | input.emplace_back(leaf_data); |
| 146 |
1/2✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
|
17 | input.emplace_back(attribute_set); |
| 147 |
3/8✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 17 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
34 | return ax_ingroup(op)->execute(input, B); |
| 148 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
7 | }; |
| 149 | |||
| 150 | 7 | return FunctionBuilder("ingroup") | |
| 151 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
14 | .addSignature<bool(const codegen::String* const)>(generate) |
| 152 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
|
7 | .addDependency("_ingroup") |
| 153 | .setEmbedIR(true) | ||
| 154 | .setConstantFold(false) | ||
| 155 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
|
7 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 156 | .setDocumentation( "Return whether or not the current point is " | ||
| 157 | "a member of the given group name. This returns false if the group does " | ||
| 158 | "not exist.") | ||
| 159 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
14 | .get(); |
| 160 | } | ||
| 161 | |||
| 162 | 30 | inline FunctionGroup::UniquePtr axeditgroup(const FunctionOptions& op) | |
| 163 | { | ||
| 164 | static auto editgroup = | ||
| 165 | 54 | [](const codegen::String* const name, | |
| 166 | const uint64_t index, | ||
| 167 | void** groupHandles, | ||
| 168 | void* const leafDataPtr, | ||
| 169 | const void* const data, | ||
| 170 | const bool flag) | ||
| 171 | { | ||
| 172 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
|
54 | assert(name); |
| 173 |
1/2✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
|
58 | if (name->size() == 0) return; |
| 174 | |||
| 175 | // Get the group handle out of the pre-existing container of handles if they | ||
| 176 | // exist | ||
| 177 | |||
| 178 | const std::string nameStr = name->str(); | ||
| 179 | openvdb::points::GroupWriteHandle* handle = nullptr; | ||
| 180 |
2/2✓ Branch 0 taken 49 times.
✓ Branch 1 taken 5 times.
|
54 | if (groupHandles) { |
| 181 | handle = groupHandle<openvdb::points::GroupWriteHandle>(nameStr, groupHandles, data); | ||
| 182 | } | ||
| 183 | |||
| 184 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
|
7 | if (!handle) { |
| 185 | codegen_internal::PointLeafLocalData* const leafData = | ||
| 186 | static_cast<codegen_internal::PointLeafLocalData*>(leafDataPtr); | ||
| 187 | |||
| 188 | // If we are setting membership and the handle doesn't exist, create in in | ||
| 189 | // the set of new data thats being added | ||
| 190 |
4/4✓ Branch 0 taken 6 times.
✓ Branch 1 taken 41 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
|
53 | if (!flag && !leafData->hasGroup(nameStr)) return; |
| 191 |
1/2✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
|
43 | handle = leafData->getOrInsert(nameStr); |
| 192 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
|
43 | assert(handle); |
| 193 | } | ||
| 194 | |||
| 195 | // set the group membership | ||
| 196 |
1/2✓ Branch 1 taken 50 times.
✗ Branch 2 not taken.
|
50 | handle->set(static_cast<openvdb::Index>(index), flag); |
| 197 | }; | ||
| 198 | |||
| 199 | static auto editgroupcstar = | ||
| 200 | 5 | [](const char* const name, | |
| 201 | const uint64_t index, | ||
| 202 | void** groupHandles, | ||
| 203 | void* const leafDataPtr, | ||
| 204 | const void* const data, | ||
| 205 | const bool flag) | ||
| 206 | { | ||
| 207 | const codegen::String str(name); | ||
| 208 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | editgroup(&str, index, groupHandles, leafDataPtr, data, flag); |
| 209 | 5 | }; | |
| 210 | |||
| 211 | using EditGroup = void(const codegen::String* const, | ||
| 212 | const uint64_t, | ||
| 213 | void**, | ||
| 214 | void* const, | ||
| 215 | const void* const, | ||
| 216 | const bool); | ||
| 217 | |||
| 218 | using EditGroupCstar = void(const char* const, | ||
| 219 | const uint64_t, | ||
| 220 | void**, | ||
| 221 | void* const, | ||
| 222 | const void* const, | ||
| 223 | const bool); | ||
| 224 | |||
| 225 | 60 | return FunctionBuilder("editgroup") | |
| 226 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | .addSignature<EditGroup>(editgroup) |
| 227 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | .addSignature<EditGroupCstar>(editgroupcstar) |
| 228 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | .addParameterAttribute(0, llvm::Attribute::ReadOnly) |
| 229 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | .addParameterAttribute(2, llvm::Attribute::ReadOnly) |
| 230 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | .addParameterAttribute(3, llvm::Attribute::ReadOnly) |
| 231 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
|
30 | .addParameterAttribute(4, llvm::Attribute::ReadOnly) |
| 232 | .setConstantFold(false) | ||
| 233 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
|
30 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 234 | .setDocumentation("Internal function for setting point group data") | ||
| 235 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
60 | .get(); |
| 236 | } | ||
| 237 | |||
| 238 | 15 | inline FunctionGroup::UniquePtr axaddtogroup(const FunctionOptions& op) | |
| 239 | { | ||
| 240 | static auto generate = | ||
| 241 |
1/2✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
|
18 | [op](const std::vector<llvm::Value*>& args, |
| 242 | llvm::IRBuilder<>& B) -> llvm::Value* | ||
| 243 | { | ||
| 244 |
11/26✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 2 times.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
|
32 | OPENVDB_AX_CHECK_MODULE_CONTEXT(B); |
| 245 | // Pull out parent function arguments | ||
| 246 | llvm::Function* compute = B.GetInsertBlock()->getParent(); | ||
| 247 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | llvm::Value* point_index = extractArgument(compute, "point_index"); |
| 248 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | llvm::Value* group_handles = extractArgument(compute, "group_handles"); |
| 249 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | llvm::Value* leaf_data = extractArgument(compute, "leaf_data"); |
| 250 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | llvm::Value* attribute_set = extractArgument(compute, "attribute_set"); |
| 251 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
|
16 | assert(point_index); |
| 252 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
|
16 | assert(group_handles); |
| 253 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
|
16 | assert(leaf_data); |
| 254 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
|
16 | assert(attribute_set); |
| 255 | |||
| 256 | 16 | std::vector<llvm::Value*> input(args); | |
| 257 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | input.emplace_back(point_index); |
| 258 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | input.emplace_back(group_handles); |
| 259 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | input.emplace_back(leaf_data); |
| 260 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | input.emplace_back(attribute_set); |
| 261 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | input.emplace_back(llvm::ConstantInt::get(LLVMType<bool>::get(B.getContext()), true)); |
| 262 |
3/8✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
32 | return axeditgroup(op)->execute(input, B); |
| 263 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 14 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
15 | }; |
| 264 | |||
| 265 | 15 | return FunctionBuilder("addtogroup") | |
| 266 |
1/2✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
|
30 | .addSignature<void(const codegen::String* const)>(generate) |
| 267 |
2/6✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
30 | .addSignature<void(const char* const)>(generate) // to support axdeletepoint() @todo fix |
| 268 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
|
15 | .addDependency("editgroup") |
| 269 | .setEmbedIR(true) | ||
| 270 | .setConstantFold(false) | ||
| 271 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
|
15 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 272 | .setDocumentation("Add the current point to the given group " | ||
| 273 | "name, effectively setting its membership to true. If the group does not " | ||
| 274 | "exist, it is implicitly created. This function has no effect if the point " | ||
| 275 | "already belongs to the given group.") | ||
| 276 |
1/2✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
|
30 | .get(); |
| 277 | } | ||
| 278 | |||
| 279 | 6 | inline FunctionGroup::UniquePtr axremovefromgroup(const FunctionOptions& op) | |
| 280 | { | ||
| 281 | static auto generate = | ||
| 282 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
5 | [op](const std::vector<llvm::Value*>& args, |
| 283 | llvm::IRBuilder<>& B) -> llvm::Value* | ||
| 284 | { | ||
| 285 | // Pull out parent function arguments | ||
| 286 |
11/26✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 1 times.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
|
12 | OPENVDB_AX_CHECK_MODULE_CONTEXT(B); |
| 287 | llvm::Function* compute = B.GetInsertBlock()->getParent(); | ||
| 288 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | llvm::Value* point_index = extractArgument(compute, "point_index"); |
| 289 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | llvm::Value* group_handles = extractArgument(compute, "group_handles"); |
| 290 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | llvm::Value* leaf_data = extractArgument(compute, "leaf_data"); |
| 291 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | llvm::Value* attribute_set = extractArgument(compute, "attribute_set"); |
| 292 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | assert(point_index); |
| 293 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | assert(group_handles); |
| 294 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | assert(leaf_data); |
| 295 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | assert(attribute_set); |
| 296 | |||
| 297 | 4 | std::vector<llvm::Value*> input(args); | |
| 298 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | input.emplace_back(point_index); |
| 299 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | input.emplace_back(group_handles); |
| 300 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | input.emplace_back(leaf_data); |
| 301 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | input.emplace_back(attribute_set); |
| 302 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | input.emplace_back(llvm::ConstantInt::get(LLVMType<bool>::get(B.getContext()), false)); |
| 303 |
3/8✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
8 | return axeditgroup(op)->execute(input, B); |
| 304 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
6 | }; |
| 305 | |||
| 306 | 6 | return FunctionBuilder("removefromgroup") | |
| 307 |
1/2✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
|
12 | .addSignature<void(const codegen::String* const)>(generate) |
| 308 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
|
6 | .addDependency("editgroup") |
| 309 | .setEmbedIR(true) | ||
| 310 | .setConstantFold(false) | ||
| 311 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
|
6 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 312 | .setDocumentation("Remove the current point from the " | ||
| 313 | "given group name, effectively setting its membership to false. This " | ||
| 314 | "function has no effect if the group does not exist.") | ||
| 315 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
12 | .get(); |
| 316 | } | ||
| 317 | |||
| 318 | 7 | inline FunctionGroup::UniquePtr axdeletepoint(const FunctionOptions& op) | |
| 319 | { | ||
| 320 | static auto generate = | ||
| 321 | 5 | [op](const std::vector<llvm::Value*>&, | |
| 322 | llvm::IRBuilder<>& B) -> llvm::Value* | ||
| 323 | { | ||
| 324 | // args guaranteed to be empty | ||
| 325 | 5 | const std::string deadGroup = "__ax_dead"; | |
| 326 |
1/2✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
10 | llvm::Constant* loc = llvm::cast<llvm::Constant>(B.CreateGlobalStringPtr(deadGroup.c_str())); // char* |
| 327 |
4/6✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 1 times.
|
11 | return axaddtogroup(op)->execute({loc}, B); |
| 328 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
7 | }; |
| 329 | |||
| 330 | 7 | return FunctionBuilder("deletepoint") | |
| 331 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
14 | .addSignature<void()>(generate) |
| 332 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | .addDependency("addtogroup") |
| 333 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
|
7 | .addFunctionAttribute(llvm::Attribute::AlwaysInline) |
| 334 | .setEmbedIR(true) // axaddtogroup needs access to parent function arguments | ||
| 335 | .setConstantFold(false) | ||
| 336 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
|
7 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 337 | .setDocumentation("Delete the current point from the point set. Note that this does not " | ||
| 338 | "stop AX execution - any additional AX commands will be executed on the " | ||
| 339 | "point and it will remain accessible until the end of execution.") | ||
| 340 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
14 | .get(); |
| 341 | } | ||
| 342 | |||
| 343 | 724 | inline FunctionGroup::UniquePtr axsetattribute(const FunctionOptions& op) | |
| 344 | { | ||
| 345 | static auto setattribptr = | ||
| 346 | 498 | [](void* attributeHandle, uint64_t index, const auto value) | |
| 347 | { | ||
| 348 | using ValueType = typename std::remove_const | ||
| 349 | <typename std::remove_pointer | ||
| 350 | <decltype(value)>::type>::type; | ||
| 351 | using AttributeHandleType = openvdb::points::AttributeWriteHandle<ValueType>; | ||
| 352 | |||
| 353 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 249 times.
|
498 | assert(attributeHandle); |
| 354 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 249 times.
|
498 | assert(value); |
| 355 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 249 times.
|
498 | assert(index < static_cast<uint64_t>(std::numeric_limits<openvdb::Index>::max())); |
| 356 | |||
| 357 | AttributeHandleType* handle = static_cast<AttributeHandleType*>(attributeHandle); | ||
| 358 | 498 | handle->set(static_cast<openvdb::Index>(index), *value); | |
| 359 | 498 | }; | |
| 360 | |||
| 361 | static auto setattribstr = | ||
| 362 | 210 | [](void* attributeHandle, | |
| 363 | const uint64_t index, | ||
| 364 | const codegen::String* value, | ||
| 365 | void* const leafDataPtr) | ||
| 366 | { | ||
| 367 | using AttributeHandleType = openvdb::points::StringAttributeWriteHandle; | ||
| 368 | |||
| 369 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
|
210 | assert(attributeHandle); |
| 370 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
|
210 | assert(value); |
| 371 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
|
210 | assert(leafDataPtr); |
| 372 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
|
210 | assert(index < static_cast<uint64_t>(std::numeric_limits<openvdb::Index>::max())); |
| 373 | |||
| 374 | const std::string s = value->str(); | ||
| 375 | AttributeHandleType* const handle = | ||
| 376 | static_cast<AttributeHandleType*>(attributeHandle); | ||
| 377 | codegen_internal::PointLeafLocalData* const leafData = | ||
| 378 | static_cast<codegen_internal::PointLeafLocalData*>(leafDataPtr); | ||
| 379 | |||
| 380 | // Check to see if the string exists in the metadata cache. If so, set the string and | ||
| 381 | // remove any new data associated with it, otherwise set the new data | ||
| 382 | |||
| 383 |
3/4✓ Branch 1 taken 210 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 25 times.
✓ Branch 4 taken 185 times.
|
210 | if (handle->contains(s)) { |
| 384 |
1/2✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
|
25 | handle->set(static_cast<openvdb::Index>(index), s); |
| 385 |
1/2✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
|
25 | leafData->removeNewStringData(&(handle->array()), index); |
| 386 | } | ||
| 387 | else { | ||
| 388 |
2/4✓ Branch 1 taken 185 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 185 times.
✗ Branch 5 not taken.
|
185 | leafData->setNewStringData(&(handle->array()), index, s); |
| 389 | } | ||
| 390 | 210 | }; | |
| 391 | |||
| 392 | static auto setattrib = | ||
| 393 | [](void* attributeHandle, | ||
| 394 | uint64_t index, | ||
| 395 | const auto value) { | ||
| 396 | setattribptr(attributeHandle, index, &value); | ||
| 397 | }; | ||
| 398 | |||
| 399 | using SetAttribD = void(void*, uint64_t, const double); | ||
| 400 | using SetAttribF = void(void*, uint64_t, const float); | ||
| 401 | using SetAttribI64 = void(void*, uint64_t, const int64_t); | ||
| 402 | using SetAttribI32 = void(void*, uint64_t, const int32_t); | ||
| 403 | using SetAttribI16 = void(void*, uint64_t, const int16_t); | ||
| 404 | using SetAttribB = void(void*, uint64_t, const bool); | ||
| 405 | using SetAttribV2D = void(void*, uint64_t, const openvdb::math::Vec2<double>*); | ||
| 406 | using SetAttribV2F = void(void*, uint64_t, const openvdb::math::Vec2<float>*); | ||
| 407 | using SetAttribV2I = void(void*, uint64_t, const openvdb::math::Vec2<int32_t>*); | ||
| 408 | using SetAttribV3D = void(void*, uint64_t, const openvdb::math::Vec3<double>*); | ||
| 409 | using SetAttribV3F = void(void*, uint64_t, const openvdb::math::Vec3<float>*); | ||
| 410 | using SetAttribV3I = void(void*, uint64_t, const openvdb::math::Vec3<int32_t>*); | ||
| 411 | using SetAttribV4D = void(void*, uint64_t, const openvdb::math::Vec4<double>*); | ||
| 412 | using SetAttribV4F = void(void*, uint64_t, const openvdb::math::Vec4<float>*); | ||
| 413 | using SetAttribV4I = void(void*, uint64_t, const openvdb::math::Vec4<int32_t>*); | ||
| 414 | using SetAttribM3D = void(void*, uint64_t, const openvdb::math::Mat3<double>*); | ||
| 415 | using SetAttribM3F = void(void*, uint64_t, const openvdb::math::Mat3<float>*); | ||
| 416 | using SetAttribM4D = void(void*, uint64_t, const openvdb::math::Mat4<double>*); | ||
| 417 | using SetAttribM4F = void(void*, uint64_t, const openvdb::math::Mat4<float>*); | ||
| 418 | using SetAttribStr = void(void*, uint64_t, const codegen::String*, void* const); | ||
| 419 | |||
| 420 | 1448 | return FunctionBuilder("setattribute") | |
| 421 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribD>((SetAttribD*)(setattrib)) |
| 422 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribF>((SetAttribF*)(setattrib)) |
| 423 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribI64>((SetAttribI64*)(setattrib)) |
| 424 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribI32>((SetAttribI32*)(setattrib)) |
| 425 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribI16>((SetAttribI16*)(setattrib)) |
| 426 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribB>((SetAttribB*)(setattrib)) |
| 427 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addParameterAttribute(0, llvm::Attribute::ReadOnly) |
| 428 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addFunctionAttribute(llvm::Attribute::NoRecurse) |
| 429 | .setConstantFold(false) | ||
| 430 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV2D>((SetAttribV2D*)(setattribptr)) |
| 431 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV2F>((SetAttribV2F*)(setattribptr)) |
| 432 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV2I>((SetAttribV2I*)(setattribptr)) |
| 433 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV3D>((SetAttribV3D*)(setattribptr)) |
| 434 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV3F>((SetAttribV3F*)(setattribptr)) |
| 435 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV3I>((SetAttribV3I*)(setattribptr)) |
| 436 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV4D>((SetAttribV4D*)(setattribptr)) |
| 437 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV4F>((SetAttribV4F*)(setattribptr)) |
| 438 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribV4I>((SetAttribV4I*)(setattribptr)) |
| 439 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribM3D>((SetAttribM3D*)(setattribptr)) |
| 440 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribM3F>((SetAttribM3F*)(setattribptr)) |
| 441 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribM4D>((SetAttribM4D*)(setattribptr)) |
| 442 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribM4F>((SetAttribM4F*)(setattribptr)) |
| 443 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addParameterAttribute(0, llvm::Attribute::ReadOnly) |
| 444 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addParameterAttribute(2, llvm::Attribute::ReadOnly) |
| 445 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addFunctionAttribute(llvm::Attribute::NoRecurse) |
| 446 | .setConstantFold(false) | ||
| 447 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addSignature<SetAttribStr>((SetAttribStr*)(setattribstr)) |
| 448 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addParameterAttribute(0, llvm::Attribute::ReadOnly) |
| 449 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addParameterAttribute(2, llvm::Attribute::ReadOnly) |
| 450 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
724 | .addParameterAttribute(3, llvm::Attribute::ReadOnly) |
| 451 |
2/2✓ Branch 0 taken 232 times.
✓ Branch 1 taken 492 times.
|
724 | .addFunctionAttribute(llvm::Attribute::NoRecurse) |
| 452 | .setConstantFold(false) | ||
| 453 |
2/2✓ Branch 0 taken 232 times.
✓ Branch 1 taken 492 times.
|
724 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 454 | .setDocumentation("Internal function for setting the value of a point attribute.") | ||
| 455 |
1/2✓ Branch 1 taken 724 times.
✗ Branch 2 not taken.
|
1448 | .get(); |
| 456 | } | ||
| 457 | |||
| 458 | 728 | inline FunctionGroup::UniquePtr axgetattribute(const FunctionOptions& op) | |
| 459 | { | ||
| 460 | static auto getattrib = | ||
| 461 | 498 | [](void* attributeHandle, uint64_t index, auto value) | |
| 462 | { | ||
| 463 | using ValueType = typename std::remove_const | ||
| 464 | <typename std::remove_pointer | ||
| 465 | <decltype(value)>::type>::type; | ||
| 466 | // typedef is a read handle. As write handles are derived types this | ||
| 467 | // is okay and lets us define the handle types outside IR for attributes that are | ||
| 468 | // only being read! | ||
| 469 | using AttributeHandleType = openvdb::points::AttributeHandle<ValueType>; | ||
| 470 | |||
| 471 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 249 times.
|
498 | assert(value); |
| 472 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 249 times.
|
498 | assert(attributeHandle); |
| 473 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 249 times.
|
498 | assert(index < static_cast<uint64_t>(std::numeric_limits<openvdb::Index>::max())); |
| 474 | |||
| 475 | AttributeHandleType* handle = static_cast<AttributeHandleType*>(attributeHandle); | ||
| 476 | 498 | (*value) = handle->get(static_cast<openvdb::Index>(index)); | |
| 477 | 498 | }; | |
| 478 | |||
| 479 | static auto getattribstr = | ||
| 480 | 225 | [](void* attributeHandle, | |
| 481 | uint64_t index, | ||
| 482 | codegen::String* value, | ||
| 483 | const void* const leafDataPtr) | ||
| 484 | { | ||
| 485 | using AttributeHandleType = openvdb::points::StringAttributeHandle; | ||
| 486 | |||
| 487 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 225 times.
|
225 | assert(value); |
| 488 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 225 times.
|
225 | assert(attributeHandle); |
| 489 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 225 times.
|
225 | assert(leafDataPtr); |
| 490 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 225 times.
|
225 | assert(index < static_cast<uint64_t>(std::numeric_limits<openvdb::Index>::max())); |
| 491 | |||
| 492 | AttributeHandleType* const handle = | ||
| 493 | static_cast<AttributeHandleType*>(attributeHandle); | ||
| 494 | const codegen_internal::PointLeafLocalData* const leafData = | ||
| 495 | static_cast<const codegen_internal::PointLeafLocalData*>(leafDataPtr); | ||
| 496 | |||
| 497 | std::string data; | ||
| 498 |
3/6✓ Branch 1 taken 225 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 225 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 225 times.
✗ Branch 7 not taken.
|
225 | if (!leafData->getNewStringData(&(handle->array()), index, data)) { |
| 499 |
1/2✓ Branch 1 taken 225 times.
✗ Branch 2 not taken.
|
225 | handle->get(data, static_cast<openvdb::Index>(index)); |
| 500 | } | ||
| 501 | |||
| 502 | 225 | *value = data; | |
| 503 | 225 | }; | |
| 504 | |||
| 505 | using GetAttribD = void(void*, uint64_t, double*); | ||
| 506 | using GetAttribF = void(void*, uint64_t, float*); | ||
| 507 | using GetAttribI64 = void(void*, uint64_t, int64_t*); | ||
| 508 | using GetAttribI32 = void(void*, uint64_t, int32_t*); | ||
| 509 | using GetAttribI16 = void(void*, uint64_t, int16_t*); | ||
| 510 | using GetAttribB = void(void*, uint64_t, bool*); | ||
| 511 | using GetAttribV2D = void(void*, uint64_t, openvdb::math::Vec2<double>*); | ||
| 512 | using GetAttribV2F = void(void*, uint64_t, openvdb::math::Vec2<float>*); | ||
| 513 | using GetAttribV2I = void(void*, uint64_t, openvdb::math::Vec2<int32_t>*); | ||
| 514 | using GetAttribV3D = void(void*, uint64_t, openvdb::math::Vec3<double>*); | ||
| 515 | using GetAttribV3F = void(void*, uint64_t, openvdb::math::Vec3<float>*); | ||
| 516 | using GetAttribV3I = void(void*, uint64_t, openvdb::math::Vec3<int32_t>*); | ||
| 517 | using GetAttribV4D = void(void*, uint64_t, openvdb::math::Vec4<double>*); | ||
| 518 | using GetAttribV4F = void(void*, uint64_t, openvdb::math::Vec4<float>*); | ||
| 519 | using GetAttribV4I = void(void*, uint64_t, openvdb::math::Vec4<int32_t>*); | ||
| 520 | using GetAttribM3D = void(void*, uint64_t, openvdb::math::Mat3<double>*); | ||
| 521 | using GetAttribM3F = void(void*, uint64_t, openvdb::math::Mat3<float>*); | ||
| 522 | using GetAttribM4D = void(void*, uint64_t, openvdb::math::Mat4<double>*); | ||
| 523 | using GetAttribM4F = void(void*, uint64_t, openvdb::math::Mat4<float>*); | ||
| 524 | using GetAttribStr = void(void*, uint64_t, codegen::String*, const void* const); | ||
| 525 | |||
| 526 | 1456 | return FunctionBuilder("getattribute") | |
| 527 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribD>((GetAttribD*)(getattrib)) |
| 528 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribF>((GetAttribF*)(getattrib)) |
| 529 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribI64>((GetAttribI64*)(getattrib)) |
| 530 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribI32>((GetAttribI32*)(getattrib)) |
| 531 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribI16>((GetAttribI16*)(getattrib)) |
| 532 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribB>((GetAttribB*)(getattrib)) |
| 533 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV2D>((GetAttribV2D*)(getattrib)) |
| 534 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV2F>((GetAttribV2F*)(getattrib)) |
| 535 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV2I>((GetAttribV2I*)(getattrib)) |
| 536 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV3D>((GetAttribV3D*)(getattrib)) |
| 537 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV3F>((GetAttribV3F*)(getattrib)) |
| 538 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV3I>((GetAttribV3I*)(getattrib)) |
| 539 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV4D>((GetAttribV4D*)(getattrib)) |
| 540 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV4F>((GetAttribV4F*)(getattrib)) |
| 541 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribV4I>((GetAttribV4I*)(getattrib)) |
| 542 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribM3D>((GetAttribM3D*)(getattrib)) |
| 543 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribM3F>((GetAttribM3F*)(getattrib)) |
| 544 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribM4D>((GetAttribM4D*)(getattrib)) |
| 545 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribM4F>((GetAttribM4F*)(getattrib)) |
| 546 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addParameterAttribute(0, llvm::Attribute::ReadOnly) |
| 547 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addFunctionAttribute(llvm::Attribute::NoRecurse) |
| 548 | .setConstantFold(false) | ||
| 549 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addSignature<GetAttribStr>((GetAttribStr*)(getattribstr)) |
| 550 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addParameterAttribute(0, llvm::Attribute::ReadOnly) |
| 551 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
728 | .addParameterAttribute(3, llvm::Attribute::ReadOnly) |
| 552 |
2/2✓ Branch 0 taken 232 times.
✓ Branch 1 taken 496 times.
|
728 | .addFunctionAttribute(llvm::Attribute::NoRecurse) |
| 553 | .setConstantFold(false) | ||
| 554 |
2/2✓ Branch 0 taken 232 times.
✓ Branch 1 taken 496 times.
|
728 | .setPreferredImpl(op.mPrioritiseIR ? FunctionBuilder::IR : FunctionBuilder::C) |
| 555 | .setDocumentation("Internal function for getting the value of a point attribute.") | ||
| 556 |
1/2✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
|
1456 | .get(); |
| 557 | } | ||
| 558 | |||
| 559 | |||
| 560 | //////////////////////////////////////////////////////////////////////// | ||
| 561 | //////////////////////////////////////////////////////////////////////// | ||
| 562 | |||
| 563 | |||
| 564 | 1487 | void insertVDBPointFunctions(FunctionRegistry& registry, | |
| 565 | const FunctionOptions* options) | ||
| 566 | { | ||
| 567 |
4/4✓ Branch 0 taken 1486 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1485 times.
✓ Branch 3 taken 1 times.
|
1487 | const bool create = options && !options->mLazyFunctions; |
| 568 | 11896 | auto add = [&](const std::string& name, | |
| 569 | const FunctionRegistry::ConstructorT creator, | ||
| 570 | const bool internal = false) | ||
| 571 | { | ||
| 572 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 11888 times.
|
11896 | if (create) registry.insertAndCreate(name, creator, *options, internal); |
| 573 | 11888 | else registry.insert(name, creator, internal); | |
| 574 | 13383 | }; | |
| 575 | |||
| 576 | // point functions | ||
| 577 | |||
| 578 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("addtogroup", axaddtogroup); |
| 579 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("ingroup", axingroup); |
| 580 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("removefromgroup",axremovefromgroup); |
| 581 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("deletepoint", axdeletepoint); |
| 582 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("_ingroup", ax_ingroup, true); |
| 583 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("editgroup", axeditgroup, true); |
| 584 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("getattribute", axgetattribute, true); |
| 585 |
2/4✓ Branch 1 taken 1487 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1487 times.
✗ Branch 5 not taken.
|
1487 | add("setattribute", axsetattribute, true); |
| 586 | 1487 | } | |
| 587 | |||
| 588 | } // namespace codegen | ||
| 589 | } // namespace ax | ||
| 590 | } // namespace openvdb_version | ||
| 591 | } // namespace openvdb | ||
| 592 | |||
| 593 | |||
| 594 |