-
Notifications
You must be signed in to change notification settings - Fork 163
/
CurveSerialization.h
141 lines (110 loc) · 5.02 KB
/
CurveSerialization.h
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* ***** BEGIN LICENSE BLOCK *****
* This file is part of Natron <http://www.natron.fr/>,
* Copyright (C) 2013-2018 INRIA and Alexandre Gauthier-Foichat
*
* Natron is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Natron is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Natron. If not, see <http://www.gnu.org/licenses/gpl-2.0.html>
* ***** END LICENSE BLOCK ***** */
#ifndef NATRON_ENGINE_CURVESERIALIZATION_H
#define NATRON_ENGINE_CURVESERIALIZATION_H
// ***** BEGIN PYTHON BLOCK *****
// from <https://docs.python.org/3/c-api/intro.html#include-files>:
// "Since Python may define some pre-processor definitions which affect the standard headers on some systems, you must include Python.h before any standard headers are included."
#include <Python.h>
// ***** END PYTHON BLOCK *****
#include <vector>
#include <map>
#include "Serialization/SerializationBase.h"
#include "Serialization/SerializationFwd.h"
SERIALIZATION_NAMESPACE_ENTER
#define kKeyframeSerializationTypeConstant "K"
#define kKeyframeSerializationTypeLinear "L"
#define kKeyframeSerializationTypeSmooth "S"
#define kKeyframeSerializationTypeCatmullRom "R"
#define kKeyframeSerializationTypeCubic "C"
#define kKeyframeSerializationTypeHorizontal "H"
#define kKeyframeSerializationTypeFree "F"
#define kKeyframeSerializationTypeBroken "X"
#define kKeyFramePropertyVariantTypeBool "Bool"
#define kKeyFramePropertyVariantTypeInt "Int"
#define kKeyFramePropertyVariantTypeDouble "Double"
#define kKeyFramePropertyVariantTypeString "String"
struct KeyFramePropertyVariant
{
double scalarValue;
std::string stringValue;
};
struct KeyFrameProperty
{
std::string type;
std::string name;
std::vector<KeyFramePropertyVariant> values;
};
/**
* @brief Basically just the same as a Keyframe but without all member functions and extracted to remove any dependency to Natron.
* This class i contained into CurveSerialization
**/
struct KeyFrameSerialization
{
// The frame in the timeline. This is not necessarily an integer if the user applied retiming operations
double time;
// The value of the keyframe
double value;
// Letter that corresponds to one value of KeyframeTypeEnum
// eKeyframeTypeConstant = kKeyframeSerializationTypeConstant,
// eKeyframeTypeLinear = kKeyframeSerializationTypeLinear
// eKeyframeTypeSmooth = kKeyframeSerializationTypeSmooth
// eKeyframeTypeCatmullRom = kKeyframeSerializationTypeCatmullRom
// eKeyframeTypeCubic = kKeyframeSerializationTypeCubic
// eKeyframeTypeHorizontal = kKeyframeSerializationTypeHorizontal
// eKeyframeTypeFree = kKeyframeSerializationTypeFree
// eKeyframeTypeBroken = kKeyframeSerializationTypeBroken
// eKeyframeTypeNone = empty string, meaning we do not serialize the value
//
// This value is only serialized if this is the first keyframe in the curve OR if the interpolation type changes
// at this keyframe.
std::string interpolation;
// This is only needed in eKeyframeTypeFree mode where the user controls the interpolation of both tangents at once
// or in eKeyframeTypeBroken mode
double rightDerivative;
// This is only needed in eKeyframeTypeBroken mode when user can have set different right/left tangents
double leftDerivative;
// List of properties associated to the keyframe. Properties do not have any interpolation, they are
// assumed to have a constant interpolation.
std::list<KeyFrameProperty> properties;
};
enum CurveSerializationTypeEnum
{
// The curve contains for each keyframe a scalar value
eCurveSerializationTypeScalar,
// The curve contains for each keyframe a single property. It can only be of constant interpolation type.
eCurveSerializationTypeString,
// The curve contains for each keyframe a list of properties of different types.
// This is a generic version of eCurveSerializationTypeString where a keyframe may hold more data.
// Note that if a keyframe doesn't have any property, it will still save the time marker.
// It can only be of constant interpolation type.
eCurveSerializationTypePropertiesOnly,
};
class CurveSerialization
: public SerializationObjectBase
{
public:
CurveSerializationTypeEnum curveType;
// We don't need a set complicated data structure here because we trust that the Curve itself
// gave us a list of keyframes with a correct ordering
std::list<KeyFrameSerialization> keys;
virtual void encode(YAML::Emitter& em) const OVERRIDE FINAL;
virtual void decode(const YAML::Node& node) OVERRIDE FINAL;
};
SERIALIZATION_NAMESPACE_EXIT
#endif // NATRON_ENGINE_CURVESERIALIZATION_H