1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/*
* Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved.
*
* NVIDIA CORPORATION and its licensors retain all intellectual property
* and proprietary rights in and to this software, related documentation
* and any modifications thereto. Any use, reproduction, disclosure or
* distribution of this software and related documentation without an express
* license agreement from NVIDIA CORPORATION is strictly prohibited.
*/
#ifndef CURVE_H
#define CURVE_H
#include "Apex.h"
#include "nvparameterized/NvParameterized.h"
namespace nvidia
{
namespace apex
{
PX_PUSH_PACK_DEFAULT
/**
\brief A trivial templatized math vector type for pairs.
*/
template <typename T>
struct Vec2T
{
/**
\brief Constructor that takes 0, 1, or 2 parameters to initialize the pair
*/
Vec2T(T _x = T(), T _y = T()) : x(_x), y(_y) { }
/**
\brief The first element in the pair
*/
T x;
/**
\brief The second element in the pair
*/ T y;
/**
\brief Overloading the subscript operator to access the members of the pair
*/
T& operator[](uint32_t ndx)
{
PX_ASSERT(ndx < 2);
return ((T*)&x)[ndx];
}
};
/**
\brief Vec2R is a helpful typedef for a pair of 32bit floats.
*/
typedef Vec2T<float> Vec2R;
/**
The Curve is a class for storing control points on a curve and evaluating the results later.
*/
class Curve
{
public:
virtual ~Curve() {}
/**
Retrieve the output Y for the specified input x, based on the properties of the stored curve described
by mControlPoints.
*/
virtual float evaluate(float x) const = 0;
/**
Add a control point to the list of control points, returning the index of the new point.
*/
virtual uint32_t addControlPoint(const Vec2R& controlPoint) = 0;
/**
Add a control points to the list of control points. Assuming the
hPoints points to a list of vec2s
*/
virtual void addControlPoints(::NvParameterized::Interface* param, ::NvParameterized::Handle& hPoints) = 0;
/**
Locates the control points that contain x, placing the resulting control points in the two
out parameters. Returns true if the points were found, false otherwise. If the points were not
found, the output variables are untouched
*/
virtual bool calculateControlPoints(float x, Vec2R& outXPoints, Vec2R& outYPoints) const = 0;
/**
Locates the first control point with x larger than xValue or the nimber of control points if such point doesn't exist
*/
virtual uint32_t calculateFollowingControlPoint(float xValue) const = 0;
///get the array of control points
virtual const Vec2R* getControlPoints(uint32_t& outCount) const = 0;
};
PX_POP_PACK
}
} // namespace apex
#endif // CURVE_H
|