[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