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