diff options
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/CMakeLists.txt | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/geom/geom_triangle_intersect.h | 64 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 8 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_voxel.h | 61 |
6 files changed, 128 insertions, 15 deletions
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 89dd3542ef6..b6c6e502c95 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -124,6 +124,7 @@ set(SRC_SVM_HEADERS svm/svm_value.h svm/svm_vector_transform.h svm/svm_voronoi.h + svm/svm_voxel.h svm/svm_wave.h ) diff --git a/intern/cycles/kernel/geom/geom_triangle_intersect.h b/intern/cycles/kernel/geom/geom_triangle_intersect.h index 220169f56d3..d6e4abc8267 100644 --- a/intern/cycles/kernel/geom/geom_triangle_intersect.h +++ b/intern/cycles/kernel/geom/geom_triangle_intersect.h @@ -110,9 +110,19 @@ ccl_device_inline bool triangle_intersect(KernelGlobals *kg, const float Sz = isect_precalc->Sz; /* Calculate vertices relative to ray origin. */ - const float4 tri_a = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0), - tri_b = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+1), - tri_c = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+2); + float4 tri_a, tri_b, tri_c; + if (kernel_data.bvh.use_tri_storage) { + tri_a = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0); + tri_b = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+1); + tri_c = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+2); + } + else { + const int prim = kernel_tex_fetch(__prim_index, triAddr); + const float4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim); + tri_a = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)); + tri_b = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)); + tri_c = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)); + } const float3 A = make_float3(tri_a.x - P.x, tri_a.y - P.y, tri_a.z - P.z); const float3 B = make_float3(tri_b.x - P.x, tri_b.y - P.y, tri_b.z - P.z); const float3 C = make_float3(tri_c.x - P.x, tri_c.y - P.y, tri_c.z - P.z); @@ -203,9 +213,19 @@ ccl_device_inline void triangle_intersect_subsurface( const float Sz = isect_precalc->Sz; /* Calculate vertices relative to ray origin. */ - const float4 tri_a = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0), - tri_b = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+1), - tri_c = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+2); + float4 tri_a, tri_b, tri_c; + if (kernel_data.bvh.use_tri_storage) { + tri_a = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0); + tri_b = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+1); + tri_c = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+2); + } + else { + const int prim = kernel_tex_fetch(__prim_index, triAddr); + const float4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim); + tri_a = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)); + tri_b = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)); + tri_c = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)); + } const float3 A = make_float3(tri_a.x - P.x, tri_a.y - P.y, tri_a.z - P.z); const float3 B = make_float3(tri_b.x - P.x, tri_b.y - P.y, tri_b.z - P.z); const float3 C = make_float3(tri_c.x - P.x, tri_c.y - P.y, tri_c.z - P.z); @@ -318,9 +338,19 @@ ccl_device_inline float3 triangle_refine(KernelGlobals *kg, P = P + D*t; - const float4 tri_a = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+0), - tri_b = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+1), - tri_c = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+2); + float4 tri_a, tri_b, tri_c; + if (kernel_data.bvh.use_tri_storage) { + tri_a = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+0); + tri_b = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+1); + tri_c = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+2); + } + else { + const int prim = kernel_tex_fetch(__prim_index, isect->prim); + const float4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim); + tri_a = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)); + tri_b = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)); + tri_c = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)); + } float3 edge1 = make_float3(tri_a.x - tri_c.x, tri_a.y - tri_c.y, tri_a.z - tri_c.z); float3 edge2 = make_float3(tri_b.x - tri_c.x, tri_b.y - tri_c.y, tri_b.z - tri_c.z); float3 tvec = make_float3(P.x - tri_c.x, P.y - tri_c.y, P.z - tri_c.z); @@ -375,9 +405,19 @@ ccl_device_inline float3 triangle_refine_subsurface(KernelGlobals *kg, P = P + D*t; - const float4 tri_a = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+0), - tri_b = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+1), - tri_c = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+2); + float4 tri_a, tri_b, tri_c; + if (kernel_data.bvh.use_tri_storage) { + tri_a = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+0); + tri_b = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+1); + tri_c = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+2); + } + else { + const int prim = kernel_tex_fetch(__prim_index, isect->prim); + const float4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim); + tri_a = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)); + tri_b = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)); + tri_c = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)); + } float3 edge1 = make_float3(tri_a.x - tri_c.x, tri_a.y - tri_c.y, tri_a.z - tri_c.z); float3 edge2 = make_float3(tri_b.x - tri_c.x, tri_b.y - tri_c.y, tri_b.z - tri_c.z); float3 tvec = make_float3(P.x - tri_c.x, P.y - tri_c.y, P.z - tri_c.z); diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 54b78dec54d..fbdeeed1216 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -950,7 +950,8 @@ typedef struct KernelBVH { int have_curves; int have_instancing; int use_qbvh; - int pad1, pad2; + int use_tri_storage; + int pad1; } KernelBVH; typedef enum CurveFlag { diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index e5e25eb6ca8..db83d2ec024 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -179,6 +179,7 @@ CCL_NAMESPACE_END #include "svm_checker.h" #include "svm_brick.h" #include "svm_vector_transform.h" +#include "svm_voxel.h" CCL_NAMESPACE_BEGIN @@ -434,7 +435,10 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, Shade break; case NODE_NORMAL_MAP: svm_node_normal_map(kg, sd, stack, node); - break; + break; + case NODE_TEX_VOXEL: + svm_node_tex_voxel(kg, sd, stack, node, &offset); + break; case NODE_END: default: return; diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 4f2117a605b..52f9bec02ef 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -119,7 +119,8 @@ typedef enum NodeType { NODE_TANGENT, NODE_NORMAL_MAP, NODE_HAIR_INFO, - NODE_UVMAP + NODE_UVMAP, + NODE_TEX_VOXEL, } NodeType; typedef enum NodeAttributeType { @@ -364,6 +365,11 @@ typedef enum NodeBumpOffset { NODE_BUMP_OFFSET_DY, } NodeBumpOffset; +typedef enum NodeTexVoxelSpace { + NODE_TEX_VOXEL_SPACE_OBJECT = 0, + NODE_TEX_VOXEL_SPACE_WORLD = 1, +} NodeTexVoxelSpace; + typedef enum ShaderType { SHADER_TYPE_SURFACE, SHADER_TYPE_VOLUME, diff --git a/intern/cycles/kernel/svm/svm_voxel.h b/intern/cycles/kernel/svm/svm_voxel.h new file mode 100644 index 00000000000..4838926503e --- /dev/null +++ b/intern/cycles/kernel/svm/svm_voxel.h @@ -0,0 +1,61 @@ +/* + * Copyright 2011-2015 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. + */ + +CCL_NAMESPACE_BEGIN + +ccl_device void svm_node_tex_voxel(KernelGlobals *kg, + ShaderData *sd, + float *stack, + uint4 node, + int *offset) +{ + int id = node.y; + uint co_offset, density_out_offset, color_out_offset, space; + decode_node_uchar4(node.z, &co_offset, &density_out_offset, &color_out_offset, &space); + float3 co = stack_load_float3(stack, co_offset); + if(space == NODE_TEX_VOXEL_SPACE_OBJECT) { + co = volume_normalized_position(kg, sd, co); + } + else { + kernel_assert(space == NODE_TEX_VOXEL_SPACE_WORLD); + Transform tfm; + tfm.x = read_node_float(kg, offset); + tfm.y = read_node_float(kg, offset); + tfm.z = read_node_float(kg, offset); + tfm.w = read_node_float(kg, offset); + co = transform_point(&tfm, co); + } + if(co.x < 0.0f || co.y < 0.0f || co.z < 0.0f || + co.x > 1.0f || co.y > 1.0f || co.z > 1.0f) + { + if (stack_valid(density_out_offset)) + stack_store_float(stack, density_out_offset, 0.0f); + if (stack_valid(color_out_offset)) + stack_store_float3(stack, color_out_offset, make_float3(0.0f, 0.0f, 0.0f)); + return; + } +#ifdef __KERNEL_GPU__ + float4 r = make_float4(0.0f, 0.0f, 0.0f, 0.0f); +#else + float4 r = kernel_tex_image_interp_3d(id, co.x, co.y, co.z); +#endif + if (stack_valid(density_out_offset)) + stack_store_float(stack, density_out_offset, r.w); + if (stack_valid(color_out_offset)) + stack_store_float3(stack, color_out_offset, make_float3(r.x, r.y, r.z)); +} + +CCL_NAMESPACE_END |