Files
test/intern/cycles/scene/light.h
Brecht Van Lommel a428815716 Fix: Cycles light tree poor when light normalize is off
This option was not exposed in the Blender UI, so no user visible effect.
Take into account light area when building light tree.

Ref #136958
2025-05-22 16:32:44 +02:00

158 lines
3.9 KiB
C++

/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#pragma once
#include "kernel/types.h"
#include "graph/node.h"
#include "scene/geometry.h"
#include "util/ies.h"
#include "util/thread.h"
#include "util/types.h"
#include "util/unique_ptr.h"
#include "util/vector.h"
CCL_NAMESPACE_BEGIN
class Device;
class DeviceScene;
class Object;
class Progress;
class Scene;
class Shader;
class Light : public Geometry {
public:
NODE_DECLARE;
Light();
NODE_SOCKET_API(LightType, light_type)
NODE_SOCKET_API(float3, strength)
NODE_SOCKET_API(float, size)
NODE_SOCKET_API(float, angle)
NODE_SOCKET_API(float, sizeu)
NODE_SOCKET_API(float, sizev)
NODE_SOCKET_API(bool, ellipse)
NODE_SOCKET_API(float, spread)
NODE_SOCKET_API(int, map_resolution)
NODE_SOCKET_API(float, average_radiance)
NODE_SOCKET_API(bool, is_sphere)
NODE_SOCKET_API(float, spot_angle)
NODE_SOCKET_API(float, spot_smooth)
NODE_SOCKET_API(bool, cast_shadow)
NODE_SOCKET_API(bool, use_mis)
NODE_SOCKET_API(bool, use_caustics)
NODE_SOCKET_API(bool, is_portal)
NODE_SOCKET_API(bool, is_enabled)
NODE_SOCKET_API(int, max_bounces)
/* Normalize power by the surface area of the light. */
NODE_SOCKET_API(bool, normalize)
void tag_update(Scene *scene);
/* Check whether the light has contribution the scene. */
bool has_contribution(const Scene *scene, const Object *object);
/* Shader */
Shader *get_shader() const;
float area(const Transform &tfm) const;
/* Geometry */
void compute_bounds() override;
void apply_transform(const Transform &tfm, const bool apply_to_motion) override;
void get_uv_tiles(ustring map, unordered_set<int> &tiles) override;
PrimitiveType primitive_type() const override;
friend class LightManager;
friend class LightTree;
};
class LightManager {
public:
enum : uint32_t {
MESH_NEED_REBUILD = (1 << 0),
EMISSIVE_MESH_MODIFIED = (1 << 1),
LIGHT_MODIFIED = (1 << 2),
LIGHT_ADDED = (1 << 3),
LIGHT_REMOVED = (1 << 4),
OBJECT_MANAGER = (1 << 5),
SHADER_COMPILED = (1 << 6),
SHADER_MODIFIED = (1 << 7),
/* tag everything in the manager for an update */
UPDATE_ALL = ~0u,
UPDATE_NONE = 0u,
};
/* Need to update background (including multiple importance map) */
bool need_update_background;
LightManager();
/* IES texture management */
int add_ies(const string &content);
int add_ies_from_file(const string &filename);
void remove_ies(const int slot);
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress);
void device_free(Device *device, DeviceScene *dscene, const bool free_background = true);
void tag_update(Scene *scene, const uint32_t flag);
bool need_update() const;
/* Check whether there is a background light. */
bool has_background_light(Scene *scene);
protected:
/* Optimization: disable light which is either unsupported or
* which doesn't contribute to the scene or which is only used for MIS
* and scene doesn't need MIS.
*/
void test_enabled_lights(Scene *scene);
void device_update_lights(DeviceScene *dscene, Scene *scene);
void device_update_distribution(Device *device,
DeviceScene *dscene,
Scene *scene,
Progress &progress);
void device_update_tree(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress);
void device_update_background(Device *device,
DeviceScene *dscene,
Scene *scene,
Progress &progress);
void device_update_ies(DeviceScene *dscene);
struct IESSlot {
IESFile ies;
uint hash;
int users;
};
vector<unique_ptr<IESSlot>> ies_slots;
thread_mutex ies_mutex;
bool last_background_enabled;
int last_background_resolution;
uint32_t update_flags;
};
CCL_NAMESPACE_END