[Bf-blender-cvs] [878a315] temp-cycles-microdisplacement: Add displacement scale option to displaced meshes

Mai Lavelle noreply at git.blender.org
Mon Apr 11 14:54:23 CEST 2016


Commit: 878a315880ba0ffe4145ccccc6ae718af85727d6
Author: Mai Lavelle
Date:   Wed Dec 2 03:53:26 2015 -0500
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB878a315880ba0ffe4145ccccc6ae718af85727d6

Add displacement scale option to displaced meshes

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/osl/osl_services.cpp
M	intern/cycles/kernel/osl/osl_services.h
M	intern/cycles/kernel/shaders/node_bump.osl
M	intern/cycles/kernel/shaders/node_output_displacement.osl
M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/svm_displace.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/graph.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	intern/cycles/render/object.cpp

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 7bb757c..060c6ed 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -937,6 +937,12 @@ class CyclesMeshSettings(bpy.types.PropertyGroup):
                 items=enum_displacement_methods,
                 default='BUMP',
                 )
+        cls.displacement_scale = FloatProperty(
+                name="Displacement Scale",
+                description="",
+                min=-1000, max=1000.0,
+                default=1.0,
+                )
         cls.subdivision_type = EnumProperty(
                 name="Subdivision Type",
                 description="Type of subdivision to use",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 0689f5b..df638fb 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -687,6 +687,7 @@ class Cycles_PT_mesh_displacement(CyclesButtonsPanel, Panel):
         sub = col.column()
         sub.label(text="Displacment:")
         sub.prop(cdata, "displacement_method", text="")
+        sub.prop(cdata, "displacement_scale", text="Scale")
 
         col = split.column()
         sub = col.column(align=True)
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 7554e3f..07b2e68 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -785,6 +785,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
 
 		if(b_mesh) {
 			if(render_layer.use_surfaces && !hide_tris) {
+				mesh->displacement_scale = RNA_float_get(&cmesh, "displacement_scale");
+
 				if(cmesh.data && experimental && RNA_enum_get(&cmesh, "subdivision_type") != 0 &&
 						(!preview || RNA_boolean_get(&cmesh, "preview_displacement")))
 				{
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index ffd2f3b..fbb8a59 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -32,7 +32,7 @@ enum ObjectTransform {
 	OBJECT_INVERSE_TRANSFORM = 4,
 	OBJECT_TRANSFORM_MOTION_POST = 4,
 	OBJECT_PROPERTIES = 8,
-	OBJECT_DUPLI = 9
+	OBJECT_DUPLI = 10
 };
 
 enum ObjectVectorTransform {
@@ -238,6 +238,18 @@ ccl_device_inline float object_random_number(KernelGlobals *kg, int object)
 	return f.z;
 }
 
+/* Displacement scale for objects mesh */
+
+ccl_device_inline float object_displacement_scale(KernelGlobals *kg, int object)
+{
+	if(object == OBJECT_NONE)
+		return 1.0f;
+
+	int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES+1;
+	float4 f = kernel_tex_fetch(__objects, offset);
+	return f.x;
+}
+
 /* Particle ID from which this object was generated */
 
 ccl_device_inline int object_particle_id(KernelGlobals *kg, int object)
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 71fa4bb..c43b575 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -34,7 +34,7 @@
 CCL_NAMESPACE_BEGIN
 
 /* constants */
-#define OBJECT_SIZE 		11
+#define OBJECT_SIZE 		12
 #define OBJECT_VECTOR_SIZE	6
 #define LIGHT_SIZE			5
 #define FILTER_TABLE_SIZE	1024
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index 03e7906..470c90d 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -76,6 +76,7 @@ ustring OSLRenderServices::u_raster("raster");
 ustring OSLRenderServices::u_ndc("NDC");
 ustring OSLRenderServices::u_object_location("object:location");
 ustring OSLRenderServices::u_object_index("object:index");
+ustring OSLRenderServices::u_object_displacement_scale("object:displacement_scale");
 ustring OSLRenderServices::u_geom_dupli_generated("geom:dupli_generated");
 ustring OSLRenderServices::u_geom_dupli_uv("geom:dupli_uv");
 ustring OSLRenderServices::u_material_index("material:index");
@@ -603,6 +604,10 @@ bool OSLRenderServices::get_object_standard_attribute(KernelGlobals *kg, ShaderD
 		float f = object_pass_id(kg, sd->object);
 		return set_attribute_float(f, type, derivatives, val);
 	}
+	else if(name == u_object_displacement_scale) {
+		float f = object_displacement_scale(kg, sd->object);
+		return set_attribute_float(f, type, derivatives, val);
+	}
 	else if(name == u_geom_dupli_generated) {
 		float3 f = object_dupli_generated(kg, sd->object);
 		return set_attribute_float3(f, type, derivatives, val);
diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h
index 2701abb..1be60d7 100644
--- a/intern/cycles/kernel/osl/osl_services.h
+++ b/intern/cycles/kernel/osl/osl_services.h
@@ -142,6 +142,7 @@ public:
 	static ustring u_ndc;
 	static ustring u_object_location;
 	static ustring u_object_index;
+	static ustring u_object_displacement_scale;
 	static ustring u_geom_dupli_generated;
 	static ustring u_geom_dupli_uv;
 	static ustring u_material_index;
diff --git a/intern/cycles/kernel/shaders/node_bump.osl b/intern/cycles/kernel/shaders/node_bump.osl
index 9882857..d87132e 100644
--- a/intern/cycles/kernel/shaders/node_bump.osl
+++ b/intern/cycles/kernel/shaders/node_bump.osl
@@ -27,6 +27,7 @@ surface node_bump(
 	float SampleCenter = 0.0,
 	float SampleX = 0.0,
 	float SampleY = 0.0,
+	int displacement_scale_override = 0,
 	output normal NormalOut = N)
 {
 	/* get surface tangents from normal */
@@ -44,6 +45,8 @@ surface node_bump(
 
 	float strength = max(Strength, 0.0);
 	float dist = Distance;
+	if(displacement_scale_override)
+		getattribute("object:displacement_scale", dist);
 
 	if (invert)
 		dist *= -1.0;
diff --git a/intern/cycles/kernel/shaders/node_output_displacement.osl b/intern/cycles/kernel/shaders/node_output_displacement.osl
index d0688cf..e351b7a 100644
--- a/intern/cycles/kernel/shaders/node_output_displacement.osl
+++ b/intern/cycles/kernel/shaders/node_output_displacement.osl
@@ -18,6 +18,8 @@
 
 displacement node_output_displacement(float Displacement = 0.0)
 {
-	P += N * Displacement * 0.1;  /* todo: get rid of this factor */
+	float scale = 1.0;
+	getattribute("object:displacement_scale", scale);
+	P += N * Displacement * scale;
 }
 
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 9865da2..b26a579 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -259,7 +259,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
 				svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z);
 				break;
 			case NODE_SET_DISPLACEMENT:
-				svm_node_set_displacement(sd, stack, node.y);
+				svm_node_set_displacement(kg, sd, stack, node.y);
 				break;
 #  endif  /* NODES_FEATURE(NODE_FEATURE_BUMP) */
 #  ifdef __TEXTURES__
diff --git a/intern/cycles/kernel/svm/svm_displace.h b/intern/cycles/kernel/svm/svm_displace.h
index 8d4b07c..c5852c8 100644
--- a/intern/cycles/kernel/svm/svm_displace.h
+++ b/intern/cycles/kernel/svm/svm_displace.h
@@ -22,8 +22,8 @@ ccl_device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stac
 {
 #ifdef __RAY_DIFFERENTIALS__
 	/* get normal input */
-	uint normal_offset, distance_offset, invert;
-	decode_node_uchar4(node.y, &normal_offset, &distance_offset, &invert, NULL);
+	uint normal_offset, distance_offset, flags;
+	decode_node_uchar4(node.y, &normal_offset, &distance_offset, &flags, NULL);
 
 	float3 normal_in = stack_valid(normal_offset)? stack_load_float3(stack, normal_offset): ccl_fetch(sd, N);
 
@@ -47,8 +47,10 @@ ccl_device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stac
 
 	float strength = stack_load_float(stack, strength_offset);
 	float distance = stack_load_float(stack, distance_offset);
+	if(flags & NODE_BUMP_OVERRIDE)
+		distance = object_displacement_scale(kg, sd->object);
 
-	if(invert)
+	if(flags & NODE_BUMP_INVERT)
 		distance *= -1.0f;
 
 	strength = max(strength, 0.0f);
@@ -62,10 +64,10 @@ ccl_device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stac
 
 /* Displacement Node */
 
-ccl_device void svm_node_set_displacement(ShaderData *sd, float *stack, uint fac_offset)
+ccl_device void svm_node_set_displacement(KernelGlobals *kg, ShaderData *sd, float *stack, uint fac_offset)
 {
 	float d = stack_load_float(stack, fac_offset);
-	ccl_fetch(sd, P) += ccl_fetch(sd, N)*d*0.1f; /* todo: get rid of this factor */
+	ccl_fetch(sd, P) += ccl_fetch(sd, N) * d * object_displacement_scale(kg, sd->object);
 }
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 21b0cb1..0d80f94 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -350,6 +350,11 @@ typedef enum NodeImageProjection {
 	NODE_IMAGE_PROJ_TUBE   = 3,
 } NodeImageProjection;
 
+typedef enum NodeBumpFlags {
+	NODE_BUMP_INVERT = (1 << 0),
+	NODE_BUMP_OVERRIDE = (1 << 1),
+} NodeBumpFlags;
+
 typedef enum NodeBumpOffset {
 	NODE_BUMP_OFFSET_CENTER,
 	NODE_BUMP_OFFSET_DX,
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index 4a9b2f1..1f33f7c 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -988,7 +988,8 @@ void ShaderGraph::bump_from_displacement()
 	ShaderNode *set_normal = add(new SetNormalNode());
 	
 	/* add bump node and connect copied graphs to it */
-	ShaderNode *bump = add(new BumpNode());
+	BumpNode *bump = (BumpNode*)add(new BumpNode());
+	bump->displacement_override = true;
 
 	ShaderOutput *out = displacement_in->link;
 	ShaderOutput *out_center = nodes_center[out->parent]->output(out->name);
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index d158ff3..681ab68 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -88,6 +88,8 @@ Mesh::Mesh()
 	motion_steps = 3;
 	use_motion_blur = false;
 
+	displacement_scale = 1.0f;
+
 	bvh = NULL;
 
 	tri_offset = 0;
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 628773f..29a613d 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -108,6 +108,8 @@ public:
 	uint motion_steps;
 	bool use_mo

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list