Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm_displace.h
| /* | /* | ||||
| * Copyright 2011-2013 Blender Foundation | * Copyright 2011-2013 Blender Foundation | ||||
| * | * | ||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| * you may not use this file except in compliance with the License. | * you may not use this file except in compliance with the License. | ||||
| * You may obtain a copy of the License at | * You may obtain a copy of the License at | ||||
| * | * | ||||
| * http://www.apache.org/licenses/LICENSE-2.0 | * http://www.apache.org/licenses/LICENSE-2.0 | ||||
| * | * | ||||
| * Unless required by applicable law or agreed to in writing, software | * Unless required by applicable law or agreed to in writing, software | ||||
| * distributed under the License is distributed on an "AS IS" BASIS, | * distributed under the License is distributed on an "AS IS" BASIS, | ||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| * See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | ||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| #include "kernel/kernel_montecarlo.h" | |||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| /* Bump Node */ | /* Bump Node */ | ||||
| ccl_device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node) | ccl_device_noinline void svm_node_set_bump(const KernelGlobals *kg, | ||||
| ShaderData *sd, | |||||
| float *stack, | |||||
| uint4 node) | |||||
| { | { | ||||
| #ifdef __RAY_DIFFERENTIALS__ | #ifdef __RAY_DIFFERENTIALS__ | ||||
| /* get normal input */ | /* get normal input */ | ||||
| uint normal_offset, scale_offset, invert, use_object_space; | uint normal_offset, scale_offset, invert, use_object_space; | ||||
| svm_unpack_node_uchar4(node.y, &normal_offset, &scale_offset, &invert, &use_object_space); | svm_unpack_node_uchar4(node.y, &normal_offset, &scale_offset, &invert, &use_object_space); | ||||
| float3 normal_in = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N; | float3 normal_in = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N; | ||||
| ▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | #ifdef __RAY_DIFFERENTIALS__ | ||||
| normal_out = ensure_valid_reflection(sd->Ng, sd->I, normal_out); | normal_out = ensure_valid_reflection(sd->Ng, sd->I, normal_out); | ||||
| stack_store_float3(stack, node.w, normal_out); | stack_store_float3(stack, node.w, normal_out); | ||||
| #endif | #endif | ||||
| } | } | ||||
| /* Displacement Node */ | /* Displacement Node */ | ||||
| ccl_device void svm_node_set_displacement(KernelGlobals *kg, | ccl_device void svm_node_set_displacement(const KernelGlobals *kg, | ||||
| ShaderData *sd, | ShaderData *sd, | ||||
| float *stack, | float *stack, | ||||
| uint fac_offset) | uint fac_offset) | ||||
| { | { | ||||
| float3 dP = stack_load_float3(stack, fac_offset); | float3 dP = stack_load_float3(stack, fac_offset); | ||||
| sd->P += dP; | sd->P += dP; | ||||
| } | } | ||||
| ccl_device void svm_node_displacement(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node) | ccl_device_noinline void svm_node_displacement(const KernelGlobals *kg, | ||||
| ShaderData *sd, | |||||
| float *stack, | |||||
| uint4 node) | |||||
| { | { | ||||
| uint height_offset, midlevel_offset, scale_offset, normal_offset; | uint height_offset, midlevel_offset, scale_offset, normal_offset; | ||||
| svm_unpack_node_uchar4(node.y, &height_offset, &midlevel_offset, &scale_offset, &normal_offset); | svm_unpack_node_uchar4(node.y, &height_offset, &midlevel_offset, &scale_offset, &normal_offset); | ||||
| float height = stack_load_float(stack, height_offset); | float height = stack_load_float(stack, height_offset); | ||||
| float midlevel = stack_load_float(stack, midlevel_offset); | float midlevel = stack_load_float(stack, midlevel_offset); | ||||
| float scale = stack_load_float(stack, scale_offset); | float scale = stack_load_float(stack, scale_offset); | ||||
| float3 normal = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N; | float3 normal = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N; | ||||
| Show All 10 Lines | ccl_device_noinline void svm_node_displacement(const KernelGlobals *kg, | ||||
| else { | else { | ||||
| /* World space. */ | /* World space. */ | ||||
| dP *= (height - midlevel) * scale; | dP *= (height - midlevel) * scale; | ||||
| } | } | ||||
| stack_store_float3(stack, node.z, dP); | stack_store_float3(stack, node.z, dP); | ||||
| } | } | ||||
| ccl_device void svm_node_vector_displacement( | ccl_device_noinline int svm_node_vector_displacement( | ||||
| KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) | const KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int offset) | ||||
| { | { | ||||
| uint4 data_node = read_node(kg, offset); | uint4 data_node = read_node(kg, &offset); | ||||
| uint space = data_node.x; | uint space = data_node.x; | ||||
| uint vector_offset, midlevel_offset, scale_offset, displacement_offset; | uint vector_offset, midlevel_offset, scale_offset, displacement_offset; | ||||
| svm_unpack_node_uchar4( | svm_unpack_node_uchar4( | ||||
| node.y, &vector_offset, &midlevel_offset, &scale_offset, &displacement_offset); | node.y, &vector_offset, &midlevel_offset, &scale_offset, &displacement_offset); | ||||
| float3 vector = stack_load_float3(stack, vector_offset); | float3 vector = stack_load_float3(stack, vector_offset); | ||||
| float midlevel = stack_load_float(stack, midlevel_offset); | float midlevel = stack_load_float(stack, midlevel_offset); | ||||
| Show All 25 Lines | ccl_device_noinline int svm_node_vector_displacement( | ||||
| } | } | ||||
| if (space != NODE_NORMAL_MAP_WORLD) { | if (space != NODE_NORMAL_MAP_WORLD) { | ||||
| /* Tangent or object space. */ | /* Tangent or object space. */ | ||||
| object_dir_transform(kg, sd, &dP); | object_dir_transform(kg, sd, &dP); | ||||
| } | } | ||||
| stack_store_float3(stack, displacement_offset, dP); | stack_store_float3(stack, displacement_offset, dP); | ||||
| return offset; | |||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||