5#include <gtest/gtest.h>
45 EXPECT_NE((
void *)
nullptr, input_socket);
46 input_socket->
set(value);
52 const SocketType *input_socket =
node_->type->find_input(ustring(input_name.c_str()));
53 EXPECT_NE((
void *)
nullptr, input_socket);
54 node_->set(*input_socket, value);
72 const map<string, ShaderNode *>::iterator it =
node_map_.find(
name);
96 EXPECT_NE((
void *)
nullptr, node_from);
97 EXPECT_NE((
void *)
nullptr, node_to);
98 EXPECT_NE(node_from, node_to);
101 EXPECT_NE((
void *)
nullptr, socket_from);
102 EXPECT_NE((
void *)
nullptr, socket_to);
103 graph_->connect(socket_from, socket_to);
162 messages.push_back(msg);
169 messages.free_memory();
175 for (
const string &msg : messages) {
176 if (msg.find(pattern) == string::npos) {
180 LOG_FATAL <<
"Message \"" << pattern <<
"\" not found";
186 for (
const string &msg : messages) {
187 if (msg.find(pattern) == string::npos) {
188 LOG_FATAL <<
"Invalid message \"" << pattern <<
"\" found";
250 builder.add_node(ShaderNodeBuilder<GeometryNode>(graph,
"Geometry1"))
251 .add_node(ShaderNodeBuilder<GeometryNode>(graph,
"Geometry2"))
252 .add_node(ShaderNodeBuilder<ValueNode>(graph,
"Value1").set_param(
"value", 0.8f))
253 .add_node(ShaderNodeBuilder<ValueNode>(graph,
"Value2").set_param(
"value", 0.8f))
254 .add_node(ShaderNodeBuilder<NoiseTextureNode>(graph,
"Noise1"))
255 .add_node(ShaderNodeBuilder<NoiseTextureNode>(graph,
"Noise2"))
256 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix")
259 .add_connection(
"Geometry1::Parametric",
"Noise1::Vector")
260 .add_connection(
"Value1::Value",
"Noise1::Scale")
261 .add_connection(
"Noise1::Color",
"Mix::Color1")
262 .add_connection(
"Geometry2::Parametric",
"Noise2::Vector")
263 .add_connection(
"Value2::Value",
"Noise2::Scale")
264 .add_connection(
"Noise2::Color",
"Mix::Color2")
265 .output_color(
"Mix::Color");
267 graph.finalize(scene.get());
271 log.correct_info_message(
"XFolding Value1::Value to constant (0.8).");
272 log.correct_info_message(
"Folding Value2::Value to constant (0.8).");
273 log.correct_info_message(
"Deduplicated 2 nodes.");
282 .add_node(ShaderNodeBuilder<RGBToBWNode>(graph,
"RGBToBWNodeNode")
284 .output_color(
"RGBToBWNodeNode::Val");
286 graph.finalize(scene.get());
288 log.correct_info_message(
"Folding RGBToBWNodeNode::Val to constant (0.8).");
289 log.correct_info_message(
290 "Folding convert_float_to_color::value_color to constant (0.8, 0.8, 0.8).");
300 builder.add_node(ShaderNodeBuilder<EmissionNode>(graph,
"Emission").set(
"Color",
zero_float3()))
301 .output_closure(
"Emission::Emission");
303 graph.finalize(scene.get());
305 log.correct_info_message(
"Discarding closure Emission.");
311 builder.add_node(ShaderNodeBuilder<EmissionNode>(graph,
"Emission").set(
"Strength", 0.0f))
312 .output_closure(
"Emission::Emission");
314 graph.finalize(scene.get());
316 log.correct_info_message(
"Discarding closure Emission.");
326 .add_node(ShaderNodeBuilder<BackgroundNode>(graph,
"Background").set(
"Color",
zero_float3()))
327 .output_closure(
"Background::Background");
329 graph.finalize(scene.get());
331 log.correct_info_message(
"Discarding closure Background.");
336 builder.add_node(ShaderNodeBuilder<BackgroundNode>(graph,
"Background").set(
"Strength", 0.0f))
337 .output_closure(
"Background::Background");
339 graph.finalize(scene.get());
341 log.correct_info_message(
"Discarding closure Background.");
350 builder.add_node(ShaderNodeBuilder<DiffuseBsdfNode>(graph,
"Diffuse"))
351 .add_node(ShaderNodeBuilder<AddClosureNode>(graph,
"AddClosure1"))
352 .add_node(ShaderNodeBuilder<AddClosureNode>(graph,
"AddClosure2"))
353 .add_node(ShaderNodeBuilder<AddClosureNode>(graph,
"AddClosure3"))
354 .add_connection(
"Diffuse::BSDF",
"AddClosure1::Closure1")
355 .add_connection(
"Diffuse::BSDF",
"AddClosure2::Closure2")
356 .add_connection(
"AddClosure1::Closure",
"AddClosure3::Closure1")
357 .add_connection(
"AddClosure2::Closure",
"AddClosure3::Closure2")
358 .output_closure(
"AddClosure3::Closure");
360 graph.finalize(scene.get());
362 log.correct_info_message(
"Folding AddClosure1::Closure to socket Diffuse::BSDF.");
363 log.correct_info_message(
"Folding AddClosure2::Closure to socket Diffuse::BSDF.");
364 log.invalid_info_message(
"Folding AddClosure3");
374 builder.add_attribute(
"Attribute")
375 .add_node(ShaderNodeBuilder<DiffuseBsdfNode>(graph,
"Diffuse"))
377 .add_node(ShaderNodeBuilder<MixClosureNode>(graph,
"MixClosure1").set(
"Fac", 0.0f))
378 .add_connection(
"Diffuse::BSDF",
"MixClosure1::Closure1")
380 .add_node(ShaderNodeBuilder<MixClosureNode>(graph,
"MixClosure2").set(
"Fac", 1.0f))
381 .add_connection(
"Diffuse::BSDF",
"MixClosure2::Closure2")
383 .add_node(ShaderNodeBuilder<MixClosureNode>(graph,
"MixClosure3"))
384 .add_connection(
"Attribute::Fac",
"MixClosure3::Fac")
385 .add_connection(
"MixClosure1::Closure",
"MixClosure3::Closure1")
386 .add_connection(
"MixClosure2::Closure",
"MixClosure3::Closure2")
387 .output_closure(
"MixClosure3::Closure");
389 graph.finalize(scene.get());
391 log.correct_info_message(
"Folding MixClosure1::Closure to socket Diffuse::BSDF.");
392 log.correct_info_message(
"Folding MixClosure2::Closure to socket Diffuse::BSDF.");
393 log.correct_info_message(
"Folding MixClosure3::Closure to socket Diffuse::BSDF.");
403 .add_node(ShaderNodeBuilder<InvertNode>(graph,
"Invert")
406 .output_color(
"Invert::Color");
408 graph.finalize(scene.get());
410 log.correct_info_message(
"Folding Invert::Color to constant (0.68, 0.5, 0.32).");
419 builder.add_attribute(
"Attribute")
420 .add_node(ShaderNodeBuilder<InvertNode>(graph,
"Invert").set(
"Fac", 0.0f))
421 .add_connection(
"Attribute::Color",
"Invert::Color")
422 .output_color(
"Invert::Color");
424 graph.finalize(scene.get());
426 log.correct_info_message(
"Folding Invert::Color to socket Attribute::Color.");
436 .add_node(ShaderNodeBuilder<InvertNode>(graph,
"Invert")
439 .output_color(
"Invert::Color");
441 graph.finalize(scene.get());
443 log.correct_info_message(
"Folding Invert::Color to constant (0.2, 0.5, 0.8).");
453 .add_node(ShaderNodeBuilder<MixNode>(graph,
"MixAdd")
455 .set_param(
"use_clamp",
false)
459 .output_color(
"MixAdd::Color");
461 graph.finalize(scene.get());
463 log.correct_info_message(
"Folding MixAdd::Color to constant (0.62, 1.14, 1.42).");
473 .add_node(ShaderNodeBuilder<MixNode>(graph,
"MixAdd")
475 .set_param(
"use_clamp",
true)
479 .output_color(
"MixAdd::Color");
481 graph.finalize(scene.get());
483 log.correct_info_message(
"Folding MixAdd::Color to constant (0.62, 1, 1).");
492 builder.add_attribute(
"Attribute1")
493 .add_attribute(
"Attribute2")
494 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix")
496 .set_param(
"use_clamp",
false)
498 .add_connection(
"Attribute1::Color",
"Mix::Color1")
499 .add_connection(
"Attribute2::Color",
"Mix::Color2")
500 .output_color(
"Mix::Color");
502 graph.finalize(scene.get());
504 log.invalid_info_message(
"Folding ");
513 builder.add_attribute(
"Attribute1")
514 .add_attribute(
"Attribute2")
515 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix")
517 .set_param(
"use_clamp",
false)
519 .add_connection(
"Attribute1::Color",
"Mix::Color1")
520 .add_connection(
"Attribute2::Color",
"Mix::Color2")
521 .output_color(
"Mix::Color");
523 graph.finalize(scene.get());
525 log.invalid_info_message(
"Folding ");
534 builder.add_attribute(
"Attribute1")
535 .add_attribute(
"Attribute2")
536 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix")
538 .set_param(
"use_clamp",
false)
540 .add_connection(
"Attribute1::Color",
"Mix::Color1")
541 .add_connection(
"Attribute2::Color",
"Mix::Color2")
542 .output_color(
"Mix::Color");
544 graph.finalize(scene.get());
546 log.invalid_info_message(
"Folding ");
555 builder.add_attribute(
"Attribute1")
556 .add_attribute(
"Attribute2")
557 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix")
559 .set_param(
"use_clamp",
true)
561 .add_connection(
"Attribute1::Color",
"Mix::Color1")
562 .add_connection(
"Attribute2::Color",
"Mix::Color2")
563 .output_color(
"Mix::Color");
565 graph.finalize(scene.get());
567 log.invalid_info_message(
"Folding ");
577 builder.add_attribute(
"Attribute1")
578 .add_attribute(
"Attribute2")
580 .add_node(ShaderNodeBuilder<MixNode>(graph,
"MixBlend1")
582 .set_param(
"use_clamp",
false)
584 .add_connection(
"Attribute1::Color",
"MixBlend1::Color1")
585 .add_connection(
"Attribute2::Color",
"MixBlend1::Color2")
587 .add_node(ShaderNodeBuilder<MixNode>(graph,
"MixBlend2")
589 .set_param(
"use_clamp",
false)
591 .add_connection(
"Attribute1::Color",
"MixBlend2::Color2")
592 .add_connection(
"Attribute2::Color",
"MixBlend2::Color1")
594 .add_node(ShaderNodeBuilder<MixNode>(graph,
"MixBlend3")
596 .set_param(
"use_clamp",
false))
597 .add_connection(
"Attribute1::Fac",
"MixBlend3::Fac")
598 .add_connection(
"MixBlend1::Color",
"MixBlend3::Color1")
599 .add_connection(
"MixBlend2::Color",
"MixBlend3::Color2")
600 .output_color(
"MixBlend3::Color");
602 graph.finalize(scene.get());
604 log.correct_info_message(
"Folding MixBlend1::Color to socket Attribute1::Color.");
605 log.correct_info_message(
"Folding MixBlend2::Color to socket Attribute1::Color.");
606 log.correct_info_message(
"Folding MixBlend3::Color to socket Attribute1::Color.");
615 builder.add_attribute(
"Attribute")
616 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix")
618 .set_param(
"use_clamp",
true)
620 .add_connection(
"Attribute::Color",
"Mix::Color1")
621 .add_connection(
"Attribute::Color",
"Mix::Color2")
622 .output_color(
"Mix::Color");
624 graph.finalize(scene.get());
626 log.invalid_info_message(
"Folding Mix::");
635 builder.add_attribute(
"Attribute")
636 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix")
638 .set_param(
"use_clamp",
true)
640 .add_connection(
"Attribute::Color",
"Mix::Color1")
641 .add_connection(
"Attribute::Color",
"Mix::Color2")
642 .output_color(
"Mix::Color");
644 graph.finalize(scene.get());
646 log.correct_info_message(
"Folding Mix::Color to constant (0, 0, 0).");
658 .add_attribute(
"Attribute")
660 .add_node(ShaderNodeBuilder<MixNode>(builder.graph(),
"Mix_Cx_Fx")
661 .set_param(
"mix_type", type)
662 .set_param(
"use_clamp",
false)
663 .set(
"Color1", constval))
664 .add_node(ShaderNodeBuilder<MixNode>(builder.graph(),
"Mix_Cx_F1")
665 .set_param(
"mix_type", type)
666 .set_param(
"use_clamp",
false)
667 .set(
"Color1", constval)
669 .add_connection(
"Attribute::Fac",
"Mix_Cx_Fx::Fac")
670 .add_connection(
"Attribute::Color",
"Mix_Cx_Fx::Color2")
671 .add_connection(
"Attribute::Color",
"Mix_Cx_F1::Color2")
673 .add_node(ShaderNodeBuilder<MixNode>(builder.graph(),
"Mix_xC_Fx")
674 .set_param(
"mix_type", type)
675 .set_param(
"use_clamp",
false)
676 .set(
"Color2", constval))
677 .add_node(ShaderNodeBuilder<MixNode>(builder.graph(),
"Mix_xC_F1")
678 .set_param(
"mix_type", type)
679 .set_param(
"use_clamp",
false)
680 .set(
"Color2", constval)
682 .add_connection(
"Attribute::Fac",
"Mix_xC_Fx::Fac")
683 .add_connection(
"Attribute::Color",
"Mix_xC_Fx::Color1")
684 .add_connection(
"Attribute::Color",
"Mix_xC_F1::Color1")
686 .add_node(ShaderNodeBuilder<MixNode>(builder.graph(),
"Out12")
688 .set_param(
"use_clamp",
true)
690 .add_node(ShaderNodeBuilder<MixNode>(builder.graph(),
"Out34")
692 .set_param(
"use_clamp",
true)
694 .add_node(ShaderNodeBuilder<MixNode>(builder.graph(),
"Out1234")
696 .set_param(
"use_clamp",
true)
698 .add_connection(
"Mix_Cx_Fx::Color",
"Out12::Color1")
699 .add_connection(
"Mix_Cx_F1::Color",
"Out12::Color2")
700 .add_connection(
"Mix_xC_Fx::Color",
"Out34::Color1")
701 .add_connection(
"Mix_xC_F1::Color",
"Out34::Color2")
702 .add_connection(
"Out12::Color",
"Out1234::Color1")
703 .add_connection(
"Out34::Color",
"Out1234::Color2")
704 .output_color(
"Out1234::Color");
713 graph.finalize(scene.get());
716 log.invalid_info_message(
"Folding Mix_Cx_Fx::Color");
717 log.correct_info_message(
"Folding Mix_Cx_F1::Color to socket Attribute::Color.");
719 log.correct_info_message(
"Folding Mix_xC_Fx::Color to socket Attribute::Color.");
720 log.correct_info_message(
"Folding Mix_xC_F1::Color to socket Attribute::Color.");
721 log.invalid_info_message(
"Folding Out");
730 graph.finalize(scene.get());
732 log.invalid_info_message(
"Folding Mix_Cx_Fx::Color");
733 log.invalid_info_message(
"Folding Mix_Cx_F1::Color");
735 log.correct_info_message(
"Folding Mix_xC_Fx::Color to socket Attribute::Color.");
736 log.correct_info_message(
"Folding Mix_xC_F1::Color to socket Attribute::Color.");
737 log.invalid_info_message(
"Folding Out");
746 graph.finalize(scene.get());
749 log.invalid_info_message(
"Folding Mix_Cx_Fx::Color");
750 log.correct_info_message(
"Folding Mix_Cx_F1::Color to socket Attribute::Color.");
752 log.correct_info_message(
"Folding Mix_xC_Fx::Color to socket Attribute::Color.");
753 log.correct_info_message(
"Folding Mix_xC_F1::Color to socket Attribute::Color.");
754 log.invalid_info_message(
"Folding Out");
763 graph.finalize(scene.get());
765 log.invalid_info_message(
"Folding Mix_Cx_Fx::Color");
766 log.invalid_info_message(
"Folding Mix_Cx_F1::Color");
768 log.correct_info_message(
"Folding Mix_xC_Fx::Color to socket Attribute::Color.");
769 log.correct_info_message(
"Folding Mix_xC_F1::Color to socket Attribute::Color.");
770 log.invalid_info_message(
"Folding Out");
779 graph.finalize(scene.get());
782 log.correct_info_message(
"Folding Mix_Cx_Fx::Color to constant (0, 0, 0).");
783 log.correct_info_message(
"Folding Mix_Cx_F1::Color to constant (0, 0, 0).");
785 log.invalid_info_message(
"Folding Mix_xC_Fx::Color");
786 log.correct_info_message(
"Folding Mix_xC_F1::Color to constant (0, 0, 0).");
788 log.correct_info_message(
"Folding Out12::Color to constant (0, 0, 0).");
789 log.invalid_info_message(
"Folding Out1234");
798 graph.finalize(scene.get());
801 log.correct_info_message(
"Folding Mix_Cx_Fx::Color to constant (0, 0, 0).");
802 log.correct_info_message(
"Folding Mix_Cx_F1::Color to constant (0, 0, 0).");
803 log.invalid_info_message(
"Folding Mix_xC_Fx::Color");
804 log.invalid_info_message(
"Folding Mix_xC_F1::Color");
806 log.correct_info_message(
"Folding Out12::Color to constant (0, 0, 0).");
807 log.invalid_info_message(
"Folding Out1234");
816 .add_node(ShaderNodeBuilder<SeparateColorNode>(graph,
"SeparateRGB")
819 .add_node(ShaderNodeBuilder<CombineColorNode>(graph,
"CombineRGB")
821 .add_connection(
"SeparateRGB::Red",
"CombineRGB::Red")
822 .add_connection(
"SeparateRGB::Green",
"CombineRGB::Green")
823 .add_connection(
"SeparateRGB::Blue",
"CombineRGB::Blue")
824 .output_color(
"CombineRGB::Color");
826 graph.finalize(scene.get());
828 log.correct_info_message(
"Folding SeparateRGB::R to constant (0.3).");
829 log.correct_info_message(
"Folding SeparateRGB::G to constant (0.5).");
830 log.correct_info_message(
"Folding SeparateRGB::B to constant (0.7).");
831 log.correct_info_message(
"Folding CombineRGB::Image to constant (0.3, 0.5, 0.7).");
840 .add_node(ShaderNodeBuilder<SeparateXYZNode>(graph,
"SeparateXYZ")
842 .add_node(ShaderNodeBuilder<CombineXYZNode>(graph,
"CombineXYZ"))
843 .add_connection(
"SeparateXYZ::X",
"CombineXYZ::X")
844 .add_connection(
"SeparateXYZ::Y",
"CombineXYZ::Y")
845 .add_connection(
"SeparateXYZ::Z",
"CombineXYZ::Z")
846 .output_color(
"CombineXYZ::Vector");
848 graph.finalize(scene.get());
850 log.correct_info_message(
"Folding SeparateXYZ::X to constant (0.3).");
851 log.correct_info_message(
"Folding SeparateXYZ::Y to constant (0.5).");
852 log.correct_info_message(
"Folding SeparateXYZ::Z to constant (0.7).");
853 log.correct_info_message(
"Folding CombineXYZ::Vector to constant (0.3, 0.5, 0.7).");
854 log.correct_info_message(
855 "Folding convert_vector_to_color::value_color to constant (0.3, 0.5, 0.7).");
864 .add_node(ShaderNodeBuilder<SeparateColorNode>(graph,
"SeparateHSV")
867 .add_node(ShaderNodeBuilder<CombineColorNode>(graph,
"CombineHSV")
869 .add_connection(
"SeparateHSV::Red",
"CombineHSV::Red")
870 .add_connection(
"SeparateHSV::Green",
"CombineHSV::Green")
871 .add_connection(
"SeparateHSV::Blue",
"CombineHSV::Blue")
872 .output_color(
"CombineHSV::Color");
874 graph.finalize(scene.get());
876 log.correct_info_message(
"Folding SeparateHSV::H to constant (0.583333).");
877 log.correct_info_message(
"Folding SeparateHSV::S to constant (0.571429).");
878 log.correct_info_message(
"Folding SeparateHSV::V to constant (0.7).");
879 log.correct_info_message(
"Folding CombineHSV::Color to constant (0.3, 0.5, 0.7).");
888 .add_node(ShaderNodeBuilder<GammaNode>(graph,
"Gamma")
891 .output_color(
"Gamma::Color");
893 graph.finalize(scene.get());
895 log.correct_info_message(
"Folding Gamma::Color to constant (0.164317, 0.353553, 0.585662).");
904 .add_attribute(
"Attribute")
906 .add_node(ShaderNodeBuilder<GammaNode>(graph,
"Gamma_Cx").set(
"Color",
zero_float3()))
907 .add_connection(
"Attribute::Fac",
"Gamma_Cx::Gamma")
909 .add_node(ShaderNodeBuilder<GammaNode>(graph,
"Gamma_xC").set(
"Gamma", 0.0f))
910 .add_connection(
"Attribute::Color",
"Gamma_xC::Color")
912 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Out")
914 .set_param(
"use_clamp",
true)
916 .add_connection(
"Gamma_Cx::Color",
"Out::Color1")
917 .add_connection(
"Gamma_xC::Color",
"Out::Color2")
918 .output_color(
"Out::Color");
920 graph.finalize(scene.get());
922 log.invalid_info_message(
"Folding Gamma_Cx::");
923 log.correct_info_message(
"Folding Gamma_xC::Color to constant (1, 1, 1).");
932 .add_attribute(
"Attribute")
934 .add_node(ShaderNodeBuilder<GammaNode>(graph,
"Gamma_Cx").set(
"Color",
one_float3()))
935 .add_connection(
"Attribute::Fac",
"Gamma_Cx::Gamma")
937 .add_node(ShaderNodeBuilder<GammaNode>(graph,
"Gamma_xC").set(
"Gamma", 1.0f))
938 .add_connection(
"Attribute::Color",
"Gamma_xC::Color")
940 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Out")
942 .set_param(
"use_clamp",
true)
944 .add_connection(
"Gamma_Cx::Color",
"Out::Color1")
945 .add_connection(
"Gamma_xC::Color",
"Out::Color2")
946 .output_color(
"Out::Color");
948 graph.finalize(scene.get());
950 log.correct_info_message(
"Folding Gamma_Cx::Color to constant (1, 1, 1).");
951 log.correct_info_message(
"Folding Gamma_xC::Color to socket Attribute::Color.");
960 .add_node(ShaderNodeBuilder<BrightContrastNode>(graph,
"BrightContrast")
963 .set(
"Contrast", 1.2f))
964 .output_color(
"BrightContrast::Color");
966 graph.finalize(scene.get());
968 log.correct_info_message(
"Folding BrightContrast::Color to constant (0.16, 0.6, 1.04).");
977 .add_node(ShaderNodeBuilder<BlackbodyNode>(graph,
"Blackbody").set(
"Temperature", 1200.0f))
978 .output_color(
"Blackbody::Color");
980 graph.finalize(scene.get());
982 log.correct_info_message(
"Folding Blackbody::Color to constant (3.96553, 0.227897, 0).");
998 .add_node(ShaderNodeBuilder<MathNode>(graph,
"Math")
1000 .set_param(
"use_clamp",
false)
1001 .set(
"Value1", 0.7f)
1002 .set(
"Value2", 0.9f))
1003 .output_value(
"Math::Value");
1005 graph.finalize(scene.get());
1007 log.correct_info_message(
"Folding Math::Value to constant (1.6).");
1016 .add_node(ShaderNodeBuilder<MathNode>(graph,
"Math")
1018 .set_param(
"use_clamp",
true)
1019 .set(
"Value1", 0.7f)
1020 .set(
"Value2", 0.9f))
1021 .output_value(
"Math::Value");
1023 graph.finalize(scene.get());
1025 log.correct_info_message(
"Folding clamp::Result to constant (1).");
1034 const float constval)
1037 .add_attribute(
"Attribute")
1039 .add_node(ShaderNodeBuilder<MathNode>(builder.graph(),
"Math_Cx")
1040 .set_param(
"math_type", type)
1041 .set_param(
"use_clamp",
false)
1042 .set(
"Value1", constval))
1043 .add_connection(
"Attribute::Fac",
"Math_Cx::Value2")
1045 .add_node(ShaderNodeBuilder<MathNode>(builder.graph(),
"Math_xC")
1046 .set_param(
"math_type", type)
1047 .set_param(
"use_clamp",
false)
1048 .set(
"Value2", constval))
1049 .add_connection(
"Attribute::Fac",
"Math_xC::Value1")
1051 .add_node(ShaderNodeBuilder<MathNode>(builder.graph(),
"Out")
1053 .set_param(
"use_clamp",
true))
1054 .add_connection(
"Math_Cx::Value",
"Out::Value1")
1055 .add_connection(
"Math_xC::Value",
"Out::Value2")
1056 .output_value(
"Out::Value");
1065 graph.finalize(scene.get());
1068 log.correct_info_message(
"Folding Math_Cx::Value to socket Attribute::Fac.");
1069 log.correct_info_message(
"Folding Math_xC::Value to socket Attribute::Fac.");
1070 log.invalid_info_message(
"Folding clamp::");
1079 graph.finalize(scene.get());
1082 log.invalid_info_message(
"Folding Math_Cx::");
1083 log.correct_info_message(
"Folding Math_xC::Value to socket Attribute::Fac.");
1084 log.invalid_info_message(
"Folding clamp::");
1093 graph.finalize(scene.get());
1096 log.correct_info_message(
"Folding Math_Cx::Value to socket Attribute::Fac.");
1097 log.correct_info_message(
"Folding Math_xC::Value to socket Attribute::Fac.");
1098 log.invalid_info_message(
"Folding clamp::");
1107 graph.finalize(scene.get());
1110 log.invalid_info_message(
"Folding Math_Cx::");
1111 log.correct_info_message(
"Folding Math_xC::Value to socket Attribute::Fac.");
1112 log.invalid_info_message(
"Folding clamp::");
1121 graph.finalize(scene.get());
1124 log.correct_info_message(
"Folding Math_Cx::Value to constant (0).");
1125 log.correct_info_message(
"Folding Math_xC::Value to constant (0).");
1126 log.correct_info_message(
"Folding clamp::Result to constant (0)");
1127 log.correct_info_message(
"Discarding closure EmissionNode.");
1136 graph.finalize(scene.get());
1139 log.correct_info_message(
"Folding Math_Cx::Value to constant (0).");
1140 log.invalid_info_message(
"Folding Math_xC::");
1141 log.invalid_info_message(
"Folding clamp::");
1150 graph.finalize(scene.get());
1153 log.invalid_info_message(
"Folding Math_Cx::");
1154 log.correct_info_message(
"Folding Math_xC::Value to constant (1).");
1155 log.invalid_info_message(
"Folding clamp::");
1164 graph.finalize(scene.get());
1167 log.correct_info_message(
"Folding Math_Cx::Value to constant (1)");
1168 log.correct_info_message(
"Folding Math_xC::Value to socket Attribute::Fac.");
1169 log.invalid_info_message(
"Folding clamp::");
1178 .add_node(ShaderNodeBuilder<VectorMathNode>(graph,
"VectorMath")
1182 .output_color(
"VectorMath::Vector");
1184 graph.finalize(scene.get());
1186 log.correct_info_message(
"Folding VectorMath::Vector to constant (3, 0, 0).");
1198 .add_attribute(
"Attribute")
1200 .add_node(ShaderNodeBuilder<VectorMathNode>(builder.graph(),
"Math_Cx")
1201 .set_param(
"math_type", type)
1202 .set(
"Vector1", constval))
1203 .add_connection(
"Attribute::Vector",
"Math_Cx::Vector2")
1205 .add_node(ShaderNodeBuilder<VectorMathNode>(builder.graph(),
"Math_xC")
1206 .set_param(
"math_type", type)
1207 .set(
"Vector2", constval))
1208 .add_connection(
"Attribute::Vector",
"Math_xC::Vector1")
1210 .add_node(ShaderNodeBuilder<VectorMathNode>(builder.graph(),
"Out")
1212 .add_connection(
"Math_Cx::Vector",
"Out::Vector1")
1213 .add_connection(
"Math_xC::Vector",
"Out::Vector2")
1214 .output_color(
"Out::Vector");
1223 graph.finalize(scene.get());
1226 log.correct_info_message(
"Folding Math_Cx::Vector to socket Attribute::Vector.");
1227 log.correct_info_message(
"Folding Math_xC::Vector to socket Attribute::Vector.");
1228 log.invalid_info_message(
"Folding Out::");
1237 graph.finalize(scene.get());
1240 log.invalid_info_message(
"Folding Math_Cx::");
1241 log.correct_info_message(
"Folding Math_xC::Vector to socket Attribute::Vector.");
1242 log.invalid_info_message(
"Folding Out::");
1251 graph.finalize(scene.get());
1254 log.correct_info_message(
"Folding Math_Cx::Vector to constant (0, 0, 0).");
1255 log.correct_info_message(
"Folding Math_xC::Vector to constant (0, 0, 0).");
1256 log.correct_info_message(
"Folding Out::Vector to constant (0, 0, 0).");
1257 log.correct_info_message(
"Discarding closure EmissionNode.");
1265 builder.add_node(ShaderNodeBuilder<GeometryNode>(graph,
"Geometry1"))
1266 .add_node(ShaderNodeBuilder<BumpNode>(graph,
"Bump"))
1267 .add_connection(
"Geometry1::Normal",
"Bump::Normal")
1268 .output_color(
"Bump::Normal");
1270 graph.finalize(scene.get());
1272 log.correct_info_message(
"Folding Bump::Normal to socket Geometry1::Normal.");
1280 builder.add_node(ShaderNodeBuilder<BumpNode>(graph,
"Bump")).output_color(
"Bump::Normal");
1282 graph.finalize(scene.get());
1284 log.correct_info_message(
"Folding Bump::Normal to socket geometry::Normal.");
1291 for (
int i = 0;
i < steps;
i++) {
1292 buffer[
i] =
mix(start, end,
float(
i) / (steps - 1));
1306 .add_node(ShaderNodeBuilder<RGBCurvesNode>(graph,
"Curves")
1307 .set_param(
"curves", curve)
1308 .set_param(
"min_x", 0.1f)
1309 .set_param(
"max_x", 0.9f)
1312 .output_color(
"Curves::Color");
1314 graph.finalize(scene.get());
1316 log.correct_info_message(
"Folding Curves::Color to constant (0.275, 0.5, 0.475).");
1328 builder.add_attribute(
"Attribute")
1329 .add_node(ShaderNodeBuilder<RGBCurvesNode>(graph,
"Curves")
1330 .set_param(
"curves", curve)
1331 .set_param(
"min_x", 0.1f)
1332 .set_param(
"max_x", 0.9f)
1334 .add_connection(
"Attribute::Color",
"Curves::Color")
1335 .output_color(
"Curves::Color");
1337 graph.finalize(scene.get());
1339 log.correct_info_message(
"Folding Curves::Color to socket Attribute::Color.");
1352 .add_node(ShaderNodeBuilder<RGBCurvesNode>(graph,
"Curves")
1353 .set_param(
"curves", curve)
1354 .set_param(
"min_x", 0.1f)
1355 .set_param(
"max_x", 0.9f)
1358 .output_color(
"Curves::Color");
1360 graph.finalize(scene.get());
1362 log.correct_info_message(
"Folding Curves::Color to constant (0.3, 0.5, 0.7).");
1375 .add_node(ShaderNodeBuilder<VectorCurvesNode>(graph,
"Curves")
1376 .set_param(
"curves", curve)
1377 .set_param(
"min_x", 0.1f)
1378 .set_param(
"max_x", 0.9f)
1381 .output_color(
"Curves::Vector");
1383 graph.finalize(scene.get());
1385 log.correct_info_message(
"Folding Curves::Vector to constant (0.275, 0.5, 0.475).");
1397 builder.add_attribute(
"Attribute")
1398 .add_node(ShaderNodeBuilder<VectorCurvesNode>(graph,
"Curves")
1399 .set_param(
"curves", curve)
1400 .set_param(
"min_x", 0.1f)
1401 .set_param(
"max_x", 0.9f)
1403 .add_connection(
"Attribute::Vector",
"Curves::Vector")
1404 .output_color(
"Curves::Vector");
1406 graph.finalize(scene.get());
1408 log.correct_info_message(
"Folding Curves::Vector to socket Attribute::Vector.");
1423 .add_node(ShaderNodeBuilder<RGBRampNode>(graph,
"Ramp")
1424 .set_param(
"ramp", curve)
1425 .set_param(
"ramp_alpha", alpha)
1426 .set_param(
"interpolate",
true)
1428 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix").set_param(
"mix_type",
NODE_MIX_ADD))
1429 .add_connection(
"Ramp::Color",
"Mix::Color1")
1430 .add_connection(
"Ramp::Alpha",
"Mix::Color2")
1431 .output_color(
"Mix::Color");
1433 graph.finalize(scene.get());
1435 log.correct_info_message(
"Folding Ramp::Color to constant (0.14, 0.39, 0.64).");
1436 log.correct_info_message(
"Folding Ramp::Alpha to constant (0.89).");
1451 .add_node(ShaderNodeBuilder<RGBRampNode>(graph,
"Ramp")
1452 .set_param(
"ramp", curve)
1453 .set_param(
"ramp_alpha", alpha)
1454 .set_param(
"interpolate",
false)
1456 .add_node(ShaderNodeBuilder<MixNode>(graph,
"Mix").set_param(
"mix_type",
NODE_MIX_ADD))
1457 .add_connection(
"Ramp::Color",
"Mix::Color1")
1458 .add_connection(
"Ramp::Alpha",
"Mix::Color2")
1459 .output_color(
"Mix::Color");
1461 graph.finalize(scene.get());
1463 log.correct_info_message(
"Folding Ramp::Color to constant (0.125, 0.375, 0.625).");
1464 log.correct_info_message(
"Folding Ramp::Alpha to constant (0.875).");
1473 builder.add_attribute(
"Attribute")
1474 .add_node(ShaderNodeBuilder<InvertNode>(graph,
"Invert").set(
"Fac", 0.0f))
1475 .add_connection(
"Attribute::Fac",
"Invert::Color")
1476 .output_value(
"Invert::Color");
1478 graph.finalize(scene.get());
1480 log.correct_info_message(
"Folding Invert::Color to socket convert_float_to_color::value_color.");
1481 log.correct_info_message(
1482 "Folding convert_color_to_float::value_float to socket Attribute::Fac.");
1491 builder.add_attribute(
"Attribute")
1492 .add_node(ShaderNodeBuilder<VectorMathNode>(graph,
"VecAdd")
1495 .add_connection(
"Attribute::Color",
"VecAdd::Vector1")
1496 .output_color(
"VecAdd::Vector");
1498 graph.finalize(scene.get());
1500 log.correct_info_message(
1501 "Folding VecAdd::Vector to socket convert_color_to_vector::value_vector.");
1502 log.correct_info_message(
1503 "Folding convert_vector_to_color::value_color to socket Attribute::Color.");
1512 builder.add_attribute(
"Attribute")
1513 .add_node(ShaderNodeBuilder<MathNode>(graph,
"MathAdd")
1515 .set(
"Value2", 0.0f))
1516 .add_connection(
"Attribute::Color",
"MathAdd::Value1")
1517 .output_color(
"MathAdd::Value");
1519 graph.finalize(scene.get());
1521 log.correct_info_message(
1522 "Folding MathAdd::Value to socket convert_color_to_float::value_float.");
1523 log.invalid_info_message(
"Folding convert_float_to_color::");
1532 builder.add_attribute(
"Attribute")
1533 .add_node(ShaderNodeBuilder<MathNode>(graph,
"MathMultiply")
1535 .add_node(ShaderNodeBuilder<ScatterVolumeNode>(graph,
"ScatterVolume"))
1536 .add_connection(
"Attribute::Fac",
"MathMultiply::Value1")
1537 .add_connection(
"MathMultiply::Value",
"ScatterVolume::Density")
1538 .output_volume_closure(
"ScatterVolume::Volume");
1540 graph.finalize(scene.get());
1542 log.correct_info_message(
"Volume attribute node Attribute uses stochastic sampling");
1551 builder.add_attribute(
"Attribute")
1553 ShaderNodeBuilder<MathNode>(graph,
"MathPower").set_param(
"math_type",
NODE_MATH_POWER))
1554 .add_node(ShaderNodeBuilder<ScatterVolumeNode>(graph,
"ScatterVolume"))
1555 .add_connection(
"Attribute::Fac",
"MathPower::Value1")
1556 .add_connection(
"MathPower::Value",
"ScatterVolume::Density")
1557 .output_volume_closure(
"ScatterVolume::Volume");
1559 graph.finalize(scene.get());
1561 log.invalid_info_message(
"Volume attribute node Attribute uses stochastic sampling");
1570 builder.add_attribute(
"Attribute")
1571 .add_node(ShaderNodeBuilder<MapRangeNode>(graph,
"MapRange"))
1572 .add_node(ShaderNodeBuilder<MixClosureNode>(graph,
"MixClosure").set(
"Fac", 0.5f))
1573 .add_node(ShaderNodeBuilder<PrincipledVolumeNode>(graph,
"PrincipledVolume1"))
1574 .add_node(ShaderNodeBuilder<PrincipledVolumeNode>(graph,
"PrincipledVolume2"))
1575 .add_connection(
"Attribute::Color",
"MapRange::Value")
1576 .add_connection(
"MapRange::Result",
"PrincipledVolume1::Temperature")
1577 .add_connection(
"Attribute::Fac",
"PrincipledVolume2::Density")
1578 .add_connection(
"PrincipledVolume1::Volume",
"MixClosure::Closure1")
1579 .add_connection(
"PrincipledVolume2::Volume",
"MixClosure::Closure2")
1580 .output_volume_closure(
"MixClosure::Closure");
1582 graph.finalize(scene.get());
1584 log.correct_info_message(
"Volume attribute node Attribute uses stochastic sampling");
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
@ NODE_VECTOR_MATH_CROSS_PRODUCT
@ NODE_VECTOR_MATH_SUBTRACT
void correct_info_message(const char *pattern)
void invalid_info_message(const char *pattern)
ShaderGraphBuilder & add_connection(const string &from, const string &to)
ShaderGraphBuilder & output_value(const string &from)
ShaderGraphBuilder(ShaderGraph *graph)
map< string, ShaderNode * > node_map_
ShaderGraphBuilder & output_closure(const string &from)
ShaderGraphBuilder & add_node(const T &node)
ShaderGraphBuilder & output_volume_closure(const string &from)
ShaderGraphBuilder & add_attribute(const string &name)
ShaderGraphBuilder & output_color(const string &from)
ShaderNode * find_node(const string &name)
ShaderNodeBuilder & set(const string &input_name, V value)
ShaderNodeBuilder & set_param(const string &input_name, V value)
const string & name() const
ShaderNode * node() const
ShaderNodeBuilder(ShaderGraph &graph, const string &name)
static void init_fallback_config()
static unique_ptr< Device > create(const DeviceInfo &info, Stats &stats, Profiler &profiler, bool headless)
ShaderGraphBuilder builder
unique_ptr< Scene > scene
unique_ptr< Device > device_cpu
T * create_node(Args &&...args)
ShaderInput * input(const char *name)
ShaderOutput * output(const char *name)
T * resize(const size_t newsize)
#define CCL_NAMESPACE_END
void log_init(const LogFunction func)
void log_level_set(const LogLevel level)
ccl_device_inline float3 one_float3()
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
void init_test_curve(array< T > &buffer, T start, T end, const int steps)
TEST_F(RenderGraph, deduplicate_deep)
static void build_math_partial_test_graph(ShaderGraphBuilder &builder, NodeMathType type, const float constval)
static void build_mix_partial_test_graph(ShaderGraphBuilder &builder, NodeMix type, const float3 constval)
static void build_vecmath_partial_test_graph(ShaderGraphBuilder &builder, NodeVectorMathType type, const float3 constval)
void string_split(vector< string > &tokens, const string &str, const string &separators, bool skip_empty_tokens)
std::unique_lock< std::mutex > thread_scoped_lock
CCL_NAMESPACE_BEGIN struct Window V