Cycles: Make all #include statements relative to cycles source directory
[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_types.h"
25 #include "util/util_vector.h"
26
27 CCL_NAMESPACE_BEGIN
28
29 class Device;
30 class DeviceScene;
31 class Object;
32 class Progress;
33 class Scene;
34 class Shader;
35
36 class Light : public Node {
37 public:
38         NODE_DECLARE;
39
40         Light();
41
42         LightType type;
43         float3 co;
44
45         float3 dir;
46         float size;
47
48         float3 axisu;
49         float sizeu;
50         float3 axisv;
51         float sizev;
52
53         Transform tfm;
54
55         int map_resolution;
56
57         float spot_angle;
58         float spot_smooth;
59
60         bool cast_shadow;
61         bool use_mis;
62         bool use_diffuse;
63         bool use_glossy;
64         bool use_transmission;
65         bool use_scatter;
66
67         bool is_portal;
68         bool is_enabled;
69
70         Shader *shader;
71         int samples;
72         int max_bounces;
73
74         void tag_update(Scene *scene);
75
76         /* Check whether the light has contribution the the scene. */
77         bool has_contribution(Scene *scene);
78 };
79
80 class LightManager {
81 public:
82         bool use_light_visibility;
83         bool need_update;
84
85         LightManager();
86         ~LightManager();
87
88         void device_update(Device *device,
89                            DeviceScene *dscene,
90                            Scene *scene,
91                            Progress& progress);
92         void device_free(Device *device, DeviceScene *dscene);
93
94         void tag_update(Scene *scene);
95
96         /* Check whether there is a background light. */
97         bool has_background_light(Scene *scene);
98
99 protected:
100         /* Optimization: disable light which is either unsupported or
101          * which doesn't contribute to the scene or which is only used for MIS
102          * and scene doesn't need MIS.
103          */
104         void disable_ineffective_light(Device *device, Scene *scene);
105
106         void device_update_points(Device *device,
107                                   DeviceScene *dscene,
108                                   Scene *scene);
109         void device_update_distribution(Device *device,
110                                         DeviceScene *dscene,
111                                         Scene *scene,
112                                         Progress& progress);
113         void device_update_background(Device *device,
114                                       DeviceScene *dscene,
115                                       Scene *scene,
116                                       Progress& progress);
117
118         /* Check whether light manager can use the object as a light-emissive. */
119         bool object_usable_as_light(Object *object);
120 };
121
122 CCL_NAMESPACE_END
123
124 #endif /* __LIGHT_H__ */
125