[Bf-blender-cvs] [3269c9e] temp-cycles-microdisplacement: Merge branch 'master' into temp-cycles-microdisplacement
Mai Lavelle
noreply at git.blender.org
Mon Jul 11 03:12:50 CEST 2016
Commit: 3269c9e1376d27b5ecac2d9a0f1e6cc6fbb3bb28
Author: Mai Lavelle
Date: Sun Jul 10 21:12:01 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB3269c9e1376d27b5ecac2d9a0f1e6cc6fbb3bb28
Merge branch 'master' into temp-cycles-microdisplacement
===================================================================
===================================================================
diff --cc intern/cycles/kernel/geom/geom.h
index 9ff246a,33e91d1..175cbae
--- a/intern/cycles/kernel/geom/geom.h
+++ b/intern/cycles/kernel/geom/geom.h
@@@ -21,24 -21,10 +21,11 @@@
/* 64 object BVH + 64 mesh BVH + 64 object node splitting */
#define BVH_STACK_SIZE 192
#define BVH_QSTACK_SIZE 384
- #define BVH_NODE_SIZE 4
- #define BVH_NODE_LEAF_SIZE 1
- #define BVH_QNODE_SIZE 7
- #define BVH_QNODE_LEAF_SIZE 1
#define TRI_NODE_SIZE 3
- /* silly workaround for float extended precision that happens when compiling
- * without sse support on x86, it results in different results for float ops
- * that you would otherwise expect to compare correctly */
- #if !defined(__i386__) || defined(__SSE__)
- # define NO_EXTENDED_PRECISION
- #else
- # define NO_EXTENDED_PRECISION volatile
- #endif
-
#include "geom_attribute.h"
#include "geom_object.h"
+#include "geom_patch.h"
#include "geom_triangle.h"
#include "geom_triangle_intersect.h"
#include "geom_motion_triangle.h"
diff --cc intern/cycles/kernel/geom/geom_triangle.h
index 712ff40,0c2351e..e211534
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@@ -116,14 -111,14 +111,14 @@@ ccl_device float triangle_attribute_flo
if(dx) *dx = 0.0f;
if(dy) *dy = 0.0f;
- return kernel_tex_fetch(__attributes_float, offset + ccl_fetch(sd, prim));
+ return kernel_tex_fetch(__attributes_float, desc->offset + ccl_fetch(sd, prim));
}
- else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
+ else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
- float4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
+ uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
- float f0 = kernel_tex_fetch(__attributes_float, desc->offset + __float_as_int(tri_vindex.x));
- float f1 = kernel_tex_fetch(__attributes_float, desc->offset + __float_as_int(tri_vindex.y));
- float f2 = kernel_tex_fetch(__attributes_float, desc->offset + __float_as_int(tri_vindex.z));
- float f0 = kernel_tex_fetch(__attributes_float, offset + tri_vindex.x);
- float f1 = kernel_tex_fetch(__attributes_float, offset + tri_vindex.y);
- float f2 = kernel_tex_fetch(__attributes_float, offset + tri_vindex.z);
++ float f0 = kernel_tex_fetch(__attributes_float, desc->offset + tri_vindex.x);
++ float f1 = kernel_tex_fetch(__attributes_float, desc->offset + tri_vindex.y);
++ float f2 = kernel_tex_fetch(__attributes_float, desc->offset + tri_vindex.z);
#ifdef __RAY_DIFFERENTIALS__
if(dx) *dx = ccl_fetch(sd, du).dx*f0 + ccl_fetch(sd, dv).dx*f1 - (ccl_fetch(sd, du).dx + ccl_fetch(sd, dv).dx)*f2;
@@@ -159,14 -154,14 +154,14 @@@ ccl_device float3 triangle_attribute_fl
if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f);
if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
- return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + ccl_fetch(sd, prim)));
+ return float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + ccl_fetch(sd, prim)));
}
- else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
+ else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
- float4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
+ uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
- float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + __float_as_int(tri_vindex.x)));
- float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + __float_as_int(tri_vindex.y)));
- float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + __float_as_int(tri_vindex.z)));
- float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + tri_vindex.x));
- float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + tri_vindex.y));
- float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + tri_vindex.z));
++ float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + tri_vindex.x));
++ float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + tri_vindex.y));
++ float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, desc->offset + tri_vindex.z));
#ifdef __RAY_DIFFERENTIALS__
if(dx) *dx = ccl_fetch(sd, du).dx*f0 + ccl_fetch(sd, dv).dx*f1 - (ccl_fetch(sd, du).dx + ccl_fetch(sd, dv).dx)*f2;
@@@ -205,282 -200,4 +200,282 @@@
}
}
+/* Patch index for triangle, -1 if not subdivision triangle */
+
+ccl_device_inline uint subd_triangle_patch(KernelGlobals *kg, const ShaderData *sd)
+{
+ return kernel_tex_fetch(__tri_patch, ccl_fetch(sd, prim));
+}
+
+/* UV coords of triangle within patch */
+
+ccl_device_inline void subd_triangle_patch_uv(KernelGlobals *kg, const ShaderData *sd, float2 uv[3])
+{
- float4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
++ uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
+
- uv[0] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.x));
- uv[1] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.y));
- uv[2] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.z));
++ uv[0] = kernel_tex_fetch(__tri_patch_uv, tri_vindex.x);
++ uv[1] = kernel_tex_fetch(__tri_patch_uv, tri_vindex.y);
++ uv[2] = kernel_tex_fetch(__tri_patch_uv, tri_vindex.z);
+}
+
+/* Vertex indices of patch */
+
+ccl_device_inline uint4 subd_triangle_patch_indices(KernelGlobals *kg, int patch)
+{
+ uint4 indices;
+
+ indices.x = kernel_tex_fetch(__patches, patch+0);
+ indices.y = kernel_tex_fetch(__patches, patch+1);
+ indices.z = kernel_tex_fetch(__patches, patch+2);
+ indices.w = kernel_tex_fetch(__patches, patch+3);
+
+ return indices;
+}
+
+/* Originating face for patch */
+
+ccl_device_inline uint subd_triangle_patch_face(KernelGlobals *kg, int patch)
+{
+ return kernel_tex_fetch(__patches, patch+4);
+}
+
+/* Number of corners on originating face */
+
+ccl_device_inline uint subd_triangle_patch_num_corners(KernelGlobals *kg, int patch)
+{
+ return kernel_tex_fetch(__patches, patch+5) & 0xffff;
+}
+
+/* Indices of the four corners that are used by the patch */
+
+ccl_device_inline void subd_triangle_patch_corners(KernelGlobals *kg, int patch, int corners[4])
+{
+ uint4 data;
+
+ data.x = kernel_tex_fetch(__patches, patch+4);
+ data.y = kernel_tex_fetch(__patches, patch+5);
+ data.z = kernel_tex_fetch(__patches, patch+6);
+ data.w = kernel_tex_fetch(__patches, patch+7);
+
+ int num_corners = data.y & 0xffff;
+
+ if(num_corners == 4) {
+ /* quad */
+ corners[0] = data.z;
+ corners[1] = data.z+1;
+ corners[2] = data.z+2;
+ corners[3] = data.z+3;
+ }
+ else {
+ /* ngon */
+ int c = data.y >> 16;
+
+ corners[0] = data.z + c;
+ corners[1] = data.z + mod(c+1, num_corners);
+ corners[2] = data.w;
+ corners[3] = data.z + mod(c-1, num_corners);
+ }
+}
+
+/* Reading attributes on various subdivision triangle elements */
+
+ccl_device float subd_triangle_attribute_float(KernelGlobals *kg, const ShaderData *sd, const AttributeDescriptor *desc, float *dx, float *dy)
+{
+ int patch = subd_triangle_patch(kg, sd);
+
+ if(desc->element == ATTR_ELEMENT_FACE) {
+ if(dx) *dx = 0.0f;
+ if(dy) *dy = 0.0f;
+
+ return kernel_tex_fetch(__attributes_float, desc->offset + subd_triangle_patch_face(kg, patch));
+ }
+ else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
+ float2 uv[3];
+ subd_triangle_patch_uv(kg, sd, uv);
+
+ float a, b, c;
+
+ if(desc->flags & ATTR_SUBDIVIDED) {
+ a = patch_eval_float(kg, sd, desc->offset, patch, uv[0].x, uv[0].y, 0, NULL, NULL);
+ b = patch_eval_float(kg, sd, desc->offset, patch, uv[1].x, uv[1].y, 0, NULL, NULL);
+ c = patch_eval_float(kg, sd, desc->offset, patch, uv[2].x, uv[2].y, 0, NULL, NULL);
+ }
+ else {
+ uint4 v = subd_triangle_patch_indices(kg, patch);
+
+ float f0 = kernel_tex_fetch(__attributes_float, desc->offset + v.x);
+ float f1 = kernel_tex_fetch(__attributes_float, desc->offset + v.y);
+ float f2 = kernel_tex_fetch(__attributes_float, desc->offset + v.z);
+ float f3 = kernel_tex_fetch(__attributes_float, desc->offset + v.w);
+
+ if(subd_triangle_patch_num_corners(kg, patch) != 4) {
+ f1 = (f1+f0)*0.5f;
+ f3 = (f3+f0)*0.5f;
+ }
+
+ a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y);
+ b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y);
+ c = mix(mix(f0, f1, uv[2].x), mix(f3, f2, uv[2].x), uv[2].y);
+ }
+
+#ifdef __RAY_DIFFERENTIALS__
+ if(dx) *dx = ccl_fetch(sd, du).dx*a + ccl_fetch(sd, dv).dx*b - (ccl_fetch(sd, du).dx + ccl_fetch(sd, dv).dx)*c;
+ if(dy) *dy = ccl_fetch(sd, du).dy*a + ccl_fetch(sd, dv).dy*b - (ccl_fetch(sd, du).dy + ccl_fetch(sd, dv).dy)*c;
+#endif
+
+ return ccl_fetch(sd, u)*a + ccl_fetch(sd, v)*b + (1.0f - ccl_fetch(sd, u) - ccl_fetch(sd, v))*c;
+ }
+ else if(desc->element == ATTR_ELEMENT_CORNER) {
+ float2 uv[3];
+ subd_triangle_patch_uv(kg, sd, uv);
+
+ float a, b, c;
+
+ if(desc->flags & ATTR_SUBDIVIDED) {
+ a = patch_eval_float(kg, sd, desc->offset, patch, uv[0].x, uv[0].y, 0, NULL, NULL);
+ b = patch_eval_float(kg, sd, desc->offset, patch, uv[1].x, uv[1].y, 0, NULL, NULL);
+ c = patch_eval_float(kg, sd, desc->offset, patch, uv[2].x, uv[2].y, 0, NULL, NULL);
+ }
+ else {
+ int corners[4];
+ subd_triangle_patch_corners(kg, patch, corners);
+
+ float f0 = kernel_tex_fetch(__attributes_float, corners[0] + desc->offset);
+ float f1 = kernel_tex_fetch(__attributes_float, corners[1] + desc->offset);
+ float f2 = kernel_tex_fetch(__attributes_float, corners[2] + desc->offset);
+ float f3 = kernel_tex_fetch(__attributes_float, corners[3] + desc->offset);
+
+ if(subd_triangle_patch_num_corners(kg, patch) != 4) {
+ f1 = (f1+f0)*0.5f;
+ f3 = (f3+f0)*0.5f;
+ }
+
+ a = mix(mix(f0, f1, uv[0].x), mix(f3, f2, uv[0].x), uv[0].y);
+ b = mix(mix(f0, f1, uv[1].x), mix(f3, f2, uv[1].x), uv[1].y)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list