1 // Copyright 2020-2021 Intel Corporation 2 // SPDX-License-Identifier: Apache-2.0 3 4 #pragma once 5 6 #include "rkcommon/math/vec.h" 7 8 namespace openvkl { 9 namespace testing { 10 getAttributeIndices(unsigned int numAttributes)11 inline std::vector<unsigned int> getAttributeIndices( 12 unsigned int numAttributes) 13 { 14 std::vector<unsigned int> attributeIndices(numAttributes); 15 std::iota(attributeIndices.begin(), attributeIndices.end(), 0); 16 17 return attributeIndices; 18 } 19 20 struct ProceduralVolumeMulti 21 { ProceduralVolumeMultiProceduralVolumeMulti22 ProceduralVolumeMulti(bool supportsTime) : supportsTime(supportsTime) {} 23 24 virtual unsigned int getNumAttributes() const = 0; 25 26 // these public non-virtual methods handle all parameter defaults 27 28 float computeProceduralValue(const vec3f &objectCoordinates, 29 unsigned int attributeIndex, 30 float time = 0.f) const; 31 32 vec3f computeProceduralGradient(const vec3f &objectCoordinates, 33 unsigned int attributeIndex, 34 float time = 0.f) const; 35 36 protected: 37 virtual float computeProceduralValueImpl(const vec3f &objectCoordinates, 38 unsigned int attributeIndex, 39 float time) const = 0; 40 41 virtual vec3f computeProceduralGradientImpl( 42 const vec3f &objectCoordinates, 43 unsigned int attributeIndex, 44 float time) const = 0; 45 46 private: 47 bool supportsTime; 48 }; 49 50 // Inlined definitions //////////////////////////////////////////////////// 51 computeProceduralValue(const vec3f & objectCoordinates,unsigned int attributeIndex,float time)52 inline float ProceduralVolumeMulti::computeProceduralValue( 53 const vec3f &objectCoordinates, 54 unsigned int attributeIndex, 55 float time) const 56 { 57 if (!supportsTime && time != 0.f) { 58 throw std::runtime_error( 59 "computeProceduralValue() called with non-zero time on " 60 "incompatible volume"); 61 } 62 63 return computeProceduralValueImpl( 64 objectCoordinates, attributeIndex, time); 65 } 66 computeProceduralGradient(const vec3f & objectCoordinates,unsigned int attributeIndex,float time)67 inline vec3f ProceduralVolumeMulti::computeProceduralGradient( 68 const vec3f &objectCoordinates, 69 unsigned int attributeIndex, 70 float time) const 71 { 72 if (!supportsTime && time != 0.f) { 73 throw std::runtime_error( 74 "computeProceduralGradient() called with non-zero time on " 75 "incompatible volume"); 76 } 77 78 return computeProceduralGradientImpl( 79 objectCoordinates, attributeIndex, time); 80 } 81 } // namespace testing 82 } // namespace openvkl 83