Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm_light_path.h
| Show All 12 Lines | |||||
| * 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. | ||||
| */ | */ | ||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| /* Light Path Node */ | /* Light Path Node */ | ||||
| ccl_device void svm_node_light_path(ShaderData *sd, | ccl_device_noinline void svm_node_light_path(INTEGRATOR_STATE_CONST_ARGS, | ||||
| ccl_addr_space PathState *state, | const ShaderData *sd, | ||||
| float *stack, | float *stack, | ||||
| uint type, | uint type, | ||||
| uint out_offset, | uint out_offset, | ||||
| int path_flag) | int path_flag) | ||||
| { | { | ||||
| float info = 0.0f; | float info = 0.0f; | ||||
| switch (type) { | switch (type) { | ||||
| case NODE_LP_camera: | case NODE_LP_camera: | ||||
| info = (path_flag & PATH_RAY_CAMERA) ? 1.0f : 0.0f; | info = (path_flag & PATH_RAY_CAMERA) ? 1.0f : 0.0f; | ||||
| break; | break; | ||||
| case NODE_LP_shadow: | case NODE_LP_shadow: | ||||
| Show All 18 Lines | case NODE_LP_volume_scatter: | ||||
| info = (path_flag & PATH_RAY_VOLUME_SCATTER) ? 1.0f : 0.0f; | info = (path_flag & PATH_RAY_VOLUME_SCATTER) ? 1.0f : 0.0f; | ||||
| break; | break; | ||||
| case NODE_LP_backfacing: | case NODE_LP_backfacing: | ||||
| info = (sd->flag & SD_BACKFACING) ? 1.0f : 0.0f; | info = (sd->flag & SD_BACKFACING) ? 1.0f : 0.0f; | ||||
| break; | break; | ||||
| case NODE_LP_ray_length: | case NODE_LP_ray_length: | ||||
| info = sd->ray_length; | info = sd->ray_length; | ||||
| break; | break; | ||||
| case NODE_LP_ray_depth: | case NODE_LP_ray_depth: { | ||||
| info = (float)state->bounce; | /* Read bounce from difference location depending if this is a shadow | ||||
| * path. It's a bit dubious to have integrate state details leak into | |||||
| * this function but hard to avoid currently. */ | |||||
| int bounce = (INTEGRATOR_STATE_IS_NULL) ? 0 : | |||||
| (path_flag & PATH_RAY_SHADOW) ? INTEGRATOR_STATE(shadow_path, bounce) : | |||||
| INTEGRATOR_STATE(path, bounce); | |||||
| /* For background, light emission and shadow evaluation we from a | |||||
| * surface or volume we are effective one bounce further. */ | |||||
| if (path_flag & (PATH_RAY_SHADOW | PATH_RAY_EMISSION)) { | |||||
| bounce++; | |||||
| } | |||||
| info = (float)bounce; | |||||
| break; | |||||
| } | |||||
| /* TODO */ | |||||
| case NODE_LP_ray_transparent: { | |||||
| const int bounce = (INTEGRATOR_STATE_IS_NULL) ? | |||||
| 0 : | |||||
| (path_flag & PATH_RAY_SHADOW) ? | |||||
| INTEGRATOR_STATE(shadow_path, transparent_bounce) : | |||||
| INTEGRATOR_STATE(path, transparent_bounce); | |||||
| info = (float)bounce; | |||||
| break; | break; | ||||
| } | |||||
| #if 0 | |||||
| case NODE_LP_ray_diffuse: | case NODE_LP_ray_diffuse: | ||||
| info = (float)state->diffuse_bounce; | info = (float)state->diffuse_bounce; | ||||
| break; | break; | ||||
| case NODE_LP_ray_glossy: | case NODE_LP_ray_glossy: | ||||
| info = (float)state->glossy_bounce; | info = (float)state->glossy_bounce; | ||||
| break; | break; | ||||
| case NODE_LP_ray_transparent: | #endif | ||||
| info = (float)state->transparent_bounce; | #if 0 | ||||
| break; | |||||
| case NODE_LP_ray_transmission: | case NODE_LP_ray_transmission: | ||||
| info = (float)state->transmission_bounce; | info = (float)state->transmission_bounce; | ||||
| break; | break; | ||||
| #endif | |||||
| } | } | ||||
| stack_store_float(stack, out_offset, info); | stack_store_float(stack, out_offset, info); | ||||
| } | } | ||||
| /* Light Falloff Node */ | /* Light Falloff Node */ | ||||
| ccl_device void svm_node_light_falloff(ShaderData *sd, float *stack, uint4 node) | ccl_device_noinline void svm_node_light_falloff(ShaderData *sd, float *stack, uint4 node) | ||||
| { | { | ||||
| uint strength_offset, out_offset, smooth_offset; | uint strength_offset, out_offset, smooth_offset; | ||||
| svm_unpack_node_uchar3(node.z, &strength_offset, &smooth_offset, &out_offset); | svm_unpack_node_uchar3(node.z, &strength_offset, &smooth_offset, &out_offset); | ||||
| float strength = stack_load_float(stack, strength_offset); | float strength = stack_load_float(stack, strength_offset); | ||||
| uint type = node.y; | uint type = node.y; | ||||
| Show All 25 Lines | |||||