Blender  V3.3
scene/mesh.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #ifndef __MESH_H__
5 #define __MESH_H__
6 
7 #include "graph/node.h"
8 
9 #include "bvh/params.h"
10 #include "scene/attribute.h"
11 #include "scene/geometry.h"
12 #include "scene/shader.h"
13 
14 #include "util/array.h"
15 #include "util/boundbox.h"
16 #include "util/list.h"
17 #include "util/map.h"
18 #include "util/param.h"
19 #include "util/set.h"
20 #include "util/types.h"
21 #include "util/vector.h"
22 
24 
25 class Attribute;
26 class BVH;
27 class Device;
28 class DeviceScene;
29 class Mesh;
30 class Progress;
31 class RenderStats;
32 class Scene;
33 class SceneParams;
34 class AttributeRequest;
35 struct SubdParams;
36 class DiagSplit;
37 struct PackedPatchTable;
38 
39 /* Mesh */
40 
41 class Mesh : public Geometry {
42  protected:
43  Mesh(const NodeType *node_type_, Type geom_type_);
44 
45  public:
47 
48  /* Mesh Triangle */
49  struct Triangle {
50  int v[3];
51 
52  void bounds_grow(const float3 *verts, BoundBox &bounds) const;
53 
54  void motion_verts(const float3 *verts,
55  const float3 *vert_steps,
56  size_t num_verts,
57  size_t num_steps,
58  float time,
59  float3 r_verts[3]) const;
60 
61  void verts_for_step(const float3 *verts,
62  const float3 *vert_steps,
63  size_t num_verts,
64  size_t num_steps,
65  size_t step,
66  float3 r_verts[3]) const;
67 
68  float3 compute_normal(const float3 *verts) const;
69 
70  bool valid(const float3 *verts) const;
71  };
72 
73  Triangle get_triangle(size_t i) const
74  {
75  Triangle tri = {{triangles[i * 3 + 0], triangles[i * 3 + 1], triangles[i * 3 + 2]}};
76  return tri;
77  }
78 
79  size_t num_triangles() const
80  {
81  return triangles.size() / 3;
82  }
83 
84  /* Mesh SubdFace */
85  struct SubdFace {
88  int shader;
89  bool smooth;
91 
92  bool is_quad()
93  {
94  return num_corners == 4;
95  }
96  float3 normal(const Mesh *mesh) const;
97  int num_ptex_faces() const
98  {
99  return num_corners == 4 ? 1 : num_corners;
100  }
101  };
102 
103  struct SubdEdgeCrease {
104  int v[2];
105  float crease;
106  };
107 
109  {
110  SubdEdgeCrease s;
111  s.v[0] = subd_creases_edge[i * 2];
112  s.v[1] = subd_creases_edge[i * 2 + 1];
113  s.crease = subd_creases_weight[i];
114  return s;
115  }
116 
117  bool need_tesselation();
118 
123  };
124 
125  NODE_SOCKET_API(SubdivisionType, subdivision_type)
126 
127  /* Mesh Data */
132 
133  /* used for storing patch info for subd triangles, only allocated if there are patches */
134  NODE_SOCKET_API_ARRAY(array<int>, triangle_patch) /* must be < 0 for non subd triangles */
135  NODE_SOCKET_API_ARRAY(array<float2>, vert_patch_uv)
136 
137  /* SubdFaces */
138  NODE_SOCKET_API_ARRAY(array<int>, subd_start_corner)
139  NODE_SOCKET_API_ARRAY(array<int>, subd_num_corners)
140  NODE_SOCKET_API_ARRAY(array<int>, subd_shader)
141  NODE_SOCKET_API_ARRAY(array<bool>, subd_smooth)
142  NODE_SOCKET_API_ARRAY(array<int>, subd_ptex_offset)
143 
144  NODE_SOCKET_API_ARRAY(array<int>, subd_face_corners)
145  NODE_SOCKET_API(int, num_ngons)
146 
147  NODE_SOCKET_API_ARRAY(array<int>, subd_creases_edge)
148  NODE_SOCKET_API_ARRAY(array<float>, subd_creases_weight)
149 
150  NODE_SOCKET_API_ARRAY(array<int>, subd_vert_creases)
151  NODE_SOCKET_API_ARRAY(array<float>, subd_vert_creases_weight)
152 
153  /* Subdivisions parameters */
154  NODE_SOCKET_API(float, subd_dicing_rate)
155  NODE_SOCKET_API(int, subd_max_level)
156  NODE_SOCKET_API(Transform, subd_objecttoworld)
157 
158  AttributeSet subd_attributes;
159 
160  private:
161  PackedPatchTable *patch_table;
162  /* BVH */
163  size_t vert_offset;
164 
165  size_t patch_offset;
166  size_t patch_table_offset;
167  size_t face_offset;
168  size_t corner_offset;
169 
170  size_t num_subd_verts;
171  size_t num_subd_faces;
172 
173  unordered_map<int, int> vert_to_stitching_key_map; /* real vert index -> stitching index */
174  unordered_multimap<int, int>
175  vert_stitching_map; /* stitching index -> multiple real vert indices */
176 
177  friend class BVH2;
178  friend class BVHBuild;
179  friend class BVHSpatialSplit;
180  friend class DiagSplit;
181  friend class EdgeDice;
182  friend class GeometryManager;
183  friend class ObjectManager;
184 
185  SubdParams *subd_params = nullptr;
186 
187  public:
188  /* Functions */
189  Mesh();
190  ~Mesh();
191 
192  void resize_mesh(int numverts, int numfaces);
193  void reserve_mesh(int numverts, int numfaces);
194  void resize_subd_faces(int numfaces, int num_ngons, int numcorners);
195  void reserve_subd_faces(int numfaces, int num_ngons, int numcorners);
196  void reserve_subd_creases(size_t num_creases);
197  void clear_non_sockets();
198  void clear(bool preserve_shaders = false) override;
199  void add_vertex(float3 P);
200  void add_vertex_slow(float3 P);
201  void add_triangle(int v0, int v1, int v2, int shader, bool smooth);
202  void add_subd_face(const int *corners, int num_corners, int shader_, bool smooth_);
203  void add_edge_crease(int v0, int v1, float weight);
204  void add_vertex_crease(int v, float weight);
205 
206  void copy_center_to_motion_step(const int motion_step);
207 
208  void compute_bounds() override;
209  void apply_transform(const Transform &tfm, const bool apply_to_motion) override;
210  void add_face_normals();
211  void add_vertex_normals();
212  void add_undisplaced();
213 
214  void get_uv_tiles(ustring map, unordered_set<int> &tiles) override;
215 
216  void pack_shaders(Scene *scene, uint *shader);
218  void pack_verts(packed_float3 *tri_verts,
219  uint4 *tri_vindex,
220  uint *tri_patch,
221  float2 *tri_patch_uv);
222  void pack_patches(uint *patch_data);
223 
225 
226  void tessellate(DiagSplit *split);
227 
228  SubdFace get_subd_face(size_t index) const;
229 
231 
232  size_t get_num_subd_faces() const
233  {
234  return num_subd_faces;
235  }
236 
237  void set_num_subd_faces(size_t num_subd_faces_)
238  {
239  num_subd_faces = num_subd_faces_;
240  }
241 
243  {
244  return num_subd_verts;
245  }
246 
247  protected:
248  void clear(bool preserve_shaders, bool preserve_voxel_data);
249 };
250 
252 
253 #endif /* __MESH_H__ */
unsigned int uint
Definition: BLI_sys_types.h:67
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
Definition: bvh2.h:33
Definition: build.h:34
Definition: bvh/bvh.h:63
Definition: dice.h:49
BoundBox bounds
size_t index
int motion_step(float time) const
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
double time
Scene scene
static float verts[][3]
#define NODE_SOCKET_API(type_, name)
Definition: graph/node.h:54
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
PrimitiveType
Definition: kernel/types.h:549
static float P(float k)
Definition: math_interp.c:25
static void vnormal(PROCESS *process, const float point[3], float r_no[3])
void split(const std::string &s, const char delim, std::vector< std::string > &tokens)
Definition: abc_util.cc:92
SocketIndexByIdentifierMap * map
#define NODE_DECLARE
Definition: node_type.h:135
smooth(Type::FLOAT, "mask_weight")
int num_ptex_faces() const
Definition: scene/mesh.h:97
bool is_quad()
Definition: scene/mesh.h:92
float3 normal(const Mesh *mesh) const
Definition: scene/mesh.cpp:102
bool valid(const float3 *verts) const
Definition: scene/mesh.cpp:95
void motion_verts(const float3 *verts, const float3 *vert_steps, size_t num_verts, size_t num_steps, float time, float3 r_verts[3]) const
Definition: scene/mesh.cpp:34
void verts_for_step(const float3 *verts, const float3 *vert_steps, size_t num_verts, size_t num_steps, size_t step, float3 r_verts[3]) const
Definition: scene/mesh.cpp:56
void bounds_grow(const float3 *verts, BoundBox &bounds) const
Definition: scene/mesh.cpp:27
float3 compute_normal(const float3 *verts) const
Definition: scene/mesh.cpp:82
void tessellate(DiagSplit *split)
SubdParams * get_subd_params()
Definition: scene/mesh.cpp:152
void reserve_subd_faces(int numfaces, int num_ngons, int numcorners)
Definition: scene/mesh.cpp:250
void pack_verts(packed_float3 *tri_verts, uint4 *tri_vindex, uint *tri_patch, float2 *tri_patch_uv)
Definition: scene/mesh.cpp:737
NODE_SOCKET_API_ARRAY(array< int >, triangle_patch) AttributeSet subd_attributes
size_t get_num_subd_faces() const
Definition: scene/mesh.h:232
void add_edge_crease(int v0, int v1, float weight)
Definition: scene/mesh.cpp:401
void reserve_subd_creases(size_t num_creases)
Definition: scene/mesh.cpp:264
void add_undisplaced()
Definition: scene/mesh.cpp:657
void compute_bounds() override
Definition: scene/mesh.cpp:459
void add_vertex_normals()
Definition: scene/mesh.cpp:566
Triangle get_triangle(size_t i) const
Definition: scene/mesh.h:73
void copy_center_to_motion_step(const int motion_step)
Definition: scene/mesh.cpp:421
void clear(bool preserve_shaders=false) override
Definition: scene/mesh.cpp:315
void resize_subd_faces(int numfaces, int num_ngons, int numcorners)
Definition: scene/mesh.cpp:236
void pack_patches(uint *patch_data)
Definition: scene/mesh.cpp:767
void reserve_mesh(int numverts, int numfaces)
Definition: scene/mesh.cpp:220
void add_vertex_slow(float3 P)
Definition: scene/mesh.cpp:331
bool need_tesselation()
Definition: scene/mesh.cpp:169
SubdivisionType
Definition: scene/mesh.h:119
@ SUBDIVISION_NONE
Definition: scene/mesh.h:120
@ SUBDIVISION_LINEAR
Definition: scene/mesh.h:121
@ SUBDIVISION_CATMULL_CLARK
Definition: scene/mesh.h:122
size_t num_triangles() const
Definition: scene/mesh.h:79
void clear_non_sockets()
Definition: scene/mesh.cpp:270
void set_num_subd_faces(size_t num_subd_faces_)
Definition: scene/mesh.h:237
void pack_normals(packed_float3 *vnormal)
Definition: scene/mesh.cpp:713
void add_vertex(float3 P)
Definition: scene/mesh.cpp:320
SubdEdgeCrease get_subd_crease(size_t i) const
Definition: scene/mesh.h:108
void get_uv_tiles(ustring map, unordered_set< int > &tiles) override
Definition: scene/mesh.cpp:438
void add_vertex_crease(int v, float weight)
Definition: scene/mesh.cpp:412
void add_triangle(int v0, int v1, int v2, int shader, bool smooth)
Definition: scene/mesh.cpp:342
SubdFace get_subd_face(size_t index) const
Definition: scene/mesh.cpp:390
void pack_shaders(Scene *scene, uint *shader)
Definition: scene/mesh.cpp:686
PrimitiveType primitive_type() const override
Definition: scene/mesh.cpp:813
void resize_mesh(int numverts, int numfaces)
Definition: scene/mesh.cpp:205
void add_subd_face(const int *corners, int num_corners, int shader_, bool smooth_)
Definition: scene/mesh.cpp:360
void add_face_normals()
Definition: scene/mesh.cpp:536
void apply_transform(const Transform &tfm, const bool apply_to_motion) override
Definition: scene/mesh.cpp:502
size_t get_num_subd_verts()
Definition: scene/mesh.h:242
bool override
Definition: wm_files.c:1022