[Bf-blender-cvs] [d0a21bc] temp-cycles-microdisplacement: Approximate normals for "true" displacement
Mai Lavelle
noreply at git.blender.org
Mon Apr 11 14:54:35 CEST 2016
Commit: d0a21bc44bf065254f493bb736253c36557467d0
Author: Mai Lavelle
Date: Sun Apr 3 21:33:23 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rBd0a21bc44bf065254f493bb736253c36557467d0
Approximate normals for "true" displacement
===================================================================
M intern/cycles/kernel/geom/geom_cache.cpp
M intern/cycles/kernel/geom/geom_object.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/render/object.cpp
===================================================================
diff --git a/intern/cycles/kernel/geom/geom_cache.cpp b/intern/cycles/kernel/geom/geom_cache.cpp
index d1499b8..af5b529 100644
--- a/intern/cycles/kernel/geom/geom_cache.cpp
+++ b/intern/cycles/kernel/geom/geom_cache.cpp
@@ -248,6 +248,26 @@ TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int
*(vert+1) = make_float4(sd.N.x, sd.N.y, sd.N.z, (vert+1)->w);
}
+
+ /* TODO(mai): this is only a temporary approximation, proper thing to do is have normals generated from bump */
+ if(object_displacement_method(kg, object) == OBJECT_DISPLACEMENT_TRUE) {
+ float4* verts = &subpatch->data[subpatch->vert_offset];
+ uint4* tris = (uint4*)&subpatch->data[subpatch->tri_offset];
+
+ for(int i = 0; i < subpatch->num_triangles; i++) {
+ uint4 tri = tris[i];
+
+ float3 a = float4_to_float3(verts[tri.x]);
+ float3 b = float4_to_float3(verts[tri.y]);
+ float3 c = float4_to_float3(verts[tri.z]);
+
+ float3 ng = normalize(cross(b-a, c-a));
+
+ for(int j = 0; j < 3; j++){
+ verts[tri[j]+1] = make_float4(ng.x, ng.y, ng.z, verts[tri[j]+1].w);
+ }
+ }
+ }
}
if(!sample_displacement) {
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index fbb8a59..0f11eb1 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -250,6 +250,18 @@ ccl_device_inline float object_displacement_scale(KernelGlobals *kg, int object)
return f.x;
}
+/* Displacement method for objects mesh */
+
+ccl_device_inline uint object_displacement_method(KernelGlobals *kg, int object)
+{
+ if(object == OBJECT_NONE)
+ return OBJECT_DISPLACEMENT_BUMP;
+
+ int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES+1;
+ float4 f = kernel_tex_fetch(__objects, offset);
+ return __float_as_uint(f.y);
+}
+
/* 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 89a21f9..3947555 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -571,6 +571,14 @@ typedef struct CacheTriangle {
uint shader;
} CacheTriangle;
+typedef enum ObjectDisplacementMethod {
+ OBJECT_DISPLACEMENT_BUMP = 0,
+ OBJECT_DISPLACEMENT_TRUE,
+ OBJECT_DISPLACEMENT_BOTH,
+
+ OBJECT_DISPLACE_NUM_METHODS
+} ObjectDisplacementMethod;
+
/* Intersection */
typedef ccl_addr_space struct Intersection {
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index 8466eaa..e2592b4 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -310,7 +310,7 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene
memcpy(&objects[offset+4], &itfm, sizeof(float4)*3);
/* OBJECT_PROPERTIES */
objects[offset+8] = make_float4(surface_area, pass_id, random_number, __int_as_float(particle_index));
- objects[offset+9] = make_float4(mesh->displacement_scale, 0, 0, 0);
+ objects[offset+9] = make_float4(mesh->displacement_scale, __int_as_float(mesh->displacement_method), 0, 0);
if(need_motion == Scene::MOTION_PASS) {
/* motion transformations, is world/object space depending if mesh
More information about the Bf-blender-cvs
mailing list