ClangFormat: apply to source, most of intern
[blender.git] / intern / cycles / render / light.h
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __LIGHT_H__
18 #define __LIGHT_H__
19
20 #include "kernel/kernel_types.h"
21
22 #include "graph/node.h"
23
24 #include "util/util_ies.h"
25 #include "util/util_thread.h"
26 #include "util/util_types.h"
27 #include "util/util_vector.h"
28
29 CCL_NAMESPACE_BEGIN
30
31 class Device;
32 class DeviceScene;
33 class Object;
34 class Progress;
35 class Scene;
36 class Shader;
37
38 class Light : public Node {
39  public:
40   NODE_DECLARE;
41
42   Light();
43
44   LightType type;
45   float3 co;
46
47   float3 dir;
48   float size;
49
50   float3 axisu;
51   float sizeu;
52   float3 axisv;
53   float sizev;
54   bool round;
55
56   Transform tfm;
57
58   int map_resolution;
59
60   float spot_angle;
61   float spot_smooth;
62
63   bool cast_shadow;
64   bool use_mis;
65   bool use_diffuse;
66   bool use_glossy;
67   bool use_transmission;
68   bool use_scatter;
69
70   bool is_portal;
71   bool is_enabled;
72
73   Shader *shader;
74   int samples;
75   int max_bounces;
76   uint random_id;
77
78   void tag_update(Scene *scene);
79
80   /* Check whether the light has contribution the the scene. */
81   bool has_contribution(Scene *scene);
82 };
83
84 class LightManager {
85  public:
86   bool use_light_visibility;
87   bool need_update;
88
89   LightManager();
90   ~LightManager();
91
92   /* IES texture management */
93   int add_ies(ustring ies);
94   int add_ies_from_file(ustring filename);
95   void remove_ies(int slot);
96
97   void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress);
98   void device_free(Device *device, DeviceScene *dscene);
99
100   void tag_update(Scene *scene);
101
102   /* Check whether there is a background light. */
103   bool has_background_light(Scene *scene);
104
105  protected:
106   /* Optimization: disable light which is either unsupported or
107    * which doesn't contribute to the scene or which is only used for MIS
108    * and scene doesn't need MIS.
109    */
110   void disable_ineffective_light(Scene *scene);
111
112   void device_update_points(Device *device, DeviceScene *dscene, Scene *scene);
113   void device_update_distribution(Device *device,
114                                   DeviceScene *dscene,
115                                   Scene *scene,
116                                   Progress &progress);
117   void device_update_background(Device *device,
118                                 DeviceScene *dscene,
119                                 Scene *scene,
120                                 Progress &progress);
121   void device_update_ies(DeviceScene *dscene);
122
123   /* Check whether light manager can use the object as a light-emissive. */
124   bool object_usable_as_light(Object *object);
125
126   struct IESSlot {
127     IESFile ies;
128     uint hash;
129     int users;
130   };
131
132   vector<IESSlot *> ies_slots;
133   thread_mutex ies_mutex;
134 };
135
136 CCL_NAMESPACE_END
137
138 #endif /* __LIGHT_H__ */