Cleanup: Fix Cycles Apache header.
[blender.git] / intern / cycles / render / attribute.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 __ATTRIBUTE_H__
18 #define __ATTRIBUTE_H__
19
20 #include "kernel_types.h"
21
22 #include "util_list.h"
23 #include "util_param.h"
24 #include "util_types.h"
25 #include "util_vector.h"
26
27 CCL_NAMESPACE_BEGIN
28
29 class Attribute;
30 class AttributeRequest;
31 class AttributeRequestSet;
32 class AttributeSet;
33 class ImageManager;
34 class Mesh;
35 struct Transform;
36
37 /* Attributes for voxels are images */
38
39 struct VoxelAttribute {
40         ImageManager *manager;
41         int slot;
42 };
43
44 /* Attribute
45  *
46  * Arbitrary data layers on meshes.
47  * Supported types: Float, Color, Vector, Normal, Point */
48
49 class Attribute {
50 public:
51         ustring name;
52         AttributeStandard std;
53
54         TypeDesc type;
55         vector<char> buffer;
56         AttributeElement element;
57
58         Attribute() {}
59         ~Attribute();
60         void set(ustring name, TypeDesc type, AttributeElement element);
61         void reserve(int numverts, int numfaces, int numsteps, int numcurves, int numkeys, bool resize);
62
63         size_t data_sizeof() const;
64         size_t element_size(int numverts, int numfaces, int numsteps, int numcurves, int numkeys) const;
65         size_t buffer_size(int numverts, int numfaces, int numsteps, int numcurves, int numkeys) const;
66
67         char *data() { return (buffer.size())? &buffer[0]: NULL; };
68         float3 *data_float3() { return (float3*)data(); }
69         float4 *data_float4() { return (float4*)data(); }
70         float *data_float() { return (float*)data(); }
71         uchar4 *data_uchar4() { return (uchar4*)data(); }
72         Transform *data_transform() { return (Transform*)data(); }
73         VoxelAttribute *data_voxel()  { return ( VoxelAttribute*)data(); }
74
75         const char *data() const { return (buffer.size())? &buffer[0]: NULL; }
76         const float3 *data_float3() const { return (const float3*)data(); }
77         const float4 *data_float4() const { return (const float4*)data(); }
78         const float *data_float() const { return (const float*)data(); }
79         const Transform *data_transform() const { return (const Transform*)data(); }
80         const VoxelAttribute *data_voxel() const { return (const VoxelAttribute*)data(); }
81
82         void add(const float& f);
83         void add(const float3& f);
84         void add(const uchar4& f);
85         void add(const Transform& f);
86         void add(const VoxelAttribute& f);
87         void add(const char *data);
88
89         static bool same_storage(TypeDesc a, TypeDesc b);
90         static const char *standard_name(AttributeStandard std);
91         static AttributeStandard name_standard(const char *name);
92 };
93
94 /* Attribute Set
95  *
96  * Set of attributes on a mesh. */
97
98 class AttributeSet {
99 public:
100         Mesh *triangle_mesh;
101         Mesh *curve_mesh;
102         list<Attribute> attributes;
103
104         AttributeSet();
105         ~AttributeSet();
106
107         Attribute *add(ustring name, TypeDesc type, AttributeElement element, bool resize = true);
108         Attribute *find(ustring name) const;
109         void remove(ustring name);
110
111         Attribute *add(AttributeStandard std, ustring name = ustring());
112         Attribute *find(AttributeStandard std) const;
113         void remove(AttributeStandard std);
114
115         Attribute *find(AttributeRequest& req);
116
117         void reserve();
118         void clear();
119 };
120
121 /* AttributeRequest
122  *
123  * Request from a shader to use a certain attribute, so we can figure out
124  * which ones we need to export from the host app end store for the kernel.
125  * The attribute is found either by name or by standard attribute type. */
126
127 class AttributeRequest {
128 public:
129         ustring name;
130         AttributeStandard std;
131
132         /* temporary variables used by MeshManager */
133         TypeDesc triangle_type, curve_type;
134         AttributeElement triangle_element, curve_element;
135         int triangle_offset, curve_offset;
136
137         AttributeRequest(ustring name_);
138         AttributeRequest(AttributeStandard std);
139 };
140
141 /* AttributeRequestSet
142  *
143  * Set of attributes requested by a shader. */
144
145 class AttributeRequestSet {
146 public:
147         vector<AttributeRequest> requests;
148
149         AttributeRequestSet();
150         ~AttributeRequestSet();
151
152         void add(ustring name);
153         void add(AttributeStandard std);
154         void add(AttributeRequestSet& reqs);
155
156         bool find(ustring name);
157         bool find(AttributeStandard std);
158
159         size_t size();
160         void clear();
161
162         bool modified(const AttributeRequestSet& other);
163 };
164
165 CCL_NAMESPACE_END
166
167 #endif /* __ATTRIBUTE_H__ */
168