30 Namable::operator = (copy);
32 if (is_used_by_auto_shader()) {
33 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
36 _base_color = copy._base_color;
37 _ambient = copy._ambient;
38 _diffuse = copy._diffuse;
39 _specular = copy._specular;
40 _emission = copy._emission;
41 _shininess = copy._shininess;
42 _roughness = copy._roughness;
43 _metallic = copy._metallic;
44 _refractive_index = copy._refractive_index;
45 _flags = (copy._flags & ~(F_attrib_lock | F_used_by_auto_shader)) | (_flags & (F_attrib_lock | F_used_by_auto_shader));
62 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
65 _flags |= F_base_color | F_metallic;
66 _flags &= ~(F_ambient | F_diffuse | F_specular);
69 _ambient = _base_color;
70 _diffuse = _base_color * (1 - _metallic);
73 if (_refractive_index >= 1) {
74 f0 = (_refractive_index - 1) / (_refractive_index + 1);
76 f0 *= (1 - _metallic);
78 _specular.set(f0, f0, f0, 0);
79 _specular += _base_color * _metallic;
88 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
90 _flags &= ~F_base_color;
91 _base_color.set(0.0f, 0.0f, 0.0f, 0.0f);
93 if ((_flags & F_ambient) == 0) {
94 _ambient.set(0, 0, 0, 0);
96 if ((_flags & F_diffuse) == 0) {
97 _diffuse.set(0, 0, 0, 0);
99 if ((_flags & F_specular) == 0) {
102 if (_refractive_index >= 1) {
103 f0 = (_refractive_index - 1) / (_refractive_index + 1);
106 _specular.set(f0, f0, f0, 0);
123 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
142 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
163 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
166 _flags |= F_specular;
175 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
177 _flags &= ~F_specular;
181 if (_refractive_index >= 1) {
182 f0 = (_refractive_index - 1) / (_refractive_index + 1);
184 f0 *= (1 - _metallic);
186 _specular.set(f0, f0, f0, 0);
187 _specular += _base_color * _metallic;
202 GraphicsStateGuardianBase::mark_rehash_generated_shaders();
205 _flags |= F_emission;
220 _shininess = shininess;
221 _flags &= ~F_roughness;
230 if ((_flags & F_roughness) == 0) {
232 return csqrt(csqrt(2 / (_shininess + 2)));
249 _roughness = roughness;
250 _flags |= F_roughness;
256 if (roughness <= 0 || IS_NEARLY_ZERO(roughness)) {
257 _shininess = make_inf((PN_stdfloat)0);
259 PN_stdfloat alpha = roughness * roughness;
260 _shininess = 2 / (alpha * alpha) - 2;
273 _metallic = metallic;
274 _flags |= F_metallic;
277 if ((_flags & F_diffuse) == 0) {
278 _diffuse = _base_color * (1 - _metallic);
280 if ((_flags & F_specular) == 0) {
283 if (_refractive_index >= 1) {
284 f0 = (_refractive_index - 1) / (_refractive_index + 1);
286 f0 *= (1 - _metallic);
288 _specular.set(f0, f0, f0, 0);
289 _specular += _base_color * _metallic;
298 _flags &= ~F_metallic;
302 if (_flags & F_base_color) {
303 if ((_flags & F_diffuse) == 0) {
304 _diffuse = _base_color;
306 if ((_flags & F_specular) == 0) {
309 if (_refractive_index >= 1) {
310 f0 = (_refractive_index - 1) / (_refractive_index + 1);
313 _specular.set(f0, f0, f0, 0);
328 _refractive_index = refractive_index;
329 _flags |= F_refractive_index;
331 if ((_flags & F_specular) == 0) {
334 if (_refractive_index >= 1) {
335 f0 = (_refractive_index - 1) / (_refractive_index + 1);
338 _specular.set(f0, f0, f0, 0);
350 if (_flags != other._flags) {
351 return _flags - other._flags;
378 return strcmp(get_name().c_str(), other.get_name().c_str());
385 output(std::ostream &out)
const {
386 out <<
"Material " << get_name();
406 if (_flags & F_roughness) {
411 if (_flags & F_metallic) {
412 out <<
" m" << _metallic;
422 write(std::ostream &out,
int indent_level)
const {
423 indent(out, indent_level) <<
"Material " << get_name() <<
"\n";
441 if (_flags & F_roughness) {
472 me.
add_int32(_flags & ~F_used_by_auto_shader);
474 if (_flags & F_metallic) {
476 _base_color.write_datagram(me);
479 _ambient.write_datagram(me);
480 _diffuse.write_datagram(me);
481 _specular.write_datagram(me);
483 _emission.write_datagram(me);
485 if (_flags & F_roughness) {
493 _ambient.write_datagram(me);
494 _diffuse.write_datagram(me);
495 _specular.write_datagram(me);
496 _emission.write_datagram(me);
512 me->fillin(scan, manager);
528 if (_flags & F_metallic) {
530 _base_color.read_datagram(scan);
534 _ambient.read_datagram(scan);
535 _diffuse.read_datagram(scan);
536 _specular.read_datagram(scan);
538 _emission.read_datagram(scan);
540 if (_flags & F_roughness) {
547 if ((_flags & (F_base_color | F_metallic)) == (F_base_color | F_metallic)) {
553 _ambient.read_datagram(scan);
554 _diffuse.read_datagram(scan);
555 _specular.read_datagram(scan);
556 _emission.read_datagram(scan);
560 if (_flags & F_roughness) {
566 if (is_used_by_auto_shader()) {
567 GraphicsStateGuardianBase::mark_rehash_generated_shaders();