Cycles: Initial support for volume ray visibility.
This adds a new "Volume Scatter" option to the "Ray Visibility" panels and can be used to e.g. exclude lamps from having an influence on the volume. See release logs for an example: http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.72/Cycles Differential revision: https://developer.blender.org/D771
This commit is contained in:
@@ -731,6 +731,11 @@ class CyclesVisibilitySettings(bpy.types.PropertyGroup):
|
||||
description="Object visibility for shadow rays",
|
||||
default=True,
|
||||
)
|
||||
cls.scatter = BoolProperty(
|
||||
name="Volume Scatter",
|
||||
description="Object visibility for volume scatter rays",
|
||||
default=True,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def unregister(cls):
|
||||
|
||||
@@ -618,6 +618,7 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
|
||||
flow.prop(visibility, "diffuse")
|
||||
flow.prop(visibility, "glossy")
|
||||
flow.prop(visibility, "transmission")
|
||||
flow.prop(visibility, "scatter")
|
||||
|
||||
if ob.type != 'LAMP':
|
||||
flow.prop(visibility, "shadow")
|
||||
@@ -897,6 +898,7 @@ class CyclesWorld_PT_ray_visibility(CyclesButtonsPanel, Panel):
|
||||
flow.prop(visibility, "diffuse")
|
||||
flow.prop(visibility, "glossy")
|
||||
flow.prop(visibility, "transmission")
|
||||
flow.prop(visibility, "scatter")
|
||||
|
||||
|
||||
class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
|
||||
|
||||
@@ -82,6 +82,7 @@ static uint object_ray_visibility(BL::Object b_ob)
|
||||
flag |= get_boolean(cvisibility, "glossy")? PATH_RAY_GLOSSY: 0;
|
||||
flag |= get_boolean(cvisibility, "transmission")? PATH_RAY_TRANSMIT: 0;
|
||||
flag |= get_boolean(cvisibility, "shadow")? PATH_RAY_SHADOW: 0;
|
||||
flag |= get_boolean(cvisibility, "scatter")? PATH_RAY_VOLUME_SCATTER: 0;
|
||||
|
||||
return flag;
|
||||
}
|
||||
@@ -172,6 +173,7 @@ void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSI
|
||||
light->use_diffuse = (visibility & PATH_RAY_DIFFUSE) != 0;
|
||||
light->use_glossy = (visibility & PATH_RAY_GLOSSY) != 0;
|
||||
light->use_transmission = (visibility & PATH_RAY_TRANSMIT) != 0;
|
||||
light->use_scatter = (visibility & PATH_RAY_VOLUME_SCATTER) != 0;
|
||||
|
||||
/* tag */
|
||||
light->tag_update(scene);
|
||||
|
||||
@@ -1071,6 +1071,7 @@ void BlenderSync::sync_world(bool update_all)
|
||||
visibility |= get_boolean(cvisibility, "diffuse")? PATH_RAY_DIFFUSE: 0;
|
||||
visibility |= get_boolean(cvisibility, "glossy")? PATH_RAY_GLOSSY: 0;
|
||||
visibility |= get_boolean(cvisibility, "transmission")? PATH_RAY_TRANSMIT: 0;
|
||||
visibility |= get_boolean(cvisibility, "scatter")? PATH_RAY_VOLUME_SCATTER: 0;
|
||||
|
||||
background->visibility = visibility;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval, ClosureType type, float3 v
|
||||
eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
eval->transparent = make_float3(0.0f, 0.0f, 0.0f);
|
||||
eval->subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
eval->scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
if(type == CLOSURE_BSDF_TRANSPARENT_ID)
|
||||
eval->transparent = value;
|
||||
@@ -43,6 +44,8 @@ ccl_device_inline void bsdf_eval_init(BsdfEval *eval, ClosureType type, float3 v
|
||||
eval->transmission = value;
|
||||
else if(CLOSURE_IS_BSDF_BSSRDF(type))
|
||||
eval->subsurface = value;
|
||||
else if(CLOSURE_IS_PHASE(type))
|
||||
eval->scatter = value;
|
||||
}
|
||||
else
|
||||
eval->diffuse = value;
|
||||
@@ -55,7 +58,7 @@ ccl_device_inline void bsdf_eval_accum(BsdfEval *eval, ClosureType type, float3
|
||||
{
|
||||
#ifdef __PASSES__
|
||||
if(eval->use_light_pass) {
|
||||
if(CLOSURE_IS_BSDF_DIFFUSE(type) || CLOSURE_IS_PHASE(type))
|
||||
if(CLOSURE_IS_BSDF_DIFFUSE(type))
|
||||
eval->diffuse += value;
|
||||
else if(CLOSURE_IS_BSDF_GLOSSY(type))
|
||||
eval->glossy += value;
|
||||
@@ -63,6 +66,8 @@ ccl_device_inline void bsdf_eval_accum(BsdfEval *eval, ClosureType type, float3
|
||||
eval->transmission += value;
|
||||
else if(CLOSURE_IS_BSDF_BSSRDF(type))
|
||||
eval->subsurface += value;
|
||||
else if(CLOSURE_IS_PHASE(type))
|
||||
eval->scatter += value;
|
||||
|
||||
/* skipping transparent, this function is used by for eval(), will be zero then */
|
||||
}
|
||||
@@ -81,7 +86,8 @@ ccl_device_inline bool bsdf_eval_is_zero(BsdfEval *eval)
|
||||
&& is_zero(eval->glossy)
|
||||
&& is_zero(eval->transmission)
|
||||
&& is_zero(eval->transparent)
|
||||
&& is_zero(eval->subsurface);
|
||||
&& is_zero(eval->subsurface)
|
||||
&& is_zero(eval->scatter);
|
||||
}
|
||||
else
|
||||
return is_zero(eval->diffuse);
|
||||
@@ -98,6 +104,7 @@ ccl_device_inline void bsdf_eval_mul(BsdfEval *eval, float3 value)
|
||||
eval->glossy *= value;
|
||||
eval->transmission *= value;
|
||||
eval->subsurface *= value;
|
||||
eval->scatter *= value;
|
||||
|
||||
/* skipping transparent, this function is used by for eval(), will be zero then */
|
||||
}
|
||||
@@ -130,21 +137,25 @@ ccl_device_inline void path_radiance_init(PathRadiance *L, int use_light_pass)
|
||||
L->color_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->color_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->color_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->color_scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->path_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->emission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->background = make_float3(0.0f, 0.0f, 0.0f);
|
||||
@@ -174,14 +185,16 @@ ccl_device_inline void path_radiance_bsdf_bounce(PathRadiance *L, float3 *throug
|
||||
L->path_glossy = bsdf_eval->glossy*value;
|
||||
L->path_transmission = bsdf_eval->transmission*value;
|
||||
L->path_subsurface = bsdf_eval->subsurface*value;
|
||||
L->path_scatter = bsdf_eval->scatter*value;
|
||||
|
||||
*throughput = L->path_diffuse + L->path_glossy + L->path_transmission + L->path_subsurface;
|
||||
*throughput = L->path_diffuse + L->path_glossy + L->path_transmission + L->path_subsurface + L->path_scatter;
|
||||
|
||||
L->direct_throughput = *throughput;
|
||||
}
|
||||
else {
|
||||
/* transparent bounce before first hit, or indirectly visible through BSDF */
|
||||
float3 sum = (bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->transparent + bsdf_eval->subsurface)*inverse_pdf;
|
||||
float3 sum = (bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->transparent +
|
||||
bsdf_eval->subsurface + bsdf_eval->scatter) * inverse_pdf;
|
||||
*throughput *= sum;
|
||||
}
|
||||
}
|
||||
@@ -241,6 +254,7 @@ ccl_device_inline void path_radiance_accum_light(PathRadiance *L, float3 through
|
||||
L->direct_glossy += throughput*bsdf_eval->glossy*shadow;
|
||||
L->direct_transmission += throughput*bsdf_eval->transmission*shadow;
|
||||
L->direct_subsurface += throughput*bsdf_eval->subsurface*shadow;
|
||||
L->direct_scatter += throughput*bsdf_eval->scatter*shadow;
|
||||
|
||||
if(is_lamp) {
|
||||
L->shadow.x += shadow.x*shadow_fac;
|
||||
@@ -250,7 +264,7 @@ ccl_device_inline void path_radiance_accum_light(PathRadiance *L, float3 through
|
||||
}
|
||||
else {
|
||||
/* indirectly visible lighting after BSDF bounce */
|
||||
float3 sum = bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->subsurface;
|
||||
float3 sum = bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->subsurface + bsdf_eval->scatter;
|
||||
L->indirect += throughput*sum*shadow;
|
||||
}
|
||||
}
|
||||
@@ -291,12 +305,14 @@ ccl_device_inline void path_radiance_sum_indirect(PathRadiance *L)
|
||||
L->direct_glossy += L->path_glossy*L->direct_emission;
|
||||
L->direct_transmission += L->path_transmission*L->direct_emission;
|
||||
L->direct_subsurface += L->path_subsurface*L->direct_emission;
|
||||
L->direct_scatter += L->path_scatter*L->direct_emission;
|
||||
|
||||
L->indirect = safe_divide_color(L->indirect, L->direct_throughput);
|
||||
L->indirect_diffuse += L->path_diffuse*L->indirect;
|
||||
L->indirect_glossy += L->path_glossy*L->indirect;
|
||||
L->indirect_transmission += L->path_transmission*L->indirect;
|
||||
L->indirect_subsurface += L->path_subsurface*L->indirect;
|
||||
L->indirect_scatter += L->path_scatter*L->indirect;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -309,6 +325,7 @@ ccl_device_inline void path_radiance_reset_indirect(PathRadiance *L)
|
||||
L->path_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->direct_emission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect = make_float3(0.0f, 0.0f, 0.0f);
|
||||
@@ -327,8 +344,8 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadi
|
||||
if(L->use_light_pass) {
|
||||
path_radiance_sum_indirect(L);
|
||||
|
||||
L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface + L->emission;
|
||||
L_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface;
|
||||
L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface + L->direct_scatter + L->emission;
|
||||
L_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface + L->indirect_scatter;
|
||||
|
||||
if(!kernel_data.background.transparent)
|
||||
L_direct += L->background;
|
||||
@@ -344,11 +361,13 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadi
|
||||
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->emission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
@@ -368,6 +387,7 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadi
|
||||
L->direct_glossy *= scale;
|
||||
L->direct_transmission *= scale;
|
||||
L->direct_subsurface *= scale;
|
||||
L->direct_scatter *= scale;
|
||||
L->emission *= scale;
|
||||
L->background *= scale;
|
||||
}
|
||||
@@ -382,6 +402,7 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadi
|
||||
L->indirect_glossy *= scale;
|
||||
L->indirect_transmission *= scale;
|
||||
L->indirect_subsurface *= scale;
|
||||
L->indirect_scatter *= scale;
|
||||
}
|
||||
|
||||
/* Sum again, after clamping */
|
||||
@@ -416,11 +437,13 @@ ccl_device_inline void path_radiance_accum_sample(PathRadiance *L, PathRadiance
|
||||
L->direct_glossy += L_sample->direct_glossy*fac;
|
||||
L->direct_transmission += L_sample->direct_transmission*fac;
|
||||
L->direct_subsurface += L_sample->direct_subsurface*fac;
|
||||
L->direct_scatter += L_sample->direct_scatter*fac;
|
||||
|
||||
L->indirect_diffuse += L_sample->indirect_diffuse*fac;
|
||||
L->indirect_glossy += L_sample->indirect_glossy*fac;
|
||||
L->indirect_transmission += L_sample->indirect_transmission*fac;
|
||||
L->indirect_subsurface += L_sample->indirect_subsurface*fac;
|
||||
L->indirect_scatter += L_sample->indirect_scatter*fac;
|
||||
|
||||
L->emission += L_sample->emission*fac;
|
||||
L->background += L_sample->background*fac;
|
||||
|
||||
@@ -108,6 +108,8 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd,
|
||||
eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
if(ls->shader & SHADER_EXCLUDE_TRANSMIT)
|
||||
eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
if(ls->shader & SHADER_EXCLUDE_SCATTER)
|
||||
eval->scatter = make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -187,7 +189,8 @@ ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, PathState *st
|
||||
if(ls.shader & SHADER_EXCLUDE_ANY) {
|
||||
if(((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (state->flag & PATH_RAY_DIFFUSE)) ||
|
||||
((ls.shader & SHADER_EXCLUDE_GLOSSY) && (state->flag & PATH_RAY_GLOSSY)) ||
|
||||
((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)))
|
||||
((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)) ||
|
||||
((ls.shader & SHADER_EXCLUDE_SCATTER) && (state->flag & PATH_RAY_VOLUME_SCATTER)))
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
@@ -231,7 +234,8 @@ ccl_device_noinline float3 indirect_background(KernelGlobals *kg, PathState *sta
|
||||
if(((shader & SHADER_EXCLUDE_DIFFUSE) && (state->flag & PATH_RAY_DIFFUSE)) ||
|
||||
((shader & SHADER_EXCLUDE_GLOSSY) && (state->flag & PATH_RAY_GLOSSY)) ||
|
||||
((shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)) ||
|
||||
((shader & SHADER_EXCLUDE_CAMERA) && (state->flag & PATH_RAY_CAMERA)))
|
||||
((shader & SHADER_EXCLUDE_CAMERA) && (state->flag & PATH_RAY_CAMERA)) ||
|
||||
((shader & SHADER_EXCLUDE_SCATTER) && (state->flag & PATH_RAY_VOLUME_SCATTER)))
|
||||
return make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
|
||||
@@ -254,17 +254,17 @@ enum PathRayFlag {
|
||||
PATH_RAY_SHADOW_TRANSPARENT = 256,
|
||||
PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE|PATH_RAY_SHADOW_TRANSPARENT),
|
||||
|
||||
PATH_RAY_CURVE = 512, /* visibility flag to define curve segments*/
|
||||
PATH_RAY_CURVE = 512, /* visibility flag to define curve segments */
|
||||
PATH_RAY_VOLUME_SCATTER = 1024, /* volume scattering */
|
||||
|
||||
/* note that these can use maximum 12 bits, the other are for layers */
|
||||
PATH_RAY_ALL_VISIBILITY = (1|2|4|8|16|32|64|128|256|512),
|
||||
PATH_RAY_ALL_VISIBILITY = (1|2|4|8|16|32|64|128|256|512|1024),
|
||||
|
||||
PATH_RAY_MIS_SKIP = 1024,
|
||||
PATH_RAY_DIFFUSE_ANCESTOR = 2048,
|
||||
PATH_RAY_GLOSSY_ANCESTOR = 4096,
|
||||
PATH_RAY_BSSRDF_ANCESTOR = 8192,
|
||||
PATH_RAY_SINGLE_PASS_DONE = 16384,
|
||||
PATH_RAY_VOLUME_SCATTER = 32768,
|
||||
PATH_RAY_MIS_SKIP = 2048,
|
||||
PATH_RAY_DIFFUSE_ANCESTOR = 4096,
|
||||
PATH_RAY_GLOSSY_ANCESTOR = 8192,
|
||||
PATH_RAY_BSSRDF_ANCESTOR = 16384,
|
||||
PATH_RAY_SINGLE_PASS_DONE = 32768,
|
||||
|
||||
/* we need layer member flags to be the 20 upper bits */
|
||||
PATH_RAY_LAYER_SHIFT = (32-20)
|
||||
@@ -334,21 +334,25 @@ typedef struct PathRadiance {
|
||||
float3 color_glossy;
|
||||
float3 color_transmission;
|
||||
float3 color_subsurface;
|
||||
float3 color_scatter;
|
||||
|
||||
float3 direct_diffuse;
|
||||
float3 direct_glossy;
|
||||
float3 direct_transmission;
|
||||
float3 direct_subsurface;
|
||||
float3 direct_scatter;
|
||||
|
||||
float3 indirect_diffuse;
|
||||
float3 indirect_glossy;
|
||||
float3 indirect_transmission;
|
||||
float3 indirect_subsurface;
|
||||
float3 indirect_scatter;
|
||||
|
||||
float3 path_diffuse;
|
||||
float3 path_glossy;
|
||||
float3 path_transmission;
|
||||
float3 path_subsurface;
|
||||
float3 path_scatter;
|
||||
|
||||
float4 shadow;
|
||||
float mist;
|
||||
@@ -362,6 +366,7 @@ typedef struct BsdfEval {
|
||||
float3 transmission;
|
||||
float3 transparent;
|
||||
float3 subsurface;
|
||||
float3 scatter;
|
||||
} BsdfEval;
|
||||
|
||||
#else
|
||||
@@ -382,7 +387,8 @@ typedef enum ShaderFlag {
|
||||
SHADER_EXCLUDE_GLOSSY = (1 << 26),
|
||||
SHADER_EXCLUDE_TRANSMIT = (1 << 25),
|
||||
SHADER_EXCLUDE_CAMERA = (1 << 24),
|
||||
SHADER_EXCLUDE_ANY = (SHADER_EXCLUDE_DIFFUSE|SHADER_EXCLUDE_GLOSSY|SHADER_EXCLUDE_TRANSMIT|SHADER_EXCLUDE_CAMERA),
|
||||
SHADER_EXCLUDE_SCATTER = (1 << 23),
|
||||
SHADER_EXCLUDE_ANY = (SHADER_EXCLUDE_DIFFUSE|SHADER_EXCLUDE_GLOSSY|SHADER_EXCLUDE_TRANSMIT|SHADER_EXCLUDE_CAMERA|SHADER_EXCLUDE_SCATTER),
|
||||
|
||||
SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT|SHADER_USE_MIS|SHADER_EXCLUDE_ANY)
|
||||
} ShaderFlag;
|
||||
|
||||
@@ -78,6 +78,8 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene
|
||||
kbackground->surface_shader |= SHADER_EXCLUDE_GLOSSY;
|
||||
if(!(visibility & PATH_RAY_TRANSMIT))
|
||||
kbackground->surface_shader |= SHADER_EXCLUDE_TRANSMIT;
|
||||
if(!(visibility & PATH_RAY_VOLUME_SCATTER))
|
||||
kbackground->surface_shader |= SHADER_EXCLUDE_SCATTER;
|
||||
if(!(visibility & PATH_RAY_CAMERA))
|
||||
kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA;
|
||||
|
||||
|
||||
@@ -121,6 +121,7 @@ Light::Light()
|
||||
use_diffuse = true;
|
||||
use_glossy = true;
|
||||
use_transmission = true;
|
||||
use_scatter = true;
|
||||
|
||||
shader = 0;
|
||||
samples = 1;
|
||||
@@ -243,6 +244,10 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
|
||||
shader_flag |= SHADER_EXCLUDE_TRANSMIT;
|
||||
use_light_visibility = true;
|
||||
}
|
||||
if(!(object->visibility & PATH_RAY_VOLUME_SCATTER)) {
|
||||
shader_flag |= SHADER_EXCLUDE_SCATTER;
|
||||
use_light_visibility = true;
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < mesh->triangles.size(); i++) {
|
||||
Shader *shader = scene->shaders[mesh->shader[i]];
|
||||
@@ -500,6 +505,10 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce
|
||||
shader_id |= SHADER_EXCLUDE_TRANSMIT;
|
||||
use_light_visibility = true;
|
||||
}
|
||||
if(!light->use_scatter) {
|
||||
shader_id |= SHADER_EXCLUDE_SCATTER;
|
||||
use_light_visibility = true;
|
||||
}
|
||||
|
||||
if(light->type == LIGHT_POINT) {
|
||||
shader_id &= ~SHADER_AREA_LIGHT;
|
||||
@@ -554,6 +563,10 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce
|
||||
shader_id |= SHADER_EXCLUDE_TRANSMIT;
|
||||
use_light_visibility = true;
|
||||
}
|
||||
if(!(visibility & PATH_RAY_VOLUME_SCATTER)) {
|
||||
shader_id |= SHADER_EXCLUDE_SCATTER;
|
||||
use_light_visibility = true;
|
||||
}
|
||||
|
||||
light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), 0.0f, 0.0f, 0.0f);
|
||||
light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), 0.0f, 0.0f, 0.0f);
|
||||
|
||||
@@ -54,6 +54,7 @@ public:
|
||||
bool use_diffuse;
|
||||
bool use_glossy;
|
||||
bool use_transmission;
|
||||
bool use_scatter;
|
||||
|
||||
int shader;
|
||||
int samples;
|
||||
|
||||
Reference in New Issue
Block a user