Skip to content

Commit 51dc3aa

Browse files
author
devsh
committed
This is a neat rewrite!
1 parent 35d4a0a commit 51dc3aa

File tree

2 files changed

+71
-102
lines changed

2 files changed

+71
-102
lines changed

src/nbl/ext/MitsubaLoader/CElementSensor.cpp

Lines changed: 47 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010
#include <functional>
1111

12-
template<typename D, typename B>
13-
struct derived_from : std::is_base_of<B,D> {};
1412

1513
namespace nbl::ext::MitsubaLoader
1614
{
@@ -20,36 +18,14 @@ auto CElementSensor::compAddPropertyMap() -> AddPropertyMap<CElementSensor>
2018
using this_t = CElementSensor;
2119
AddPropertyMap<CElementSensor> retval;
2220

23-
// auto setUp = SET_PROPERTY_TEMPLATE(up, SNamedPropertyElement::Type::VECTOR, ShutterSensor);
24-
NBL_EXT_MITSUBA_LOADER_REGISTER_ADD_PROPERTY(VECTOR,"clipPlane")
25-
{
26-
if (_property.getVectorDimension()!=4)
27-
{
28-
return false;
29-
}
30-
constexpr std::string_view Name = "clipPlane";
31-
const std::string_view sv(_property.name);
32-
if (sv.length()!=Name.length()+1 || sv.find(Name)!=0)
33-
{
34-
return false;
35-
}
36-
const auto index = std::atoi(sv.data()+Name.length());
37-
if (index>MaxClipPlanes)
38-
{
39-
return false;
40-
}
41-
// everyone inherits from this
42-
_this->perspective.clipPlanes[index] = _property.vvalue;
43-
return true;
44-
}
45-
});
46-
47-
// auto setShiftX = SET_PROPERTY_TEMPLATE(shiftX, SNamedPropertyElement::Type::FLOAT, PerspectivePinhole);
48-
// auto setShiftY = SET_PROPERTY_TEMPLATE(shiftY, SNamedPropertyElement::Type::FLOAT, PerspectivePinhole);
49-
// auto setFov = SET_PROPERTY_TEMPLATE(fov, SNamedPropertyElement::Type::FLOAT, PerspectivePinhole);
50-
retval.template registerCallback<derived_from,PerspectivePinhole>(SNamedPropertyElement::Type::STRING,"fovAxis",[](CElementSensor* _this, SNamedPropertyElement&& _property, const system::logger_opt_ptr logger)->bool
21+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(up,VECTOR,derived_from,ShutterSensor);
22+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(shiftX,FLOAT,derived_from,PerspectivePinhole);
23+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(shiftY,FLOAT,derived_from,PerspectivePinhole);
24+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(fov,FLOAT,derived_from,PerspectivePinhole);
25+
NBL_EXT_MITSUBA_LOADER_REGISTER_ADD_PROPERTY_CONSTRAINED("fovAxis",STRING,derived_from,PerspectivePinhole)
5126
{
5227
auto& state = _this->perspective;
28+
// TODO: check if this gives problem with delay loads
5329
static const core::unordered_map<std::string,PerspectivePinhole::FOVAxis,core::CaseInsensitiveHash,core::CaseInsensitiveEquals> StringToType =
5430
{
5531
{"x", PerspectivePinhole::FOVAxis::X},
@@ -67,81 +43,51 @@ auto CElementSensor::compAddPropertyMap() -> AddPropertyMap<CElementSensor>
6743
}
6844
);
6945

70-
return retval;
71-
}
46+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(up,VECTOR,derived_from,ShutterSensor);
47+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(shutterOpen,FLOAT,derived_from,ShutterSensor);
48+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(shutterClose,FLOAT,derived_from,ShutterSensor);
49+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(moveSpeed,FLOAT,derived_from,ShutterSensor);
50+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(zoomSpeed,FLOAT,derived_from,ShutterSensor);
51+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(rotateSpeed,FLOAT,derived_from,ShutterSensor);
52+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(nearClip,FLOAT,derived_from,CameraBase);
53+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(farClip,FLOAT,derived_from,CameraBase);
54+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(focusDistance,FLOAT,derived_from,DepthOfFieldBase);
55+
NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(apertureRadius,FLOAT,derived_from,DepthOfFieldBase);
56+
57+
// special
58+
auto setClipPlane = [](this_t* _this, SNamedPropertyElement&& _property, const system::logger_opt_ptr logger)->bool
59+
{
60+
if (_property.getVectorDimension()!=4)
61+
{
62+
return false;
63+
}
64+
constexpr std::string_view Name = "clipPlane";
65+
const std::string_view sv(_property.name);
66+
if (sv.length()!=Name.length()+1 || sv.find(Name)!=0)
67+
{
68+
return false;
69+
}
70+
const auto index = std::atoi(sv.data()+Name.length());
71+
if (index>MaxClipPlanes)
72+
{
73+
return false;
74+
}
75+
// everyone inherits from this
76+
_this->perspective.clipPlanes[index] = _property.vvalue;
77+
return true;
78+
};
79+
for (auto i=0; i<MaxClipPlanes; i++)
80+
retval.registerCallback(SNamedPropertyElement::Type::VECTOR,"clipPlane"+std::to_string(i),{.func=setClipPlane});
7281

