Skip to content

Commit 5f243bf

Browse files
committed
add basic object use counts
1 parent d49f85d commit 5f243bf

22 files changed

+377
-169
lines changed

tsd/apps/tutorial/tsdTutorialLoadScene.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ int main(int argc, const char *argv[])
2323
printf("----------------------TSD Tree--------------------------\n\n");
2424

2525
auto onNodeEntry = [&](auto &node, int level) {
26-
tsd::core::Object *obj = node->getObject(&scene);
26+
tsd::core::Object *obj = node->getObject();
2727

2828
const char *typeText = "[-]";
2929
switch (node->type()) {

tsd/src/tsd/app/Core.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ void Core::setupSceneFromCommandLine(bool hdriOnly)
204204
else if (f.first == ImporterType::GLTF)
205205
tsd::io::import_GLTF(tsd.scene, f.second.c_str(), root);
206206
else
207-
tsd::core::logWarning("...skipping unknown file type for '%s'",
208-
f.second.c_str());
207+
tsd::core::logWarning(
208+
"...skipping unknown file type for '%s'", f.second.c_str());
209209
}
210210
}
211211
}
@@ -350,7 +350,7 @@ void Core::setSelectedObject(tsd::core::Object *o)
350350

351351
void Core::setSelectedNode(tsd::core::LayerNode &n)
352352
{
353-
setSelectedObject(n->getObject(&tsd.scene));
353+
setSelectedObject(n->getObject());
354354
auto *layer = n.container();
355355
tsd.selectedNode = layer->at(n.index());
356356
}

tsd/src/tsd/core/Parameter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@ Parameter &Parameter::setDescription(const char *d)
3838

3939
Parameter &Parameter::setValue(const Any &newValue)
4040
{
41+
auto oldValue = m_value;
4142
m_value = newValue;
4243
if (m_observer)
43-
m_observer->parameterChanged(this);
44+
m_observer->parameterChanged(this, oldValue);
4445
return *this;
4546
}
4647

@@ -78,7 +79,7 @@ Parameter &Parameter::setEnabled(bool enabled)
7879
{
7980
m_enabled = enabled;
8081
if (m_observer)
81-
m_observer->parameterChanged(this);
82+
m_observer->parameterChanged(this, m_value);
8283
return *this;
8384
}
8485

tsd/src/tsd/core/Parameter.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212

