35 Shader *synced_shader = (
id) ? shader_map.
find(
id) :
nullptr;
36 Shader *shader = (synced_shader) ? synced_shader : default_shader;
72 int value = b_node.interpolation();
79 int value = b_node.extension();
85 int value = b_image.alpha_mode();
110 case BL::ShaderNodeAttribute::attribute_type_OBJECT:
112 case BL::ShaderNodeAttribute::attribute_type_INSTANCER:
115 return ustring(name);
121 string_view sname(name);
125 return BL::ShaderNodeAttribute::attribute_type_OBJECT;
130 return BL::ShaderNodeAttribute::attribute_type_INSTANCER;
133 return BL::ShaderNodeAttribute::attribute_type_GEOMETRY;
140 for (BL::NodeSocket &b_out : b_node.outputs) {
141 if (b_out.identifier() == name) {
146 return *b_node.outputs.begin();
173 switch (b_socket.type()) {
174 case BL::NodeSocket::type_VALUE:
176 case BL::NodeSocket::type_INT:
178 case BL::NodeSocket::type_VECTOR:
180 case BL::NodeSocket::type_RGBA:
182 case BL::NodeSocket::type_STRING:
184 case BL::NodeSocket::type_SHADER:
193 BL::NodeSocket &b_sock,
194 BL::BlendData &b_data,
201 switch (
input->type()) {
207 if (b_sock.type() == BL::NodeSocket::type_BOOLEAN) {
213 node->set(socket,
get_int(b_sock.ptr,
"default_value"));
243 mapping->set_tex_mapping_translation(
get_float3(b_mapping.translation()));
244 mapping->set_tex_mapping_rotation(
get_float3(b_mapping.rotation()));
245 mapping->set_tex_mapping_scale(
get_float3(b_mapping.scale()));
255 return (b_image_source == BL::Image::source_MOVIE ||
256 b_image_source == BL::Image::source_SEQUENCE) &&
257 b_image_user.use_auto_refresh();
262 BL::BlendData &b_data,
266 BL::ShaderNodeTree &b_ntree,
267 BL::ShaderNode &b_node)
272 if (b_node.is_a(&RNA_ShaderNodeRGBCurve)) {
273 BL::ShaderNodeRGBCurve b_curve_node(b_node);
282 curves->set_curves(curve_mapping_curves);
283 curves->set_extrapolate(mapping.extend() == mapping.extend_EXTRAPOLATED);
286 if (b_node.is_a(&RNA_ShaderNodeVectorCurve)) {
287 BL::ShaderNodeVectorCurve b_curve_node(b_node);
296 curves->set_curves(curve_mapping_curves);
297 curves->set_extrapolate(mapping.extend() == mapping.extend_EXTRAPOLATED);
300 else if (b_node.is_a(&RNA_ShaderNodeFloatCurve)) {
301 BL::ShaderNodeFloatCurve b_curve_node(b_node);
308 curve->set_min_x(min_x);
309 curve->set_max_x(max_x);
310 curve->set_curve(curve_mapping_curve);
311 curve->set_extrapolate(mapping.extend() == mapping.extend_EXTRAPOLATED);
314 else if (b_node.is_a(&RNA_ShaderNodeValToRGB)) {
316 BL::ShaderNodeValToRGB b_ramp_node(b_node);
317 BL::ColorRamp b_color_ramp(b_ramp_node.color_ramp());
321 ramp->set_ramp(ramp_values);
322 ramp->set_ramp_alpha(ramp_alpha);
323 ramp->set_interpolate(b_color_ramp.interpolation() != BL::ColorRamp::interpolation_CONSTANT);
326 else if (b_node.is_a(&RNA_ShaderNodeRGB)) {
331 else if (b_node.is_a(&RNA_ShaderNodeValue)) {
336 else if (b_node.is_a(&RNA_ShaderNodeCameraData)) {
339 else if (b_node.is_a(&RNA_ShaderNodeInvert)) {
342 else if (b_node.is_a(&RNA_ShaderNodeGamma)) {
345 else if (b_node.is_a(&RNA_ShaderNodeBrightContrast)) {
348 else if (b_node.is_a(&RNA_ShaderNodeMixRGB)) {
349 BL::ShaderNodeMixRGB b_mix_node(b_node);
351 mix->set_mix_type((
NodeMix)b_mix_node.blend_type());
352 mix->set_use_clamp(b_mix_node.use_clamp());
355 else if (b_node.is_a(&RNA_ShaderNodeSeparateRGB)) {
358 else if (b_node.is_a(&RNA_ShaderNodeCombineRGB)) {
361 else if (b_node.is_a(&RNA_ShaderNodeSeparateHSV)) {
364 else if (b_node.is_a(&RNA_ShaderNodeCombineHSV)) {
367 else if (b_node.is_a(&RNA_ShaderNodeSeparateColor)) {
368 BL::ShaderNodeSeparateColor b_separate_node(b_node);
371 node = separate_node;
373 else if (b_node.is_a(&RNA_ShaderNodeCombineColor)) {
374 BL::ShaderNodeCombineColor b_combine_node(b_node);
379 else if (b_node.is_a(&RNA_ShaderNodeSeparateXYZ)) {
382 else if (b_node.is_a(&RNA_ShaderNodeCombineXYZ)) {
385 else if (b_node.is_a(&RNA_ShaderNodeHueSaturation)) {
388 else if (b_node.is_a(&RNA_ShaderNodeRGBToBW)) {
391 else if (b_node.is_a(&RNA_ShaderNodeMapRange)) {
392 BL::ShaderNodeMapRange b_map_range_node(b_node);
393 if (b_map_range_node.data_type() == BL::ShaderNodeMapRange::data_type_FLOAT_VECTOR) {
395 vector_map_range_node->set_use_clamp(b_map_range_node.clamp());
396 vector_map_range_node->set_range_type(
398 node = vector_map_range_node;
402 map_range_node->set_clamp(b_map_range_node.clamp());
403 map_range_node->set_range_type((
NodeMapRangeType)b_map_range_node.interpolation_type());
404 node = map_range_node;
407 else if (b_node.is_a(&RNA_ShaderNodeClamp)) {
408 BL::ShaderNodeClamp b_clamp_node(b_node);
410 clamp_node->set_clamp_type((
NodeClampType)b_clamp_node.clamp_type());
413 else if (b_node.is_a(&RNA_ShaderNodeMath)) {
414 BL::ShaderNodeMath b_math_node(b_node);
416 math_node->set_math_type((
NodeMathType)b_math_node.operation());
417 math_node->set_use_clamp(b_math_node.use_clamp());
420 else if (b_node.is_a(&RNA_ShaderNodeVectorMath)) {
421 BL::ShaderNodeVectorMath b_vector_math_node(b_node);
424 node = vector_math_node;
426 else if (b_node.is_a(&RNA_ShaderNodeVectorRotate)) {
427 BL::ShaderNodeVectorRotate b_vector_rotate_node(b_node);
429 vector_rotate_node->set_rotate_type(
431 vector_rotate_node->set_invert(b_vector_rotate_node.invert());
432 node = vector_rotate_node;
434 else if (b_node.is_a(&RNA_ShaderNodeVectorTransform)) {
435 BL::ShaderNodeVectorTransform b_vector_transform_node(b_node);
438 vtransform->set_convert_from(
440 vtransform->set_convert_to(
444 else if (b_node.is_a(&RNA_ShaderNodeNormal)) {
445 BL::Node::outputs_iterator out_it;
452 else if (b_node.is_a(&RNA_ShaderNodeMapping)) {
453 BL::ShaderNodeMapping b_mapping_node(b_node);
455 mapping->set_mapping_type((
NodeMappingType)b_mapping_node.vector_type());
458 else if (b_node.is_a(&RNA_ShaderNodeFresnel)) {
461 else if (b_node.is_a(&RNA_ShaderNodeLayerWeight)) {
464 else if (b_node.is_a(&RNA_ShaderNodeAddShader)) {
467 else if (b_node.is_a(&RNA_ShaderNodeMixShader)) {
470 else if (b_node.is_a(&RNA_ShaderNodeAttribute)) {
471 BL::ShaderNodeAttribute b_attr_node(b_node);
474 b_attr_node.attribute_type()));
477 else if (b_node.is_a(&RNA_ShaderNodeBackground)) {
480 else if (b_node.is_a(&RNA_ShaderNodeHoldout)) {
483 else if (b_node.is_a(&RNA_ShaderNodeBsdfAnisotropic)) {
484 BL::ShaderNodeBsdfAnisotropic b_aniso_node(b_node);
487 switch (b_aniso_node.distribution()) {
488 case BL::ShaderNodeBsdfAnisotropic::distribution_BECKMANN:
491 case BL::ShaderNodeBsdfAnisotropic::distribution_GGX:
494 case BL::ShaderNodeBsdfAnisotropic::distribution_MULTI_GGX:
497 case BL::ShaderNodeBsdfAnisotropic::distribution_ASHIKHMIN_SHIRLEY:
504 else if (b_node.is_a(&RNA_ShaderNodeBsdfDiffuse)) {
507 else if (b_node.is_a(&RNA_ShaderNodeSubsurfaceScattering)) {
508 BL::ShaderNodeSubsurfaceScattering b_subsurface_node(b_node);
512 switch (b_subsurface_node.falloff()) {
513 case BL::ShaderNodeSubsurfaceScattering::falloff_BURLEY:
516 case BL::ShaderNodeSubsurfaceScattering::falloff_RANDOM_WALK_FIXED_RADIUS:
519 case BL::ShaderNodeSubsurfaceScattering::falloff_RANDOM_WALK:
526 else if (b_node.is_a(&RNA_ShaderNodeBsdfGlossy)) {
527 BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
530 switch (b_glossy_node.distribution()) {
531 case BL::ShaderNodeBsdfGlossy::distribution_SHARP:
534 case BL::ShaderNodeBsdfGlossy::distribution_BECKMANN:
537 case BL::ShaderNodeBsdfGlossy::distribution_GGX:
540 case BL::ShaderNodeBsdfGlossy::distribution_ASHIKHMIN_SHIRLEY:
543 case BL::ShaderNodeBsdfGlossy::distribution_MULTI_GGX:
549 else if (b_node.is_a(&RNA_ShaderNodeBsdfGlass)) {
550 BL::ShaderNodeBsdfGlass b_glass_node(b_node);
552 switch (b_glass_node.distribution()) {
553 case BL::ShaderNodeBsdfGlass::distribution_SHARP:
556 case BL::ShaderNodeBsdfGlass::distribution_BECKMANN:
559 case BL::ShaderNodeBsdfGlass::distribution_GGX:
562 case BL::ShaderNodeBsdfGlass::distribution_MULTI_GGX:
568 else if (b_node.is_a(&RNA_ShaderNodeBsdfRefraction)) {
569 BL::ShaderNodeBsdfRefraction b_refraction_node(b_node);
571 switch (b_refraction_node.distribution()) {
572 case BL::ShaderNodeBsdfRefraction::distribution_SHARP:
575 case BL::ShaderNodeBsdfRefraction::distribution_BECKMANN:
578 case BL::ShaderNodeBsdfRefraction::distribution_GGX:
584 else if (b_node.is_a(&RNA_ShaderNodeBsdfToon)) {
585 BL::ShaderNodeBsdfToon b_toon_node(b_node);
587 switch (b_toon_node.component()) {
588 case BL::ShaderNodeBsdfToon::component_DIFFUSE:
591 case BL::ShaderNodeBsdfToon::component_GLOSSY:
597 else if (b_node.is_a(&RNA_ShaderNodeBsdfHair)) {
598 BL::ShaderNodeBsdfHair b_hair_node(b_node);
600 switch (b_hair_node.component()) {
601 case BL::ShaderNodeBsdfHair::component_Reflection:
604 case BL::ShaderNodeBsdfHair::component_Transmission:
610 else if (b_node.is_a(&RNA_ShaderNodeBsdfHairPrincipled)) {
611 BL::ShaderNodeBsdfHairPrincipled b_principled_hair_node(b_node);
620 else if (b_node.is_a(&RNA_ShaderNodeBsdfPrincipled)) {
621 BL::ShaderNodeBsdfPrincipled b_principled_node(b_node);
623 switch (b_principled_node.distribution()) {
624 case BL::ShaderNodeBsdfPrincipled::distribution_GGX:
627 case BL::ShaderNodeBsdfPrincipled::distribution_MULTI_GGX:
631 switch (b_principled_node.subsurface_method()) {
632 case BL::ShaderNodeBsdfPrincipled::subsurface_method_BURLEY:
635 case BL::ShaderNodeBsdfPrincipled::subsurface_method_RANDOM_WALK_FIXED_RADIUS:
638 case BL::ShaderNodeBsdfPrincipled::subsurface_method_RANDOM_WALK:
644 else if (b_node.is_a(&RNA_ShaderNodeBsdfTranslucent)) {
647 else if (b_node.is_a(&RNA_ShaderNodeBsdfTransparent)) {
650 else if (b_node.is_a(&RNA_ShaderNodeBsdfVelvet)) {
653 else if (b_node.is_a(&RNA_ShaderNodeEmission)) {
656 else if (b_node.is_a(&RNA_ShaderNodeAmbientOcclusion)) {
657 BL::ShaderNodeAmbientOcclusion b_ao_node(b_node);
659 ao->set_samples(b_ao_node.samples());
660 ao->set_inside(b_ao_node.inside());
661 ao->set_only_local(b_ao_node.only_local());
664 else if (b_node.is_a(&RNA_ShaderNodeVolumeScatter)) {
667 else if (b_node.is_a(&RNA_ShaderNodeVolumeAbsorption)) {
670 else if (b_node.is_a(&RNA_ShaderNodeVolumePrincipled)) {
674 else if (b_node.is_a(&RNA_ShaderNodeNewGeometry)) {
677 else if (b_node.is_a(&RNA_ShaderNodeWireframe)) {
678 BL::ShaderNodeWireframe b_wireframe_node(b_node);
680 wire->set_use_pixel_size(b_wireframe_node.use_pixel_size());
683 else if (b_node.is_a(&RNA_ShaderNodeWavelength)) {
686 else if (b_node.is_a(&RNA_ShaderNodeBlackbody)) {
689 else if (b_node.is_a(&RNA_ShaderNodeLightPath)) {
692 else if (b_node.is_a(&RNA_ShaderNodeLightFalloff)) {
695 else if (b_node.is_a(&RNA_ShaderNodeObjectInfo)) {
698 else if (b_node.is_a(&RNA_ShaderNodeParticleInfo)) {
701 else if (b_node.is_a(&RNA_ShaderNodeHairInfo)) {
704 else if (b_node.is_a(&RNA_ShaderNodePointInfo)) {
707 else if (b_node.is_a(&RNA_ShaderNodeVolumeInfo)) {
710 else if (b_node.is_a(&RNA_ShaderNodeVertexColor)) {
711 BL::ShaderNodeVertexColor b_vertex_color_node(b_node);
713 vertex_color_node->set_layer_name(ustring(b_vertex_color_node.layer_name()));
714 node = vertex_color_node;
716 else if (b_node.is_a(&RNA_ShaderNodeBump)) {
717 BL::ShaderNodeBump b_bump_node(b_node);
719 bump->set_invert(b_bump_node.invert());
722 else if (b_node.is_a(&RNA_ShaderNodeScript)) {
726 BL::ShaderNodeScript b_script_node(b_node);
729 string bytecode_hash = b_script_node.bytecode_hash();
731 if (!bytecode_hash.empty()) {
732 node = OSLShaderManager::osl_node(
733 graph, manager,
"", bytecode_hash, b_script_node.bytecode());
737 b_data, b_ntree, b_script_node.filepath());
738 node = OSLShaderManager::osl_node(
graph, manager, absolute_filepath,
"");
746 else if (b_node.is_a(&RNA_ShaderNodeTexImage)) {
747 BL::ShaderNodeTexImage b_image_node(b_node);
755 image->set_projection_blend(b_image_node.projection_blend());
760 BL::Image::source_enum b_image_source = b_image.source();
761 PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr;
768 for (BL::UDIMTile &b_tile : b_image.tiles) {
769 tiles.push_back_slow(b_tile.number());
776 bool is_builtin = b_image.packed_file() || b_image_source == BL::Image::source_GENERATED ||
777 b_image_source == BL::Image::source_MOVIE ||
778 (b_engine.is_preview() && b_image_source != BL::Image::source_SEQUENCE);
787 int scene_frame = b_scene.frame_current();
789 if (b_image_source != BL::Image::source_TILED) {
792 image->image_params());
796 loaders.reserve(
image->get_tiles().size());
797 for (
int tile_number :
image->get_tiles()) {
806 ustring filename = ustring(
808 image->set_filename(filename);
813 else if (b_node.is_a(&RNA_ShaderNodeTexEnvironment)) {
814 BL::ShaderNodeTexEnvironment b_env_node(b_node);
825 BL::Image::source_enum b_image_source = b_image.source();
826 PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr;
831 bool is_builtin = b_image.packed_file() || b_image_source == BL::Image::source_GENERATED ||
832 b_image_source == BL::Image::source_MOVIE ||
833 (b_engine.is_preview() && b_image_source != BL::Image::source_SEQUENCE);
836 int scene_frame = b_scene.frame_current();
849 else if (b_node.is_a(&RNA_ShaderNodeTexGradient)) {
850 BL::ShaderNodeTexGradient b_gradient_node(b_node);
852 gradient->set_gradient_type((
NodeGradientType)b_gradient_node.gradient_type());
853 BL::TexMapping b_texture_mapping(b_gradient_node.texture_mapping());
857 else if (b_node.is_a(&RNA_ShaderNodeTexVoronoi)) {
858 BL::ShaderNodeTexVoronoi b_voronoi_node(b_node);
860 voronoi->set_dimensions(b_voronoi_node.voronoi_dimensions());
863 BL::TexMapping b_texture_mapping(b_voronoi_node.texture_mapping());
867 else if (b_node.is_a(&RNA_ShaderNodeTexMagic)) {
868 BL::ShaderNodeTexMagic b_magic_node(b_node);
870 magic->set_depth(b_magic_node.turbulence_depth());
875 else if (b_node.is_a(&RNA_ShaderNodeTexWave)) {
876 BL::ShaderNodeTexWave b_wave_node(b_node);
878 wave->set_wave_type((
NodeWaveType)b_wave_node.wave_type());
886 else if (b_node.is_a(&RNA_ShaderNodeTexChecker)) {
887 BL::ShaderNodeTexChecker b_checker_node(b_node);
889 BL::TexMapping b_texture_mapping(b_checker_node.texture_mapping());
893 else if (b_node.is_a(&RNA_ShaderNodeTexBrick)) {
894 BL::ShaderNodeTexBrick b_brick_node(b_node);
896 brick->set_offset(b_brick_node.offset());
897 brick->set_offset_frequency(b_brick_node.offset_frequency());
898 brick->set_squash(b_brick_node.squash());
899 brick->set_squash_frequency(b_brick_node.squash_frequency());
904 else if (b_node.is_a(&RNA_ShaderNodeTexNoise)) {
905 BL::ShaderNodeTexNoise b_noise_node(b_node);
907 noise->set_dimensions(b_noise_node.noise_dimensions());
912 else if (b_node.is_a(&RNA_ShaderNodeTexMusgrave)) {
913 BL::ShaderNodeTexMusgrave b_musgrave_node(b_node);
915 musgrave_node->set_musgrave_type((
NodeMusgraveType)b_musgrave_node.musgrave_type());
916 musgrave_node->set_dimensions(b_musgrave_node.musgrave_dimensions());
917 BL::TexMapping b_texture_mapping(b_musgrave_node.texture_mapping());
919 node = musgrave_node;
921 else if (b_node.is_a(&RNA_ShaderNodeTexCoord)) {
922 BL::ShaderNodeTexCoord b_tex_coord_node(b_node);
924 tex_coord->set_from_dupli(b_tex_coord_node.from_instancer());
925 if (b_tex_coord_node.object()) {
931 else if (b_node.is_a(&RNA_ShaderNodeTexSky)) {
932 BL::ShaderNodeTexSky b_sky_node(b_node);
934 sky->set_sky_type((
NodeSkyType)b_sky_node.sky_type());
936 sky->set_turbidity(b_sky_node.turbidity());
937 sky->set_ground_albedo(b_sky_node.ground_albedo());
938 sky->set_sun_disc(b_sky_node.sun_disc());
939 sky->set_sun_size(b_sky_node.sun_size());
940 sky->set_sun_intensity(b_sky_node.sun_intensity());
943 float sun_rotation = b_sky_node.sun_rotation();
945 float sun_elevation =
fmodf(b_sky_node.sun_elevation(),
M_2PI_F);
955 sky->set_sun_elevation(sun_elevation);
956 sky->set_sun_rotation(sun_rotation);
957 sky->set_altitude(b_sky_node.altitude());
958 sky->set_air_density(b_sky_node.air_density());
959 sky->set_dust_density(b_sky_node.dust_density());
960 sky->set_ozone_density(b_sky_node.ozone_density());
965 else if (b_node.is_a(&RNA_ShaderNodeTexIES)) {
966 BL::ShaderNodeTexIES b_ies_node(b_node);
968 switch (b_ies_node.mode()) {
969 case BL::ShaderNodeTexIES::mode_EXTERNAL:
972 case BL::ShaderNodeTexIES::mode_INTERNAL:
974 if (ies_content.empty()) {
977 ies->set_ies(ies_content);
982 else if (b_node.is_a(&RNA_ShaderNodeTexWhiteNoise)) {
983 BL::ShaderNodeTexWhiteNoise b_tex_white_noise_node(b_node);
985 white_noise_node->set_dimensions(b_tex_white_noise_node.noise_dimensions());
986 node = white_noise_node;
988 else if (b_node.is_a(&RNA_ShaderNodeNormalMap)) {
989 BL::ShaderNodeNormalMap b_normal_map_node(b_node);
992 nmap->set_attribute(ustring(b_normal_map_node.uv_map()));
995 else if (b_node.is_a(&RNA_ShaderNodeTangent)) {
996 BL::ShaderNodeTangent b_tangent_node(b_node);
1000 tangent->set_attribute(ustring(b_tangent_node.uv_map()));
1003 else if (b_node.is_a(&RNA_ShaderNodeUVMap)) {
1004 BL::ShaderNodeUVMap b_uvmap_node(b_node);
1006 uvm->set_attribute(ustring(b_uvmap_node.uv_map()));
1007 uvm->set_from_dupli(b_uvmap_node.from_instancer());
1010 else if (b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
1011 BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
1019 b_point_density_node.cache_point_density(b_depsgraph);
1020 node = point_density;
1027 BL::Object b_ob(b_point_density_node.object());
1035 else if (b_node.is_a(&RNA_ShaderNodeBevel)) {
1036 BL::ShaderNodeBevel b_bevel_node(b_node);
1038 bevel->set_samples(b_bevel_node.samples());
1041 else if (b_node.is_a(&RNA_ShaderNodeDisplacement)) {
1042 BL::ShaderNodeDisplacement b_disp_node(b_node);
1047 else if (b_node.is_a(&RNA_ShaderNodeVectorDisplacement)) {
1048 BL::ShaderNodeVectorDisplacement b_disp_node(b_node);
1051 disp->set_attribute(ustring(
""));
1054 else if (b_node.is_a(&RNA_ShaderNodeOutputAOV)) {
1055 BL::ShaderNodeOutputAOV b_aov_node(b_node);
1057 aov->set_name(ustring(b_aov_node.name()));
1062 node->name = b_node.name();
1079 string name = b_socket.identifier();
1118 string name = b_socket.identifier();
1123 if (name ==
"Shader") {
1134 BL::BlendData &b_data,
1138 BL::ShaderNodeTree &b_ntree,
1147 BL::ShaderNode output_node = b_ntree.get_output_node(
1148 BL::ShaderNodeOutputMaterial::target_CYCLES);
1151 for (BL::Node &b_node : b_ntree.nodes) {
1152 if (b_node.mute() || b_node.is_a(&RNA_NodeReroute)) {
1154 for (BL::NodeLink &b_link : b_node.internal_links) {
1155 BL::NodeSocket to_socket(b_link.to_socket());
1163 input_map[b_link.from_socket().ptr.data] = proxy->
inputs[0];
1164 output_map[b_link.to_socket().ptr.data] = proxy->
outputs[0];
1169 else if (b_node.is_a(&RNA_ShaderNodeGroup) || b_node.is_a(&RNA_NodeCustomGroup) ||
1170 b_node.is_a(&RNA_ShaderNodeCustomGroup)) {
1173 if (b_node.is_a(&RNA_ShaderNodeGroup))
1174 b_group_ntree = BL::ShaderNodeTree(((BL::NodeGroup)(b_node)).
node_tree());
1175 else if (b_node.is_a(&RNA_NodeCustomGroup))
1176 b_group_ntree = BL::ShaderNodeTree(((BL::NodeCustomGroup)(b_node)).
node_tree());
1178 b_group_ntree = BL::ShaderNodeTree(((BL::ShaderNodeCustomGroup)(b_node)).
node_tree());
1180 ProxyMap group_proxy_input_map, group_proxy_output_map;
1186 for (BL::NodeSocket &b_input : b_node.inputs) {
1196 group_proxy_input_map[b_input.identifier()] = proxy;
1198 input_map[b_input.ptr.data] = proxy->
inputs[0];
1202 for (BL::NodeSocket &b_output : b_node.outputs) {
1212 group_proxy_output_map[b_output.identifier()] = proxy;
1214 output_map[b_output.ptr.data] = proxy->
outputs[0];
1217 if (b_group_ntree) {
1225 group_proxy_input_map,
1226 group_proxy_output_map);
1229 else if (b_node.is_a(&RNA_NodeGroupInput)) {
1231 for (BL::NodeSocket &b_output : b_node.outputs) {
1232 ProxyMap::const_iterator proxy_it = proxy_input_map.find(b_output.identifier());
1233 if (proxy_it != proxy_input_map.end()) {
1236 output_map[b_output.ptr.data] = proxy->
outputs[0];
1240 else if (b_node.is_a(&RNA_NodeGroupOutput)) {
1241 BL::NodeGroupOutput b_output_node(b_node);
1243 if (b_output_node.is_active_output()) {
1245 for (BL::NodeSocket &b_input : b_node.inputs) {
1246 ProxyMap::const_iterator proxy_it = proxy_output_map.find(b_input.identifier());
1247 if (proxy_it != proxy_output_map.end()) {
1250 input_map[b_input.ptr.data] = proxy->
inputs[0];
1260 if (b_node.ptr.data == output_node.ptr.data) {
1264 BL::ShaderNode b_shader_node(b_node);
1266 scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree, b_shader_node);
1271 for (BL::NodeSocket &b_input : b_node.inputs) {
1277 input_map[b_input.ptr.data] =
input;
1281 for (BL::NodeSocket &b_output : b_node.outputs) {
1287 output_map[b_output.ptr.data] =
output;
1294 for (BL::NodeLink &b_link : b_ntree.links) {
1297 if (!(b_link.is_valid() && b_link.from_socket().enabled() && b_link.to_socket().enabled()) ||
1298 b_link.is_muted()) {
1302 BL::NodeSocket b_from_sock = b_link.from_socket();
1303 BL::NodeSocket b_to_sock = b_link.to_socket();
1308 PtrOutputMap::iterator output_it = output_map.find(b_from_sock.ptr.data);
1309 if (output_it != output_map.end())
1310 output = output_it->second;
1311 PtrInputMap::iterator input_it = input_map.find(b_to_sock.ptr.data);
1312 if (input_it != input_map.end())
1313 input = input_it->second;
1324 BL::BlendData &b_data,
1328 BL::ShaderNodeTree &b_ntree)
1330 static const ProxyMap empty_proxy_map;
1344 void BlenderSync::sync_materials(
BL::Depsgraph &b_depsgraph,
bool update_all)
1349 set<Shader *> updated_shaders;
1351 for (
BL::ID &b_id : b_depsgraph.ids) {
1352 if (!b_id.is_a(&RNA_Material)) {
1360 if (shader_map.
add_or_update(&shader, b_mat) || update_all) {
1363 shader->
name = b_mat.name().c_str();
1364 shader->set_pass_id(b_mat.pass_index());
1367 if (b_mat.use_nodes() && b_mat.node_tree()) {
1368 BL::ShaderNodeTree b_ntree(b_mat.node_tree());
1370 add_nodes(scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree);
1374 diffuse->set_color(
get_float3(b_mat.diffuse_color()));
1375 graph->add(diffuse);
1383 shader->set_use_mis(
get_boolean(cmat,
"sample_as_light"));
1384 shader->set_use_transparent_shadow(
get_boolean(cmat,
"use_transparent_shadow"));
1385 shader->set_heterogeneous_volume(!
get_boolean(cmat,
"homogeneous_volume"));
1388 shader->set_volume_step_rate(
get_float(cmat,
"volume_step_rate"));
1407 updated_shaders.insert(shader);
1420 foreach (
Shader *shader, updated_shaders) {
1427 void BlenderSync::sync_world(
BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d,
bool update_all)
1437 if (world_recalc || update_all || b_world.ptr.data != world_map ||
1443 if (new_viewport_parameters.use_scene_world && b_world && b_world.use_nodes() &&
1444 b_world.node_tree()) {
1445 BL::ShaderNodeTree b_ntree(b_world.node_tree());
1447 add_nodes(scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree);
1451 shader->set_heterogeneous_volume(!
get_boolean(cworld,
"homogeneous_volume"));
1454 shader->set_volume_step_rate(
get_float(cworld,
"volume_step_size"));
1456 else if (new_viewport_parameters.use_scene_world && b_world) {
1458 background->set_color(
get_float3(b_world.color()));
1459 graph->add(background);
1462 graph->connect(background->
output(
"Background"),
out->input(
"Surface"));
1464 else if (!new_viewport_parameters.use_scene_world) {
1474 graph->add(background);
1477 graph->add(light_path);
1480 mix_scene_with_background->set_color2(world_color);
1481 graph->add(mix_scene_with_background);
1485 float3 rotation_z = texture_environment->get_tex_mapping_rotation();
1486 rotation_z[2] = new_viewport_parameters.studiolight_rotate_z;
1487 texture_environment->set_tex_mapping_rotation(rotation_z);
1488 texture_environment->set_filename(new_viewport_parameters.studiolight_path);
1489 graph->add(texture_environment);
1493 mix_intensity->set_fac(1.0f);
1494 mix_intensity->set_color2(
make_float3(new_viewport_parameters.studiolight_intensity,
1495 new_viewport_parameters.studiolight_intensity,
1496 new_viewport_parameters.studiolight_intensity));
1497 graph->add(mix_intensity);
1500 graph->add(texture_coordinate);
1503 mix_background_with_environment->set_fac(
1504 new_viewport_parameters.studiolight_background_alpha);
1505 mix_background_with_environment->set_color1(world_color);
1506 graph->add(mix_background_with_environment);
1510 graph->connect(texture_coordinate->
output(
"Generated"),
1511 texture_environment->
input(
"Vector"));
1512 graph->connect(texture_environment->
output(
"Color"), mix_intensity->
input(
"Color1"));
1513 graph->connect(light_path->
output(
"Is Camera Ray"), mix_scene_with_background->
input(
"Fac"));
1514 graph->connect(mix_intensity->
output(
"Color"), mix_scene_with_background->
input(
"Color1"));
1516 mix_background_with_environment->
input(
"Color2"));
1517 graph->connect(mix_background_with_environment->
output(
"Color"),
1518 mix_scene_with_background->
input(
"Color2"));
1519 graph->connect(mix_scene_with_background->
output(
"Color"), background->
input(
"Color"));
1520 graph->connect(background->
output(
"Background"),
out->input(
"Surface"));
1526 uint visibility = 0;
1534 background->set_visibility(visibility);
1543 BL::WorldLighting b_light = b_world.light_settings();
1544 enum { FAST_GI_METHOD_REPLACE = 0, FAST_GI_METHOD_ADD = 1, FAST_GI_METHOD_NUM };
1546 const bool use_fast_gi =
get_boolean(cscene,
"use_fast_gi");
1548 const int fast_gi_method =
get_enum(
1549 cscene,
"fast_gi_method", FAST_GI_METHOD_NUM, FAST_GI_METHOD_REPLACE);
1550 integrator->set_ao_factor((fast_gi_method == FAST_GI_METHOD_REPLACE) ? b_light.ao_factor() :
1552 integrator->set_ao_additive_factor(
1553 (fast_gi_method == FAST_GI_METHOD_ADD) ? b_light.ao_factor() : 0.0f);
1556 integrator->set_ao_factor(0.0f);
1557 integrator->set_ao_additive_factor(0.0f);
1560 integrator->set_ao_distance(b_light.distance());
1563 integrator->set_ao_factor(0.0f);
1564 integrator->set_ao_additive_factor(0.0f);
1565 integrator->set_ao_distance(10.0f);
1568 background->set_transparent(b_scene.render().film_transparent());
1570 if (background->get_transparent()) {
1571 background->set_transparent_glass(
get_boolean(cscene,
"film_transparent_glass"));
1572 background->set_transparent_roughness_threshold(
1573 get_float(cscene,
"film_transparent_roughness"));
1576 background->set_transparent_glass(
false);
1577 background->set_transparent_roughness_threshold(0.0f);
1580 background->set_use_shader(view_layer.use_background_shader ||
1583 background->set_lightgroup(ustring(b_world ? b_world.lightgroup() :
""));
1585 background->tag_update(scene);
1590 void BlenderSync::sync_lights(
BL::Depsgraph &b_depsgraph,
bool update_all)
1594 for (
BL::ID &b_id : b_depsgraph.ids) {
1595 if (!b_id.is_a(&RNA_Light)) {
1603 if (shader_map.
add_or_update(&shader, b_light) || update_all) {
1607 if (b_light.use_nodes() && b_light.node_tree()) {
1608 shader->
name = b_light.name().c_str();
1610 BL::ShaderNodeTree b_ntree(b_light.node_tree());
1612 add_nodes(scene, b_engine, b_data, b_depsgraph, b_scene,
graph, b_ntree);
1617 emission->set_strength(1.0f);
1618 graph->add(emission);
1621 graph->connect(emission->
output(
"Emission"),
out->input(
"Surface"));
1630 void BlenderSync::sync_shaders(
BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d,
bool update_all)
1634 sync_world(b_depsgraph, b_v3d, update_all);
1635 sync_lights(b_depsgraph, update_all);
1636 sync_materials(b_depsgraph, update_all);
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 Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to curves
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert a color
struct RenderEngine RenderEngine
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 ShaderOutput * node_find_output_by_name(ShaderNode *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 bool is_image_animated(BL::Image::source_enum b_image_source, BL::ImageUser &b_image_user)
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)
static ShaderInput * node_find_input_by_name(ShaderNode *node, BL::NodeSocket &b_socket)
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
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
bool shader_modified(const BlenderViewportParameters &other) const
bool use_custom_shader() const
ImageParams image_params() const
ImageHandle add_image(const string &filename, const ImageParams ¶ms)
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 set_graph(ShaderGraph *graph)
void tag_update(Scene *scene)
void tag_used(Scene *scene)
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)
#define CCL_NAMESPACE_END
static string image_user_file_path(BL::BlendData &data, BL::ImageUser &iuser, BL::Image &ima, int cfra)
static float4 get_float4(const BL::Array< float, 4 > &array)
static float get_float(PointerRNA &ptr, const char *name)
static void curvemapping_float_to_array(BL::CurveMapping &cumap, array< float > &data, int size)
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)
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 get_string(PointerRNA &ptr, const char *name)
static Transform get_transform(const BL::Array< float, 16 > &array)
static void curvemapping_minmax(BL::CurveMapping &cumap, int num_curves, float *min_x, float *max_x)
BL::ShaderNodeAttribute::attribute_type_enum BlenderAttributeType
static int image_user_frame_number(BL::ImageUser &iuser, BL::Image &ima, int cfra)
SyclQueue void void size_t num_bytes void
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img image(1, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D_ARRAY, "out_weight_img") .image(3
ccl_gpu_kernel_postfix ccl_global int ccl_global int int num_values
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
ccl_global KernelShaderEvalInput ccl_global float * output
ccl_global KernelShaderEvalInput * input
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_RANDOM_WALK_FIXED_RADIUS_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_BSDF_GLOSSY_TOON_ID
@ CLOSURE_BSDF_HAIR_REFLECTION_ID
@ CLOSURE_BSDF_REFLECTION_ID
@ PATH_RAY_VOLUME_SCATTER
ccl_device_inline float3 one_float3()
ccl_device_inline float3 zero_float3()
bool is_builtin(const void *UNUSED(owner), const AttributeIDRef &attribute_id)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
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
@ SHADER_SPECIAL_TYPE_OSL
closure color principled_hair(normal N, color sigma, float roughnessu, float roughnessv, float coat, float alpha, float eta) BUILTIN
bool string_startswith(const string_view s, const string_view start)
void string_replace(string &haystack, const string &needle, const string &other)
bool string_endswith(const string_view s, const string_view end)
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)
void point_density_texture_space(BL::Depsgraph &b_depsgraph, BL::ShaderNodeTexPointDensity &b_point_density_node, float3 &loc, float3 &size)
static int magic(const Tex *tex, const float texvec[3], TexResult *texres)
ccl_device_inline float3 float4_to_float3(const float4 a)
@ INTERPOLATION_NUM_TYPES