3 #include <unordered_map>
7 #include "../property_value.h"
8 #include "core_material.h"
9 #include "../../../generic/containers/contiguous_map.h"
20 bool valid_name(
const char* name);
29 bool set_property_value(MaterialPropertyNameHash hsh,
const char* name,
const T& value) {
30 if(
auto v = find_core_property_value(hsh)) {
43 bool set_property_value(
const char* name,
const T& value) {
44 if(!valid_name(name)) {
45 S_WARN(
"Ignoring invalid property name: {0}", name);
49 if(parent_ && !parent_->check_existance(name)) {
50 S_WARN(
"Ignoring unknown property override for {0}", name);
54 return set_property_value(material_property_hash(name), name, value);
57 bool set_property_value(
const char* name,
const Colour& value) {
58 if(!valid_name(name)) {
59 S_WARN(
"Ignoring invalid property name: {0}", name);
63 if(parent_ && !parent_->check_existance(name)) {
64 S_WARN(
"Ignoring unknown property override for {0}", name);
68 return set_property_value(material_property_hash(name), name, (
const Vec4&) value);
72 bool property_value(
const MaterialPropertyNameHash hsh,
const T*& out)
const {
76 auto mem_ptr = find_core_property(hsh);
78 auto v = &(this->*mem_ptr);
79 auto p = (parent_) ? &(parent_->*mem_ptr) :
nullptr;
83 }
else if(p && p->has_value()) {
87 return core_material_property_value(hsh, out);
90 auto it = properties_.find(hsh);
91 if(it != properties_.end()) {
92 out = it->second.get<T>();
95 return parent_->property_value(hsh, out);
104 void set_property_value(
const std::string& str,
const T& v) {
105 set_property_value(str.c_str(), v);
109 bool property_value(
const std::string& str,
const T*& out)
const {
110 return property_value(str.c_str(), out);
114 bool property_value(
const char* name,
const T*& out)
const {
115 auto hsh = material_property_hash(name);
116 return property_value(hsh, out);
119 bool clear_override(
const char* name) {
120 return clear_override(material_property_hash(name));
123 bool property_type(
const char* property_name, MaterialPropertyType* type)
const;
162 BasePropertyValue* find_core_property_value(
const MaterialPropertyNameHash& hsh) {
168 PropertyValueMemberPtr find_core_property(
const MaterialPropertyNameHash& hsh)
const {
170 case DIFFUSE_PROPERTY_HASH:
171 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::diffuse_property_;
172 case AMBIENT_PROPERTY_HASH:
173 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::ambient_property_;
174 case EMISSION_PROPERTY_HASH:
175 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::emission_property_;
176 case SPECULAR_PROPERTY_HASH:
177 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::specular_property_;
178 case SHININESS_PROPERTY_HASH:
179 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::shininess_property_;
180 case POINT_SIZE_PROPERTY_HASH:
181 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::point_size_property_;
182 case DEPTH_WRITE_ENABLED_PROPERTY_HASH:
183 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::depth_write_enabled_property_;
184 case DEPTH_TEST_ENABLED_PROPERTY_HASH:
185 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::depth_test_enabled_property_;
186 case LIGHTING_ENABLED_PROPERTY_HASH:
187 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::lighting_enabled_property_;
188 case TEXTURES_ENABLED_PROPERTY_HASH:
189 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::textures_enabled_property_;
190 case DIFFUSE_MAP_PROPERTY_HASH:
191 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::diffuse_map_property_;
192 case SPECULAR_MAP_PROPERTY_HASH:
193 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::specular_map_property_;
194 case LIGHT_MAP_PROPERTY_HASH:
195 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::light_map_property_;
196 case NORMAL_MAP_PROPERTY_HASH:
197 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::normal_map_property_;
198 case DIFFUSE_MAP_MATRIX_PROPERTY_HASH:
199 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::diffuse_map_matrix_property_;
200 case SPECULAR_MAP_MATRIX_PROPERTY_HASH:
201 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::specular_map_matrix_property_;
202 case LIGHT_MAP_MATRIX_PROPERTY_HASH:
203 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::light_map_matrix_property_;
204 case NORMAL_MAP_MATRIX_PROPERTY_HASH:
205 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::normal_map_matrix_property_;
206 case BLEND_FUNC_PROPERTY_HASH:
207 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::blend_func_property_;
208 case POLYGON_MODE_PROPERTY_HASH:
209 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::polygon_mode_property_;
210 case SHADE_MODEL_PROPERTY_HASH:
211 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::shade_model_property_;
212 case COLOUR_MATERIAL_PROPERTY_HASH:
213 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::colour_material_property_;
214 case CULL_MODE_PROPERTY_HASH:
215 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::cull_mode_property_;
216 case FOG_COLOUR_PROPERTY_HASH:
217 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::fog_colour_property_;
218 case FOG_DENSITY_PROPERTY_HASH:
219 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::fog_density_property_;
220 case FOG_START_PROPERTY_HASH:
221 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::fog_start_property_;
222 case FOG_END_PROPERTY_HASH:
223 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::fog_end_property_;
224 case FOG_MODE_PROPERTY_HASH:
225 return (PropertyValueMemberPtr) &MaterialPropertyOverrider::fog_mode_property_;
231 const BasePropertyValue* find_core_property_value(
const MaterialPropertyNameHash& hsh)
const {
232 auto ptr = find_core_property(hsh);
237 return &(this->*ptr);
241 virtual void on_override(
242 MaterialPropertyNameHash hsh,
244 MaterialPropertyType type
251 virtual void on_clear_override(MaterialPropertyNameHash hsh) { _S_UNUSED(hsh); }
255 bool check_existance(
const MaterialPropertyNameHash hsh)
const;
256 bool check_existance(
const char* property_name)
const;
257 bool clear_override(
const unsigned hsh);
261 std::unordered_map<MaterialPropertyNameHash, PropertyValue<void>> properties_;