2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
4
#include " tsd/core/scene/Layer.hpp"
5
+ #include " tsd/core/Logging.hpp"
5
6
#include " tsd/core/scene/Scene.hpp"
6
7
7
8
namespace tsd ::core {
8
9
9
10
LayerNodeData::LayerNodeData (const char *n) : m_name(n)
10
11
{
11
- m_srt[0 ] = math::float3 (1 .f , 1 .f , 1 .f );
12
- m_srt[1 ] = math::float3 (0 .f , 0 .f , 0 .f );
13
- m_srt[2 ] = math::float3 (0 .f , 0 .f , 0 .f );
12
+ setEmpty ();
14
13
}
15
14
16
15
LayerNodeData::LayerNodeData (Object *o, const char *n) : LayerNodeData(n)
17
16
{
18
17
setAsObject (o);
19
18
}
20
19
21
- LayerNodeData::LayerNodeData (anari::DataType type, size_t index, const char *n)
20
+ LayerNodeData::LayerNodeData (
21
+ anari::DataType type, size_t index, Scene *s, const char *n)
22
22
: LayerNodeData(n)
23
23
{
24
- setAsObject (type, index);
24
+ setAsObject (type, index, s );
25
25
}
26
26
27
27
LayerNodeData::LayerNodeData (const math::mat4 &m, const char *n)
@@ -41,6 +41,65 @@ LayerNodeData::LayerNodeData(Array *a, const char *n) : LayerNodeData(n)
41
41
setAsTransformArray (a);
42
42
}
43
43
44
+ LayerNodeData::LayerNodeData (const LayerNodeData &o)
45
+ {
46
+ m_name = o.m_name ;
47
+ m_enabled = o.m_enabled ;
48
+ m_value = o.m_value ;
49
+ m_defaultValue = o.m_defaultValue ;
50
+ m_srt = o.m_srt ;
51
+ m_instanceParameters = o.m_instanceParameters ;
52
+ m_scene = o.m_scene ;
53
+ incObjectUseCount ();
54
+ }
55
+
56
+ LayerNodeData::LayerNodeData (LayerNodeData &&o)
57
+ {
58
+ m_name = std::move (o.m_name );
59
+ m_enabled = std::move (o.m_enabled );
60
+ m_value = std::move (o.m_value );
61
+ m_defaultValue = std::move (o.m_defaultValue );
62
+ m_srt = std::move (o.m_srt );
63
+ m_instanceParameters = std::move (o.m_instanceParameters );
64
+ m_scene = std::move (o.m_scene );
65
+ o.m_scene = nullptr ;
66
+ o.m_value .reset ();
67
+ }
68
+
69
+ LayerNodeData &LayerNodeData::operator =(const LayerNodeData &o)
70
+ {
71
+ decObjectUseCount ();
72
+ m_name = o.m_name ;
73
+ m_enabled = o.m_enabled ;
74
+ m_value = o.m_value ;
75
+ m_defaultValue = o.m_defaultValue ;
76
+ m_srt = o.m_srt ;
77
+ m_instanceParameters = o.m_instanceParameters ;
78
+ m_scene = o.m_scene ;
79
+ incObjectUseCount ();
80
+ return *this ;
81
+ }
82
+
83
+ LayerNodeData &LayerNodeData::operator =(LayerNodeData &&o)
84
+ {
85
+ decObjectUseCount ();
86
+ m_name = std::move (o.m_name );
87
+ m_enabled = std::move (o.m_enabled );
88
+ m_value = std::move (o.m_value );
89
+ m_defaultValue = std::move (o.m_defaultValue );
90
+ m_srt = std::move (o.m_srt );
91
+ m_instanceParameters = std::move (o.m_instanceParameters );
92
+ m_scene = std::move (o.m_scene );
93
+ o.m_scene = nullptr ;
94
+ o.m_value .reset ();
95
+ return *this ;
96
+ }
97
+
98
+ LayerNodeData::~LayerNodeData ()
99
+ {
100
+ decObjectUseCount ();
101
+ }
102
+
44
103
bool LayerNodeData::hasDefault () const
45
104
{
46
105
return m_defaultValue;
@@ -73,17 +132,17 @@ anari::DataType LayerNodeData::type() const
73
132
74
133
bool LayerNodeData::isObject () const
75
134
{
76
- return anari::isObject (m_value. type ());
135
+ return anari::isObject (type ());
77
136
}
78
137
79
138
bool LayerNodeData::isTransform () const
80
139
{
81
- return m_value. type () == ANARI_FLOAT32_MAT4;
140
+ return type () == ANARI_FLOAT32_MAT4;
82
141
}
83
142
84
143
bool LayerNodeData::isEmpty () const
85
144
{
86
- return m_value;
145
+ return ! m_value;
87
146
}
88
147
89
148
bool LayerNodeData::isEnabled () const
@@ -93,19 +152,27 @@ bool LayerNodeData::isEnabled() const
93
152
94
153
void LayerNodeData::setAsObject (Object *o)
95
154
{
96
- m_value.reset ();
97
155
if (o)
98
- setAsObject (o->type (), o->index ());
156
+ setAsObject (o->type (), o->index (), o->scene ());
157
+ else {
158
+ tsd::core::logWarning (
159
+ " LayerNodeData::setAsObject() called with null object,"
160
+ " setting to empty" );
161
+ setEmpty ();
162
+ }
99
163
}
100
164
101
- void LayerNodeData::setAsObject (anari::DataType type, size_t index)
165
+ void LayerNodeData::setAsObject (anari::DataType type, size_t index, Scene *s )
102
166
{
103
- m_defaultValue. reset ();
167
+ decObjectUseCount ();
104
168
m_value = Any (type, index);
169
+ m_scene = s;
170
+ incObjectUseCount ();
105
171
}
106
172
107
173
void LayerNodeData::setAsTransform (const math::mat4 &m)
108
174
{
175
+ decObjectUseCount ();
109
176
m_value = m;
110
177
if (!hasDefault ())
111
178
m_defaultValue = m_value;
@@ -127,6 +194,7 @@ void LayerNodeData::setAsTransform(
127
194
128
195
void LayerNodeData::setAsTransform (const math::mat3 &srt)
129
196
{
197
+ decObjectUseCount ();
130
198
m_srt = srt;
131
199
auto &sc = srt[0 ];
132
200
auto &azelrot = srt[1 ];
@@ -154,14 +222,26 @@ void LayerNodeData::setAsTransformArray(Array *a)
154
222
setAsObject (a);
155
223
}
156
224
225
+ void LayerNodeData::setEmpty ()
226
+ {
227
+ decObjectUseCount ();
228
+ m_value.reset ();
229
+ m_srt[0 ] = math::float3 (1 .f , 1 .f , 1 .f );
230
+ m_srt[1 ] = math::float3 (0 .f , 0 .f , 0 .f );
231
+ m_srt[2 ] = math::float3 (0 .f , 0 .f , 0 .f );
232
+ m_scene = nullptr ;
233
+ clearInstanceParameters ();
234
+ m_name.clear ();
235
+ }
236
+
157
237
void LayerNodeData::setEnabled (bool e)
158
238
{
159
239
m_enabled = e;
160
240
}
161
241
162
- Object *LayerNodeData::getObject (Scene *scene ) const
242
+ Object *LayerNodeData::getObject () const
163
243
{
164
- return scene ->getObject (m_value);
244
+ return isObject () && m_scene ? m_scene ->getObject (m_value) : nullptr ;
165
245
}
166
246
167
247
size_t LayerNodeData::getObjectIndex () const
@@ -182,9 +262,9 @@ math::mat3 LayerNodeData::getTransformSRT() const
182
262
math::float3 (0 .f , 0 .f , 0 .f )};
183
263
}
184
264
185
- Array *LayerNodeData::getTransformArray (Scene *scene ) const
265
+ Array *LayerNodeData::getTransformArray () const
186
266
{
187
- auto *obj = getObject (scene );
267
+ auto *obj = getObject ();
188
268
if (obj && obj->type () == ANARI_ARRAY1D) {
189
269
auto *a = (Array *)obj;
190
270
if (a->elementType () == ANARI_FLOAT32_MAT4)
@@ -203,10 +283,13 @@ Any LayerNodeData::getValueRaw() const
203
283
return m_value;
204
284
}
205
285
206
- void LayerNodeData::setValueRaw (const Any &v)
286
+ void LayerNodeData::setValueRaw (const Any &v, Scene *scene )
207
287
{
288
+ setEmpty ();
289
+ m_scene = scene;
208
290
m_value = v;
209
291
setCurrentValueAsDefault ();
292
+ incObjectUseCount ();
210
293
}
211
294
212
295
const InstanceParameterMap &LayerNodeData::getInstanceParameters () const
@@ -224,4 +307,16 @@ void LayerNodeData::clearInstanceParameters()
224
307
m_instanceParameters.clear ();
225
308
}
226
309
310
+ void LayerNodeData::incObjectUseCount ()
311
+ {
312
+ if (auto *o = getObject (); o)
313
+ o->incUseCount ();
314
+ }
315
+
316
+ void LayerNodeData::decObjectUseCount ()
317
+ {
318
+ if (auto *o = getObject (); o)
319
+ o->decUseCount ();
320
+ }
321
+
227
322
} // namespace tsd::core
0 commit comments