diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-03-29 16:03:48 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-03-29 16:03:48 +0400 |
commit | 393216a6df934a78f541d98def7a948a89f9b5c8 (patch) | |
tree | 4dacc87743cf976dccada7a175477385e95fbee0 /intern/cycles/kernel/geom/geom_triangle.h | |
parent | 663a750c7fe3fdba0830e3054e98f8d3959f9ea3 (diff) |
Cycles code refactor: move more code to geom folder, add some comments.
Diffstat (limited to 'intern/cycles/kernel/geom/geom_triangle.h')
-rw-r--r-- | intern/cycles/kernel/geom/geom_triangle.h | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h index ab59524f7c9..3fdf9e8a7cc 100644 --- a/intern/cycles/kernel/geom/geom_triangle.h +++ b/intern/cycles/kernel/geom/geom_triangle.h @@ -15,6 +15,12 @@ * limitations under the License. */ +/* Triangle Primitive + * + * Basic triangle with 3 vertices is used to represent mesh surfaces. For BVH + * ray intersection we use a precomputed triangle storage to accelarate + * intersection at the cost of more memory usage */ + CCL_NAMESPACE_BEGIN /* Refine triangle intersection to more precise hit point. For rays that travel @@ -129,10 +135,10 @@ ccl_device_inline void triangle_point_normal(KernelGlobals *kg, int prim, float *shader = __float_as_int(Nm.w); } -/* Return 3 triangle vertex locations */ +/* Triangle vertex locations */ + ccl_device_inline void triangle_vertices(KernelGlobals *kg, int prim, float3 P[3]) { - /* load triangle vertices */ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, prim)); P[0] = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x))); @@ -140,6 +146,8 @@ ccl_device_inline void triangle_vertices(KernelGlobals *kg, int prim, float3 P[3 P[2] = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z))); } +/* Interpolate smooth vertex normal from vertices */ + ccl_device_inline float3 triangle_smooth_normal(KernelGlobals *kg, int prim, float u, float v) { /* load triangle vertices */ @@ -152,6 +160,8 @@ ccl_device_inline float3 triangle_smooth_normal(KernelGlobals *kg, int prim, flo return normalize((1.0f - u - v)*n2 + u*n0 + v*n1); } +/* Ray differentials on triangle */ + ccl_device_inline void triangle_dPdudv(KernelGlobals *kg, int prim, float3 *dPdu, float3 *dPdv) { /* fetch triangle vertex coordinates */ @@ -166,7 +176,7 @@ ccl_device_inline void triangle_dPdudv(KernelGlobals *kg, int prim, float3 *dPdu *dPdv = (p1 - p2); } -/* attributes */ +/* Reading attributes on various triangle elements */ ccl_device float triangle_attribute_float(KernelGlobals *kg, const ShaderData *sd, AttributeElement elem, int offset, float *dx, float *dy) { @@ -254,7 +264,10 @@ ccl_device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData } } -/* Sven Woop's algorithm */ +/* Ray-Triangle intersection for BVH traversal + * + * Based on Sven Woop's algorithm with precomputed triangle storage */ + ccl_device_inline bool triangle_intersect(KernelGlobals *kg, Intersection *isect, float3 P, float3 idir, uint visibility, int object, int triAddr) { @@ -303,11 +316,11 @@ ccl_device_inline bool triangle_intersect(KernelGlobals *kg, Intersection *isect return false; } -#ifdef __SUBSURFACE__ /* Special ray intersection routines for subsurface scattering. In that case we * only want to intersect with primitives in the same object, and if case of * multiple hits we pick a single random primitive as the intersection point. */ +#ifdef __SUBSURFACE__ ccl_device_inline void triangle_intersect_subsurface(KernelGlobals *kg, Intersection *isect_array, float3 P, float3 idir, int object, int triAddr, float tmax, uint *num_hits, uint *lcg_state, int max_hits) { |