Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/kernel_path_state.h
| Show All 17 Lines | |||||
| ccl_device_inline void path_state_init(KernelGlobals *kg, | ccl_device_inline void path_state_init(KernelGlobals *kg, | ||||
| ShaderData *stack_sd, | ShaderData *stack_sd, | ||||
| ccl_addr_space PathState *state, | ccl_addr_space PathState *state, | ||||
| uint rng_hash, | uint rng_hash, | ||||
| int sample, | int sample, | ||||
| ccl_addr_space Ray *ray) | ccl_addr_space Ray *ray) | ||||
| { | { | ||||
| state->flag = PATH_RAY_CAMERA|PATH_RAY_MIS_SKIP; | state->flag = PATH_RAY_CAMERA|PATH_RAY_MIS_SKIP|PATH_RAY_TRANSPARENT_GLASS; | ||||
| state->rng_hash = rng_hash; | state->rng_hash = rng_hash; | ||||
| state->rng_offset = PRNG_BASE_NUM; | state->rng_offset = PRNG_BASE_NUM; | ||||
| state->sample = sample; | state->sample = sample; | ||||
| state->num_samples = kernel_data.integrator.aa_samples; | state->num_samples = kernel_data.integrator.aa_samples; | ||||
| state->branch_factor = 1.0f; | state->branch_factor = 1.0f; | ||||
| state->bounce = 0; | state->bounce = 0; | ||||
| Show All 28 Lines | if(kernel_data.integrator.use_volumes) { | ||||
| state->rng_congruential = lcg_init(rng_hash + sample*0x51633e2d); | state->rng_congruential = lcg_init(rng_hash + sample*0x51633e2d); | ||||
| } | } | ||||
| else { | else { | ||||
| state->volume_stack[0].shader = SHADER_NONE; | state->volume_stack[0].shader = SHADER_NONE; | ||||
| } | } | ||||
| #endif | #endif | ||||
| } | } | ||||
| ccl_device_inline void path_state_next(KernelGlobals *kg, ccl_addr_space PathState *state, int label) | ccl_device_inline void path_state_next(KernelGlobals *kg, ccl_addr_space PathState *state, int label, float roughness_sqr) | ||||
| { | { | ||||
| /* ray through transparent keeps same flags from previous ray and is | /* ray through transparent keeps same flags from previous ray and is | ||||
| * not counted as a regular bounce, transparent has separate max */ | * not counted as a regular bounce, transparent has separate max */ | ||||
| if(label & LABEL_TRANSPARENT) { | if(label & LABEL_TRANSPARENT) { | ||||
| state->flag |= PATH_RAY_TRANSPARENT; | state->flag |= PATH_RAY_TRANSPARENT; | ||||
| state->transparent_bounce++; | state->transparent_bounce++; | ||||
| if(!kernel_data.integrator.transparent_shadows) | if(!kernel_data.integrator.transparent_shadows) | ||||
| state->flag |= PATH_RAY_MIS_SKIP; | state->flag |= PATH_RAY_MIS_SKIP; | ||||
| /* random number generator next bounce */ | /* random number generator next bounce */ | ||||
| state->rng_offset += PRNG_BOUNCE_NUM; | state->rng_offset += PRNG_BOUNCE_NUM; | ||||
| return; | return; | ||||
| } | } | ||||
| state->bounce++; | state->bounce++; | ||||
| #ifdef __VOLUME__ | #ifdef __VOLUME__ | ||||
| if(label & LABEL_VOLUME_SCATTER) { | if(label & LABEL_VOLUME_SCATTER) { | ||||
| /* volume scatter */ | /* volume scatter */ | ||||
| state->flag |= PATH_RAY_VOLUME_SCATTER; | state->flag |= PATH_RAY_VOLUME_SCATTER; | ||||
| state->flag &= ~(PATH_RAY_REFLECT|PATH_RAY_TRANSMIT|PATH_RAY_CAMERA|PATH_RAY_TRANSPARENT|PATH_RAY_DIFFUSE|PATH_RAY_GLOSSY|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP); | state->flag &= ~(PATH_RAY_REFLECT|PATH_RAY_TRANSMIT|PATH_RAY_CAMERA|PATH_RAY_TRANSPARENT|PATH_RAY_DIFFUSE|PATH_RAY_GLOSSY|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP|PATH_RAY_TRANSPARENT_GLASS); | ||||
| state->volume_bounce++; | state->volume_bounce++; | ||||
| } | } | ||||
| else | else | ||||
| #endif | #endif | ||||
| { | { | ||||
| /* surface reflection/transmission */ | /* surface reflection/transmission */ | ||||
| if(label & LABEL_REFLECT) { | if(label & LABEL_REFLECT) { | ||||
| Show All 9 Lines | else { | ||||
| kernel_assert(label & LABEL_TRANSMIT); | kernel_assert(label & LABEL_TRANSMIT); | ||||
| state->flag |= PATH_RAY_TRANSMIT; | state->flag |= PATH_RAY_TRANSMIT; | ||||
| state->flag &= ~(PATH_RAY_REFLECT|PATH_RAY_VOLUME_SCATTER|PATH_RAY_CAMERA|PATH_RAY_TRANSPARENT); | state->flag &= ~(PATH_RAY_REFLECT|PATH_RAY_VOLUME_SCATTER|PATH_RAY_CAMERA|PATH_RAY_TRANSPARENT); | ||||
| state->transmission_bounce++; | state->transmission_bounce++; | ||||
| } | } | ||||
| if(roughness_sqr >= kernel_data.background.glass_threshold_sqr) { | |||||
| state->flag &= ~PATH_RAY_TRANSPARENT_GLASS; | |||||
| } | |||||
| /* diffuse/glossy/singular */ | /* diffuse/glossy/singular */ | ||||
| if(label & LABEL_DIFFUSE) { | if(label & LABEL_DIFFUSE) { | ||||
| state->flag |= PATH_RAY_DIFFUSE|PATH_RAY_DIFFUSE_ANCESTOR; | state->flag |= PATH_RAY_DIFFUSE|PATH_RAY_DIFFUSE_ANCESTOR; | ||||
| state->flag &= ~(PATH_RAY_GLOSSY|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP); | state->flag &= ~(PATH_RAY_GLOSSY|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP|PATH_RAY_TRANSPARENT_GLASS); | ||||
| } | } | ||||
| else if(label & LABEL_GLOSSY) { | else if(label & LABEL_GLOSSY) { | ||||
| state->flag |= PATH_RAY_GLOSSY; | state->flag |= PATH_RAY_GLOSSY; | ||||
| state->flag &= ~(PATH_RAY_DIFFUSE|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP); | state->flag &= ~(PATH_RAY_DIFFUSE|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP); | ||||
| } | } | ||||
| else { | else { | ||||
| kernel_assert(label & LABEL_SINGULAR); | kernel_assert(label & LABEL_SINGULAR); | ||||
| ▲ Show 20 Lines • Show All 115 Lines • Show Last 20 Lines | |||||