ClangFormat: apply to source, most of intern
[blender.git] / intern / cycles / render / object.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 __OBJECT_H__
18 #define __OBJECT_H__
19
20 #include "graph/node.h"
21 #include "render/scene.h"
22
23 #include "util/util_array.h"
24 #include "util/util_boundbox.h"
25 #include "util/util_param.h"
26 #include "util/util_transform.h"
27 #include "util/util_thread.h"
28 #include "util/util_types.h"
29 #include "util/util_vector.h"
30
31 CCL_NAMESPACE_BEGIN
32
33 class Device;
34 class DeviceScene;
35 class Mesh;
36 class ParticleSystem;
37 class Progress;
38 class Scene;
39 struct Transform;
40 struct UpdateObjectTransformState;
41 class ObjectManager;
42
43 /* Object */
44
45 class Object : public Node {
46  public:
47   NODE_DECLARE
48
49   Mesh *mesh;
50   Transform tfm;
51   BoundBox bounds;
52   uint random_id;
53   int pass_id;
54   ustring asset_name;
55   vector<ParamValue> attributes;
56   uint visibility;
57   array<Transform> motion;
58   bool hide_on_missing_motion;
59   bool use_holdout;
60   bool is_shadow_catcher;
61
62   float3 dupli_generated;
63   float2 dupli_uv;
64
65   ParticleSystem *particle_system;
66   int particle_index;
67
68   Object();
69   ~Object();
70
71   void tag_update(Scene *scene);
72
73   void compute_bounds(bool motion_blur);
74   void apply_transform(bool apply_to_motion);
75
76   /* Convert between normalized -1..1 motion time and index
77    * in the motion array. */
78   bool use_motion() const;
79   float motion_time(int step) const;
80   int motion_step(float time) const;
81   void update_motion();
82
83   /* Check whether object is traceable and it worth adding it to
84    * kernel scene.
85    */
86   bool is_traceable() const;
87
88   /* Combine object's visibility with all possible internal run-time
89    * determined flags which denotes trace-time visibility.
90    */
91   uint visibility_for_tracing() const;
92
93   /* Returns the index that is used in the kernel for this object. */
94   int get_device_index() const;
95
96  protected:
97   /* Specifies the position of the object in scene->objects and
98    * in the device vectors. Gets set in device_update. */
99   int index;
100
101   friend class ObjectManager;
102 };
103
104 /* Object Manager */
105
106 class ObjectManager {
107  public:
108   bool need_update;
109   bool need_flags_update;
110
111   ObjectManager();
112   ~ObjectManager();
113
114   void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress);
115   void device_update_transforms(DeviceScene *dscene, Scene *scene, Progress &progress);
116
117   void device_update_flags(Device *device,
118                            DeviceScene *dscene,
119                            Scene *scene,
120                            Progress &progress,
121                            bool bounds_valid = true);
122   void device_update_mesh_offsets(Device *device, DeviceScene *dscene, Scene *scene);
123
124   void device_free(Device *device, DeviceScene *dscene);
125
126   void tag_update(Scene *scene);
127
128   void apply_static_transforms(DeviceScene *dscene, Scene *scene, Progress &progress);
129
130   string get_cryptomatte_objects(Scene *scene);
131   string get_cryptomatte_assets(Scene *scene);
132
133  protected:
134   void device_update_object_transform(UpdateObjectTransformState *state, Object *ob);
135   void device_update_object_transform_task(UpdateObjectTransformState *state);
136   bool device_update_object_transform_pop_work(UpdateObjectTransformState *state,
137                                                int *start_index,
138                                                int *num_objects);
139 };
140
141 CCL_NAMESPACE_END
142
143 #endif /* __OBJECT_H__ */