1313
namespace tsd::core {
1414

15-
using Any = tsd::core::Any;
16-
1715
enum ParameterUsageHint
1816
{
1917
NONE = 0,
@@ -26,7 +24,7 @@ enum ParameterUsageHint
2624
struct Parameter;
2725
struct ParameterObserver
2826
{
29-
virtual void parameterChanged(const Parameter *p) = 0;
27+
virtual void parameterChanged(const Parameter *p, const Any &oldValue) = 0;
3028
virtual void removeParameter(const Parameter *p) = 0;
3129
};
3230

tsd/src/tsd/core/algorithms/computeScalarRange.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ tsd::math::float2 computeScalarRange(const Array &a)
1919
const bool elementsAreScalars =
2020
!anari::isObject(type) && anari::componentsOf(type) == 1;
2121

22-
if (auto *scene = a.context(); elementsAreArrays && scene) {
22+
if (auto *scene = a.scene(); elementsAreArrays && scene) {
2323
const auto *begin = (uint64_t *)a.data();
2424
const auto *end = begin + a.size();
2525
std::for_each(begin, end, [&](uint64_t idx) {

tsd/src/tsd/core/scene/Layer.cpp

Lines changed: 112 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,26 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
#include "tsd/core/scene/Layer.hpp"
5+
#include "tsd/core/Logging.hpp"
56
#include "tsd/core/scene/Scene.hpp"
67

78
namespace tsd::core {
89

910
LayerNodeData::LayerNodeData(const char *n) : m_name(n)
1011
{
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();
1413
}
1514

1615
LayerNodeData::LayerNodeData(Object *o, const char *n) : LayerNodeData(n)
1716
{
1817
setAsObject(o);
1918
}
2019

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)
2222
: LayerNodeData(n)
2323
{
24-
setAsObject(type, index);
24+
setAsObject(type, index, s);
2525
}
2626

2727
LayerNodeData::LayerNodeData(const math::mat4 &m, const char *n)
@@ -41,6 +41,65 @@ LayerNodeData::LayerNodeData(Array *a, const char *n) : LayerNodeData(n)
4141
setAsTransformArray(a);
4242
}
4343

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+
44103
bool LayerNodeData::hasDefault() const
45104
{
46105
return m_defaultValue;
@@ -73,17 +132,17 @@ anari::DataType LayerNodeData::type() const
73132

74133
bool LayerNodeData::isObject() const
75134
{
76-
return anari::isObject(m_value.type());
135+
return anari::isObject(type());
77136
}
78137

79138
bool LayerNodeData::isTransform() const
80139
{
81-
return m_value.type() == ANARI_FLOAT32_MAT4;
140+
return type() == ANARI_FLOAT32_MAT4;
82141
}
83142

84143
bool LayerNodeData::isEmpty() const
85144
{
86-
return m_value;
145+
return !m_value;
87146
}
88147

89148
bool LayerNodeData::isEnabled() const
@@ -93,19 +152,27 @@ bool LayerNodeData::isEnabled() const
93152

94153
void LayerNodeData::setAsObject(Object *o)
95154
{
96-
m_value.reset();
97155
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+
}
99163
}
100164

101-
void LayerNodeData::setAsObject(anari::DataType type, size_t index)
165+
void LayerNodeData::setAsObject(anari::DataType type, size_t index, Scene *s)
102166
{
103-
m_defaultValue.reset();
167+
decObjectUseCount();
104168
m_value = Any(type, index);
169+
m_scene = s;
170+
incObjectUseCount();
105171
}
106172

107173
void LayerNodeData::setAsTransform(const math::mat4 &m)
108174
{
175+
decObjectUseCount();
109176
m_value = m;
110177
if (!hasDefault())
111178
m_defaultValue = m_value;
@@ -127,6 +194,7 @@ void LayerNodeData::setAsTransform(
127194

128195
void LayerNodeData::setAsTransform(const math::mat3 &srt)
129196
{
197+
decObjectUseCount();
130198
m_srt = srt;
131199
auto &sc = srt[0];
132200
auto &azelrot = srt[1];
@@ -154,14 +222,26 @@ void LayerNodeData::setAsTransformArray(Array *a)
154222
setAsObject(a);
155223
}
156224

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+
157237
void LayerNodeData::setEnabled(bool e)
158238
{
159239
m_enabled = e;
160240
}
161241

162-
Object *LayerNodeData::getObject(Scene *scene) const
242+
Object *LayerNodeData::getObject() const
163243
{
164-
return scene->getObject(m_value);
244+
return isObject() && m_scene ? m_scene->getObject(m_value) : nullptr;
165245
}
166246

167247
size_t LayerNodeData::getObjectIndex() const
@@ -182,9 +262,9 @@ math::mat3 LayerNodeData::getTransformSRT() const
182262
math::float3(0.f, 0.f, 0.f)};
183263
}
184264

185-
Array *LayerNodeData::getTransformArray(Scene *scene) const
265+
Array *LayerNodeData::getTransformArray() const
186266
{
187-
auto *obj = getObject(scene);
267+
auto *obj = getObject();
188268
if (obj && obj->type() == ANARI_ARRAY1D) {
189269
auto *a = (Array *)obj;
190270
if (a->elementType() == ANARI_FLOAT32_MAT4)
@@ -203,10 +283,13 @@ Any LayerNodeData::getValueRaw() const
203283
return m_value;
204284
}
205285

206-
void LayerNodeData::setValueRaw(const Any &v)
286+
void LayerNodeData::setValueRaw(const Any &v, Scene *scene)
207287
{
288+
setEmpty();
289+
m_scene = scene;
208290
m_value = v;
209291
setCurrentValueAsDefault();
292+
incObjectUseCount();
210293
}
211294

212295
const InstanceParameterMap &LayerNodeData::getInstanceParameters() const
@@ -224,4 +307,16 @@ void LayerNodeData::clearInstanceParameters()
224307
m_instanceParameters.clear();
225308
}
226309

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+
227322
} // namespace tsd::core

tsd/src/tsd/core/scene/Layer.hpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,21 @@ struct LayerNodeData
2020
LayerNodeData() = default;
2121
LayerNodeData(const char *n);
2222
LayerNodeData(Object *o, const char *n = "");
23-
LayerNodeData(anari::DataType type, size_t index, const char *n = "");
23+
LayerNodeData(
24+
anari::DataType type, size_t index, Scene *s, const char *n = "");
2425
LayerNodeData(const math::mat4 &m, const char *n = "");
2526
LayerNodeData(const math::mat3 &m, const char *n = "");
2627
LayerNodeData(Array *a, const char *n = "");
2728
template <typename T>
2829
LayerNodeData(IndexedVectorRef<T> obj, const char *n = "");
2930

31+
LayerNodeData(const LayerNodeData &o);
32+
LayerNodeData(LayerNodeData &&o);
33+
LayerNodeData &operator=(const LayerNodeData &o);
34+
LayerNodeData &operator=(LayerNodeData &&o);
35+
36+
~LayerNodeData();
37+
3038
bool hasDefault() const;
3139
bool isDefaultValue() const;
3240
void setToDefaultValue();
@@ -39,32 +47,37 @@ struct LayerNodeData
3947
bool isEnabled() const;
4048

4149
void setAsObject(Object *o);
42-
void setAsObject(anari::DataType type, size_t index);
50+
void setAsObject(anari::DataType type, size_t index, Scene *s);
4351
void setAsTransform(const math::mat4 &m);
4452
void setAsTransform(const math::mat4 &m, const math::mat4 &defaultM);
4553
void setAsTransform(const math::mat3 &srt);
4654
void setAsTransformArray(Array *a);
55+
void setEmpty();
56+
4757
void setEnabled(bool enabled);
4858

49-
Object *getObject(Scene *scene) const;
59+
Object *getObject() const;
5060
size_t getObjectIndex() const;
5161
math::mat4 getTransform() const;
5262
math::mat3 getTransformSRT() const;
53-
Array *getTransformArray(Scene *scene) const;
63+
Array *getTransformArray() const;
5464

5565
std::string &name();
5666

5767
//////////////////////////////////////////////////////////////////
5868
// Warning: these operate on the raw Any value, no type checking!
5969
Any getValueRaw() const;
60-
void setValueRaw(const Any &v);
70+
void setValueRaw(const Any &v, Scene *scene = nullptr);
6171
//////////////////////////////////////////////////////////////////
6272

6373
const InstanceParameterMap &getInstanceParameters() const;
6474
void setInstanceParameter(const std::string &name, Any v);
6575
void clearInstanceParameters();
6676

6777
private:
78+
void incObjectUseCount();
79+
void decObjectUseCount();
80+
6881
// Data //
6982

7083
std::string m_name;
@@ -73,6 +86,7 @@ struct LayerNodeData
7386
Any m_defaultValue;
7487
math::mat3 m_srt; // scale, azelrot, translation
7588
InstanceParameterMap m_instanceParameters;
89+
Scene *m_scene{nullptr};
7690
};
7791

7892
using Layer = Forest<LayerNodeData>;

0 commit comments

Comments
 (0)