add BLI_strcpy_rlen, replace strcat, which was used in misleading way.
[blender.git] / intern / cycles / render / mesh.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #ifndef __MESH_H__
20 #define __MESH_H__
21
22 #include "attribute.h"
23 #include "shader.h"
24
25 #include "util_boundbox.h"
26 #include "util_list.h"
27 #include "util_map.h"
28 #include "util_param.h"
29 #include "util_transform.h"
30 #include "util_types.h"
31 #include "util_vector.h"
32
33 CCL_NAMESPACE_BEGIN
34
35 class BVH;
36 class Device;
37 class DeviceScene;
38 class Mesh;
39 class Progress;
40 class Scene;
41 class SceneParams;
42 class AttributeRequest;
43
44 /* Mesh */
45
46 class Mesh {
47 public:
48         /* Mesh Triangle */
49         struct Triangle {
50                 int v[3];
51         };
52
53         /* Mesh Curve */
54         struct Curve {
55                 int first_key;
56                 int num_keys;
57                 uint shader;
58
59                 int num_segments() { return num_keys - 1; }
60         };
61
62         struct CurveKey {
63                 float3 co;
64                 float radius;
65         };
66
67         /* Displacement */
68         enum DisplacementMethod {
69                 DISPLACE_BUMP,
70                 DISPLACE_TRUE,
71                 DISPLACE_BOTH
72         };
73
74         ustring name;
75
76         /* Mesh Data */
77         vector<float3> verts;
78         vector<Triangle> triangles;
79         vector<uint> shader;
80         vector<bool> smooth;
81
82         vector<CurveKey> curve_keys;
83         vector<Curve> curves;
84
85         vector<uint> used_shaders;
86         AttributeSet attributes;
87         AttributeSet curve_attributes;
88
89         BoundBox bounds;
90         bool transform_applied;
91         bool transform_negative_scaled;
92         Transform transform_normal;
93         DisplacementMethod displacement_method;
94
95         /* Update Flags */
96         bool need_update;
97         bool need_update_rebuild;
98
99         /* BVH */
100         BVH *bvh;
101         size_t tri_offset;
102         size_t vert_offset;
103
104         size_t curve_offset;
105         size_t curvekey_offset;
106
107         /* Functions */
108         Mesh();
109         ~Mesh();
110
111         void reserve(int numverts, int numfaces, int numcurves, int numcurvekeys);
112         void clear();
113         void add_triangle(int v0, int v1, int v2, int shader, bool smooth);
114         void add_curve_key(float3 loc, float radius);
115         void add_curve(int first_key, int num_keys, int shader);
116
117         void compute_bounds();
118         void add_face_normals();
119         void add_vertex_normals();
120
121         void pack_normals(Scene *scene, float4 *normal, float4 *vnormal);
122         void pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset);
123         void pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, size_t curvekey_offset);
124         void compute_bvh(SceneParams *params, Progress *progress, int n, int total);
125
126         bool need_attribute(Scene *scene, AttributeStandard std);
127         bool need_attribute(Scene *scene, ustring name);
128
129         void tag_update(Scene *scene, bool rebuild);
130 };
131
132 /* Mesh Manager */
133
134 class MeshManager {
135 public:
136         BVH *bvh;
137
138         bool need_update;
139
140         MeshManager();
141         ~MeshManager();
142
143         bool displace(Device *device, DeviceScene *dscene, Scene *scene, Mesh *mesh, Progress& progress);
144
145         /* attributes */
146         void update_osl_attributes(Device *device, Scene *scene, vector<AttributeRequestSet>& mesh_attributes);
147         void update_svm_attributes(Device *device, DeviceScene *dscene, Scene *scene, vector<AttributeRequestSet>& mesh_attributes);
148
149         void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
150         void device_update_object(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
151         void device_update_mesh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
152         void device_update_attributes(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
153         void device_update_bvh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
154         void device_free(Device *device, DeviceScene *dscene);
155
156         void tag_update(Scene *scene);
157 };
158
159 CCL_NAMESPACE_END
160
161 #endif /* __MESH_H__ */
162