Commit: 26cdc64a7fb03b2a732947ea71a3575e6087b0b4
Author: Sergey Sharybin
Date:   Tue Jan 17 10:58:04 2017 +0100
Branches: master
https://developer.blender.org/rB26cdc64a7fb03b2a732947ea71a3575e6087b0b4

Cycles: Split motion triangle file once again, avoids annoying forward 
declarations

===================================================================

M       intern/cycles/kernel/CMakeLists.txt
M       intern/cycles/kernel/geom/geom.h
M       intern/cycles/kernel/geom/geom_motion_triangle.h
A       intern/cycles/kernel/geom/geom_motion_triangle_shader.h

===================================================================

diff --git a/intern/cycles/kernel/CMakeLists.txt 
b/intern/cycles/kernel/CMakeLists.txt
index e06534d0a9..29e0f44841 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -165,6 +165,7 @@ set(SRC_GEOM_HEADERS
        geom/geom_motion_curve.h
        geom/geom_motion_triangle.h
        geom/geom_motion_triangle_intersect.h
+       geom/geom_motion_triangle_shader.h
        geom/geom_object.h
        geom/geom_patch.h
        geom/geom_primitive.h
diff --git a/intern/cycles/kernel/geom/geom.h b/intern/cycles/kernel/geom/geom.h
index 68eaa467a9..6838e26c24 100644
--- a/intern/cycles/kernel/geom/geom.h
+++ b/intern/cycles/kernel/geom/geom.h
@@ -24,6 +24,7 @@
 #include "geom_triangle_intersect.h"
 #include "geom_motion_triangle.h"
 #include "geom_motion_triangle_intersect.h"
+#include "geom_motion_triangle_shader.h"
 #include "geom_motion_curve.h"
 #include "geom_curve.h"
 #include "geom_volume.h"
diff --git a/intern/cycles/kernel/geom/geom_motion_triangle.h 
b/intern/cycles/kernel/geom/geom_motion_triangle.h
index fe0cd0c258..4e84aa9777 100644
--- a/intern/cycles/kernel/geom/geom_motion_triangle.h
+++ b/intern/cycles/kernel/geom/geom_motion_triangle.h
@@ -27,26 +27,6 @@
 
 CCL_NAMESPACE_BEGIN
 
-/* TODO(sergey): Find a proper place for that. */
-ccl_device_inline float3 motion_triangle_refine(KernelGlobals *kg,
-                                                ShaderData *sd,
-                                                const Intersection *isect,
-                                                const Ray *ray,
-                                                float3 verts[3]);
-
-#ifdef __SUBSURFACE__
-#  if defined(__KERNEL_CUDA__) && (defined(i386) || defined(_M_IX86))
-ccl_device_noinline
-#  else
-ccl_device_inline
-#  endif
-float3 motion_triangle_refine_subsurface(KernelGlobals *kg,
-                                         ShaderData *sd,
-                                         const Intersection *isect,
-                                         const Ray *ray,
-                                         float3 verts[3]);
-#endif  /* __SUBSURFACE__ */
-
 /* Time interpolation of vertex positions and normals */
 
 ccl_device_inline int find_attribute_motion(KernelGlobals *kg, int object, 
uint id, AttributeElement *elem)
@@ -137,92 +117,4 @@ ccl_device_inline void 
motion_triangle_vertices(KernelGlobals *kg, int object, i
        verts[2] = (1.0f - t)*verts[2] + t*next_verts[2];
 }
 
-/* Setup of motion triangle specific parts of ShaderData, moved into this one
- * function to more easily share computation of interpolated positions and
- * normals */
-
-/* return 3 triangle vertex normals */
-ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals *kg, 
ShaderData *sd, const Intersection *isect, const Ray *ray, bool subsurface)
-{
-       /* get shader */
-       ccl_fetch(sd, shader) = kernel_tex_fetch(__tri_shader, ccl_fetch(sd, 
prim));
-
-       /* get motion info */
-       int numsteps, numverts;
-       object_motion_info(kg, ccl_fetch(sd, object), &numsteps, &numverts, 
NULL);
-
-       /* figure out which steps we need to fetch and their interpolation 
factor */
-       int maxstep = numsteps*2;
-       int step = min((int)(ccl_fetch(sd, time)*maxstep), maxstep-1);
-       float t = ccl_fetch(sd, time)*maxstep - step;
-
-       /* find attribute */
-       AttributeElement elem;
-       int offset = find_attribute_motion(kg, ccl_fetch(sd, object), 
ATTR_STD_MOTION_VERTEX_POSITION, &elem);
-       kernel_assert(offset != ATTR_STD_NOT_FOUND);
-
-       /* fetch vertex coordinates */
-       float3 verts[3], next_verts[3];
-       uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
-
-       motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, 
numsteps, step, verts);
-       motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, 
numsteps, step+1, next_verts);
-
-       /* interpolate between steps */
-       verts[0] = (1.0f - t)*verts[0] + t*next_verts[0];
-       verts[1] = (1.0f - t)*verts[1] + t*next_verts[1];
-       verts[2] = (1.0f - t)*verts[2] + t*next_verts[2];
-
-       /* compute refined position */
-#ifdef __SUBSURFACE__
-       if(!subsurface)
-#endif
-               ccl_fetch(sd, P) = motion_triangle_refine(kg, sd, isect, ray, 
verts);
-#ifdef __SUBSURFACE__
-       else
-               ccl_fetch(sd, P) = motion_triangle_refine_subsurface(kg, sd, 
isect, ray, verts);
-#endif
-
-       /* compute face normal */
-       float3 Ng;
-       if(ccl_fetch(sd, flag) & SD_NEGATIVE_SCALE_APPLIED)
-               Ng = normalize(cross(verts[2] - verts[0], verts[1] - verts[0]));
-       else
-               Ng = normalize(cross(verts[1] - verts[0], verts[2] - verts[0]));
-
-       ccl_fetch(sd, Ng) = Ng;
-       ccl_fetch(sd, N) = Ng;
-
-       /* compute derivatives of P w.r.t. uv */
-#ifdef __DPDU__
-       ccl_fetch(sd, dPdu) = (verts[0] - verts[2]);
-       ccl_fetch(sd, dPdv) = (verts[1] - verts[2]);
-#endif
-
-       /* compute smooth normal */
-       if(ccl_fetch(sd, shader) & SHADER_SMOOTH_NORMAL) {
-               /* find attribute */
-               AttributeElement elem;
-               int offset = find_attribute_motion(kg, ccl_fetch(sd, object), 
ATTR_STD_MOTION_VERTEX_NORMAL, &elem);
-               kernel_assert(offset != ATTR_STD_NOT_FOUND);
-
-               /* fetch vertex coordinates */
-               float3 normals[3], next_normals[3];
-               motion_triangle_normals_for_step(kg, tri_vindex, offset, 
numverts, numsteps, step, normals);
-               motion_triangle_normals_for_step(kg, tri_vindex, offset, 
numverts, numsteps, step+1, next_normals);
-
-               /* interpolate between steps */
-               normals[0] = (1.0f - t)*normals[0] + t*next_normals[0];
-               normals[1] = (1.0f - t)*normals[1] + t*next_normals[1];
-               normals[2] = (1.0f - t)*normals[2] + t*next_normals[2];
-
-               /* interpolate between vertices */
-               float u = ccl_fetch(sd, u);
-               float v = ccl_fetch(sd, v);
-               float w = 1.0f - u - v;
-               ccl_fetch(sd, N) = (u*normals[0] + v*normals[1] + w*normals[2]);
-       }
-}
-
 CCL_NAMESPACE_END