73-
bool CElementSensor::addProperty(SNamedPropertyElement&& _property, system::logger_opt_ptr logger)
74-
{
75-
if (type >= Type::INVALID)
76-
return false;
77-
bool error = false;
78-
79-
#if 0
80-
81-
#define SET_PROPERTY_TEMPLATE(MEMBER,PROPERTY_TYPE,BASE) [&]() -> void { \
82-
dispatch([&](auto& state) -> void { \
83-
if constexpr (std::is_base_of<BASE,std::remove_reference<decltype(state)>::type >::value) \
84-
{ \
85-
if (_property.type!=PROPERTY_TYPE) { \
86-
error = true; \
87-
return; \
88-
} \
89-
state. ## MEMBER = _property.getProperty<PROPERTY_TYPE>(); \
90-
} \
91-
}); \
92-
}
93-
94-
auto setUp = SET_PROPERTY_TEMPLATE(up,SNamedPropertyElement::Type::VECTOR,ShutterSensor);
95-
auto setShutterOpen = SET_PROPERTY_TEMPLATE(shutterOpen,SNamedPropertyElement::Type::FLOAT,ShutterSensor);
96-
auto setShutterClose = SET_PROPERTY_TEMPLATE(shutterClose,SNamedPropertyElement::Type::FLOAT,ShutterSensor);
97-
auto setMoveSpeed = SET_PROPERTY_TEMPLATE(moveSpeed,SNamedPropertyElement::Type::FLOAT,ShutterSensor);
98-
auto setZoomSpeed = SET_PROPERTY_TEMPLATE(zoomSpeed,SNamedPropertyElement::Type::FLOAT,ShutterSensor);
99-
auto setRotateSpeed = SET_PROPERTY_TEMPLATE(rotateSpeed,SNamedPropertyElement::Type::FLOAT,ShutterSensor);
100-
auto setNearClip = SET_PROPERTY_TEMPLATE(nearClip,SNamedPropertyElement::Type::FLOAT,CameraBase);
101-
auto setFarClip = SET_PROPERTY_TEMPLATE(farClip,SNamedPropertyElement::Type::FLOAT,CameraBase);
102-
auto setFocusDistance = SET_PROPERTY_TEMPLATE(focusDistance,SNamedPropertyElement::Type::FLOAT,DepthOfFieldBase);
103-
auto setApertureRadius = SET_PROPERTY_TEMPLATE(apertureRadius,SNamedPropertyElement::Type::FLOAT,DepthOfFieldBase);
82+
// TODOs:
10483
//auto setKc = SET_PROPERTY_TEMPLATE(apertureRadius,SNamedPropertyElement::Type::STRING,PerspectivePinholeRadialDistortion);
84+
//{"focalLength", noIdeaHowToProcessValue},
10585

