[Bf-blender-cvs] [28604c4] master: Cycles: Make Blender importer more forward compatible

Sergey Sharybin noreply at git.blender.org
Fri Feb 12 15:28:15 CET 2016


Commit: 28604c46a137c1288cc7a494b36ed72e44a0ab8b
Author: Sergey Sharybin
Date:   Wed Feb 10 15:09:45 2016 +0100
Branches: master
https://developer.blender.org/rB28604c46a137c1288cc7a494b36ed72e44a0ab8b

Cycles: Make Blender importer more forward compatible

Basically the idea is to make code robust against extending
enum options in the future by falling back to a known safe
default setting when RNA is set to something unknown.

While this approach solves the issues similar to T47377,
but it wouldn't really help when/if any of the RNA values
gets ever deprecated and removed. There'll be no simple
solution to that apart from defining explicit mapping from
RNA value to Cycles one.

Another part which isn't so great actually is that we now
have to have some enum guards and give some explicit values
to the enum items, but we can live with that perhaps.

Reviewers: dingto, juicyfruit, lukasstockner97, brecht

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D1785

===================================================================

M	intern/cycles/blender/blender_camera.cpp
M	intern/cycles/blender/blender_curves.cpp
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/blender/blender_util.h
M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/kernel/kernel_compat_cpu.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/camera.h
M	intern/cycles/render/curves.h
M	intern/cycles/render/film.h
M	intern/cycles/render/integrator.h
M	intern/cycles/render/mesh.h
M	intern/cycles/render/scene.h
M	intern/cycles/render/shader.h
M	intern/cycles/util/util_types.h

===================================================================

diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp
index 6928fe4..cdbee52 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -158,21 +158,10 @@ static void blender_camera_from_object(BlenderCamera *bcam,
 				break;
 		}
 
-		switch(get_enum(ccamera, "panorama_type")) {
-			case 1:
-				bcam->panorama_type = PANORAMA_FISHEYE_EQUIDISTANT;
-				break;
-			case 2:
-				bcam->panorama_type = PANORAMA_FISHEYE_EQUISOLID;
-				break;
-			case 3:
-				bcam->panorama_type = PANORAMA_MIRRORBALL;
-				break;
-			case 0:
-			default:
-				bcam->panorama_type = PANORAMA_EQUIRECTANGULAR;
-				break;
-		}	
+		bcam->panorama_type = (PanoramaType)get_enum(ccamera,
+		                                             "panorama_type",
+		                                             PANORAMA_NUM_TYPES,
+		                                             PANORAMA_EQUIRECTANGULAR);
 
 		bcam->fisheye_fov = RNA_float_get(&ccamera, "fisheye_fov");
 		bcam->fisheye_lens = RNA_float_get(&ccamera, "fisheye_lens");
