2012-02-28 18:28:30 +00:00
|
|
|
/*
|
|
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*
|
|
|
|
|
* Contributor(s): Geoffrey Bantle, Levi Schooley.
|
|
|
|
|
*
|
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef __BMESH_MESH_H__
|
|
|
|
|
#define __BMESH_MESH_H__
|
|
|
|
|
|
|
|
|
|
/** \file blender/bmesh/intern/bmesh_mesh.h
|
|
|
|
|
* \ingroup bmesh
|
|
|
|
|
*/
|
|
|
|
|
|
2012-03-01 20:09:17 +00:00
|
|
|
struct BMAllocTemplate;
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
struct MLoopNorSpaceArray;
|
2012-03-01 20:09:17 +00:00
|
|
|
|
2012-11-18 12:14:22 +00:00
|
|
|
void BM_mesh_elem_toolflags_ensure(BMesh *bm);
|
2012-11-19 23:52:24 +00:00
|
|
|
void BM_mesh_elem_toolflags_clear(BMesh *bm);
|
2012-12-03 05:38:28 +00:00
|
|
|
BMesh *BM_mesh_create(const struct BMAllocTemplate *allocsize);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
|
|
|
|
void BM_mesh_free(BMesh *bm);
|
|
|
|
|
void BM_mesh_data_free(BMesh *bm);
|
|
|
|
|
void BM_mesh_clear(BMesh *bm);
|
|
|
|
|
|
2013-04-24 12:07:13 +00:00
|
|
|
void BM_mesh_normals_update(BMesh *bm);
|
2014-02-12 20:48:09 +01:00
|
|
|
void BM_verts_calc_normal_vcos(BMesh *bm, const float (*fnos)[3], const float (*vcos)[3], float (*vnos)[3]);
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
void BM_loops_calc_normal_vcos(
|
|
|
|
|
BMesh *bm, const float (*vcos)[3], const float (*vnos)[3], const float (*pnos)[3],
|
|
|
|
|
const bool use_split_normals, const float split_angle, float (*r_lnos)[3],
|
|
|
|
|
struct MLoopNorSpaceArray *r_lnors_spacearr, short (*clnors_data)[2], const int cd_loop_clnors_offset);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2013-04-14 06:22:34 +00:00
|
|
|
void bmesh_edit_begin(BMesh *bm, const BMOpTypeFlag type_flag);
|
|
|
|
|
void bmesh_edit_end(BMesh *bm, const BMOpTypeFlag type_flag);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
|
|
|
|
void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag);
|
2015-04-25 20:15:20 +10:00
|
|
|
void BM_mesh_elem_index_validate(
|
|
|
|
|
BMesh *bm, const char *location, const char *func,
|
|
|
|
|
const char *msg_a, const char *msg_b);
|
2012-04-23 01:19:50 +00:00
|
|
|
|
2013-10-28 02:05:33 +00:00
|
|
|
#ifndef NDEBUG
|
2014-08-22 16:16:19 +10:00
|
|
|
bool BM_mesh_elem_table_check(BMesh *bm);
|
2013-10-28 02:05:33 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype);
|
|
|
|
|
void BM_mesh_elem_table_init(BMesh *bm, const char htype);
|
|
|
|
|
void BM_mesh_elem_table_free(BMesh *bm, const char htype);
|
|
|
|
|
|
|
|
|
|
BMVert *BM_vert_at_index(BMesh *bm, const int index);
|
|
|
|
|
BMEdge *BM_edge_at_index(BMesh *bm, const int index);
|
|
|
|
|
BMFace *BM_face_at_index(BMesh *bm, const int index);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2013-10-27 10:01:35 +00:00
|
|
|
BMVert *BM_vert_at_index_find(BMesh *bm, const int index);
|
|
|
|
|
BMEdge *BM_edge_at_index_find(BMesh *bm, const int index);
|
|
|
|
|
BMFace *BM_face_at_index_find(BMesh *bm, const int index);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2015-04-21 01:33:09 +10:00
|
|
|
BMVert *BM_vert_at_index_find_or_table(BMesh *bm, const int index);
|
|
|
|
|
BMEdge *BM_edge_at_index_find_or_table(BMesh *bm, const int index);
|
|
|
|
|
BMFace *BM_face_at_index_find_or_table(BMesh *bm, const int index);
|
|
|
|
|
|
2013-10-28 02:05:33 +00:00
|
|
|
// XXX
|
|
|
|
|
|
|
|
|
|
int BM_mesh_elem_count(BMesh *bm, const char htype);
|
|
|
|
|
|
2014-08-07 11:50:53 +10:00
|
|
|
void BM_mesh_remap(
|
|
|
|
|
BMesh *bm,
|
|
|
|
|
const unsigned int *vert_idx,
|
|
|
|
|
const unsigned int *edge_idx,
|
|
|
|
|
const unsigned int *face_idx);
|
2013-10-28 02:05:33 +00:00
|
|
|
|
2012-03-01 20:09:17 +00:00
|
|
|
typedef struct BMAllocTemplate {
|
|
|
|
|
int totvert, totedge, totloop, totface;
|
|
|
|
|
} BMAllocTemplate;
|
|
|
|
|
|
2012-12-03 05:38:28 +00:00
|
|
|
extern const BMAllocTemplate bm_mesh_allocsize_default;
|
|
|
|
|
extern const BMAllocTemplate bm_mesh_chunksize_default;
|
2012-03-01 20:09:17 +00:00
|
|
|
|
2013-09-24 03:31:00 +00:00
|
|
|
#define BMALLOC_TEMPLATE_FROM_BM(bm) { (CHECK_TYPE_INLINE(bm, BMesh *), \
|
|
|
|
|
(bm)->totvert), (bm)->totedge, (bm)->totloop, (bm)->totface}
|
|
|
|
|
#define BMALLOC_TEMPLATE_FROM_ME(me) { (CHECK_TYPE_INLINE(me, Mesh *), \
|
|
|
|
|
(me)->totvert), (me)->totedge, (me)->totloop, (me)->totpoly}
|
|
|
|
|
#define BMALLOC_TEMPLATE_FROM_DM(dm) { (CHECK_TYPE_INLINE(dm, DerivedMesh *), \
|
|
|
|
|
(dm)->getNumVerts(dm)), (dm)->getNumEdges(dm), (dm)->getNumLoops(dm), (dm)->getNumPolys(dm)}
|
|
|
|
|
|
2012-11-18 12:14:22 +00:00
|
|
|
enum {
|
|
|
|
|
BM_MESH_CREATE_USE_TOOLFLAGS = (1 << 0)
|
|
|
|
|
};
|
|
|
|
|
|
2012-02-28 18:28:30 +00:00
|
|
|
#endif /* __BMESH_MESH_H__ */
|