-
diff --git a/intern/cycles/kernel/geom/geom_motion_triangle_shader.h 
b/intern/cycles/kernel/geom/geom_motion_triangle_shader.h
new file mode 100644
index 0000000000..c5dbc6a2f5
--- /dev/null
+++ b/intern/cycles/kernel/geom/geom_motion_triangle_shader.h
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2011-2016 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Motion Triangle Primitive
+ *
+ * These are stored as regular triangles, plus extra positions and normals at
+ * times other than the frame center. Computing the triangle vertex positions
+ * or normals at a given ray time is a matter of interpolation of the two steps
+ * between which the ray time lies.
+ *
+ * The extra positions and normals are stored as 
ATTR_STD_MOTION_VERTEX_POSITION
+ * and ATTR_STD_MOTION_VERTEX_NORMAL mesh attributes.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+/* Setup of motion triangle specific parts of ShaderData, moved into this one
+ * function to more easily share computation of interpolated positions and
+ * normals */
+
+/* return 3 triangle vertex normals */
+ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals *kg,
+                                                      ShaderData *sd, const
+                                                      Intersection *isect,
+                                                      const Ray *ray,
+                                                      bool subsurface)
+{
+       /* Get shader. */
+       ccl_fetch(sd, shader) = kernel_tex_fetch(__tri_shader, ccl_fetch(sd, 
prim));
+       /* Get motion info. */
+       /* TODO(sergey): This logic is really similar to 
motion_triangle_vertices(),
+        * can we de-duplicate something here?
+        */
+       int numsteps, numverts;
+       object_motion_info(kg, ccl_fetch(sd, object), &numsteps, &numverts, 
NULL);
+       /* Figure out which steps we need to fetch and their interpolation 
factor. */
+       int maxstep = numsteps*2;
+       int step = min((int)(ccl_fetch(sd, time)*maxstep), maxstep-1);
+       float t = ccl_fetch(sd, time)*maxstep - step;
+       /* Find attribute. */
+       AttributeElement elem;
+       int offset = find_attribute_motion(kg, ccl_fetch(sd, object),
+                                          ATTR_STD_MOTION_VERTEX_POSITION,
+                                          &elem);
+       kernel_assert(offset != ATTR_STD_NOT_FOUND);
+       /* Fetch vertex coordinates. */
+       float3 verts[3], next_verts[3];
+       uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
+       motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, 
numsteps, step, verts);
+       motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, 
numsteps, step+1, next_verts);
+       /* Interpolate between steps. */
+       verts[0] = (1.0f - t)*verts[0] + t*next_verts[0];
+       verts[1] = (1.0f - t)*verts[1] + t*next_verts[1];
+       verts[2] = (1.0f - t)*verts[2] + t*next_verts[2];
+       /* Compute refined position. */
+#ifdef __SUBSURFACE__
+       if(subsurface) {
+               ccl_fetch(sd, P) = motion_triangle_refine_subsurface(kg,
+                                                                    sd,
+                                                                    isect,
+                                                                    ray,
+                                                                    verts);
+       }
+       else
+#endif  /*  __SUBSURFACE__*/
+       {
+               ccl_fetch(sd, P) = motion_triangle_refine(kg, sd, isect, ray, 
verts);
+       }
+       /* Compute face normal. */
+       float3 Ng;
+       if(ccl_fetch(sd, flag) & SD_NEGATIVE_SCALE_APPLIED) {
+               Ng = normalize(cross(verts[2] - verts[0], verts[1] - verts[0]));
+       }
+       else {
+               Ng = normalize(cross(verts[1] - verts[0], verts[2] - verts[0]));
+       }
+       ccl_fetch(sd, Ng) = Ng;
+       ccl_fetch(sd, N) = Ng;
+       /* Compute derivatives of P w.r.t. uv. */
+#ifdef __DPDU__
+       ccl_fetch(sd, dPdu) = (verts[0] - verts[2]);
+       ccl_fetch(sd, dPdv) = (verts[1] - verts[2]);
+#endif
+       /* Compute smooth normal. */
+       if(ccl_fetch(sd, shader) & SHADER_SMOOTH_NORMAL) {
+               /* Find attribute. */
+               AttributeElement elem;
+               int offset = find_attribute_motion(kg,
+                                                  ccl_fetch(sd, object),
+                

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to