sculpt-dev: remove optimization flags
This commit is contained in:
parent
a391a01509
commit
9fc73526a0
|
@ -4265,7 +4265,7 @@ void CustomData_bmesh_free_block_data_exclude_by_type(CustomData *data,
|
|||
}
|
||||
|
||||
#ifndef USE_BMESH_PAGE_CUSTOMDATA
|
||||
ATTR_NO_OPT static void CustomData_bmesh_set_default_n(CustomData *data, void **block, const int n)
|
||||
static void CustomData_bmesh_set_default_n(CustomData *data, void **block, const int n)
|
||||
{
|
||||
if (ELEM(data->layers[n].type, CD_TOOLFLAGS, CD_MESH_ID)) {
|
||||
/* do not do toolflags or mesh ids */
|
||||
|
@ -4414,11 +4414,11 @@ void CustomData_bmesh_swap_data(CustomData *source,
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void CustomData_bmesh_copy_data_exclude_by_type(const CustomData *source,
|
||||
CustomData *dest,
|
||||
void *src_block,
|
||||
void **dest_block,
|
||||
const eCustomDataMask mask_exclude)
|
||||
void CustomData_bmesh_copy_data_exclude_by_type(const CustomData *source,
|
||||
CustomData *dest,
|
||||
void *src_block,
|
||||
void **dest_block,
|
||||
const eCustomDataMask mask_exclude)
|
||||
{
|
||||
/* Note that having a version of this function without a 'mask_exclude'
|
||||
* would cause too much duplicate code, so add a check instead. */
|
||||
|
@ -4819,11 +4819,11 @@ void CustomData_bmesh_interp(CustomData *data,
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void CustomData_to_bmesh_block(const CustomData *source,
|
||||
CustomData *dest,
|
||||
int src_index,
|
||||
void **dest_block,
|
||||
bool use_default_init)
|
||||
void CustomData_to_bmesh_block(const CustomData *source,
|
||||
CustomData *dest,
|
||||
int src_index,
|
||||
void **dest_block,
|
||||
bool use_default_init)
|
||||
{
|
||||
if (*dest_block == nullptr) {
|
||||
CustomData_bmesh_alloc_block(dest, dest_block);
|
||||
|
|
|
@ -1393,7 +1393,7 @@ bool check_face_is_tri(PBVH *pbvh, BMFace *f)
|
|||
return false;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
|
||||
bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root)
|
||||
{
|
||||
#if !(DYNTOPO_DISABLE_FLAG & DYNTOPO_DISABLE_FIN_REMOVAL)
|
||||
bm_logstack_push();
|
||||
|
@ -3163,12 +3163,12 @@ static const int splitmap[43][16] = {
|
|||
{6, -1, 3, -1, 5, -1, 1}, // 42 0 1 0 1 0 1
|
||||
};
|
||||
|
||||
ATTR_NO_OPT static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
|
||||
PBVH *pbvh,
|
||||
BMesh *bm,
|
||||
BMEdge **edges1,
|
||||
int totedge,
|
||||
bool ignore_isolated_edges)
|
||||
static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
|
||||
PBVH *pbvh,
|
||||
BMesh *bm,
|
||||
BMEdge **edges1,
|
||||
int totedge,
|
||||
bool ignore_isolated_edges)
|
||||
{
|
||||
bm_logstack_push();
|
||||
bm_log_message(" == split edges == ");
|
||||
|
|
|
@ -138,7 +138,7 @@ inline bool bm_edge_collapse_is_degenerate_topology(BMEdge *e_first)
|
|||
/* Faces *outside* the ring region are tagged with facetag, used to detect
|
||||
* border edges.
|
||||
*/
|
||||
ATTR_NO_OPT static void vert_ring_do_tag(BMVert *v, int tag, int facetag, int depth)
|
||||
static void vert_ring_do_tag(BMVert *v, int tag, int facetag, int depth)
|
||||
{
|
||||
|
||||
BMEdge *e = v->e;
|
||||
|
@ -178,7 +178,7 @@ ATTR_NO_OPT static void vert_ring_do_tag(BMVert *v, int tag, int facetag, int de
|
|||
} while ((e = BM_DISK_EDGE_NEXT(e, v)) != v->e);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void vert_ring_untag_inner_faces(BMVert *v, int tag, int facetag, int depth)
|
||||
static void vert_ring_untag_inner_faces(BMVert *v, int tag, int facetag, int depth)
|
||||
{
|
||||
if (!v->e) {
|
||||
return;
|
||||
|
@ -205,12 +205,12 @@ ATTR_NO_OPT static void vert_ring_untag_inner_faces(BMVert *v, int tag, int face
|
|||
} while ((e = BM_DISK_EDGE_NEXT(e, v)) != v->e);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void vert_ring_do_apply(BMVert *v,
|
||||
std::function<void(BMElem *elem, void *userdata)> callback,
|
||||
void *userdata,
|
||||
int tag,
|
||||
int facetag,
|
||||
int depth)
|
||||
void vert_ring_do_apply(BMVert *v,
|
||||
std::function<void(BMElem *elem, void *userdata)> callback,
|
||||
void *userdata,
|
||||
int tag,
|
||||
int facetag,
|
||||
int depth)
|
||||
{
|
||||
BMEdge *e = v->e;
|
||||
|
||||
|
@ -265,7 +265,7 @@ ATTR_NO_OPT void vert_ring_do_apply(BMVert *v,
|
|||
const int COLLAPSE_TAG = BM_ELEM_INTERNAL_TAG;
|
||||
const int COLLAPSE_FACE_TAG = BM_ELEM_TAG_ALT;
|
||||
|
||||
ATTR_NO_OPT static void collapse_ring_callback_pre(BMElem *elem, void *userdata)
|
||||
static void collapse_ring_callback_pre(BMElem *elem, void *userdata)
|
||||
{
|
||||
TraceData *data = static_cast<TraceData *>(userdata);
|
||||
|
||||
|
@ -296,7 +296,7 @@ ATTR_NO_OPT static void collapse_ring_callback_pre(BMElem *elem, void *userdata)
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void check_new_elem_id(BMElem *elem, TraceData *data)
|
||||
static void check_new_elem_id(BMElem *elem, TraceData *data)
|
||||
{
|
||||
int id = BM_ELEM_CD_GET_INT(elem, data->pbvh->bm_idmap->cd_id_off[elem->head.htype]);
|
||||
if (id >= 0) {
|
||||
|
@ -319,7 +319,7 @@ ATTR_NO_OPT static void check_new_elem_id(BMElem *elem, TraceData *data)
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void collapse_ring_callback_post(BMElem *elem, void *userdata)
|
||||
static void collapse_ring_callback_post(BMElem *elem, void *userdata)
|
||||
{
|
||||
TraceData *data = static_cast<TraceData *>(userdata);
|
||||
|
||||
|
@ -370,13 +370,13 @@ static void edge_ring_do_old(BMEdge *e,
|
|||
vert_ring_do_apply(e->v2, callback, userdata, tag, facetag, depth);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void vert_ring_do(BMVert *v,
|
||||
BMVert *v_extra,
|
||||
void (*callback)(BMElem *elem, void *userdata),
|
||||
void *userdata,
|
||||
int tag,
|
||||
int facetag,
|
||||
int depth)
|
||||
static void vert_ring_do(BMVert *v,
|
||||
BMVert *v_extra,
|
||||
void (*callback)(BMElem *elem, void *userdata),
|
||||
void *userdata,
|
||||
int tag,
|
||||
int facetag,
|
||||
int depth)
|
||||
{
|
||||
blender::Set<BMFace *, 128> faces;
|
||||
|
||||
|
@ -466,7 +466,7 @@ ATTR_NO_OPT static void vert_ring_do(BMVert *v,
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT bool pbvh_bmesh_collapse_edge_uvs(
|
||||
bool pbvh_bmesh_collapse_edge_uvs(
|
||||
PBVH *pbvh, BMEdge *e, BMVert *v_conn, BMVert *v_del, EdgeQueueContext *eq_ctx)
|
||||
{
|
||||
bm_logstack_push();
|
||||
|
@ -626,13 +626,13 @@ ATTR_NO_OPT bool pbvh_bmesh_collapse_edge_uvs(
|
|||
* This function is rather complicated. It has to
|
||||
* snap UVs, log geometry and free ids.
|
||||
*/
|
||||
ATTR_NO_OPT BMVert *pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
||||
BMEdge *e,
|
||||
BMVert *v1,
|
||||
BMVert *v2,
|
||||
GHash *deleted_verts,
|
||||
BLI_Buffer *deleted_faces,
|
||||
EdgeQueueContext *eq_ctx)
|
||||
BMVert *pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
||||
BMEdge *e,
|
||||
BMVert *v1,
|
||||
BMVert *v2,
|
||||
GHash *deleted_verts,
|
||||
BLI_Buffer *deleted_faces,
|
||||
EdgeQueueContext *eq_ctx)
|
||||
{
|
||||
bm_logstack_push();
|
||||
|
||||
|
|
|
@ -237,13 +237,13 @@ bool destroy_nonmanifold_fins(PBVH *pbvh, BMEdge *e_root);
|
|||
bool check_face_is_tri(PBVH *pbvh, BMFace *f);
|
||||
bool check_vert_fan_are_tris(PBVH *pbvh, BMVert *v);
|
||||
|
||||
ATTR_NO_OPT BMVert *pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
||||
BMEdge *e,
|
||||
BMVert *v1,
|
||||
BMVert *v2,
|
||||
struct GHash *deleted_verts,
|
||||
struct BLI_Buffer *deleted_faces,
|
||||
struct EdgeQueueContext *eq_ctx);
|
||||
BMVert *pbvh_bmesh_collapse_edge(PBVH *pbvh,
|
||||
BMEdge *e,
|
||||
BMVert *v1,
|
||||
BMVert *v2,
|
||||
struct GHash *deleted_verts,
|
||||
struct BLI_Buffer *deleted_faces,
|
||||
struct EdgeQueueContext *eq_ctx);
|
||||
|
||||
extern "C" void bm_log_message(const char *fmt, ...);
|
||||
void pbvh_bmesh_vert_remove(PBVH *pbvh, BMVert *v);
|
||||
|
|
|
@ -1400,7 +1400,7 @@ bool paint_calculate_rake_rotation(UnifiedPaintSettings *ups,
|
|||
return ok;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static bool sculpt_boundary_flags_ensure(Object *ob, PBVH *pbvh, int totvert)
|
||||
static bool sculpt_boundary_flags_ensure(Object *ob, PBVH *pbvh, int totvert)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
bool ret = false;
|
||||
|
@ -1472,7 +1472,7 @@ void BKE_sculptsession_free_vwpaint_data(SculptSession *ss)
|
|||
/**
|
||||
* Write out the sculpt dynamic-topology #BMesh to the #Mesh.
|
||||
*/
|
||||
ATTR_NO_OPT static void sculptsession_bm_to_me_update_data_only(Object *ob, bool reorder)
|
||||
static void sculptsession_bm_to_me_update_data_only(Object *ob, bool reorder)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
|
@ -3288,14 +3288,14 @@ static int sculpt_attr_elem_count_get(Object *ob, eAttrDomain domain)
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static bool sculpt_attribute_create(SculptSession *ss,
|
||||
Object *ob,
|
||||
eAttrDomain domain,
|
||||
eCustomDataType proptype,
|
||||
const char *name,
|
||||
SculptAttribute *out,
|
||||
const SculptAttributeParams *params,
|
||||
PBVHType pbvhtype)
|
||||
static bool sculpt_attribute_create(SculptSession *ss,
|
||||
Object *ob,
|
||||
eAttrDomain domain,
|
||||
eCustomDataType proptype,
|
||||
const char *name,
|
||||
SculptAttribute *out,
|
||||
const SculptAttributeParams *params,
|
||||
PBVHType pbvhtype)
|
||||
{
|
||||
Mesh *me = BKE_object_get_original_mesh(ob);
|
||||
|
||||
|
@ -3426,7 +3426,7 @@ ATTR_NO_OPT static bool sculpt_attribute_create(SculptSession *ss,
|
|||
return true;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static bool sculpt_attr_update(Object *ob, SculptAttribute *attr)
|
||||
static bool sculpt_attr_update(Object *ob, SculptAttribute *attr)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
int elem_num = sculpt_attr_elem_count_get(ob, attr->domain);
|
||||
|
@ -3581,12 +3581,12 @@ SculptAttribute *BKE_sculpt_attribute_get(struct Object *ob,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static SculptAttribute *sculpt_attribute_ensure_ex(Object *ob,
|
||||
eAttrDomain domain,
|
||||
eCustomDataType proptype,
|
||||
const char *name,
|
||||
const SculptAttributeParams *params,
|
||||
PBVHType pbvhtype)
|
||||
static SculptAttribute *sculpt_attribute_ensure_ex(Object *ob,
|
||||
eAttrDomain domain,
|
||||
eCustomDataType proptype,
|
||||
const char *name,
|
||||
const SculptAttributeParams *params,
|
||||
PBVHType pbvhtype)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
SculptAttribute *attr = BKE_sculpt_attribute_get(ob, domain, proptype, name);
|
||||
|
|
|
@ -1851,7 +1851,7 @@ void BKE_pbvh_set_flat_vcol_shading(PBVH *pbvh, bool value)
|
|||
pbvh->flat_vcol_shading = value;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void pbvh_free_draw_buffers(PBVH *UNUSED(pbvh), PBVHNode *node)
|
||||
void pbvh_free_draw_buffers(PBVH *UNUSED(pbvh), PBVHNode *node)
|
||||
{
|
||||
if (node->draw_batches) {
|
||||
DRW_pbvh_node_free(node->draw_batches);
|
||||
|
@ -4374,7 +4374,7 @@ void BKE_pbvh_update_all_tri_areas(PBVH *pbvh)
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void BKE_pbvh_check_tri_areas(PBVH *pbvh, PBVHNode *node)
|
||||
void BKE_pbvh_check_tri_areas(PBVH *pbvh, PBVHNode *node)
|
||||
{
|
||||
if (!(node->flag & PBVH_UpdateTriAreas)) {
|
||||
return;
|
||||
|
@ -4568,10 +4568,7 @@ void BKE_pbvh_set_vemap(PBVH *pbvh, MeshElemMap *vemap)
|
|||
pbvh->vemap = vemap;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void BKE_pbvh_get_vert_face_areas(PBVH *pbvh,
|
||||
PBVHVertRef vertex,
|
||||
float *r_areas,
|
||||
int valence)
|
||||
void BKE_pbvh_get_vert_face_areas(PBVH *pbvh, PBVHVertRef vertex, float *r_areas, int valence)
|
||||
{
|
||||
const int cur_i = pbvh->face_area_i;
|
||||
|
||||
|
|
|
@ -3629,7 +3629,7 @@ static void pbvh_bmesh_balance_tree(PBVH *pbvh)
|
|||
MEM_SAFE_FREE(depthmap);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void pbvh_bmesh_join_nodes(PBVH *bvh)
|
||||
static void pbvh_bmesh_join_nodes(PBVH *bvh)
|
||||
{
|
||||
if (bvh->totnode < 2) {
|
||||
return;
|
||||
|
|
|
@ -188,7 +188,7 @@ BLI_INLINE SmallHashEntry *smallhash_lookup(SmallHash *sh, const uintptr_t key)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT BLI_INLINE SmallHashEntry *smallhash_lookup_first_free(SmallHash *sh, const uintptr_t key)
|
||||
BLI_INLINE SmallHashEntry *smallhash_lookup_first_free(SmallHash *sh, const uintptr_t key)
|
||||
{
|
||||
check_stack_move(sh);
|
||||
|
||||
|
|
|
@ -30,8 +30,8 @@
|
|||
#include "BKE_mesh.h"
|
||||
|
||||
#include "bmesh.h"
|
||||
#include "intern/bmesh_private.h"
|
||||
#include "bmesh_log_intern.h"
|
||||
#include "intern/bmesh_private.h"
|
||||
#include "range_tree.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
@ -2094,7 +2094,7 @@ static char *obj_append_line(const char *line, char *str, char *fixed, int *size
|
|||
return str;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static char *bm_save_local_obj_text(
|
||||
static char *bm_save_local_obj_text(
|
||||
BMesh *bm, int depth, char buf[LOCAL_OBJ_SIZE], const char *fmt, ...)
|
||||
{
|
||||
va_list vl;
|
||||
|
@ -2442,7 +2442,7 @@ char *_last_local_obj = NULL;
|
|||
# define JVKE_CHECK_ELEMENT(elem)
|
||||
#endif
|
||||
|
||||
ATTR_NO_OPT static bool cleanup_vert(BMesh *bm, BMVert *v, const BMTracer *tracer)
|
||||
static bool cleanup_vert(BMesh *bm, BMVert *v, const BMTracer *tracer)
|
||||
{
|
||||
BMEdge *e = v->e;
|
||||
|
||||
|
@ -2506,7 +2506,7 @@ ATTR_NO_OPT static bool cleanup_vert(BMesh *bm, BMVert *v, const BMTracer *trace
|
|||
return true;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void bmesh_kernel_check_val3_vert(BMesh *bm, BMEdge *e, const BMTracer *tracer)
|
||||
static void bmesh_kernel_check_val3_vert(BMesh *bm, BMEdge *e, const BMTracer *tracer)
|
||||
{
|
||||
if (!e->l) {
|
||||
return;
|
||||
|
@ -2544,12 +2544,12 @@ ATTR_NO_OPT static void bmesh_kernel_check_val3_vert(BMesh *bm, BMEdge *e, const
|
|||
bm_logstack_pop();
|
||||
}
|
||||
|
||||
ATTR_NO_OPT BMVert *bmesh_kernel_join_vert_kill_edge(BMesh *bm,
|
||||
BMEdge *e,
|
||||
BMVert *v_kill,
|
||||
const bool do_del,
|
||||
const bool combine_flags,
|
||||
const BMTracer *tracer)
|
||||
BMVert *bmesh_kernel_join_vert_kill_edge(BMesh *bm,
|
||||
BMEdge *e,
|
||||
BMVert *v_kill,
|
||||
const bool do_del,
|
||||
const bool combine_flags,
|
||||
const BMTracer *tracer)
|
||||
{
|
||||
BMVert *v_conn = BM_edge_other_vert(e, v_kill);
|
||||
|
||||
|
@ -2586,7 +2586,7 @@ ATTR_NO_OPT BMVert *bmesh_kernel_join_vert_kill_edge(BMesh *bm,
|
|||
JVKE_CHECK_ELEMENT(v_conn);
|
||||
JVKE_CHECK_ELEMENT(v_del);
|
||||
|
||||
#define _OTHER_TRACES // paranoia (and likely duplicate) calls to tracer callbacks
|
||||
#define _OTHER_TRACES // paranoia (and likely duplicate) calls to tracer callbacks
|
||||
|
||||
/* first clear tags */
|
||||
for (int i = 0; i < 2; i++) {
|
||||
|
@ -2823,7 +2823,7 @@ ATTR_NO_OPT BMVert *bmesh_kernel_join_vert_kill_edge(BMesh *bm,
|
|||
} while (lnext && (l = lnext) != f->l_first);
|
||||
|
||||
if (f->len <= 2) {
|
||||
#if 0 //def _OTHER_TRACES
|
||||
#if 0 // def _OTHER_TRACES
|
||||
if (tracer) {
|
||||
tracer->on_face_kill(bm, f, tracer->userdata);
|
||||
}
|
||||
|
@ -3330,7 +3330,7 @@ bool BM_vert_splice_check_double(BMVert *v_a, BMVert *v_b)
|
|||
return is_double;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT bool BM_vert_splice(BMesh *bm, BMVert *v_dst, BMVert *v_src)
|
||||
bool BM_vert_splice(BMesh *bm, BMVert *v_dst, BMVert *v_src)
|
||||
{
|
||||
BMEdge *e;
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ using namespace blender;
|
|||
#define FREELIST_HASHMAP_THRESHOLD_HIGH 1024
|
||||
#define FREELIST_HASHMAP_THRESHOLD_LOW 700
|
||||
|
||||
ATTR_NO_OPT BMIdMap *BM_idmap_new(BMesh *bm, int elem_mask)
|
||||
BMIdMap *BM_idmap_new(BMesh *bm, int elem_mask)
|
||||
{
|
||||
BMIdMap *idmap = MEM_new<BMIdMap>("BMIdMap");
|
||||
|
||||
|
@ -37,7 +37,7 @@ ATTR_NO_OPT BMIdMap *BM_idmap_new(BMesh *bm, int elem_mask)
|
|||
return idmap;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void idmap_grow_map(BMIdMap *idmap, int newid)
|
||||
static void idmap_grow_map(BMIdMap *idmap, int newid)
|
||||
{
|
||||
if (idmap->map_size > newid) {
|
||||
return;
|
||||
|
@ -56,7 +56,7 @@ ATTR_NO_OPT static void idmap_grow_map(BMIdMap *idmap, int newid)
|
|||
idmap->map_size = newsize;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void BM_idmap_check_ids(BMIdMap *idmap)
|
||||
void BM_idmap_check_ids(BMIdMap *idmap)
|
||||
{
|
||||
BMIter iter;
|
||||
BMVert *v;
|
||||
|
@ -158,7 +158,7 @@ ATTR_NO_OPT void BM_idmap_check_ids(BMIdMap *idmap)
|
|||
idmap->maxid = max_id;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void BM_idmap_check_attributes(BMIdMap *idmap)
|
||||
void BM_idmap_check_attributes(BMIdMap *idmap)
|
||||
{
|
||||
auto check_attr = [&](int type) {
|
||||
if (!(idmap->flag & type)) {
|
||||
|
@ -215,22 +215,22 @@ ATTR_NO_OPT void BM_idmap_check_attributes(BMIdMap *idmap)
|
|||
check_attr(BM_FACE);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void BM_idmap_destroy(BMIdMap *idmap)
|
||||
void BM_idmap_destroy(BMIdMap *idmap)
|
||||
{
|
||||
MEM_SAFE_FREE(idmap->map);
|
||||
MEM_delete<BMIdMap>(idmap);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void check_idx_map(BMIdMap *idmap)
|
||||
static void check_idx_map(BMIdMap *idmap)
|
||||
{
|
||||
if (idmap->free_idx_map && idmap->freelist.size() < FREELIST_HASHMAP_THRESHOLD_LOW) {
|
||||
//printf("%s: Deleting free_idx_map\n", __func__);
|
||||
// printf("%s: Deleting free_idx_map\n", __func__);
|
||||
|
||||
MEM_delete<BMIdMap::FreeIdxMap>(idmap->free_idx_map);
|
||||
idmap->free_idx_map = nullptr;
|
||||
}
|
||||
else if (!idmap->free_idx_map && idmap->freelist.size() < FREELIST_HASHMAP_THRESHOLD_HIGH) {
|
||||
//printf("%s: Adding free_idx_map\n", __func__);
|
||||
// printf("%s: Adding free_idx_map\n", __func__);
|
||||
|
||||
idmap->free_idx_map = MEM_new<BMIdMap::FreeIdxMap>("BMIdMap::FreeIdxMap");
|
||||
|
||||
|
@ -240,13 +240,14 @@ ATTR_NO_OPT static void check_idx_map(BMIdMap *idmap)
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT int BM_idmap_alloc(BMIdMap *idmap, BMElem *elem)
|
||||
int BM_idmap_alloc(BMIdMap *idmap, BMElem *elem)
|
||||
{
|
||||
int id = -1;
|
||||
#ifdef USE_NEW_IDMAP
|
||||
|
||||
while (idmap->freelist.size()) {
|
||||
id = idmap->freelist.pop_last();
|
||||
|
||||
|
||||
if (id == -1) {
|
||||
continue;
|
||||
}
|
||||
|
@ -266,12 +267,13 @@ ATTR_NO_OPT int BM_idmap_alloc(BMIdMap *idmap, BMElem *elem)
|
|||
idmap->map[id] = elem;
|
||||
|
||||
BM_ELEM_CD_SET_INT(elem, idmap->cd_id_off[elem->head.htype], id);
|
||||
|
||||
#endif
|
||||
return id;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void BM_idmap_assign(BMIdMap *idmap, BMElem *elem, int id)
|
||||
void BM_idmap_assign(BMIdMap *idmap, BMElem *elem, int id)
|
||||
{
|
||||
#ifdef USE_NEW_IDMAP
|
||||
/* Remove id from freelist. */
|
||||
if (idmap->free_idx_map) {
|
||||
const int *val;
|
||||
|
@ -295,10 +297,12 @@ ATTR_NO_OPT void BM_idmap_assign(BMIdMap *idmap, BMElem *elem, int id)
|
|||
idmap->map[id] = elem;
|
||||
|
||||
check_idx_map(idmap);
|
||||
#endif
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void BM_idmap_release(BMIdMap *idmap, BMElem *elem, bool clear_id)
|
||||
void BM_idmap_release(BMIdMap *idmap, BMElem *elem, bool clear_id)
|
||||
{
|
||||
#ifdef USE_NEW_IDMAP
|
||||
int id = BM_ELEM_CD_GET_INT(elem, idmap->cd_id_off[(int)elem->head.htype]);
|
||||
|
||||
if (id == -1) {
|
||||
|
@ -323,6 +327,7 @@ ATTR_NO_OPT void BM_idmap_release(BMIdMap *idmap, BMElem *elem, bool clear_id)
|
|||
if (clear_id) {
|
||||
BM_ELEM_CD_SET_INT(elem, idmap->cd_id_off[elem->head.htype], -1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int BM_idmap_check_assign(BMIdMap *idmap, BMElem *elem)
|
||||
|
|
|
@ -644,19 +644,19 @@ static bool log_ghash_ensure_p(BMLog *log, GHash *gh, void *key, void ***val)
|
|||
}
|
||||
|
||||
#ifdef USE_NEW_IDMAP
|
||||
ATTR_NO_OPT static void bm_log_set_id_raw(BMLog *log, BMElem *elem, int id)
|
||||
static void bm_log_set_id_raw(BMLog *log, BMElem *elem, int id)
|
||||
{
|
||||
BM_ELEM_CD_SET_INT(elem, log->idmap->cd_id_off[elem->head.htype], id);
|
||||
}
|
||||
|
||||
/* Get the vertex's unique ID from the log */
|
||||
ATTR_NO_OPT static uint bm_log_vert_id_get(BMLog *log, BMVert *v)
|
||||
static uint bm_log_vert_id_get(BMLog *log, BMVert *v)
|
||||
{
|
||||
return BM_idmap_get_id(log->idmap, (BMElem *)v);
|
||||
}
|
||||
|
||||
/*Get a vertex from its unique ID */
|
||||
ATTR_NO_OPT static BMElem *bm_log_elem_from_id(BMLog *log, uint id)
|
||||
static BMElem *bm_log_elem_from_id(BMLog *log, uint id)
|
||||
{
|
||||
|
||||
if (log->idmap->map && id >= ((unsigned int)log->idmap->map_size)) {
|
||||
|
@ -667,7 +667,7 @@ ATTR_NO_OPT static BMElem *bm_log_elem_from_id(BMLog *log, uint id)
|
|||
}
|
||||
|
||||
/* Get a vertex from its unique ID */
|
||||
ATTR_NO_OPT static BMVert *bm_log_vert_from_id(BMLog *log, uint id)
|
||||
static BMVert *bm_log_vert_from_id(BMLog *log, uint id)
|
||||
{
|
||||
return (BMVert *)bm_log_elem_from_id(log, id);
|
||||
}
|
||||
|
@ -678,7 +678,7 @@ BMVert *BM_log_id_vert_get(BMLog *log, uint id)
|
|||
}
|
||||
|
||||
/* Get the edges's unique ID from the log */
|
||||
ATTR_NO_OPT static uint bm_log_edge_id_get(BMLog *log, BMEdge *e)
|
||||
static uint bm_log_edge_id_get(BMLog *log, BMEdge *e)
|
||||
{
|
||||
return BM_idmap_get_id(log->idmap, (BMElem *)e);
|
||||
}
|
||||
|
@ -695,24 +695,24 @@ static BMEdge *bm_log_edge_from_id(BMLog *log, uint id)
|
|||
}
|
||||
|
||||
/* Get the face's unique ID from the log */
|
||||
ATTR_NO_OPT static uint bm_log_face_id_get(BMLog *log, BMFace *f)
|
||||
static uint bm_log_face_id_get(BMLog *log, BMFace *f)
|
||||
{
|
||||
return BM_idmap_get_id(log->idmap, (BMElem *)f);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static uint bm_log_elem_id_get(BMLog *log, BMElem *elem)
|
||||
static uint bm_log_elem_id_get(BMLog *log, BMElem *elem)
|
||||
{
|
||||
return BM_idmap_get_id(log->idmap, elem);
|
||||
}
|
||||
|
||||
/* Get a face from its unique ID */
|
||||
ATTR_NO_OPT static BMFace *bm_log_face_from_id(BMLog *log, uint id)
|
||||
static BMFace *bm_log_face_from_id(BMLog *log, uint id)
|
||||
{
|
||||
return (BMFace *)bm_log_elem_from_id(log, id);
|
||||
}
|
||||
|
||||
#else
|
||||
ATTR_NO_OPT static void bm_log_set_id_raw(BMLog *log, BMElem *elem, int id)
|
||||
static void bm_log_set_id_raw(BMLog *log, BMElem *elem, int id)
|
||||
{
|
||||
BM_ELEM_CD_SET_INT(elem, log->bm->idmap.cd_id_off[elem->head.htype], id);
|
||||
}
|
||||
|
@ -1456,7 +1456,7 @@ static void bm_log_edges_restore(
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void bm_log_faces_restore(
|
||||
static void bm_log_faces_restore(
|
||||
BMesh *bm, BMLog *log, GHash *faces, BMLogEntry *entry, BMLogCallbacks *callbacks)
|
||||
{
|
||||
GHashIterator gh_iter;
|
||||
|
@ -4022,7 +4022,7 @@ static bool check_log_elem(BMesh *bm, BMLog *newlog, int id, int type, bool expe
|
|||
return true;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static bool bm_check_ghash_set(
|
||||
static bool bm_check_ghash_set(
|
||||
GHash *ghashes[4], BMesh *bm, BMLog *newlog, BMLogEntry *entry, bool shouldExist)
|
||||
{
|
||||
bool ok = true;
|
||||
|
@ -4062,7 +4062,7 @@ ATTR_NO_OPT static bool bm_check_ghash_set(
|
|||
return ok;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static bool bm_log_validate_intern(
|
||||
static bool bm_log_validate_intern(
|
||||
BMesh *bm, BMLog *newlog, BMLogEntry *srcEntry, bool is_applied, bool do_apply)
|
||||
{
|
||||
bool precopy = do_apply;
|
||||
|
|
|
@ -442,7 +442,7 @@ BMEdge *BM_vert_collapse_edge(BMesh *bm,
|
|||
/**
|
||||
* Collapse and edge into a single vertex.
|
||||
*/
|
||||
ATTR_NO_OPT BMVert *BM_edge_collapse(BMesh *bm,
|
||||
BMVert *BM_edge_collapse(BMesh *bm,
|
||||
BMEdge *e_kill,
|
||||
BMVert *v_kill,
|
||||
const bool do_del,
|
||||
|
|
|
@ -1441,10 +1441,10 @@ void DRW_shgroup_call_sculpt(DRWShadingGroup *shgroup,
|
|||
drw_sculpt_generate_calls(&scd);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups,
|
||||
GPUMaterial **gpumats,
|
||||
int num_shgroups,
|
||||
Object *ob)
|
||||
void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups,
|
||||
GPUMaterial **gpumats,
|
||||
int num_shgroups,
|
||||
Object *ob)
|
||||
{
|
||||
DRW_Attributes draw_attrs;
|
||||
DRW_MeshCDMask cd_needed;
|
||||
|
|
|
@ -230,7 +230,7 @@ struct PBVHBatches {
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT ~PBVHBatches()
|
||||
~PBVHBatches()
|
||||
{
|
||||
for (PBVHBatch &batch : batches.values()) {
|
||||
GPU_BATCH_DISCARD_SAFE(batch.tris);
|
||||
|
@ -760,7 +760,7 @@ struct PBVHBatches {
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void fill_vbo_bmesh(PBVHVbo &vbo, PBVH_GPU_Args *args)
|
||||
void fill_vbo_bmesh(PBVHVbo &vbo, PBVH_GPU_Args *args)
|
||||
{
|
||||
auto foreach_bmesh_normal = [&](std::function<void(BMLoop * l)> callback) {
|
||||
for (int i : IndexRange(args->tribuf->tottri)) {
|
||||
|
@ -1099,10 +1099,7 @@ struct PBVHBatches {
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void create_vbo(eAttrDomain domain,
|
||||
const uint32_t type,
|
||||
string name,
|
||||
PBVH_GPU_Args *args)
|
||||
void create_vbo(eAttrDomain domain, const uint32_t type, string name, PBVH_GPU_Args *args)
|
||||
{
|
||||
PBVHVbo vbo(domain, type, name);
|
||||
GPUVertFormat format;
|
||||
|
|
|
@ -284,9 +284,9 @@ static int new_fset_apply_curve(SculptSession *ss,
|
|||
return new_fset;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
||||
const int n,
|
||||
const TaskParallelTLS *__restrict tls)
|
||||
void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
||||
const int n,
|
||||
const TaskParallelTLS *__restrict tls)
|
||||
{
|
||||
SculptFaceSetDrawData *data = (SculptFaceSetDrawData *)userdata;
|
||||
SculptSession *ss = data->ob->sculpt;
|
||||
|
@ -307,7 +307,7 @@ ATTR_NO_OPT void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
|||
|
||||
const int thread_id = BLI_task_parallel_thread_id(tls);
|
||||
|
||||
float (*vert_positions)[3] = SCULPT_mesh_deformed_positions_get(ss);
|
||||
float(*vert_positions)[3] = SCULPT_mesh_deformed_positions_get(ss);
|
||||
const float test_limit = 0.05f;
|
||||
int cd_mask = -1;
|
||||
|
||||
|
@ -315,8 +315,6 @@ ATTR_NO_OPT void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
|||
cd_mask = CustomData_get_offset(&ss->bm->vdata, CD_PAINT_MASK);
|
||||
}
|
||||
|
||||
SCULPT_undo_push_node(data->ob, data->nodes[n], SCULPT_UNDO_FACE_SETS);
|
||||
|
||||
/*check if we need to sample the current face set*/
|
||||
|
||||
bool set_active_faceset = ss->cache->automasking &&
|
||||
|
@ -646,10 +644,7 @@ static void do_relax_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
|||
BKE_pbvh_vertex_iter_end;
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void SCULPT_do_draw_face_sets_brush(Sculpt *sd,
|
||||
Object *ob,
|
||||
PBVHNode **nodes,
|
||||
int totnode)
|
||||
void SCULPT_do_draw_face_sets_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
Brush *brush = ss->cache->brush ? ss->cache->brush : BKE_paint_brush(&sd->paint);
|
||||
|
@ -698,7 +693,7 @@ ATTR_NO_OPT void SCULPT_do_draw_face_sets_brush(Sculpt *sd,
|
|||
|
||||
// ctrl-click is single threaded since the tasks will set the initial face set
|
||||
TaskParallelSettings settings;
|
||||
BKE_pbvh_parallel_range_settings(&settings, threaded, totnode);
|
||||
BKE_pbvh_parallel_range_settings(&settings, threaded && false /* XXX */, totnode);
|
||||
if (ss->cache->alt_smooth) {
|
||||
SCULPT_boundary_info_ensure(ob);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
|
@ -968,52 +963,64 @@ typedef bool (*face_sets_flood_fill_test)(
|
|||
BMesh *bm, BMFace *from_f, BMEdge *from_e, BMFace *to_f, const float threshold);
|
||||
|
||||
static bool sculpt_face_sets_init_loose_parts_test(BMesh * /*bm*/,
|
||||
BMFace */*from_f*/,
|
||||
BMEdge */*from_e*/,
|
||||
BMFace */*UNUSED(to_f)*/,
|
||||
BMFace * /*from_f*/,
|
||||
BMEdge * /*from_e*/,
|
||||
BMFace * /*UNUSED(to_f)*/,
|
||||
const float /*UNUSED(threshold)*/)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool sculpt_face_sets_init_normals_test(
|
||||
BMesh */*bm*/, BMFace *from_f, BMEdge */*UNUSED(from_e)*/, BMFace *to_f, const float threshold)
|
||||
static bool sculpt_face_sets_init_normals_test(BMesh * /*bm*/,
|
||||
BMFace *from_f,
|
||||
BMEdge * /*UNUSED(from_e)*/,
|
||||
BMFace *to_f,
|
||||
const float threshold)
|
||||
{
|
||||
return fabsf(dot_v3v3(from_f->no, to_f->no)) > threshold;
|
||||
}
|
||||
|
||||
static bool sculpt_face_sets_init_uv_seams_test(BMesh */*UNUSED(bm)*/,
|
||||
BMFace */*UNUSED(from_f)*/,
|
||||
static bool sculpt_face_sets_init_uv_seams_test(BMesh * /*UNUSED(bm)*/,
|
||||
BMFace * /*UNUSED(from_f)*/,
|
||||
BMEdge *from_e,
|
||||
BMFace */*UNUSED(to_f)*/,
|
||||
BMFace * /*UNUSED(to_f)*/,
|
||||
const float /*UNUSED(threshold)*/)
|
||||
{
|
||||
return !BM_elem_flag_test(from_e, BM_ELEM_SEAM);
|
||||
}
|
||||
|
||||
static bool sculpt_face_sets_init_crease_test(
|
||||
BMesh *bm, BMFace */*UNUSED(from_f)*/, BMEdge *from_e, BMFace */*UNUSED(to_f)*/, const float threshold)
|
||||
static bool sculpt_face_sets_init_crease_test(BMesh *bm,
|
||||
BMFace * /*UNUSED(from_f)*/,
|
||||
BMEdge *from_e,
|
||||
BMFace * /*UNUSED(to_f)*/,
|
||||
const float threshold)
|
||||
{
|
||||
return BM_elem_float_data_get(&bm->edata, from_e, CD_CREASE) < threshold;
|
||||
}
|
||||
|
||||
static bool sculpt_face_sets_init_bevel_weight_test(
|
||||
BMesh *bm, BMFace */*UNUSED(from_f)*/, BMEdge *from_e, BMFace */*UNUSED(to_f)*/, const float threshold)
|
||||
static bool sculpt_face_sets_init_bevel_weight_test(BMesh *bm,
|
||||
BMFace * /*UNUSED(from_f)*/,
|
||||
BMEdge *from_e,
|
||||
BMFace * /*UNUSED(to_f)*/,
|
||||
const float threshold)
|
||||
{
|
||||
return BM_elem_float_data_get(&bm->edata, from_e, CD_BWEIGHT) < threshold;
|
||||
}
|
||||
|
||||
static bool sculpt_face_sets_init_sharp_edges_test(BMesh */*UNUSED(bm)*/,
|
||||
BMFace */*UNUSED(from_f)*/,
|
||||
static bool sculpt_face_sets_init_sharp_edges_test(BMesh * /*UNUSED(bm)*/,
|
||||
BMFace * /*UNUSED(from_f)*/,
|
||||
BMEdge *from_e,
|
||||
BMFace */*UNUSED(to_f)*/,
|
||||
BMFace * /*UNUSED(to_f)*/,
|
||||
const float /*UNUSED(threshold)*/)
|
||||
{
|
||||
return BM_elem_flag_test(from_e, BM_ELEM_SMOOTH);
|
||||
}
|
||||
|
||||
static bool sculpt_face_sets_init_face_set_boundary_test(
|
||||
BMesh *bm, BMFace *from_f, BMEdge */*UNUSED(from_e)*/, BMFace *to_f, const float /*UNUSED(threshold)*/)
|
||||
static bool sculpt_face_sets_init_face_set_boundary_test(BMesh *bm,
|
||||
BMFace *from_f,
|
||||
BMEdge * /*UNUSED(from_e)*/,
|
||||
BMFace *to_f,
|
||||
const float /*UNUSED(threshold)*/)
|
||||
{
|
||||
const int cd_face_sets_offset = CustomData_get_offset_named(
|
||||
&bm->pdata, CD_PROP_INT32, ".sculpt_face_sets");
|
||||
|
@ -1303,7 +1310,7 @@ static EnumPropertyItem prop_sculpt_face_sets_change_visibility_types[] = {
|
|||
{0, nullptr, 0, nullptr, nullptr},
|
||||
};
|
||||
|
||||
ATTR_NO_OPT void SCULPT_face_sets_visibility_all_set(SculptSession *ss, bool state)
|
||||
void SCULPT_face_sets_visibility_all_set(SculptSession *ss, bool state)
|
||||
{
|
||||
for (int i = 0; i < ss->totfaces; i++) {
|
||||
PBVHFaceRef face = BKE_pbvh_index_to_face(ss->pbvh, i);
|
||||
|
@ -1965,8 +1972,9 @@ static void sculpt_face_set_edit_fair_face_set(Object *ob,
|
|||
BKE_bmesh_prefair_and_fair_verts(ss->bm, fair_vertices, (eMeshFairingDepth)fair_order);
|
||||
}
|
||||
else {
|
||||
float (*vert_positions)[3] = SCULPT_mesh_deformed_positions_get(ss);
|
||||
BKE_mesh_prefair_and_fair_verts(mesh, vert_positions, fair_vertices, (eMeshFairingDepth)fair_order);
|
||||
float(*vert_positions)[3] = SCULPT_mesh_deformed_positions_get(ss);
|
||||
BKE_mesh_prefair_and_fair_verts(
|
||||
mesh, vert_positions, fair_vertices, (eMeshFairingDepth)fair_order);
|
||||
|
||||
MEM_freeN(fair_vertices);
|
||||
}
|
||||
|
@ -2852,7 +2860,7 @@ static int sculpt_face_set_edit_modal(bContext *C, wmOperator *op, const wmEvent
|
|||
}
|
||||
|
||||
if (!ss->bm) {
|
||||
float (*vert_positions)[3] = SCULPT_mesh_deformed_positions_get(ss);
|
||||
float(*vert_positions)[3] = SCULPT_mesh_deformed_positions_get(ss);
|
||||
for (int i = 0; i < fsecd->totvert; i++) {
|
||||
int idx = fsecd->verts[i];
|
||||
|
||||
|
|
|
@ -364,10 +364,10 @@ MINLINE float safe_shell_angle_to_dist(const float angle)
|
|||
return (UNLIKELY(angle < 1.e-8f)) ? 1.0f : fabsf(1.0f / th);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT static void SCULPT_neighbor_coords_average_interior_boundary(SculptSession *ss,
|
||||
float result[3],
|
||||
PBVHVertRef vertex,
|
||||
SculptSmoothArgs *args)
|
||||
static void SCULPT_neighbor_coords_average_interior_boundary(SculptSession *ss,
|
||||
float result[3],
|
||||
PBVHVertRef vertex,
|
||||
SculptSmoothArgs *args)
|
||||
{
|
||||
float avg[3] = {0.0f, 0.0f, 0.0f};
|
||||
|
||||
|
@ -709,10 +709,10 @@ ATTR_NO_OPT static void SCULPT_neighbor_coords_average_interior_boundary(SculptS
|
|||
PBVH_CHECK_NAN(co);
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void SCULPT_neighbor_coords_average_interior(SculptSession *ss,
|
||||
float result[3],
|
||||
PBVHVertRef vertex,
|
||||
SculptSmoothArgs *args)
|
||||
void SCULPT_neighbor_coords_average_interior(SculptSession *ss,
|
||||
float result[3],
|
||||
PBVHVertRef vertex,
|
||||
SculptSmoothArgs *args)
|
||||
{
|
||||
if (args->bound_smooth > 0.0f && args->bound_scl) {
|
||||
SCULPT_neighbor_coords_average_interior_boundary(ss, result, vertex, args);
|
||||
|
@ -1991,14 +1991,14 @@ void SCULPT_bound_smooth_ensure(SculptSession *ss, Object *ob)
|
|||
}
|
||||
}
|
||||
|
||||
ATTR_NO_OPT void SCULPT_smooth(Sculpt *sd,
|
||||
Object *ob,
|
||||
PBVHNode **nodes,
|
||||
const int totnode,
|
||||
float bstrength,
|
||||
const bool smooth_mask,
|
||||
float projection,
|
||||
bool do_origco)
|
||||
void SCULPT_smooth(Sculpt *sd,
|
||||
Object *ob,
|
||||
PBVHNode **nodes,
|
||||
const int totnode,
|
||||
float bstrength,
|
||||
const bool smooth_mask,
|
||||
float projection,
|
||||
bool do_origco)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
Brush *brush = ss->cache && ss->cache->brush ? ss->cache->brush : BKE_paint_brush(&sd->paint);
|
||||
|
|
Loading…
Reference in New Issue