Blender V5.0
scene/mesh.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include "graph/node.h"
8
9#include "scene/attribute.h"
10#include "scene/geometry.h"
11#include "scene/shader.h"
12
13#include "subd/dice.h"
14
15#include "util/array.h"
16#include "util/boundbox.h"
17#include "util/param.h"
18#include "util/set.h"
19#include "util/types.h"
20#include "util/unique_ptr.h"
21
23
24class Attribute;
25class BVH;
26class Device;
27class DeviceScene;
28class Mesh;
29class Progress;
30class RenderStats;
31class Scene;
32class SceneParams;
34struct SubdParams;
35class DiagSplit;
36
37/* Mesh */
38
39class Mesh : public Geometry {
40 protected:
41 Mesh(const NodeType *node_type_, Type geom_type_);
42
43 public:
45
46 /* Mesh Triangle */
47 struct Triangle {
48 int v[3];
49
50 void bounds_grow(const float3 *verts, BoundBox &bounds) const;
51
52 void motion_verts(const float3 *verts,
53 const float3 *vert_steps,
54 const size_t num_verts,
55 const size_t num_steps,
56 const float time,
57 float3 r_verts[3]) const;
58
59 void verts_for_step(const float3 *verts,
60 const float3 *vert_steps,
61 const size_t num_verts,
62 const size_t num_steps,
63 const size_t step,
64 float3 r_verts[3]) const;
65
66 float3 compute_normal(const float3 *verts) const;
67
68 bool valid(const float3 *verts) const;
69 };
70
71 Triangle get_triangle(const size_t i) const
72 {
73 Triangle tri = {{triangles[i * 3 + 0], triangles[i * 3 + 1], triangles[i * 3 + 2]}};
74 return tri;
75 }
76
77 size_t num_triangles() const
78 {
79 return triangles.size() / 3;
80 }
81
82 /* Mesh SubdFace */
83 struct SubdFace {
86 int shader;
87 bool smooth;
89
90 bool is_quad()
91 {
92 return num_corners == 4;
93 }
94 float3 normal(const Mesh *mesh) const;
95 int num_ptex_faces() const
96 {
97 return num_corners == 4 ? 1 : num_corners;
98 }
99 };
100
102 int v[2];
103 float crease;
104 };
105
106 SubdEdgeCrease get_subd_crease(const size_t i) const
107 {
109 s.v[0] = subd_creases_edge[i * 2];
110 s.v[1] = subd_creases_edge[i * 2 + 1];
111 s.crease = subd_creases_weight[i];
112 return s;
113 }
114
115 bool need_tesselation();
116
122
128
137
142
143 NODE_SOCKET_API(SubdivisionType, subdivision_type)
144 NODE_SOCKET_API(SubdivisionBoundaryInterpolation, subdivision_boundary_interpolation)
145 NODE_SOCKET_API(SubdivisionFVarInterpolation, subdivision_fvar_interpolation)
146
147 /* Mesh Data */
152
153 /* SubdFaces */
154 NODE_SOCKET_API_ARRAY(array<int>, subd_start_corner)
155 NODE_SOCKET_API_ARRAY(array<int>, subd_num_corners)
158 NODE_SOCKET_API_ARRAY(array<int>, subd_ptex_offset)
159
160 NODE_SOCKET_API_ARRAY(array<int>, subd_face_corners)
161
162 NODE_SOCKET_API_ARRAY(array<int>, subd_creases_edge)
163 NODE_SOCKET_API_ARRAY(array<float>, subd_creases_weight)
164
165 NODE_SOCKET_API_ARRAY(array<int>, subd_vert_creases)
166 NODE_SOCKET_API_ARRAY(array<float>, subd_vert_creases_weight)
167
168 /* Subdivisions parameters */
169 NODE_SOCKET_API(SubdivisionAdaptiveSpace, subd_adaptive_space)
170 NODE_SOCKET_API(float, subd_dicing_rate)
171 NODE_SOCKET_API(int, subd_max_level)
172 NODE_SOCKET_API(Transform, subd_objecttoworld)
173
175
176 /* BVH */
178
181
182 private:
183 size_t num_subd_added_verts;
184 size_t num_subd_faces;
185
186 friend class BVH2;
187 friend class BVHBuild;
188 friend class BVHSpatialSplit;
189 friend class DiagSplit;
190 friend class EdgeDice;
191 friend class GeometryManager;
192 friend class ObjectManager;
193
194 unique_ptr<SubdParams> subd_params;
195
196 public:
197 /* Functions */
198 Mesh();
199
200 void resize_mesh(const int numverts, const int numtris);
201 void reserve_mesh(const int numverts, const int numtris);
202 void resize_subd_faces(const int numfaces, const int numcorners);
203 void reserve_subd_faces(const int numfaces, const int numcorners);
204 void reserve_subd_creases(const size_t num_creases);
205 void clear_non_sockets();
206 void clear(bool preserve_shaders = false) override;
207 void add_vertex(const float3 P);
208 void add_vertex_slow(const float3 P);
209 void add_triangle(const int v0, const int v1, const int v2, const int shader, bool smooth);
210 void add_subd_face(const int *corners, const int num_corners, const int shader_, bool smooth_);
211 void add_edge_crease(const int v0, const int v1, const float weight);
212 void add_vertex_crease(const int v, const float weight);
213
215
217 void apply_transform(const Transform &tfm, const bool apply_to_motion) override;
218 void add_vertex_normals();
219 void add_undisplaced(Scene *scene);
220 void update_generated(Scene *scene);
221 void update_tangents(Scene *scene, bool undisplaced);
222
223 void get_uv_tiles(ustring map, unordered_set<int> &tiles) override;
224
225 void pack_shaders(Scene *scene, uint *shader);
226 void pack_normals(packed_float3 *vnormal);
227 void pack_verts(packed_float3 *tri_verts, packed_uint3 *tri_vindex);
228
229 bool has_motion_blur() const override;
231
233
234 SubdFace get_subd_face(const size_t index) const;
235 size_t get_num_subd_faces() const
236 {
237 return num_subd_faces;
238 }
239 void set_num_subd_faces(const size_t num_subd_faces_)
240 {
241 num_subd_faces = num_subd_faces_;
242 }
244 {
245 return verts.size() - num_subd_added_verts;
246 }
247
248 protected:
249 void clear(bool preserve_shaders, bool preserve_voxel_data);
250};
251
unsigned int uint
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
Definition bvh/bvh.h:67
int motion_step(const float time) const
BoundBox bounds
#define CCL_NAMESPACE_END
static float verts[][3]
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
#define NODE_SOCKET_API_ARRAY(type_, name)
Definition graph/node.h:63
#define NODE_SOCKET_API(type_, name)
Definition graph/node.h:55
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
PrimitiveType
#define NODE_DECLARE
Definition node_type.h:145
int num_ptex_faces() const
Definition scene/mesh.h:95
float3 normal(const Mesh *mesh) const
bool valid(const float3 *verts) const
void bounds_grow(const float3 *verts, BoundBox &bounds) const
void motion_verts(const float3 *verts, const float3 *vert_steps, const size_t num_verts, const size_t num_steps, const float time, float3 r_verts[3]) const
float3 compute_normal(const float3 *verts) const
void verts_for_step(const float3 *verts, const float3 *vert_steps, const size_t num_verts, const size_t num_steps, const size_t step, float3 r_verts[3]) const
friend class EdgeDice
Definition scene/mesh.h:190
void tessellate(SubdParams &params)
size_t get_num_subd_faces() const
Definition scene/mesh.h:235
void add_undisplaced(Scene *scene)
SubdivisionAdaptiveSpace
Definition scene/mesh.h:138
@ SUBDIVISION_ADAPTIVE_SPACE_OBJECT
Definition scene/mesh.h:140
@ SUBDIVISION_ADAPTIVE_SPACE_PIXEL
Definition scene/mesh.h:139
size_t face_offset
Definition scene/mesh.h:179
void add_triangle(const int v0, const int v1, const int v2, const int shader, bool smooth)
size_t get_num_subd_base_verts() const
Definition scene/mesh.h:243
void reserve_subd_creases(const size_t num_creases)
friend class BVHSpatialSplit
Definition scene/mesh.h:188
size_t vert_offset
Definition scene/mesh.h:177
void compute_bounds() override
size_t corner_offset
Definition scene/mesh.h:180
void add_vertex_normals()
friend class GeometryManager
Definition scene/mesh.h:191
AttributeSet subd_attributes
Definition scene/mesh.h:174
void copy_center_to_motion_step(const int motion_step)
Mesh(const NodeType *node_type_, Type geom_type_)
void clear(bool preserve_shaders=false) override
void set_num_subd_faces(const size_t num_subd_faces_)
Definition scene/mesh.h:239
friend class BVH2
Definition scene/mesh.h:186
void add_vertex_slow(const float3 P)
bool has_motion_blur() const override
void pack_verts(packed_float3 *tri_verts, packed_uint3 *tri_vindex)
friend class ObjectManager
Definition scene/mesh.h:192
SubdivisionFVarInterpolation
Definition scene/mesh.h:129
@ SUBDIVISION_FVAR_LINEAR_NONE
Definition scene/mesh.h:130
@ SUBDIVISION_FVAR_LINEAR_CORNERS_PLUS2
Definition scene/mesh.h:133
@ SUBDIVISION_FVAR_LINEAR_CORNERS_ONLY
Definition scene/mesh.h:131
@ SUBDIVISION_FVAR_LINEAR_ALL
Definition scene/mesh.h:135
@ SUBDIVISION_FVAR_LINEAR_BOUNDARIES
Definition scene/mesh.h:134
@ SUBDIVISION_FVAR_LINEAR_CORNERS_PLUS1
Definition scene/mesh.h:132
void add_vertex_crease(const int v, const float weight)
SubdFace get_subd_face(const size_t index) const
void reserve_mesh(const int numverts, const int numtris)
bool need_tesselation()
SubdivisionType
Definition scene/mesh.h:117
@ SUBDIVISION_NONE
Definition scene/mesh.h:118
@ SUBDIVISION_LINEAR
Definition scene/mesh.h:119
@ SUBDIVISION_CATMULL_CLARK
Definition scene/mesh.h:120
void add_subd_face(const int *corners, const int num_corners, const int shader_, bool smooth_)
size_t num_triangles() const
Definition scene/mesh.h:77
friend class BVHBuild
Definition scene/mesh.h:187
void clear_non_sockets()
void resize_subd_faces(const int numfaces, const int numcorners)
void pack_normals(packed_float3 *vnormal)
void add_vertex(const float3 P)
void get_uv_tiles(ustring map, unordered_set< int > &tiles) override
void resize_mesh(const int numverts, const int numtris)
void update_generated(Scene *scene)
Triangle get_triangle(const size_t i) const
Definition scene/mesh.h:71
void pack_shaders(Scene *scene, uint *shader)
PrimitiveType primitive_type() const override
void reserve_subd_faces(const int numfaces, const int numcorners)
SubdEdgeCrease get_subd_crease(const size_t i) const
Definition scene/mesh.h:106
void add_edge_crease(const int v0, const int v1, const float weight)
void update_tangents(Scene *scene, bool undisplaced)
friend class DiagSplit
Definition scene/mesh.h:189
void apply_transform(const Transform &tfm, const bool apply_to_motion) override
SubdivisionBoundaryInterpolation
Definition scene/mesh.h:123
@ SUBDIVISION_BOUNDARY_EDGE_ONLY
Definition scene/mesh.h:125
@ SUBDIVISION_BOUNDARY_EDGE_AND_CORNER
Definition scene/mesh.h:126
@ SUBDIVISION_BOUNDARY_NONE
Definition scene/mesh.h:124
i
Definition text_draw.cc:230
bool override
Definition wm_files.cc:1192