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

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

Reply via email to