13 void BlenderSync::sync_light(
BL::Object &b_parent,
28 const bool tfm_updated = (light && light->get_tfm() != tfm);
34 if (light->get_is_portal())
41 switch (b_light.type()) {
42 case BL::Light::type_POINT: {
43 BL::PointLight b_point_light(b_light);
44 light->set_size(b_point_light.shadow_soft_size());
48 case BL::Light::type_SPOT: {
49 BL::SpotLight b_spot_light(b_light);
50 light->set_size(b_spot_light.shadow_soft_size());
52 light->set_spot_angle(b_spot_light.spot_size());
53 light->set_spot_smooth(b_spot_light.spot_blend());
62 case BL::Light::type_SUN: {
63 BL::SunLight b_sun_light(b_light);
64 light->set_angle(b_sun_light.angle());
68 case BL::Light::type_AREA: {
69 BL::AreaLight b_area_light(b_light);
70 light->set_size(1.0f);
73 light->set_sizeu(b_area_light.size());
74 light->set_spread(b_area_light.spread());
75 switch (b_area_light.shape()) {
76 case BL::AreaLight::shape_SQUARE:
77 light->set_sizev(light->get_sizeu());
78 light->set_round(
false);
80 case BL::AreaLight::shape_RECTANGLE:
81 light->set_sizev(b_area_light.size_y());
82 light->set_round(
false);
84 case BL::AreaLight::shape_DISK:
85 light->set_sizev(light->get_sizeu());
86 light->set_round(
true);
88 case BL::AreaLight::shape_ELLIPSE:
89 light->set_sizev(b_area_light.size_y());
90 light->set_round(
true);
99 float3 strength =
get_float3(b_light.color()) * BL::PointLight(b_light).energy();
100 light->set_strength(strength);
110 light->set_shader(
static_cast<Shader *
>(used_shaders[0]));
114 light->set_cast_shadow(
get_boolean(clight,
"cast_shadow"));
115 light->set_use_mis(
get_boolean(clight,
"use_multiple_importance_sampling"));
118 light->set_use_caustics(
get_boolean(clight,
"is_caustics_light"));
120 light->set_max_bounces(
get_int(clight,
"max_bounces"));
123 light->set_random_id(random_id);
130 light->set_is_portal(
get_boolean(clight,
"is_portal"));
132 light->set_is_portal(
false);
134 if (light->get_is_portal())
144 light->set_is_shadow_catcher(b_ob_info.
real_object.is_shadow_catcher());
147 light->set_lightgroup(ustring(b_ob_info.
real_object.lightgroup()));
153 void BlenderSync::sync_background_light(BL::SpaceView3D &b_v3d,
bool use_portal)
160 enum SamplingMethod { SAMPLING_NONE = 0, SAMPLING_AUTOMATIC, SAMPLING_MANUAL, SAMPLING_NUM };
161 int sampling_method =
get_enum(cworld,
"sampling_method", SAMPLING_NUM, SAMPLING_AUTOMATIC);
162 bool sample_as_light = (sampling_method != SAMPLING_NONE);
164 if (sample_as_light || use_portal) {
167 ObjectKey key(b_world, 0, b_world,
false);
169 if (light_map.
add_or_update(&light, b_world, b_world, key) || world_recalc ||
170 b_world.ptr.data != world_map) {
172 if (sampling_method == SAMPLING_MANUAL) {
173 light->set_map_resolution(
get_int(cworld,
"sample_map_resolution"));
176 light->set_map_resolution(0);
179 light->set_use_mis(sample_as_light);
180 light->set_max_bounces(
get_int(cworld,
"max_bounces"));
183 light->set_is_enabled(
true);
186 light->set_use_caustics(
get_boolean(cworld,
"is_caustics_light"));
194 world_map = b_world.ptr.data;
195 world_recalc =
false;
bool add_or_update(T **r_data, const BL::ID &id)
void set_recalc(const BL::ID &id)
T * find(const BL::ID &id)
#define CCL_NAMESPACE_END
static uint object_ray_visibility(BL::Object &b_ob)
static bool get_boolean(PointerRNA &ptr, const char *name)
static int get_int(PointerRNA &ptr, const char *name)
static float3 get_float3(const BL::Array< float, 2 > &array)
static int get_enum(PointerRNA &ptr, const char *name, int num_values=-1, int default_value=-1)
static uint hash_string(const char *str)
ccl_device_inline uint hash_uint2(uint kx, uint ky)
@ OBJECT_PERSISTENT_ID_SIZE
@ PATH_RAY_VOLUME_SCATTER
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
void tag_update(Scene *scene)
Shader * default_background