75 if (value >= num_values) {
83 int value = b_node.interpolation();
90 int value = b_node.extension();
96 int value = b_image.alpha_mode();
121 case BL::ShaderNodeAttribute::attribute_type_OBJECT:
123 case BL::ShaderNodeAttribute::attribute_type_INSTANCER:
126 return ustring(name);
132 string_view sname(name);
136 return BL::ShaderNodeAttribute::attribute_type_OBJECT;
141 return BL::ShaderNodeAttribute::attribute_type_INSTANCER;
144 return BL::ShaderNodeAttribute::attribute_type_GEOMETRY;
151 for (BL::NodeSocket &b_out : b_node.outputs) {
152 if (b_out.name() == name) {
157 return *b_node.outputs.begin();
184 switch (b_socket.type()) {
185 case BL::NodeSocket::type_VALUE:
187 case BL::NodeSocket::type_INT:
189 case BL::NodeSocket::type_VECTOR:
191 case BL::NodeSocket::type_RGBA:
193 case BL::NodeSocket::type_STRING:
195 case BL::NodeSocket::type_SHADER:
204 BL::NodeSocket &b_sock,
205 BL::BlendData &b_data,
212 switch (input->
type()) {
218 node->set(socket,
get_int(b_sock.ptr,
"default_value"));
247 mapping->set_tex_mapping_translation(
get_float3(b_mapping.translation()));
248 mapping->set_tex_mapping_rotation(
get_float3(b_mapping.rotation()));
249 mapping->set_tex_mapping_scale(
get_float3(b_mapping.scale()));
259 BL::BlendData &b_data,
263 BL::ShaderNodeTree &b_ntree,
264 BL::ShaderNode &b_node)
270 BL::ShaderNodeRGBCurve b_curve_node(b_node);
277 curves->set_min_x(min_x);
278 curves->set_max_x(max_x);
279 curves->set_curves(curve_mapping_curves);
283 BL::ShaderNodeVectorCurve b_curve_node(b_node);
290 curves->set_min_x(min_x);
291 curves->set_max_x(max_x);
292 curves->set_curves(curve_mapping_curves);
297 BL::ShaderNodeValToRGB b_ramp_node(b_node);
302 ramp->set_ramp(ramp_values);
303 ramp->set_ramp_alpha(ramp_alpha);
304 ramp->set_interpolate(b_color_ramp.interpolation() != BL::ColorRamp::interpolation_CONSTANT);
326 else if (b_node.is_a(&RNA_ShaderNodeBrightContrast)) {
330 BL::ShaderNodeMixRGB b_mix_node(b_node);
332 mix->set_mix_type((
NodeMix)b_mix_node.blend_type());
333 mix->set_use_clamp(b_mix_node.use_clamp());
342 else if (b_node.is_a(&RNA_ShaderNodeSeparateHSV)) {
345 else if (b_node.is_a(&RNA_ShaderNodeCombineHSV)) {
348 else if (b_node.is_a(&RNA_ShaderNodeSeparateXYZ)) {
351 else if (b_node.is_a(&RNA_ShaderNodeCombineXYZ)) {
360 else if (b_node.is_a(&RNA_ShaderNodeMapRange)) {
361 BL::ShaderNodeMapRange b_map_range_node(b_node);
363 map_range_node->set_clamp(b_map_range_node.clamp());
364 map_range_node->set_range_type((
NodeMapRangeType)b_map_range_node.interpolation_type());
365 node = map_range_node;
367 else if (b_node.is_a(&RNA_ShaderNodeClamp)) {
368 BL::ShaderNodeClamp b_clamp_node(b_node);
370 clamp_node->set_clamp_type((
NodeClampType)b_clamp_node.clamp_type());
374 BL::ShaderNodeMath b_math_node(b_node);
376 math_node->set_math_type((
NodeMathType)b_math_node.operation());
377 math_node->set_use_clamp(b_math_node.use_clamp());
381 BL::ShaderNodeVectorMath b_vector_math_node(b_node);
384 node = vector_math_node;
386 else if (b_node.is_a(&RNA_ShaderNodeVectorRotate)) {
387 BL::ShaderNodeVectorRotate b_vector_rotate_node(b_node);
389 vector_rotate_node->set_rotate_type(
391 vector_rotate_node->set_invert(b_vector_rotate_node.invert());
392 node = vector_rotate_node;
394 else if (b_node.is_a(&RNA_ShaderNodeVectorTransform)) {
395 BL::ShaderNodeVectorTransform b_vector_transform_node(b_node);
398 vtransform->set_convert_from(
400 vtransform->set_convert_to(
405 BL::Node::outputs_iterator out_it;
413 BL::ShaderNodeMapping b_mapping_node(b_node);
415 mapping->set_mapping_type((
NodeMappingType)b_mapping_node.vector_type());
418 else if (b_node.is_a(&RNA_ShaderNodeFresnel)) {
421 else if (b_node.is_a(&RNA_ShaderNodeLayerWeight)) {
424 else if (b_node.is_a(&RNA_ShaderNodeAddShader)) {
427 else if (b_node.is_a(&RNA_ShaderNodeMixShader)) {
430 else if (b_node.is_a(&RNA_ShaderNodeAttribute)) {
431 BL::ShaderNodeAttribute b_attr_node(b_node);
434 b_attr_node.attribute_type()));
437 else if (b_node.is_a(&RNA_ShaderNodeBackground)) {
440 else if (b_node.is_a(&RNA_ShaderNodeHoldout)) {
443 else if (b_node.is_a(&RNA_ShaderNodeBsdfAnisotropic)) {
444 BL::ShaderNodeBsdfAnisotropic b_aniso_node(b_node);
447 switch (b_aniso_node.distribution()) {
448 case BL::ShaderNodeBsdfAnisotropic::distribution_BECKMANN:
451 case BL::ShaderNodeBsdfAnisotropic::distribution_GGX:
454 case BL::ShaderNodeBsdfAnisotropic::distribution_MULTI_GGX:
457 case BL::ShaderNodeBsdfAnisotropic::distribution_ASHIKHMIN_SHIRLEY:
464 else if (b_node.is_a(&RNA_ShaderNodeBsdfDiffuse)) {
467 else if (b_node.is_a(&RNA_ShaderNodeSubsurfaceScattering)) {
468 BL::ShaderNodeSubsurfaceScattering b_subsurface_node(b_node);
472 switch (b_subsurface_node.falloff()) {
473 case BL::ShaderNodeSubsurfaceScattering::falloff_CUBIC:
476 case BL::ShaderNodeSubsurfaceScattering::falloff_GAUSSIAN:
479 case BL::ShaderNodeSubsurfaceScattering::falloff_BURLEY:
482 case BL::ShaderNodeSubsurfaceScattering::falloff_RANDOM_WALK:
489 else if (b_node.is_a(&RNA_ShaderNodeBsdfGlossy)) {
490 BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
493 switch (b_glossy_node.distribution()) {
494 case BL::ShaderNodeBsdfGlossy::distribution_SHARP:
497 case BL::ShaderNodeBsdfGlossy::distribution_BECKMANN:
500 case BL::ShaderNodeBsdfGlossy::distribution_GGX:
503 case BL::ShaderNodeBsdfGlossy::distribution_ASHIKHMIN_SHIRLEY:
506 case BL::ShaderNodeBsdfGlossy::distribution_MULTI_GGX:
512 else if (b_node.is_a(&RNA_ShaderNodeBsdfGlass)) {
513 BL::ShaderNodeBsdfGlass b_glass_node(b_node);
515 switch (b_glass_node.distribution()) {
516 case BL::ShaderNodeBsdfGlass::distribution_SHARP:
519 case BL::ShaderNodeBsdfGlass::distribution_BECKMANN:
522 case BL::ShaderNodeBsdfGlass::distribution_GGX:
525 case BL::ShaderNodeBsdfGlass::distribution_MULTI_GGX:
531 else if (b_node.is_a(&RNA_ShaderNodeBsdfRefraction)) {
532 BL::ShaderNodeBsdfRefraction b_refraction_node(b_node);
534 switch (b_refraction_node.distribution()) {
535 case BL::ShaderNodeBsdfRefraction::distribution_SHARP:
538 case BL::ShaderNodeBsdfRefraction::distribution_BECKMANN:
541 case BL::ShaderNodeBsdfRefraction::distribution_GGX:
547 else if (b_node.is_a(&RNA_ShaderNodeBsdfToon)) {
548 BL::ShaderNodeBsdfToon b_toon_node(b_node);
550 switch (b_toon_node.component()) {
551 case BL::ShaderNodeBsdfToon::component_DIFFUSE:
554 case BL::ShaderNodeBsdfToon::component_GLOSSY:
560 else if (b_node.is_a(&RNA_ShaderNodeBsdfHair)) {
561 BL::ShaderNodeBsdfHair b_hair_node(b_node);
563 switch (b_hair_node.component()) {
564 case BL::ShaderNodeBsdfHair::component_Reflection:
567 case BL::ShaderNodeBsdfHair::component_Transmission:
573 else if (b_node.is_a(&RNA_ShaderNodeBsdfHairPrincipled)) {
574 BL::ShaderNodeBsdfHairPrincipled b_principled_hair_node(b_node);
583 else if (b_node.is_a(&RNA_ShaderNodeBsdfPrincipled)) {
584 BL::ShaderNodeBsdfPrincipled b_principled_node(b_node);
586 switch (b_principled_node.distribution()) {
587 case BL::ShaderNodeBsdfPrincipled::distribution_GGX:
590 case BL::ShaderNodeBsdfPrincipled::distribution_MULTI_GGX:
594 switch (b_principled_node.subsurface_method()) {
595 case BL::ShaderNodeBsdfPrincipled::subsurface_method_BURLEY:
598 case BL::ShaderNodeBsdfPrincipled::subsurface_method_RANDOM_WALK:
604 else if (b_node.is_a(&RNA_ShaderNodeBsdfTranslucent)) {
607 else if (b_node.is_a(&RNA_ShaderNodeBsdfTransparent)) {
610 else if (b_node.is_a(&RNA_ShaderNodeBsdfVelvet)) {
613 else if (b_node.is_a(&RNA_ShaderNodeEmission)) {
616 else if (b_node.is_a(&RNA_ShaderNodeAmbientOcclusion)) {
617 BL::ShaderNodeAmbientOcclusion b_ao_node(b_node);
619 ao->set_samples(b_ao_node.samples());
620 ao->set_inside(b_ao_node.inside());
621 ao->set_only_local(b_ao_node.only_local());
624 else if (b_node.is_a(&RNA_ShaderNodeVolumeScatter)) {
627 else if (b_node.is_a(&RNA_ShaderNodeVolumeAbsorption)) {
630 else if (b_node.is_a(&RNA_ShaderNodeVolumePrincipled)) {
634 else if (b_node.is_a(&RNA_ShaderNodeNewGeometry)) {
637 else if (b_node.is_a(&RNA_ShaderNodeWireframe)) {
638 BL::ShaderNodeWireframe b_wireframe_node(b_node);
640 wire->set_use_pixel_size(b_wireframe_node.use_pixel_size());
643 else if (b_node.is_a(&RNA_ShaderNodeWavelength)) {
646 else if (b_node.is_a(&RNA_ShaderNodeBlackbody)) {
649 else if (b_node.is_a(&RNA_ShaderNodeLightPath)) {
652 else if (b_node.is_a(&RNA_ShaderNodeLightFalloff)) {
655 else if (b_node.is_a(&RNA_ShaderNodeObjectInfo)) {
658 else if (b_node.is_a(&RNA_ShaderNodeParticleInfo)) {
661 else if (b_node.is_a(&RNA_ShaderNodeHairInfo)) {
664 else if (b_node.is_a(&RNA_ShaderNodeVolumeInfo)) {
667 else if (b_node.is_a(&RNA_ShaderNodeVertexColor)) {
668 BL::ShaderNodeVertexColor b_vertex_color_node(b_node);
670 vertex_color_node->set_layer_name(ustring(b_vertex_color_node.layer_name()));
671 node = vertex_color_node;
673 else if (b_node.is_a(&RNA_ShaderNodeBump)) {
674 BL::ShaderNodeBump b_bump_node(b_node);
676 bump->set_invert(b_bump_node.invert());
683 BL::ShaderNodeScript b_script_node(b_node);
686 string bytecode_hash = b_script_node.bytecode_hash();
688 if (!bytecode_hash.empty()) {
689 node = OSLShaderManager::osl_node(
690 graph, manager,
"", bytecode_hash, b_script_node.bytecode());
694 b_data, b_ntree, b_script_node.filepath());
695 node = OSLShaderManager::osl_node(
graph, manager, absolute_filepath,
"");
703 else if (b_node.is_a(&RNA_ShaderNodeTexImage)) {
704 BL::ShaderNodeTexImage b_image_node(b_node);
712 image->set_projection_blend(b_image_node.projection_blend());
717 PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr;
720 image->set_animated(b_image_node.image_user().use_auto_refresh());
724 for (BL::UDIMTile &b_tile : b_image.tiles) {
727 image->set_tiles(tiles);
732 bool is_builtin = b_image.packed_file() || b_image.source() == BL::Image::source_GENERATED ||
733 b_image.source() == BL::Image::source_MOVIE ||
734 (b_engine.is_preview() && b_image.source() != BL::Image::source_SEQUENCE);
743 int scene_frame = b_scene.frame_current();
749 ustring filename = ustring(
751 image->set_filename(filename);
756 else if (b_node.is_a(&RNA_ShaderNodeTexEnvironment)) {
757 BL::ShaderNodeTexEnvironment b_env_node(b_node);
768 PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr;
771 env->set_animated(b_env_node.image_user().use_auto_refresh());
774 bool is_builtin = b_image.packed_file() || b_image.source() == BL::Image::source_GENERATED ||
775 b_image.source() == BL::Image::source_MOVIE ||
776 (b_engine.is_preview() && b_image.source() != BL::Image::source_SEQUENCE);
779 int scene_frame = b_scene.frame_current();
791 else if (b_node.is_a(&RNA_ShaderNodeTexGradient)) {
792 BL::ShaderNodeTexGradient b_gradient_node(b_node);
794 gradient->set_gradient_type((
NodeGradientType)b_gradient_node.gradient_type());
795 BL::TexMapping b_texture_mapping(b_gradient_node.texture_mapping());
799 else if (b_node.is_a(&RNA_ShaderNodeTexVoronoi)) {
800 BL::ShaderNodeTexVoronoi b_voronoi_node(b_node);
802 voronoi->set_dimensions(b_voronoi_node.voronoi_dimensions());
805 BL::TexMapping b_texture_mapping(b_voronoi_node.texture_mapping());
809 else if (b_node.is_a(&RNA_ShaderNodeTexMagic)) {
810 BL::ShaderNodeTexMagic b_magic_node(b_node);
812 magic->set_depth(b_magic_node.turbulence_depth());
817 else if (b_node.is_a(&RNA_ShaderNodeTexWave)) {
818 BL::ShaderNodeTexWave b_wave_node(b_node);
820 wave->set_wave_type((
NodeWaveType)b_wave_node.wave_type());
828 else if (b_node.is_a(&RNA_ShaderNodeTexChecker)) {
829 BL::ShaderNodeTexChecker b_checker_node(b_node);
831 BL::TexMapping b_texture_mapping(b_checker_node.texture_mapping());
835 else if (b_node.is_a(&RNA_ShaderNodeTexBrick)) {
836 BL::ShaderNodeTexBrick b_brick_node(b_node);
838 brick->set_offset(b_brick_node.offset());
839 brick->set_offset_frequency(b_brick_node.offset_frequency());
840 brick->set_squash(b_brick_node.squash());
841 brick->set_squash_frequency(b_brick_node.squash_frequency());
846 else if (b_node.is_a(&RNA_ShaderNodeTexNoise)) {
847 BL::ShaderNodeTexNoise b_noise_node(b_node);
849 noise->set_dimensions(b_noise_node.noise_dimensions());
854 else if (b_node.is_a(&RNA_ShaderNodeTexMusgrave)) {
855 BL::ShaderNodeTexMusgrave b_musgrave_node(b_node);
857 musgrave_node->set_musgrave_type((
NodeMusgraveType)b_musgrave_node.musgrave_type());
858 musgrave_node->set_dimensions(b_musgrave_node.musgrave_dimensions());
859 BL::TexMapping b_texture_mapping(b_musgrave_node.texture_mapping());
861 node = musgrave_node;
863 else if (b_node.is_a(&RNA_ShaderNodeTexCoord)) {
864 BL::ShaderNodeTexCoord b_tex_coord_node(b_node);
866 tex_coord->set_from_dupli(b_tex_coord_node.from_instancer());
867 if (b_tex_coord_node.object()) {
873 else if (b_node.is_a(&RNA_ShaderNodeTexSky)) {
874 BL::ShaderNodeTexSky b_sky_node(b_node);
876 sky->set_sky_type((
NodeSkyType)b_sky_node.sky_type());
878 sky->set_turbidity(b_sky_node.turbidity());
879 sky->set_ground_albedo(b_sky_node.ground_albedo());
880 sky->set_sun_disc(b_sky_node.sun_disc());
881 sky->set_sun_size(b_sky_node.sun_size());
882 sky->set_sun_intensity(b_sky_node.sun_intensity());
883 sky->set_sun_elevation(b_sky_node.sun_elevation());
884 sky->set_sun_rotation(b_sky_node.sun_rotation());
885 sky->set_altitude(b_sky_node.altitude());
886 sky->set_air_density(b_sky_node.air_density());
887 sky->set_dust_density(b_sky_node.dust_density());
888 sky->set_ozone_density(b_sky_node.ozone_density());
893 else if (b_node.is_a(&RNA_ShaderNodeTexIES)) {
894 BL::ShaderNodeTexIES b_ies_node(b_node);
896 switch (b_ies_node.mode()) {
897 case BL::ShaderNodeTexIES::mode_EXTERNAL:
900 case BL::ShaderNodeTexIES::mode_INTERNAL:
902 if (ies_content.empty()) {
905 ies->set_ies(ies_content);
910 else if (b_node.is_a(&RNA_ShaderNodeTexWhiteNoise)) {
911 BL::ShaderNodeTexWhiteNoise b_tex_white_noise_node(b_node);
913 white_noise_node->set_dimensions(b_tex_white_noise_node.noise_dimensions());
914 node = white_noise_node;
916 else if (b_node.is_a(&RNA_ShaderNodeNormalMap)) {
917 BL::ShaderNodeNormalMap b_normal_map_node(b_node);
920 nmap->set_attribute(ustring(b_normal_map_node.uv_map()));
923 else if (b_node.is_a(&RNA_ShaderNodeTangent)) {
924 BL::ShaderNodeTangent b_tangent_node(b_node);
928 tangent->set_attribute(ustring(b_tangent_node.uv_map()));
931 else if (b_node.is_a(&RNA_ShaderNodeUVMap)) {
932 BL::ShaderNodeUVMap b_uvmap_node(b_node);
934 uvm->set_attribute(ustring(b_uvmap_node.uv_map()));
935 uvm->set_from_dupli(b_uvmap_node.from_instancer());
938 else if (b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
939 BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
947 b_point_density_node.cache_point_density(b_depsgraph);
948 node = point_density;
955 BL::Object b_ob(b_point_density_node.object());
963 else if (b_node.is_a(&RNA_ShaderNodeBevel)) {
964 BL::ShaderNodeBevel b_bevel_node(b_node);
966 bevel->set_samples(b_bevel_node.samples());
969 else if (b_node.is_a(&RNA_ShaderNodeDisplacement)) {
970 BL::ShaderNodeDisplacement b_disp_node(b_node);
975 else if (b_node.is_a(&RNA_ShaderNodeVectorDisplacement)) {
976 BL::ShaderNodeVectorDisplacement b_disp_node(b_node);
979 disp->set_attribute(ustring(
""));
983 BL::ShaderNodeOutputAOV b_aov_node(b_node);
985 aov->set_name(ustring(b_aov_node.name()));
990 node->name = b_node.name();
1007 BL::NodeSocket &b_socket)
1009 string name = b_socket.
name();
1013 int counter = 0, total = 0;
1015 for (BL::NodeSocket &b_input : b_node.inputs) {
1016 if (b_input.name() == name) {
1023 if (b_input.ptr.data == b_socket.ptr.data)
1028 if (name ==
"Shader")
1035 return node->input(name.c_str());
1040 BL::NodeSocket &b_socket)
1042 string name = b_socket.
name();
1046 int counter = 0, total = 0;
1048 for (BL::NodeSocket &b_output : b_node.outputs) {
1049 if (b_output.name() == name) {
1056 if (b_output.ptr.data == b_socket.ptr.data) {
1062 if (name ==
"Shader")
1069 return node->output(name.c_str());
1074 BL::BlendData &b_data,
1078 BL::ShaderNodeTree &b_ntree,
1087 BL::ShaderNode output_node = b_ntree.get_output_node(
1088 BL::ShaderNodeOutputMaterial::target_CYCLES);
1091 for (BL::Node &b_node : b_ntree.nodes) {
1092 if (b_node.mute() || b_node.is_a(&RNA_NodeReroute)) {
1094 for (BL::NodeLink &b_link : b_node.internal_links) {
1095 BL::NodeSocket to_socket(b_link.to_socket());
1103 input_map[b_link.from_socket().ptr.data] = proxy->
inputs[0];
1104 output_map[b_link.to_socket().ptr.data] = proxy->
outputs[0];
1109 else if (b_node.is_a(&RNA_ShaderNodeGroup) || b_node.is_a(&RNA_NodeCustomGroup) ||
1110 b_node.is_a(&RNA_ShaderNodeCustomGroup)) {
1113 if (b_node.is_a(&RNA_ShaderNodeGroup))
1114 b_group_ntree = BL::ShaderNodeTree(((BL::NodeGroup)(b_node)).
node_tree());
1115 else if (b_node.is_a(&RNA_NodeCustomGroup))
1116 b_group_ntree = BL::ShaderNodeTree(((BL::NodeCustomGroup)(b_node)).
node_tree());
1118 b_group_ntree = BL::ShaderNodeTree(((BL::ShaderNodeCustomGroup)(b_node)).
node_tree());
1120 ProxyMap group_proxy_input_map, group_proxy_output_map;
1126 for (BL::NodeSocket &b_input : b_node.inputs) {
1136 group_proxy_input_map[b_input.identifier()] = proxy;
1138 input_map[b_input.ptr.data] = proxy->
inputs[0];
1142 for (BL::NodeSocket &b_output : b_node.outputs) {
1152 group_proxy_output_map[b_output.identifier()] = proxy;
1154 output_map[b_output.ptr.data] = proxy->
outputs[0];
1157 if (b_group_ntree) {
1165 group_proxy_input_map,
1166 group_proxy_output_map);
1169 else if (b_node.is_a(&RNA_NodeGroupInput)) {
1171 for (BL::NodeSocket &b_output : b_node.outputs) {
1172 ProxyMap::const_iterator proxy_it = proxy_input_map.find(b_output.identifier());
1173 if (proxy_it != proxy_input_map.end()) {
1176 output_map[b_output.ptr.data] = proxy->
outputs[0];
1180 else if (b_node.is_a(&RNA_NodeGroupOutput)) {
1181 BL::NodeGroupOutput b_output_node(b_node);
1183 if (b_output_node.is_active_output()) {
1185 for (BL::NodeSocket &b_input : b_node.inputs) {
1186 ProxyMap::const_iterator proxy_it = proxy_output_map.find(b_input.identifier());
1187 if (proxy_it != proxy_output_map.end()) {
1190 input_map[b_input.ptr.data] = proxy->
inputs[0];
1200 if (b_node.ptr.data == output_node.ptr.data) {
1204 BL::ShaderNode b_shader_node(b_node);
1206 scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree, b_shader_node);
1211 for (BL::NodeSocket &b_input : b_node.inputs) {
1217 input_map[b_input.ptr.data] = input;
1221 for (BL::NodeSocket &b_output : b_node.outputs) {
1227 output_map[b_output.ptr.data] =
output;
1234 for (BL::NodeLink &b_link : b_ntree.links) {
1237 if (!(b_link.is_valid() && b_link.from_socket().enabled() && b_link.to_socket().enabled()) ||
1238 b_link.is_muted()) {
1242 BL::NodeSocket b_from_sock = b_link.from_socket();
1243 BL::NodeSocket b_to_sock = b_link.to_socket();
1248 PtrOutputMap::iterator output_it = output_map.find(b_from_sock.ptr.data);
1249 if (output_it != output_map.end())
1250 output = output_it->second;
1251 PtrInputMap::iterator input_it = input_map.find(b_to_sock.ptr.data);
1252 if (input_it != input_map.end())
1253 input = input_it->second;
1264 BL::BlendData &b_data,
1268 BL::ShaderNodeTree &b_ntree)
1270 static const ProxyMap empty_proxy_map;
1284 void BlenderSync::sync_materials(
BL::Depsgraph &b_depsgraph,
bool update_all)
1289 set<Shader *> updated_shaders;
1291 for (
BL::ID &b_id : b_depsgraph.ids) {
1303 shader->name = b_mat.name().c_str();
1304 shader->set_pass_id(b_mat.pass_index());
1307 if (b_mat.use_nodes() && b_mat.node_tree()) {
1308 BL::ShaderNodeTree b_ntree(b_mat.node_tree());
1310 add_nodes(scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree);
1314 diffuse->set_color(
get_float3(b_mat.diffuse_color()));
1315 graph->add(diffuse);
1324 shader->set_use_transparent_shadow(
get_boolean(cmat,
"use_transparent_shadow"));
1347 updated_shaders.insert(
shader);
1353 shader->tag_update(scene);
1361 shader->tag_update(scene);
1367 void BlenderSync::sync_world(
BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d,
bool update_all)
1375 if (world_recalc || update_all || b_world.ptr.data != world_map ||
1376 viewport_parameters.modified(new_viewport_parameters)) {
1381 if (new_viewport_parameters.use_scene_world && b_world && b_world.use_nodes() &&
1382 b_world.node_tree()) {
1383 BL::ShaderNodeTree b_ntree(b_world.node_tree());
1385 add_nodes(scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree);
1394 else if (new_viewport_parameters.use_scene_world && b_world) {
1396 background->set_color(
get_float3(b_world.color()));
1397 graph->add(background);
1402 else if (!new_viewport_parameters.use_scene_world) {
1412 graph->add(background);
1415 graph->add(light_path);
1418 mix_scene_with_background->set_color2(world_color);
1419 graph->add(mix_scene_with_background);
1423 float3 rotation_z = texture_environment->get_tex_mapping_rotation();
1424 rotation_z[2] = new_viewport_parameters.studiolight_rotate_z;
1425 texture_environment->set_tex_mapping_rotation(rotation_z);
1426 texture_environment->set_filename(new_viewport_parameters.studiolight_path);
1427 graph->add(texture_environment);
1431 mix_intensity->set_fac(1.0f);
1432 mix_intensity->set_color2(
make_float3(new_viewport_parameters.studiolight_intensity,
1433 new_viewport_parameters.studiolight_intensity,
1434 new_viewport_parameters.studiolight_intensity));
1435 graph->add(mix_intensity);
1438 graph->add(texture_coordinate);
1441 mix_background_with_environment->set_fac(
1442 new_viewport_parameters.studiolight_background_alpha);
1443 mix_background_with_environment->set_color1(world_color);
1444 graph->add(mix_background_with_environment);
1448 graph->connect(texture_coordinate->
output(
"Generated"),
1449 texture_environment->
input(
"Vector"));
1450 graph->connect(texture_environment->
output(
"Color"), mix_intensity->
input(
"Color1"));
1451 graph->connect(light_path->
output(
"Is Camera Ray"), mix_scene_with_background->
input(
"Fac"));
1452 graph->connect(mix_intensity->
output(
"Color"), mix_scene_with_background->
input(
"Color1"));
1454 mix_background_with_environment->
input(
"Color2"));
1455 graph->connect(mix_background_with_environment->
output(
"Color"),
1456 mix_scene_with_background->
input(
"Color2"));
1457 graph->connect(mix_scene_with_background->
output(
"Color"), background->
input(
"Color"));
1463 BL::WorldLighting b_light = b_world.light_settings();
1465 background->set_use_ao(b_light.use_ambient_occlusion());
1466 background->set_ao_factor(b_light.ao_factor());
1467 background->set_ao_distance(b_light.distance());
1471 uint visibility = 0;
1479 background->set_visibility(visibility);
1482 background->set_use_ao(
false);
1483 background->set_ao_factor(0.0f);
1484 background->set_ao_distance(FLT_MAX);
1488 shader->tag_update(scene);
1492 background->set_transparent(b_scene.render().film_transparent());
1494 if (background->get_transparent()) {
1495 background->set_transparent_glass(
get_boolean(cscene,
"film_transparent_glass"));
1496 background->set_transparent_roughness_threshold(
1497 get_float(cscene,
"film_transparent_roughness"));
1500 background->set_transparent_glass(
false);
1501 background->set_transparent_roughness_threshold(0.0f);
1504 background->set_use_shader(view_layer.use_background_shader |
1505 viewport_parameters.custom_viewport_parameters());
1506 background->set_use_ao(background->get_use_ao() && view_layer.use_background_ao);
1508 background->tag_update(scene);
1513 void BlenderSync::sync_lights(
BL::Depsgraph &b_depsgraph,
bool update_all)
1517 for (
BL::ID &b_id : b_depsgraph.ids) {
1530 if (b_light.use_nodes() && b_light.node_tree()) {
1531 shader->name = b_light.name().c_str();
1533 BL::ShaderNodeTree b_ntree(b_light.node_tree());
1535 add_nodes(scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree);
1540 emission->set_strength(1.0f);
1541 graph->add(emission);
1548 shader->tag_update(scene);
1553 void BlenderSync::sync_shaders(
BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d)
1557 const int frame = b_scene.frame_current();
1562 sync_world(b_depsgraph, b_v3d, auto_refresh_update);
1563 sync_lights(b_depsgraph, auto_refresh_update);
1564 sync_materials(b_depsgraph, auto_refresh_update);
struct Depsgraph Depsgraph
struct CurveMapping CurveMapping
struct ImageUser ImageUser
struct TexMapping TexMapping
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White ColorRamp
struct RenderEngine RenderEngine
StructRNA RNA_ShaderNodeGamma
StructRNA RNA_ShaderNodeRGBCurve
StructRNA RNA_ShaderNodeMapping
StructRNA RNA_ShaderNodeNormal
StructRNA RNA_ShaderNodeRGB
StructRNA RNA_ShaderNodeRGBToBW
StructRNA RNA_ShaderNodeCameraData
StructRNA RNA_ShaderNodeValue
StructRNA RNA_ShaderNodeCombineRGB
StructRNA RNA_ShaderNodeMixRGB
StructRNA RNA_ShaderNodeOutputAOV
StructRNA RNA_ShaderNodeInvert
StructRNA RNA_ShaderNodeVectorCurve
StructRNA RNA_ShaderNodeVectorMath
StructRNA RNA_ShaderNodeValToRGB
StructRNA RNA_ShaderNodeHueSaturation
StructRNA RNA_ShaderNodeScript
StructRNA RNA_ShaderNodeMath
StructRNA RNA_ShaderNodeSeparateRGB
static float3 get_node_output_vector(BL::Node &b_node, const string &name)
static DisplacementMethod get_displacement_method(PointerRNA &ptr)
static float3 get_node_output_rgba(BL::Node &b_node, const string &name)
static VolumeSampling get_volume_sampling(PointerRNA &ptr)
static ShaderInput * node_find_input_by_name(ShaderNode *node, BL::Node &b_node, BL::NodeSocket &b_socket)
static BL::NodeSocket get_node_output(BL::Node &b_node, const string &name)
static ImageAlphaType get_image_alpha_type(BL::Image &b_image)
static int validate_enum_value(int value, int num_values, int default_value)
static void add_nodes(Scene *scene, BL::RenderEngine &b_engine, BL::BlendData &b_data, BL::Depsgraph &b_depsgraph, BL::Scene &b_scene, ShaderGraph *graph, BL::ShaderNodeTree &b_ntree, const ProxyMap &proxy_input_map, const ProxyMap &proxy_output_map)
static bool node_use_modified_socket_name(ShaderNode *node)
static ustring blender_attribute_name_add_type(const string &name, BlenderAttributeType type)
static ShaderOutput * node_find_output_by_name(ShaderNode *node, BL::Node &b_node, BL::NodeSocket &b_socket)
BlenderAttributeType blender_attribute_name_split_type(ustring name, string *r_real_name)
static void set_default_value(ShaderInput *input, BL::NodeSocket &b_sock, BL::BlendData &b_data, BL::ID &b_id)
map< void *, ShaderOutput * > PtrOutputMap
static VolumeInterpolation get_volume_interpolation(PointerRNA &ptr)
static const string_view instancer_attr_prefix("\x01instancer:")
static float get_node_output_value(BL::Node &b_node, const string &name)
static void get_tex_mapping(TextureNode *mapping, BL::TexMapping &b_mapping)
static SocketType::Type convert_socket_type(BL::NodeSocket &b_socket)
static ShaderNode * add_node(Scene *scene, BL::RenderEngine &b_engine, BL::BlendData &b_data, BL::Depsgraph &b_depsgraph, BL::Scene &b_scene, ShaderGraph *graph, BL::ShaderNodeTree &b_ntree, BL::ShaderNode &b_node)
static ExtensionType get_image_extension(NodeType &b_node)
static const string_view object_attr_prefix("\x01object:")
static InterpolationType get_image_interpolation(NodeType &b_node)
CCL_NAMESPACE_BEGIN typedef map< void *, ShaderInput * > PtrInputMap
map< string, ConvertNode * > ProxyMap
void point_density_texture_space(BL::Depsgraph &b_depsgraph, BL::ShaderNodeTexPointDensity &b_point_density_node, float3 &loc, float3 &size)
static float4 get_float4(const BL::Array< float, 4 > &array)
static float get_float(PointerRNA &ptr, const char *name)
static void curvemapping_minmax(BL::CurveMapping &cumap, bool rgb_curve, float *min_x, float *max_x)
static bool get_boolean(PointerRNA &ptr, const char *name)
static int get_int(PointerRNA &ptr, const char *name)
static string get_enum_identifier(PointerRNA &ptr, const char *name)
static string get_text_datablock_content(const PointerRNA &ptr)
static void colorramp_to_array(BL::ColorRamp &ramp, array< float3 > &ramp_color, array< float > &ramp_alpha, int size)
static float3 get_float3(const BL::Array< float, 2 > &array)
static int get_enum(PointerRNA &ptr, const char *name, int num_values=-1, int default_value=-1)
CCL_NAMESPACE_BEGIN typedef BL::ShaderNodeAttribute::attribute_type_enum BlenderAttributeType
static void curvemapping_color_to_array(BL::CurveMapping &cumap, array< float3 > &data, int size, bool rgb_curve)
static string blender_absolute_path(BL::BlendData &b_data, BL::ID &b_id, const string &path)
static string image_user_file_path(BL::ImageUser &iuser, BL::Image &ima, int cfra, bool load_tiled)
static string get_string(PointerRNA &ptr, const char *name)
static Transform get_transform(const BL::Array< float, 16 > &array)
static int image_user_frame_number(BL::ImageUser &iuser, BL::Image &ima, int cfra)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
ImageParams image_params() const
bool set_animation_frame_update(int frame)
ImageHandle add_image(const string &filename, const ImageParams ¶ms)
ImageParams image_params() const
ImageParams image_params() const
void simplify(Scene *scene)
ShaderInput * input(const char *name)
vector< ShaderOutput * > outputs
vector< ShaderInput * > inputs
ShaderOutput * output(const char *name)
void push_back_slow(const T &t)
bool add_or_update(T **r_data, const BL::ID &id)
T * find(const BL::ID &id)
void set_default(T *data)
@ SHADER_SPECIAL_TYPE_OSL
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
@ PATH_RAY_VOLUME_SCATTER
static float noise(int n)
struct node_tree node_tree
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
const PointerRNA PointerRNA_NULL
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
float RNA_float_get(PointerRNA *ptr, const char *name)
@ VOLUME_NUM_INTERPOLATION
@ VOLUME_INTERPOLATION_LINEAR
@ VOLUME_SAMPLING_DISTANCE
closure color principled_hair(normal N, color sigma, float roughnessu, float roughnessv, float coat, float alpha, float eta) BUILTIN
void set_value(const SocketType &input, const Node &other, const SocketType &other_input)
ImageManager * image_manager
Shader * default_background
ShaderManager * shader_manager
void push(TaskRunFunction &&task)
void wait_work(Summary *stats=NULL)
NodeEnvironmentProjection
NodeVectorTransformConvertSpace
NodePrincipledHairParametrization
@ NODE_PRINCIPLED_HAIR_NUM
@ NODE_PRINCIPLED_HAIR_REFLECTANCE
NodeVoronoiDistanceMetric
@ CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID
@ CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID
@ CLOSURE_BSSRDF_CUBIC_ID
@ CLOSURE_BSSRDF_GAUSSIAN_ID
@ CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID
@ CLOSURE_BSSRDF_BURLEY_ID
@ CLOSURE_BSDF_DIFFUSE_TOON_ID
@ CLOSURE_BSDF_MICROFACET_GGX_ID
@ CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID
@ CLOSURE_BSDF_HAIR_TRANSMISSION_ID
@ CLOSURE_BSDF_SHARP_GLASS_ID
@ CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID
@ CLOSURE_BSSRDF_RANDOM_WALK_ID
@ CLOSURE_BSDF_REFRACTION_ID
@ CLOSURE_BSDF_MICROFACET_BECKMANN_ID
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID
@ CLOSURE_BSSRDF_PRINCIPLED_ID
@ CLOSURE_BSSRDF_PRINCIPLED_RANDOM_WALK_ID
@ CLOSURE_BSDF_GLOSSY_TOON_ID
@ CLOSURE_BSDF_HAIR_REFLECTION_ID
@ CLOSURE_BSDF_REFLECTION_ID
static int magic(const Tex *tex, const float texvec[3], TexResult *texres)
ccl_device_inline float3 float4_to_float3(const float4 a)
ccl_device_inline float2 normalize(const float2 &a)
ccl_device_inline float3 one_float3()
ccl_device_inline float3 zero_float3()
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
@ INTERPOLATION_NUM_TYPES