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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to