106-
const core::unordered_map<std::string, std::function<void()>, core::CaseInsensitiveHash, core::CaseInsensitiveEquals> SetPropertyMap =
107-
{
108-
//{"focalLength", noIdeaHowToProcessValue},
109-
{"up", setUp},
110-
{"clipPlane0", setClipPlane},
111-
{"clipPlane1", setClipPlane},
112-
{"clipPlane2", setClipPlane},
113-
{"clipPlane3", setClipPlane},
114-
{"clipPlane4", setClipPlane},
115-
{"clipPlane5", setClipPlane},
116-
// UPDATE WHENEVER `MaxClipPlanes` changes!
117-
{"shiftX", setShiftX},
118-
{"shiftY", setShiftY},
119-
{"fov", setFov},
120-
{"fovAxis", setFovAxis},
121-
{"shutterOpen", setShutterOpen},
122-
{"shuttterClose", setShutterClose},
123-
{"moveSpeed", setMoveSpeed},
124-
{"zoomSpeed", setZoomSpeed},
125-
{"rotateSpeed", setRotateSpeed},
126-
{"nearClip", setNearClip},
127-
{"farClip", setFarClip},
128-
{"focusDistance", setFocusDistance},
129-
{"apertureRadius", setApertureRadius}
130-
//, {"kc", setKc}
131-
};
132-
86+
return retval;
87+
}
13388

134-
auto found = SetPropertyMap.find(_property.name);
135-
if (found==SetPropertyMap.end())
136-
{
137-
_NBL_DEBUG_BREAK_IF(true);
138-
ParserLog::invalidXMLFileStructure("No Integrator can have such property set with name: "+_property.name);
139-
return false;
140-
}
141-
142-
found->second();
143-
return !error;
144-
#endif
89+
bool CElementSensor::addProperty(SNamedPropertyElement&& _property, system::logger_opt_ptr logger)
90+
{
14591
assert(false);
14692
return false;
14793
}

src/nbl/ext/MitsubaLoader/ElementMacros.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,30 @@
55
#include "nbl/ext/MitsubaLoader/ParserUtil.h"
66

77

8-
#define NBL_EXT_MITSUBA_LOADER_REGISTER_ADD_PROPERTY(PROP_TYPE,NAME) retval.registerCallback(SNamedPropertyElement::Type::PROP_TYPE,NAME,{.func=[](this_t* _this, SNamedPropertyElement&& _property, const system::logger_opt_ptr logger)->bool
8+
#define NBL_EXT_MITSUBA_LOADER_REGISTER_ADD_PROPERTY(NAME,PROP_TYPE) retval.registerCallback(SNamedPropertyElement::Type::PROP_TYPE,NAME,{\
9+
.func=[](this_t* _this, SNamedPropertyElement&& _property, const system::logger_opt_ptr logger)->bool
10+
11+
#define NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_PROPERTY(NAME,PROP_TYPE) NBL_EXT_MITSUBA_LOADER_REGISTER_ADD_PROPERTY(#NAME,PROP_TYPE) {\
12+
_this->NAME = _property.getProperty<SNamedPropertyElement::Type::PROP_TYPE>(); \
13+
return true;}})
14+
15+
16+
#define NBL_EXT_MITSUBA_LOADER_REGISTER_ADD_PROPERTY_CONSTRAINED(NAME,PROP_TYPE,CONSTRAINT,...) retval.template registerCallback<CONSTRAINT,__VA_ARGS__>( \
17+
SNamedPropertyElement::Type::PROP_TYPE,NAME,[](this_t* _this, SNamedPropertyElement&& _property, const system::logger_opt_ptr logger)->bool
18+
19+
#define NBL_EXT_MITSUBA_LOADER_REGISTER_SIMPLE_ADD_VARIANT_PROPERTY_CONSTRAINED(NAME,PROP_TYPE,CONSTRAINT,...) NBL_EXT_MITSUBA_LOADER_REGISTER_ADD_PROPERTY_CONSTRAINED(#NAME,PROP_TYPE,CONSTRAINT,__VA_ARGS__) {\
20+
_this->visit([&_property](auto& state)->void{ \
21+
if constexpr (CONSTRAINT<std::remove_reference_t<decltype(state)>,__VA_ARGS__>::value) \
22+
state. ## NAME = _property.getProperty<SNamedPropertyElement::Type::PROP_TYPE>(); \
23+
}); return true;})
24+
25+
26+
// just to reverse `is_base_of`
27+
namespace nbl::ext::MitsubaLoader
28+
{
29+
template<typename D, typename B>
30+
struct derived_from : std::is_base_of<B,D> {};
31+
}
932

1033
/*
1134
template<>

0 commit comments

Comments
 (0)