@@ -460,32 +449,16 @@ void BlenderSync::sync_camera(BL::RenderSettings& b_render,
 	curvemapping_to_array(b_shutter_curve, bcam.shutter_curve, RAMP_TABLE_SIZE);
 
 	PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
-	switch(get_enum(cscene, "motion_blur_position")) {
-		case 0:
-			bcam.motion_position = Camera::MOTION_POSITION_START;
-			break;
-		case 1:
-			bcam.motion_position = Camera::MOTION_POSITION_CENTER;
-			break;
-		case 2:
-			bcam.motion_position = Camera::MOTION_POSITION_END;
-			break;
-		default:
-			bcam.motion_position = Camera::MOTION_POSITION_CENTER;
-			break;
-	}
-
-	switch(get_enum(cscene, "rolling_shutter_type")) {
-		case 0:
-			bcam.rolling_shutter_type = Camera::ROLLING_SHUTTER_NONE;
-			break;
-		case 1:
-			bcam.rolling_shutter_type = Camera::ROLLING_SHUTTER_TOP;
-			break;
-		default:
-			bcam.rolling_shutter_type = Camera::ROLLING_SHUTTER_NONE;
-			break;
-	}
+	bcam.motion_position =
+	        (Camera::MotionPosition)get_enum(cscene,
+	                                         "motion_blur_position",
+	                                         Camera::MOTION_NUM_POSITIONS,
+	                                         Camera::MOTION_POSITION_CENTER);
+	bcam.rolling_shutter_type =
+		(Camera::RollingShutterType)get_enum(cscene,
+		                                     "rolling_shutter_type",
+		                                     Camera::ROLLING_SHUTTER_NUM_TYPES,
+		                                     Camera::ROLLING_SHUTTER_NONE);
 	bcam.rolling_shutter_duration = RNA_float_get(&cscene, "rolling_shutter_duration");
 
 	/* border */
diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index a5c0b22..0178bfb 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -795,8 +795,16 @@ void BlenderSync::sync_curve_settings()
 	curve_system_manager->minimum_width = get_float(csscene, "minimum_width");
 	curve_system_manager->maximum_width = get_float(csscene, "maximum_width");
 
-	curve_system_manager->primitive = get_enum(csscene, "primitive");
-	curve_system_manager->curve_shape = get_enum(csscene, "shape");
+	curve_system_manager->primitive =
+	        (CurvePrimitiveType)get_enum(csscene,
+	                                     "primitive",
+	                                     CURVE_NUM_PRIMITIVE_TYPES,
+	                                     CURVE_LINE_SEGMENTS);
+	curve_system_manager->curve_shape =
+	        (CurveShapeType)get_enum(csscene,
+	                                 "shape",
+	                                 CURVE_NUM_SHAPE_TYPES,
+	                                 CURVE_THICK);
 	curve_system_manager->resolution = get_int(csscene, "resolution");
 	curve_system_manager->subdivisions = get_int(csscene, "subdivisions");
 	curve_system_manager->use_backfacing = !get_boolean(csscene, "cull_backfacing");
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 4483f82..9eb4626 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -827,7 +827,10 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
 
 	/* displacement method */
 	if(cmesh.data) {
-		const int method = get_enum(cmesh, "displacement_method");
+		const int method = get_enum(cmesh,
+		                            "displacement_method",
+		                            Mesh::DISPLACE_NUM_METHODS,
+		                            Mesh::DISPLACE_BUMP);
 
 		if(method == 0 || !experimental)
 			mesh->displacement_method = Mesh::DISPLACE_BUMP;
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index b82e7dd..3e490ed 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -51,6 +51,50 @@ void BlenderSync::find_shader(BL::ID& id,
 	}
 }
 
+/* RNA translation utilities */
+
+static VolumeSampling get_volume_sampling(PointerRNA& ptr)
+{
+	return (VolumeSampling)get_enum(ptr,
+	                                "volume_sampling",
+	                                VOLUME_NUM_SAMPLING,
+	                                VOLUME_SAMPLING_DISTANCE);
+}
+
+static VolumeInterpolation get_volume_interpolation(PointerRNA& ptr)
+{
+	return (VolumeInterpolation)get_enum(ptr,
+	                                     "volume_interpolation",
+	                                     VOLUME_NUM_INTERPOLATION,
+	                                     VOLUME_INTERPOLATION_LINEAR);
+}
+
+static int validate_enum_value(int value, int num_values, int default_value)
+{
+	if(value >= num_values) {
+		return default_value;
+	}
+	return value;
+}
+
+template<typename NodeType>
+static InterpolationType get_image_interpolation(NodeType b_node)
+{
+	int value = b_node.interpolation();
+	return (InterpolationType)validate_enum_value(value,
+	                                              INTERPOLATION_NUM_TYPES,
+	                                              INTERPOLATION_LINEAR);
+}
+
+template<typename NodeType>
+static ExtensionType get_image_extension(NodeType b_node)
+{
+	int value = b_node.extension();
+	return (ExtensionType)validate_enum_value(value,
+	                                          EXTENSION_NUM_TYPES,
+	                                          EXTENSION_REPEAT);
+}
+
 /* Graph */
 
 static BL::NodeSocket get_node_output(BL::Node& b_node, const string& name)
@@ -653,14 +697,14 @@ static ShaderNode *add_node(Scene *scene,
 				scene->image_manager->tag_reload_image(
 				        image->filename,
 				        image->builtin_data,
-				        (InterpolationType)b_image_node.interpolation(),
-				        (ExtensionType)b_image_node.extension());
+				        get_image_interpolation(b_image_node),
+				        get_image_extension(b_image_node));
 			}
 		}
 		image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
 		image->projection = ImageTextureNode::projection_enum[(int)b_image_node.projection()];
