[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