[Bf-blender-cvs] [c57964d] temp-cycles-microdisplacement: Move subd_triangle_* functions to own file
Mai Lavelle
noreply at git.blender.org
Thu Jul 14 04:43:21 CEST 2016
Commit: c57964d18c55030ccb94d22637aaf719b2e32450
Author: Mai Lavelle
Date: Wed Jul 13 21:13:20 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rBc57964d18c55030ccb94d22637aaf719b2e32450
Move subd_triangle_* functions to own file
===================================================================
M intern/cycles/kernel/CMakeLists.txt
M intern/cycles/kernel/geom/geom.h
A intern/cycles/kernel/geom/geom_subd_triangle.h
M intern/cycles/kernel/geom/geom_triangle.h
===================================================================
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index ea168d4..d807bd7 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -159,6 +159,7 @@ set(SRC_GEOM_HEADERS
geom/geom_qbvh_traversal.h
geom/geom_qbvh_volume.h
geom/geom_qbvh_volume_all.h
+ geom/geom_subd_triangle.h
geom/geom_triangle.h
geom/geom_triangle_intersect.h
geom/geom_volume.h
diff --git a/intern/cycles/kernel/geom/geom.h b/intern/cycles/kernel/geom/geom.h
index 175cbae..c0baa92 100644
--- a/intern/cycles/kernel/geom/geom.h
+++ b/intern/cycles/kernel/geom/geom.h
@@ -27,6 +27,7 @@
#include "geom_object.h"
#include "geom_patch.h"
#include "geom_triangle.h"
+#include "geom_subd_triangle.h"
#include "geom_triangle_intersect.h"
#include "geom_motion_triangle.h"
#include "geom_motion_curve.h"
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_subd_triangle.h
similarity index 58%
copy from intern/cycles/kernel/geom/geom_triangle.h
copy to intern/cycles/kernel/geom/geom_subd_triangle.h
index 9181d01..29dd03d 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_subd_triangle.h
@@ -1,6 +1,5 @@
/*
- * Adapted from code Copyright 2009-2010 NVIDIA Corporation
- * Modifications Copyright 2011, Blender Foundation.
+ * 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.
@@ -15,191 +14,10 @@
* 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 accelerate
- * intersection at the cost of more memory usage */
+/* Functions for retrieving attributes on triangles produced from subdivision meshes */
CCL_NAMESPACE_BEGIN
-/* normal on triangle */
-ccl_device_inline float3 triangle_normal(KernelGlobals *kg, ShaderData *sd)
-{
- /* load triangle vertices */
- const uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
- const float3 v0 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+0));
- const float3 v1 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+1));
- const float3 v2 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+2));
-
- /* return normal */
- if(ccl_fetch(sd, flag) & SD_NEGATIVE_SCALE_APPLIED)
- return normalize(cross(v2 - v0, v1 - v0));
- else
- return normalize(cross(v1 - v0, v2 - v0));
-}
-
-/* point and normal on triangle */
-ccl_device_inline void triangle_point_normal(KernelGlobals *kg, int object, int prim, float u, float v, float3 *P, float3 *Ng, int *shader)
-{
- /* load triangle vertices */
- const uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim);
- float3 v0 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+0));
- float3 v1 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+1));
- float3 v2 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+2));
-
- /* compute point */
- float t = 1.0f - u - v;
- *P = (u*v0 + v*v1 + t*v2);
-
- /* get object flags, instance-aware */
- int object_flag = kernel_tex_fetch(__object_flag, object >= 0 ? object : ~object);
-
- /* compute normal */
- if(object_flag & SD_NEGATIVE_SCALE_APPLIED)
- *Ng = normalize(cross(v2 - v0, v1 - v0));
- else
- *Ng = normalize(cross(v1 - v0, v2 - v0));
-
- /* shader`*/
- *shader = kernel_tex_fetch(__tri_shader, prim);
-}
-
-/* Triangle vertex locations */
-
-ccl_device_inline void triangle_vertices(KernelGlobals *kg, int prim, float3 P[3])
-{
- const uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim);
- P[0] = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+0));
- P[1] = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+1));
- P[2] = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+2));
-}
-
-/* Interpolate smooth vertex normal from vertices */
-
-ccl_device_inline float3 triangle_smooth_normal(KernelGlobals *kg, int prim, float u, float v)
-{
- /* load triangle vertices */
- const uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim);
- float3 n0 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, tri_vindex.x));
- float3 n1 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, tri_vindex.y));
- float3 n2 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, tri_vindex.z));
-
- 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, ccl_addr_space float3 *dPdu, ccl_addr_space float3 *dPdv)
-{
- /* fetch triangle vertex coordinates */
- const uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim);
- const float3 p0 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+0));
- const float3 p1 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+1));
- const float3 p2 = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex.w+2));
-
- /* compute derivatives of P w.r.t. uv */
- *dPdu = (p0 - p2);
- *dPdv = (p1 - p2);
-}
-
-/* Reading attributes on various triangle elements */
-
-ccl_device float triangle_attribute_float(KernelGlobals *kg, const ShaderData *sd, const AttributeDescriptor *desc, float *dx, float *dy)
-{
- if(desc->element == ATTR_ELEMENT_FACE) {
- if(dx) *dx = 0.0f;
- if(dy) *dy = 0.0f;
-
- return kernel_tex_fetch(__attributes_float, desc->offset + ccl_fetch(sd, prim));
- }
- else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
- uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
-
- 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;
- if(dy) *dy = ccl_fetch(sd, du).dy*f0 + ccl_fetch(sd, dv).dy*f1 - (ccl_fetch(sd, du).dy + ccl_fetch(sd, dv).dy)*f2;
-#endif
-
- return ccl_fetch(sd, u)*f0 + ccl_fetch(sd, v)*f1 + (1.0f - ccl_fetch(sd, u) - ccl_fetch(sd, v))*f2;
- }
- else if(desc->element == ATTR_ELEMENT_CORNER) {
- int tri = desc->offset + ccl_fetch(sd, prim)*3;
- float f0 = kernel_tex_fetch(__attributes_float, tri + 0);
- float f1 = kernel_tex_fetch(__attributes_float, tri + 1);
- float f2 = kernel_tex_fetch(__attributes_float, tri + 2);
-
-#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;
- if(dy) *dy = ccl_fetch(sd, du).dy*f0 + ccl_fetch(sd, dv).dy*f1 - (ccl_fetch(sd, du).dy + ccl_fetch(sd, dv).dy)*f2;
-#endif
-
- return ccl_fetch(sd, u)*f0 + ccl_fetch(sd, v)*f1 + (1.0f - ccl_fetch(sd, u) - ccl_fetch(sd, v))*f2;
- }
- else {
- if(dx) *dx = 0.0f;
- if(dy) *dy = 0.0f;
-
- return 0.0f;
- }
-}
-
-ccl_device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData *sd, const AttributeDescriptor *desc, float3 *dx, float3 *dy)
-{
- if(desc->element == ATTR_ELEMENT_FACE) {
- 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, desc->offset + ccl_fetch(sd, prim)));
- }
- else if(desc->element == ATTR_ELEMENT_VERTEX || desc->element == ATTR_ELEMENT_VERTEX_MOTION) {
- uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
-
- 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;
- if(dy) *dy = ccl_fetch(sd, du).dy*f0 + ccl_fetch(sd, dv).dy*f1 - (ccl_fetch(sd, du).dy + ccl_fetch(sd, dv).dy)*f2;
-#endif
-
- return ccl_fetch(sd, u)*f0 + ccl_fetch(sd, v)*f1 + (1.0f - ccl_fetch(sd, u) - ccl_fetch(sd, v))*f2;
- }
- else if(desc->element == ATTR_ELEMENT_CORNER || desc->element == ATTR_ELEMENT_CORNER_BYTE) {
- int tri = desc->offset + ccl_fetch(sd, prim)*3;
- float3 f0, f1, f2;
-
- if(desc->element == ATTR_ELEMENT_CORNER) {
- f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, tri + 0));
- f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, tri + 1));
- f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, tri + 2));
- }
- else {
- f0 = color_byte_to_float(kernel_tex_fetch(__attributes_uchar4, tri + 0));
- f1 = color_byte_to_float(kernel_tex_fetch(__attributes_uchar4, tri + 1));
- f2 = color_byte_to_float(kernel_tex_fetch(__attributes_uchar4, tri + 2));
- }
-
-#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;
- if(dy) *dy = ccl_fetch(sd, du).dy*f0 + ccl_fetch(sd, dv).dy*f1 - (ccl_fetch(sd, du).dy + ccl_fetch(sd, dv).dy)*f2;
-#endif
-
- return ccl_fetch(sd, u)*f0 + ccl_fetch(sd, v)*f1 + (1.0f - ccl_fetch(sd, u) - ccl_fetch(sd, v))*f2;
- }
- else {
- if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f);
- if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
-
- return make_float3(0.0f, 0.0f, 0.0f);
- }
-}
-
/* Patch index for triangle, -1 if not subdivision triangle */
ccl_device_inline uint subd_triangle_patch(KernelGlobals *kg, const ShaderData *sd)
@@ -528,3 +346,4 @@ ccl_device float3 subd_triangle_attribute_float3(KernelGlobals *kg, const Shader
}
CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h
index 9181d01..6005a21 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -200,331 +200,4 @@ ccl_device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData
}
}
-/
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list