-		image->interpolation = (InterpolationType)b_image_node.interpolation();
-		image->extension = (ExtensionType)b_image_node.extension();
+		image->interpolation = get_image_interpolation(b_image_node);
+		image->extension = get_image_extension(b_image_node);
 		image->projection_blend = b_image_node.projection_blend();
 		BL::TexMapping b_texture_mapping(b_image_node.texture_mapping());
 		get_tex_mapping(&image->tex_mapping, b_texture_mapping);
@@ -696,14 +740,15 @@ static ShaderNode *add_node(Scene *scene,
 
 			/* TODO(sergey): Does not work properly when we change builtin type. */
 			if(b_image.is_updated()) {
-				scene->image_manager->tag_reload_image(env->filename,
-				                                       env->builtin_data,
-				                                       (InterpolationType)b_env_node.interpolation(),
-				                                       EXTENSION_REPEAT);
+				scene->image_manager->tag_reload_image(
+				        env->filename,
+				        env->builtin_data,
+				        get_image_interpolation(b_env_node),
+				        EXTENSION_REPEAT);
 			}
 		}
 		env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];
-		env->interpolation = (InterpolationType)b_env_node.interpolation();
+		env->interpolation = get_image_interpolation(b_env_node);
 		env->projection = EnvironmentTextureNode::projection_enum[(int)b_env_node.projection()];
 		BL::TexMapping b_texture_mapping(b_env_node.texture_mapping());
 		get_tex_mapping(&env->tex_mapping, b_texture_mapping);
@@ -824,8 +869,7 @@ static ShaderNode *add_node(Scene *scene,
 		point_density->filename = b_point_density_node.name();
 		point_density->space =
 		        PointDensityTextureNode::space_enum[(int)b_point_density_node.space()];
-		point_density->interpolation =
-		        (InterpolationType)b_point_density_node.interpolation();
+		point_density->interpolation = get_image_interpolation(b_point_density_node);
 		point_density->builtin_data = b_point_density_node.ptr.data;
 
 		/* 1 - render settings, 0 - vewport settings. */
@@ -1200,8 +1244,8 @@ void BlenderSync::sync_materials(bool update_all)
 			shader->use_mis = get_boolean(cmat, "sample_as_light");
 			shader->use_transparent_shadow = get_boolean(cmat, "use_transparent_shadow");
 			shader->heterogeneous_volume = !get_boolean(cmat, "homogeneous_volume");
-			shader->volume_sampling_method = (VolumeSampling)get_enum(cmat, "volume_sampling");
-			shader->volume_interpolation_method = (VolumeInterpolation)get_enum(cmat, "volume_interpolation");
+			shader->volume_sampling_method = get_volume_sampling(cmat);
+			shader->volume_interpolation_method = get_volume_interpolation(cmat);
 
 			shader->set_graph(graph);
 			shader->tag_update(scene);
@@ -1231,8 +1275,8 @@ void BlenderSync::sync_world(bool update_all)
 			/* volume */
 			PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles");
 			shader->heterogeneous_volume = !get_boolean(cworld, "homogeneous_volume");
-			shader->volume_sampling_method = (VolumeSampling)get_enum(cworld, "volume_sampling");
-			shader->volume_interpolation_method = (VolumeInterpolation)get_enum(cworld, "volume_

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list