Mesh: Replace auto smooth with node group #108014
|
@ -461,7 +461,7 @@ bool BMO_op_initf(BMesh *bm, BMOperator *op, int flag, const char *fmt, ...);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A `va_list` version, used to implement the above two functions,
|
* A `va_list` version, used to implement the above two functions,
|
||||||
* plus #EDBM_op_callf in editmesh_utils.c.
|
* plus #EDBM_op_callf in editmesh_utils.cc.
|
||||||
*/
|
*/
|
||||||
bool BMO_op_vinitf(BMesh *bm, BMOperator *op, int flag, const char *fmt, va_list vlist);
|
bool BMO_op_vinitf(BMesh *bm, BMOperator *op, int flag, const char *fmt, va_list vlist);
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include "COM_KuwaharaClassicOperation.h"
|
#include "COM_KuwaharaClassicOperation.h"
|
||||||
|
|
||||||
|
#include "BLI_math_vector_types.hh"
|
||||||
#include "IMB_colormanagement.h"
|
#include "IMB_colormanagement.h"
|
||||||
|
|
||||||
namespace blender::compositor {
|
namespace blender::compositor {
|
||||||
|
@ -32,9 +33,106 @@ void KuwaharaClassicOperation::execute_pixel_sampled(float output[4],
|
||||||
float y,
|
float y,
|
||||||
PixelSampler sampler)
|
PixelSampler sampler)
|
||||||
{
|
{
|
||||||
for (int ch = 0; ch < 3; ch++) {
|
Vector<float3> mean(4, float3(0.0f));
|
||||||
|
float sum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||||
|
float var[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||||
|
int cnt[4] = {0, 0, 0, 0};
|
||||||
|
|
||||||
|
/* Split surroundings of pixel into 4 overlapping regions. */
|
||||||
|
for (int dy = -kernel_size_; dy <= kernel_size_; dy++) {
|
||||||
|
for (int dx = -kernel_size_; dx <= kernel_size_; dx++) {
|
||||||
|
|
||||||
|
int xx = x + dx;
|
||||||
|
int yy = y + dy;
|
||||||
|
if (xx >= 0 && yy >= 0 && xx < this->get_width() && yy < this->get_height()) {
|
||||||
|
|
||||||
|
float4 color;
|
||||||
|
image_reader_->read_sampled(color, xx, yy, sampler);
|
||||||
|
const float3 v = color.xyz();
|
||||||
|
|
||||||
|
const float lum = IMB_colormanagement_get_luminance(color);
|
||||||
|
|
||||||
|
if (dx <= 0 && dy <= 0) {
|
||||||
|
mean[0] += v;
|
||||||
|
sum[0] += lum;
|
||||||
|
var[0] += lum * lum;
|
||||||
|
cnt[0]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dx >= 0 && dy <= 0) {
|
||||||
|
mean[1] += v;
|
||||||
|
sum[1] += lum;
|
||||||
|
var[1] += lum * lum;
|
||||||
|
cnt[1]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dx <= 0 && dy >= 0) {
|
||||||
|
mean[2] += v;
|
||||||
|
sum[2] += lum;
|
||||||
|
var[2] += lum * lum;
|
||||||
|
cnt[2]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dx >= 0 && dy >= 0) {
|
||||||
|
mean[3] += v;
|
||||||
|
sum[3] += lum;
|
||||||
|
var[3] += lum * lum;
|
||||||
|
cnt[3]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute region variances. */
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
mean[i] = cnt[i] != 0 ? mean[i] / cnt[i] : float3{0.0f, 0.0f, 0.0f};
|
||||||
|
sum[i] = cnt[i] != 0 ? sum[i] / cnt[i] : 0.0f;
|
||||||
|
var[i] = cnt[i] != 0 ? var[i] / cnt[i] : 0.0f;
|
||||||
|
const float temp = sum[i] * sum[i];
|
||||||
|
var[i] = var[i] > temp ? sqrt(var[i] - temp) : 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Choose the region with lowest variance. */
|
||||||
|
float min_var = FLT_MAX;
|
||||||
|
int min_index = 0;
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
if (var[i] < min_var) {
|
||||||
|
min_var = var[i];
|
||||||
|
min_index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output[0] = mean[min_index].x;
|
||||||
|
output[1] = mean[min_index].y;
|
||||||
|
output[2] = mean[min_index].z;
|
||||||
|
|
||||||
|
/* No changes for alpha channel. */
|
||||||
|
float tmp[4];
|
||||||
|
image_reader_->read_sampled(tmp, x, y, sampler);
|
||||||
|
output[3] = tmp[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
void KuwaharaClassicOperation::set_kernel_size(int kernel_size)
|
||||||
|
{
|
||||||
|
kernel_size_ = kernel_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int KuwaharaClassicOperation::get_kernel_size()
|
||||||
|
{
|
||||||
|
return kernel_size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KuwaharaClassicOperation::update_memory_buffer_partial(MemoryBuffer *output,
|
||||||
|
const rcti &area,
|
||||||
|
Span<MemoryBuffer *> inputs)
|
||||||
|
{
|
||||||
|
MemoryBuffer *image = inputs[0];
|
||||||
|
|
||||||
|
for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
|
||||||
|
const int x = it.x;
|
||||||
|
const int y = it.y;
|
||||||
|
|
||||||
|
Vector<float3> mean(4, float3(0.0f));
|
||||||
float sum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
float sum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||||
float mean[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
|
||||||
float var[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
float var[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||||
int cnt[4] = {0, 0, 0, 0};
|
int cnt[4] = {0, 0, 0, 0};
|
||||||
|
|
||||||
|
@ -44,10 +142,12 @@ void KuwaharaClassicOperation::execute_pixel_sampled(float output[4],
|
||||||
|
|
||||||
int xx = x + dx;
|
int xx = x + dx;
|
||||||
int yy = y + dy;
|
int yy = y + dy;
|
||||||
if (xx >= 0 && yy >= 0 && xx < this->get_width() && yy < this->get_height()) {
|
if (xx >= 0 && yy >= 0 && xx < image->get_width() && yy < image->get_height()) {
|
||||||
float color[4];
|
|
||||||
image_reader_->read_sampled(color, xx, yy, sampler);
|
float4 color;
|
||||||
const float v = color[ch];
|
image->read_elem(xx, yy, &color.x);
|
||||||
|
const float3 v = color.xyz();
|
||||||
|
|
||||||
const float lum = IMB_colormanagement_get_luminance(color);
|
const float lum = IMB_colormanagement_get_luminance(color);
|
||||||
|
|
||||||
if (dx <= 0 && dy <= 0) {
|
if (dx <= 0 && dy <= 0) {
|
||||||
|
@ -83,7 +183,7 @@ void KuwaharaClassicOperation::execute_pixel_sampled(float output[4],
|
||||||
|
|
||||||
/* Compute region variances. */
|
/* Compute region variances. */
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
mean[i] = cnt[i] != 0 ? mean[i] / cnt[i] : 0.0f;
|
mean[i] = cnt[i] != 0 ? mean[i] / cnt[i] : float3{0.0f, 0.0f, 0.0f};
|
||||||
sum[i] = cnt[i] != 0 ? sum[i] / cnt[i] : 0.0f;
|
sum[i] = cnt[i] != 0 ? sum[i] / cnt[i] : 0.0f;
|
||||||
var[i] = cnt[i] != 0 ? var[i] / cnt[i] : 0.0f;
|
var[i] = cnt[i] != 0 ? var[i] / cnt[i] : 0.0f;
|
||||||
const float temp = sum[i] * sum[i];
|
const float temp = sum[i] * sum[i];
|
||||||
|
@ -99,105 +199,12 @@ void KuwaharaClassicOperation::execute_pixel_sampled(float output[4],
|
||||||
min_index = i;
|
min_index = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
output[ch] = mean[min_index];
|
it.out[0] = mean[min_index].x;
|
||||||
}
|
it.out[1] = mean[min_index].y;
|
||||||
|
it.out[2] = mean[min_index].z;
|
||||||
|
|
||||||
/* No changes for alpha channel. */
|
/* No changes for alpha channel. */
|
||||||
float tmp[4];
|
|
||||||
image_reader_->read_sampled(tmp, x, y, sampler);
|
|
||||||
output[3] = tmp[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
void KuwaharaClassicOperation::set_kernel_size(int kernel_size)
|
|
||||||
{
|
|
||||||
kernel_size_ = kernel_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int KuwaharaClassicOperation::get_kernel_size()
|
|
||||||
{
|
|
||||||
return kernel_size_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void KuwaharaClassicOperation::update_memory_buffer_partial(MemoryBuffer *output,
|
|
||||||
const rcti &area,
|
|
||||||
Span<MemoryBuffer *> inputs)
|
|
||||||
{
|
|
||||||
MemoryBuffer *image = inputs[0];
|
|
||||||
|
|
||||||
for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
|
|
||||||
const int x = it.x;
|
|
||||||
const int y = it.y;
|
|
||||||
it.out[3] = image->get_value(x, y, 3);
|
it.out[3] = image->get_value(x, y, 3);
|
||||||
|
|
||||||
for (int ch = 0; ch < 3; ch++) {
|
|
||||||
float sum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
|
||||||
float mean[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
|
||||||
float var[4] = {0.0f, 0.0f, 0.0f, 0.0f};
|
|
||||||
int cnt[4] = {0, 0, 0, 0};
|
|
||||||
|
|
||||||
/* Split surroundings of pixel into 4 overlapping regions. */
|
|
||||||
for (int dy = -kernel_size_; dy <= kernel_size_; dy++) {
|
|
||||||
for (int dx = -kernel_size_; dx <= kernel_size_; dx++) {
|
|
||||||
|
|
||||||
int xx = x + dx;
|
|
||||||
int yy = y + dy;
|
|
||||||
if (xx >= 0 && yy >= 0 && xx < image->get_width() && yy < image->get_height()) {
|
|
||||||
const float v = image->get_value(xx, yy, ch);
|
|
||||||
float color[4];
|
|
||||||
image->read_elem(xx, yy, color);
|
|
||||||
const float lum = IMB_colormanagement_get_luminance(color);
|
|
||||||
|
|
||||||
if (dx <= 0 && dy <= 0) {
|
|
||||||
mean[0] += v;
|
|
||||||
sum[0] += lum;
|
|
||||||
var[0] += lum * lum;
|
|
||||||
cnt[0]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dx >= 0 && dy <= 0) {
|
|
||||||
mean[1] += v;
|
|
||||||
sum[1] += lum;
|
|
||||||
var[1] += lum * lum;
|
|
||||||
cnt[1]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dx <= 0 && dy >= 0) {
|
|
||||||
mean[2] += v;
|
|
||||||
sum[2] += lum;
|
|
||||||
var[2] += lum * lum;
|
|
||||||
cnt[2]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dx >= 0 && dy >= 0) {
|
|
||||||
mean[3] += v;
|
|
||||||
sum[3] += lum;
|
|
||||||
var[3] += lum * lum;
|
|
||||||
cnt[3]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compute region variances. */
|
|
||||||
for (int i = 0; i < 4; i++) {
|
|
||||||
mean[i] = cnt[i] != 0 ? mean[i] / cnt[i] : 0.0f;
|
|
||||||
sum[i] = cnt[i] != 0 ? sum[i] / cnt[i] : 0.0f;
|
|
||||||
var[i] = cnt[i] != 0 ? var[i] / cnt[i] : 0.0f;
|
|
||||||
const float temp = sum[i] * sum[i];
|
|
||||||
var[i] = var[i] > temp ? sqrt(var[i] - temp) : 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Choose the region with lowest variance. */
|
|
||||||
float min_var = FLT_MAX;
|
|
||||||
int min_index = 0;
|
|
||||||
for (int i = 0; i < 4; i++) {
|
|
||||||
if (var[i] < min_var) {
|
|
||||||
min_var = var[i];
|
|
||||||
min_index = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
output->get_value(x, y, ch) = mean[min_index];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ struct bDeformGroup;
|
||||||
struct wmKeyConfig;
|
struct wmKeyConfig;
|
||||||
struct wmOperator;
|
struct wmOperator;
|
||||||
|
|
||||||
/* editmesh_utils.c */
|
/* editmesh_utils.cc */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \param em: Edit-mesh used for generating mirror data.
|
* \param em: Edit-mesh used for generating mirror data.
|
||||||
|
|
|
@ -54,7 +54,7 @@ set(SRC
|
||||||
editmesh_select_similar.c
|
editmesh_select_similar.c
|
||||||
editmesh_tools.cc
|
editmesh_tools.cc
|
||||||
editmesh_undo.cc
|
editmesh_undo.cc
|
||||||
editmesh_utils.c
|
editmesh_utils.cc
|
||||||
mesh_data.cc
|
mesh_data.cc
|
||||||
mesh_mirror.cc
|
mesh_mirror.cc
|
||||||
mesh_ops.c
|
mesh_ops.c
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "DNA_meshdata_types.h"
|
#include "DNA_meshdata_types.h"
|
||||||
#include "DNA_object_types.h"
|
#include "DNA_object_types.h"
|
||||||
|
|
||||||
#include "BLI_alloca.h"
|
#include "BLI_array.hh"
|
||||||
#include "BLI_buffer.h"
|
#include "BLI_buffer.h"
|
||||||
#include "BLI_kdtree.h"
|
#include "BLI_kdtree.h"
|
||||||
#include "BLI_listbase.h"
|
#include "BLI_listbase.h"
|
||||||
|
@ -33,8 +33,6 @@
|
||||||
|
|
||||||
#include "DEG_depsgraph.h"
|
#include "DEG_depsgraph.h"
|
||||||
|
|
||||||
#include "BKE_object.h" /* XXX. only for EDBM_mesh_load(). */
|
|
||||||
|
|
||||||
#include "WM_api.h"
|
#include "WM_api.h"
|
||||||
#include "WM_types.h"
|
#include "WM_types.h"
|
||||||
|
|
||||||
|
@ -68,7 +66,7 @@ void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_loopt
|
||||||
BMesh *tmpbm = BM_mesh_copy(backup->bmcopy);
|
BMesh *tmpbm = BM_mesh_copy(backup->bmcopy);
|
||||||
*em->bm = *tmpbm;
|
*em->bm = *tmpbm;
|
||||||
MEM_freeN(tmpbm);
|
MEM_freeN(tmpbm);
|
||||||
tmpbm = NULL;
|
tmpbm = nullptr;
|
||||||
|
|
||||||
if (recalc_looptri) {
|
if (recalc_looptri) {
|
||||||
BKE_editmesh_looptri_calc(em);
|
BKE_editmesh_looptri_calc(em);
|
||||||
|
@ -80,7 +78,7 @@ void EDBM_redo_state_restore_and_free(BMBackup *backup, BMEditMesh *em, bool rec
|
||||||
BM_mesh_data_free(em->bm);
|
BM_mesh_data_free(em->bm);
|
||||||
*em->bm = *backup->bmcopy;
|
*em->bm = *backup->bmcopy;
|
||||||
MEM_freeN(backup->bmcopy);
|
MEM_freeN(backup->bmcopy);
|
||||||
backup->bmcopy = NULL;
|
backup->bmcopy = nullptr;
|
||||||
if (recalc_looptri) {
|
if (recalc_looptri) {
|
||||||
BKE_editmesh_looptri_calc(em);
|
BKE_editmesh_looptri_calc(em);
|
||||||
}
|
}
|
||||||
|
@ -123,13 +121,14 @@ bool EDBM_op_finish(BMEditMesh *em, BMOperator *bmop, wmOperator *op, const bool
|
||||||
const char *errmsg;
|
const char *errmsg;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
struct {
|
struct StatePrev {
|
||||||
int verts_len, edges_len, loops_len, faces_len;
|
int verts_len, edges_len, loops_len, faces_len;
|
||||||
} em_state_prev = {
|
};
|
||||||
.verts_len = em->bm->totvert,
|
StatePrev em_state_prev = {
|
||||||
.edges_len = em->bm->totedge,
|
em->bm->totvert,
|
||||||
.loops_len = em->bm->totloop,
|
em->bm->totedge,
|
||||||
.faces_len = em->bm->totface,
|
em->bm->totloop,
|
||||||
|
em->bm->totface,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -139,7 +138,7 @@ bool EDBM_op_finish(BMEditMesh *em, BMOperator *bmop, wmOperator *op, const bool
|
||||||
bool changed_was_set = false;
|
bool changed_was_set = false;
|
||||||
|
|
||||||
eBMOpErrorLevel level;
|
eBMOpErrorLevel level;
|
||||||
while (BMO_error_pop(em->bm, &errmsg, NULL, &level)) {
|
while (BMO_error_pop(em->bm, &errmsg, nullptr, &level)) {
|
||||||
eReportType type = RPT_INFO;
|
eReportType type = RPT_INFO;
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case BMO_ERROR_CANCEL: {
|
case BMO_ERROR_CANCEL: {
|
||||||
|
@ -252,7 +251,7 @@ bool EDBM_op_call_silentf(BMEditMesh *em, const char *fmt, ...)
|
||||||
BMO_op_exec(bm, &bmop);
|
BMO_op_exec(bm, &bmop);
|
||||||
|
|
||||||
va_end(list);
|
va_end(list);
|
||||||
return EDBM_op_finish(em, &bmop, NULL, false);
|
return EDBM_op_finish(em, &bmop, nullptr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
@ -265,13 +264,10 @@ bool EDBM_op_call_silentf(BMEditMesh *em, const char *fmt, ...)
|
||||||
|
|
||||||
void EDBM_mesh_make(Object *ob, const int select_mode, const bool add_key_index)
|
void EDBM_mesh_make(Object *ob, const int select_mode, const bool add_key_index)
|
||||||
{
|
{
|
||||||
Mesh *me = ob->data;
|
Mesh *me = static_cast<Mesh *>(ob->data);
|
||||||
BMesh *bm = BKE_mesh_to_bmesh(me,
|
BMeshCreateParams create_params{};
|
||||||
ob,
|
create_params.use_toolflags = true;
|
||||||
add_key_index,
|
BMesh *bm = BKE_mesh_to_bmesh(me, ob, add_key_index, &create_params);
|
||||||
&((struct BMeshCreateParams){
|
|
||||||
.use_toolflags = true,
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (me->edit_mesh) {
|
if (me->edit_mesh) {
|
||||||
/* this happens when switching shape keys */
|
/* this happens when switching shape keys */
|
||||||
|
@ -292,7 +288,7 @@ void EDBM_mesh_make(Object *ob, const int select_mode, const bool add_key_index)
|
||||||
|
|
||||||
void EDBM_mesh_load_ex(Main *bmain, Object *ob, bool free_data)
|
void EDBM_mesh_load_ex(Main *bmain, Object *ob, bool free_data)
|
||||||
{
|
{
|
||||||
Mesh *me = ob->data;
|
Mesh *me = static_cast<Mesh *>(ob->data);
|
||||||
BMesh *bm = me->edit_mesh->bm;
|
BMesh *bm = me->edit_mesh->bm;
|
||||||
|
|
||||||
/* Workaround for #42360, 'ob->shapenr' should be 1 in this case.
|
/* Workaround for #42360, 'ob->shapenr' should be 1 in this case.
|
||||||
|
@ -301,13 +297,10 @@ void EDBM_mesh_load_ex(Main *bmain, Object *ob, bool free_data)
|
||||||
bm->shapenr = 1;
|
bm->shapenr = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
BM_mesh_bm_to_me(bmain,
|
BMeshToMeshParams params{};
|
||||||
bm,
|
params.calc_object_remap = true;
|
||||||
me,
|
params.update_shapekey_indices = !free_data;
|
||||||
(&(struct BMeshToMeshParams){
|
BM_mesh_bm_to_me(bmain, bm, me, ¶ms);
|
||||||
.calc_object_remap = true,
|
|
||||||
.update_shapekey_indices = !free_data,
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EDBM_mesh_clear(BMEditMesh *em)
|
void EDBM_mesh_clear(BMEditMesh *em)
|
||||||
|
@ -330,8 +323,8 @@ void EDBM_mesh_free_data(BMEditMesh *em)
|
||||||
/* These tables aren't used yet, so it's not strictly necessary
|
/* These tables aren't used yet, so it's not strictly necessary
|
||||||
* to 'end' them but if someone tries to start using them,
|
* to 'end' them but if someone tries to start using them,
|
||||||
* having these in place will save a lot of pain. */
|
* having these in place will save a lot of pain. */
|
||||||
ED_mesh_mirror_spatial_table_end(NULL);
|
ED_mesh_mirror_spatial_table_end(nullptr);
|
||||||
ED_mesh_mirror_topo_table_end(NULL);
|
ED_mesh_mirror_topo_table_end(nullptr);
|
||||||
|
|
||||||
BKE_editmesh_free_data(em);
|
BKE_editmesh_free_data(em);
|
||||||
}
|
}
|
||||||
|
@ -469,11 +462,11 @@ UvVertMap *BM_uv_vert_map_create(BMesh *bm, const bool use_select)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (totuv == 0) {
|
if (totuv == 0) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
UvVertMap *vmap = (UvVertMap *)MEM_callocN(sizeof(*vmap), "UvVertMap");
|
UvVertMap *vmap = (UvVertMap *)MEM_callocN(sizeof(*vmap), "UvVertMap");
|
||||||
if (!vmap) {
|
if (!vmap) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
vmap->vert = (UvMapVert **)MEM_callocN(sizeof(*vmap->vert) * totverts, "UvMapVert_pt");
|
vmap->vert = (UvMapVert **)MEM_callocN(sizeof(*vmap->vert) * totverts, "UvMapVert_pt");
|
||||||
|
@ -481,7 +474,7 @@ UvVertMap *BM_uv_vert_map_create(BMesh *bm, const bool use_select)
|
||||||
|
|
||||||
if (!vmap->vert || !vmap->buf) {
|
if (!vmap->vert || !vmap->buf) {
|
||||||
BKE_mesh_uv_vert_map_free(vmap);
|
BKE_mesh_uv_vert_map_free(vmap);
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, a) {
|
BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, a) {
|
||||||
|
@ -501,7 +494,7 @@ UvVertMap *BM_uv_vert_map_create(BMesh *bm, const bool use_select)
|
||||||
|
|
||||||
/* sort individual uvs for each vert */
|
/* sort individual uvs for each vert */
|
||||||
BM_ITER_MESH_INDEX (ev, &iter, bm, BM_VERTS_OF_MESH, a) {
|
BM_ITER_MESH_INDEX (ev, &iter, bm, BM_VERTS_OF_MESH, a) {
|
||||||
UvMapVert *newvlist = NULL, *vlist = vmap->vert[a];
|
UvMapVert *newvlist = nullptr, *vlist = vmap->vert[a];
|
||||||
UvMapVert *iterv, *v, *lastv, *next;
|
UvMapVert *iterv, *v, *lastv, *next;
|
||||||
const float *uv, *uv2;
|
const float *uv, *uv2;
|
||||||
|
|
||||||
|
@ -513,16 +506,18 @@ UvVertMap *BM_uv_vert_map_create(BMesh *bm, const bool use_select)
|
||||||
|
|
||||||
efa = BM_face_at_index(bm, v->poly_index);
|
efa = BM_face_at_index(bm, v->poly_index);
|
||||||
|
|
||||||
l = BM_iter_at_index(bm, BM_LOOPS_OF_FACE, efa, v->loop_of_poly_index);
|
l = static_cast<BMLoop *>(
|
||||||
|
BM_iter_at_index(bm, BM_LOOPS_OF_FACE, efa, v->loop_of_poly_index));
|
||||||
uv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
|
uv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
|
||||||
|
|
||||||
lastv = NULL;
|
lastv = nullptr;
|
||||||
iterv = vlist;
|
iterv = vlist;
|
||||||
|
|
||||||
while (iterv) {
|
while (iterv) {
|
||||||
next = iterv->next;
|
next = iterv->next;
|
||||||
efa = BM_face_at_index(bm, iterv->poly_index);
|
efa = BM_face_at_index(bm, iterv->poly_index);
|
||||||
l = BM_iter_at_index(bm, BM_LOOPS_OF_FACE, efa, iterv->loop_of_poly_index);
|
l = static_cast<BMLoop *>(
|
||||||
|
BM_iter_at_index(bm, BM_LOOPS_OF_FACE, efa, iterv->loop_of_poly_index));
|
||||||
uv2 = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
|
uv2 = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
|
||||||
|
|
||||||
if (compare_v2v2(uv2, uv, STD_UV_CONNECT_LIMIT)) {
|
if (compare_v2v2(uv2, uv, STD_UV_CONNECT_LIMIT)) {
|
||||||
|
@ -563,8 +558,8 @@ UvElement **BM_uv_element_map_ensure_head_table(UvElementMap *element_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For each UvElement, locate the "separate" UvElement that precedes it in the linked list. */
|
/* For each UvElement, locate the "separate" UvElement that precedes it in the linked list. */
|
||||||
element_map->head_table = MEM_mallocN(sizeof(*element_map->head_table) * element_map->total_uvs,
|
element_map->head_table = static_cast<UvElement **>(
|
||||||
"uv_element_map_head_table");
|
MEM_mallocN(sizeof(*element_map->head_table) * element_map->total_uvs, __func__));
|
||||||
UvElement **head_table = element_map->head_table;
|
UvElement **head_table = element_map->head_table;
|
||||||
for (int i = 0; i < element_map->total_uvs; i++) {
|
for (int i = 0; i < element_map->total_uvs; i++) {
|
||||||
UvElement *head = element_map->storage + i;
|
UvElement *head = element_map->storage + i;
|
||||||
|
@ -585,8 +580,8 @@ UvElement **BM_uv_element_map_ensure_head_table(UvElementMap *element_map)
|
||||||
int *BM_uv_element_map_ensure_unique_index(UvElementMap *element_map)
|
int *BM_uv_element_map_ensure_unique_index(UvElementMap *element_map)
|
||||||
{
|
{
|
||||||
if (!element_map->unique_index_table) {
|
if (!element_map->unique_index_table) {
|
||||||
element_map->unique_index_table = MEM_callocN(
|
element_map->unique_index_table = static_cast<int *>(
|
||||||
element_map->total_uvs * sizeof(*element_map->unique_index_table), __func__);
|
MEM_callocN(element_map->total_uvs * sizeof(*element_map->unique_index_table), __func__));
|
||||||
|
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (int i = 0; i < element_map->total_uvs; i++) {
|
for (int i = 0; i < element_map->total_uvs; i++) {
|
||||||
|
@ -655,8 +650,8 @@ static int bm_uv_edge_select_build_islands(UvElementMap *element_map,
|
||||||
int nislands = 0;
|
int nislands = 0;
|
||||||
int islandbufsize = 0;
|
int islandbufsize = 0;
|
||||||
int stack_upper_bound = total_uvs;
|
int stack_upper_bound = total_uvs;
|
||||||
UvElement **stack_uv = MEM_mallocN(sizeof(*stack_uv) * stack_upper_bound,
|
UvElement **stack_uv = static_cast<UvElement **>(
|
||||||
"uv_island_element_stack");
|
MEM_mallocN(sizeof(*stack_uv) * stack_upper_bound, __func__));
|
||||||
int stacksize_uv = 0;
|
int stacksize_uv = 0;
|
||||||
for (int i = 0; i < total_uvs; i++) {
|
for (int i = 0; i < total_uvs; i++) {
|
||||||
UvElement *element = element_map->storage + i;
|
UvElement *element = element_map->storage + i;
|
||||||
|
@ -744,11 +739,13 @@ static void bm_uv_build_islands(UvElementMap *element_map,
|
||||||
int islandbufsize = 0;
|
int islandbufsize = 0;
|
||||||
|
|
||||||
/* map holds the map from current vmap->buf to the new, sorted map */
|
/* map holds the map from current vmap->buf to the new, sorted map */
|
||||||
uint *map = MEM_mallocN(sizeof(*map) * totuv, "uvelement_remap");
|
uint *map = static_cast<uint *>(MEM_mallocN(sizeof(*map) * totuv, __func__));
|
||||||
BMFace **stack = MEM_mallocN(sizeof(*stack) * bm->totface, "uv_island_face_stack");
|
BMFace **stack = static_cast<BMFace **>(MEM_mallocN(sizeof(*stack) * bm->totface, __func__));
|
||||||
UvElement *islandbuf = MEM_callocN(sizeof(*islandbuf) * totuv, "uvelement_island_buffer");
|
UvElement *islandbuf = static_cast<UvElement *>(
|
||||||
|
MEM_callocN(sizeof(*islandbuf) * totuv, __func__));
|
||||||
/* Island number for BMFaces. */
|
/* Island number for BMFaces. */
|
||||||
int *island_number = MEM_callocN(sizeof(*island_number) * bm->totface, "uv_island_number_face");
|
int *island_number = static_cast<int *>(
|
||||||
|
MEM_callocN(sizeof(*island_number) * bm->totface, __func__));
|
||||||
copy_vn_i(island_number, bm->totface, INVALID_ISLAND);
|
copy_vn_i(island_number, bm->totface, INVALID_ISLAND);
|
||||||
|
|
||||||
const BMUVOffsets uv_offsets = BM_uv_map_get_offsets(bm);
|
const BMUVOffsets uv_offsets = BM_uv_map_get_offsets(bm);
|
||||||
|
@ -816,22 +813,22 @@ static void bm_uv_build_islands(UvElementMap *element_map,
|
||||||
|
|
||||||
/* remap */
|
/* remap */
|
||||||
for (int i = 0; i < bm->totvert; i++) {
|
for (int i = 0; i < bm->totvert; i++) {
|
||||||
/* important since we may do selection only. Some of these may be NULL */
|
/* important since we may do selection only. Some of these may be nullptr */
|
||||||
if (element_map->vertex[i]) {
|
if (element_map->vertex[i]) {
|
||||||
element_map->vertex[i] = &islandbuf[map[element_map->vertex[i] - element_map->storage]];
|
element_map->vertex[i] = &islandbuf[map[element_map->vertex[i] - element_map->storage]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
element_map->island_indices = MEM_callocN(sizeof(*element_map->island_indices) * nislands,
|
element_map->island_indices = static_cast<int *>(
|
||||||
__func__);
|
MEM_callocN(sizeof(*element_map->island_indices) * nislands, __func__));
|
||||||
element_map->island_total_uvs = MEM_callocN(sizeof(*element_map->island_total_uvs) * nislands,
|
element_map->island_total_uvs = static_cast<int *>(
|
||||||
__func__);
|
MEM_callocN(sizeof(*element_map->island_total_uvs) * nislands, __func__));
|
||||||
element_map->island_total_unique_uvs = MEM_callocN(
|
element_map->island_total_unique_uvs = static_cast<int *>(
|
||||||
sizeof(*element_map->island_total_unique_uvs) * nislands, __func__);
|
MEM_callocN(sizeof(*element_map->island_total_unique_uvs) * nislands, __func__));
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (int i = 0; i < totuv; i++) {
|
for (int i = 0; i < totuv; i++) {
|
||||||
UvElement *next = element_map->storage[i].next;
|
UvElement *next = element_map->storage[i].next;
|
||||||
islandbuf[map[i]].next = next ? &islandbuf[map[next - element_map->storage]] : NULL;
|
islandbuf[map[i]].next = next ? &islandbuf[map[next - element_map->storage]] : nullptr;
|
||||||
|
|
||||||
if (islandbuf[i].island != j) {
|
if (islandbuf[i].island != j) {
|
||||||
j++;
|
j++;
|
||||||
|
@ -846,7 +843,7 @@ static void bm_uv_build_islands(UvElementMap *element_map,
|
||||||
|
|
||||||
MEM_SAFE_FREE(element_map->storage);
|
MEM_SAFE_FREE(element_map->storage);
|
||||||
element_map->storage = islandbuf;
|
element_map->storage = islandbuf;
|
||||||
islandbuf = NULL;
|
islandbuf = nullptr;
|
||||||
element_map->total_islands = nislands;
|
element_map->total_islands = nislands;
|
||||||
MEM_SAFE_FREE(stack);
|
MEM_SAFE_FREE(stack);
|
||||||
MEM_SAFE_FREE(map);
|
MEM_SAFE_FREE(map);
|
||||||
|
@ -953,7 +950,7 @@ static bool seam_connected(BMLoop *loop_a, BMLoop *loop_b, GSet *visited, int cd
|
||||||
BLI_assert(loop_a != loop_b);
|
BLI_assert(loop_a != loop_b);
|
||||||
BLI_assert(loop_a->v == loop_b->v);
|
BLI_assert(loop_a->v == loop_b->v);
|
||||||
|
|
||||||
BLI_gset_clear(visited, NULL);
|
BLI_gset_clear(visited, nullptr);
|
||||||
|
|
||||||
const float *luv_anchor = BM_ELEM_CD_GET_FLOAT_P(loop_a, cd_loop_uv_offset);
|
const float *luv_anchor = BM_ELEM_CD_GET_FLOAT_P(loop_a, cd_loop_uv_offset);
|
||||||
const float *luv_next_fan = BM_ELEM_CD_GET_FLOAT_P(loop_a->next, cd_loop_uv_offset);
|
const float *luv_next_fan = BM_ELEM_CD_GET_FLOAT_P(loop_a->next, cd_loop_uv_offset);
|
||||||
|
@ -986,7 +983,7 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
|
||||||
|
|
||||||
const BMUVOffsets offsets = BM_uv_map_get_offsets(bm);
|
const BMUVOffsets offsets = BM_uv_map_get_offsets(bm);
|
||||||
if (offsets.uv < 0) {
|
if (offsets.uv < 0) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BM_mesh_elem_index_ensure(bm, BM_VERT | BM_FACE);
|
BM_mesh_elem_index_ensure(bm, BM_VERT | BM_FACE);
|
||||||
|
@ -1016,7 +1013,7 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (totuv == 0) {
|
if (totuv == 0) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
UvElementMap *element_map = (UvElementMap *)MEM_callocN(sizeof(*element_map), "UvElementMap");
|
UvElementMap *element_map = (UvElementMap *)MEM_callocN(sizeof(*element_map), "UvElementMap");
|
||||||
|
@ -1026,7 +1023,9 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
|
||||||
element_map->storage = (UvElement *)MEM_callocN(sizeof(*element_map->storage) * totuv,
|
element_map->storage = (UvElement *)MEM_callocN(sizeof(*element_map->storage) * totuv,
|
||||||
"UvElement");
|
"UvElement");
|
||||||
|
|
||||||
bool *winding = use_winding ? MEM_callocN(sizeof(*winding) * bm->totface, "winding") : NULL;
|
bool *winding = use_winding ?
|
||||||
|
static_cast<bool *>(MEM_callocN(sizeof(*winding) * bm->totface, "winding")) :
|
||||||
|
nullptr;
|
||||||
|
|
||||||
UvElement *buf = element_map->storage;
|
UvElement *buf = element_map->storage;
|
||||||
int j;
|
int j;
|
||||||
|
@ -1063,12 +1062,12 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GSet *seam_visited_gset = use_seams ? BLI_gset_ptr_new(__func__) : NULL;
|
GSet *seam_visited_gset = use_seams ? BLI_gset_ptr_new(__func__) : nullptr;
|
||||||
|
|
||||||
/* For each BMVert, sort associated linked list into unique uvs. */
|
/* For each BMVert, sort associated linked list into unique uvs. */
|
||||||
int ev_index;
|
int ev_index;
|
||||||
BM_ITER_MESH_INDEX (ev, &iter, bm, BM_VERTS_OF_MESH, ev_index) {
|
BM_ITER_MESH_INDEX (ev, &iter, bm, BM_VERTS_OF_MESH, ev_index) {
|
||||||
UvElement *newvlist = NULL;
|
UvElement *newvlist = nullptr;
|
||||||
UvElement *vlist = element_map->vertex[ev_index];
|
UvElement *vlist = element_map->vertex[ev_index];
|
||||||
while (vlist) {
|
while (vlist) {
|
||||||
|
|
||||||
|
@ -1078,10 +1077,10 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
|
||||||
v->next = newvlist;
|
v->next = newvlist;
|
||||||
newvlist = v;
|
newvlist = v;
|
||||||
|
|
||||||
const float *uv = BM_ELEM_CD_GET_VOID_P(v->l, offsets.uv);
|
const float *uv = static_cast<const float *>(BM_ELEM_CD_GET_VOID_P(v->l, offsets.uv));
|
||||||
bool uv_vert_sel = uvedit_uv_select_test(scene, v->l, offsets);
|
bool uv_vert_sel = uvedit_uv_select_test(scene, v->l, offsets);
|
||||||
|
|
||||||
UvElement *lastv = NULL;
|
UvElement *lastv = nullptr;
|
||||||
UvElement *iterv = vlist;
|
UvElement *iterv = vlist;
|
||||||
|
|
||||||
/* Scan through unsorted list, finding UvElements which are connected to `v`. */
|
/* Scan through unsorted list, finding UvElements which are connected to `v`. */
|
||||||
|
@ -1138,8 +1137,8 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seam_visited_gset) {
|
if (seam_visited_gset) {
|
||||||
BLI_gset_free(seam_visited_gset, NULL);
|
BLI_gset_free(seam_visited_gset, nullptr);
|
||||||
seam_visited_gset = NULL;
|
seam_visited_gset = nullptr;
|
||||||
}
|
}
|
||||||
MEM_SAFE_FREE(winding);
|
MEM_SAFE_FREE(winding);
|
||||||
|
|
||||||
|
@ -1197,13 +1196,13 @@ UvElement *BM_uv_element_get(const UvElementMap *element_map, const BMLoop *l)
|
||||||
element = element->next;
|
element = element->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
UvElement *BM_uv_element_get_head(UvElementMap *element_map, UvElement *child)
|
UvElement *BM_uv_element_get_head(UvElementMap *element_map, UvElement *child)
|
||||||
{
|
{
|
||||||
if (!child) {
|
if (!child) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return element_map->vertex[BM_elem_index_get(child->l->v)];
|
return element_map->vertex[BM_elem_index_get(child->l->v)];
|
||||||
|
@ -1218,14 +1217,14 @@ UvElement *BM_uv_element_get_head(UvElementMap *element_map, UvElement *child)
|
||||||
BMFace *EDBM_uv_active_face_get(BMEditMesh *em, const bool sloppy, const bool selected)
|
BMFace *EDBM_uv_active_face_get(BMEditMesh *em, const bool sloppy, const bool selected)
|
||||||
{
|
{
|
||||||
if (!EDBM_uv_check(em)) {
|
if (!EDBM_uv_check(em)) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
BMFace *efa = BM_mesh_active_face_get(em->bm, sloppy, selected);
|
BMFace *efa = BM_mesh_active_face_get(em->bm, sloppy, selected);
|
||||||
if (efa) {
|
if (efa) {
|
||||||
return efa;
|
return efa;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EDBM_uv_check(BMEditMesh *em)
|
bool EDBM_uv_check(BMEditMesh *em)
|
||||||
|
@ -1249,7 +1248,7 @@ bool EDBM_vert_color_check(BMEditMesh *em)
|
||||||
static BMVert *cache_mirr_intptr_as_bmvert(const intptr_t *index_lookup, int index)
|
static BMVert *cache_mirr_intptr_as_bmvert(const intptr_t *index_lookup, int index)
|
||||||
{
|
{
|
||||||
intptr_t eve_i = index_lookup[index];
|
intptr_t eve_i = index_lookup[index];
|
||||||
return (eve_i == -1) ? NULL : (BMVert *)eve_i;
|
return (eve_i == -1) ? nullptr : (BMVert *)eve_i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1290,12 +1289,12 @@ void EDBM_verts_mirror_cache_begin_ex(BMEditMesh *em,
|
||||||
const float maxdist_sq = square_f(maxdist);
|
const float maxdist_sq = square_f(maxdist);
|
||||||
|
|
||||||
/* one or the other is used depending if topo is enabled */
|
/* one or the other is used depending if topo is enabled */
|
||||||
KDTree_3d *tree = NULL;
|
KDTree_3d *tree = nullptr;
|
||||||
MirrTopoStore_t mesh_topo_store = {NULL, -1, -1, -1};
|
MirrTopoStore_t mesh_topo_store = {nullptr, -1, -1, false};
|
||||||
|
|
||||||
BM_mesh_elem_table_ensure(bm, BM_VERT);
|
BM_mesh_elem_table_ensure(bm, BM_VERT);
|
||||||
|
|
||||||
if (r_index == NULL) {
|
if (r_index == nullptr) {
|
||||||
const char *layer_id = BM_CD_LAYER_ID;
|
const char *layer_id = BM_CD_LAYER_ID;
|
||||||
em->mirror_cdlayer = CustomData_get_named_layer_index(&bm->vdata, CD_PROP_INT32, layer_id);
|
em->mirror_cdlayer = CustomData_get_named_layer_index(&bm->vdata, CD_PROP_INT32, layer_id);
|
||||||
if (em->mirror_cdlayer == -1) {
|
if (em->mirror_cdlayer == -1) {
|
||||||
|
@ -1314,7 +1313,7 @@ void EDBM_verts_mirror_cache_begin_ex(BMEditMesh *em,
|
||||||
BM_mesh_elem_index_ensure(bm, BM_VERT);
|
BM_mesh_elem_index_ensure(bm, BM_VERT);
|
||||||
|
|
||||||
if (use_topology) {
|
if (use_topology) {
|
||||||
ED_mesh_mirrtopo_init(em, NULL, &mesh_topo_store, true);
|
ED_mesh_mirrtopo_init(em, nullptr, &mesh_topo_store, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tree = BLI_kdtree_3d_new(bm->totvert);
|
tree = BLI_kdtree_3d_new(bm->totvert);
|
||||||
|
@ -1328,7 +1327,8 @@ void EDBM_verts_mirror_cache_begin_ex(BMEditMesh *em,
|
||||||
BLI_kdtree_3d_balance(tree);
|
BLI_kdtree_3d_balance(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VERT_INTPTR(_v, _i) (r_index ? &r_index[_i] : BM_ELEM_CD_GET_VOID_P(_v, cd_vmirr_offset))
|
#define VERT_INTPTR(_v, _i) \
|
||||||
|
(r_index ? &r_index[_i] : static_cast<int *>(BM_ELEM_CD_GET_VOID_P(_v, cd_vmirr_offset)))
|
||||||
|
|
||||||
BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
|
BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
|
||||||
if (respecthide && BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
|
if (respecthide && BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
|
||||||
|
@ -1345,9 +1345,9 @@ void EDBM_verts_mirror_cache_begin_ex(BMEditMesh *em,
|
||||||
|
|
||||||
if (use_topology) {
|
if (use_topology) {
|
||||||
v_mirr = cache_mirr_intptr_as_bmvert(mesh_topo_store.index_lookup, i);
|
v_mirr = cache_mirr_intptr_as_bmvert(mesh_topo_store.index_lookup, i);
|
||||||
if (v_mirr != NULL) {
|
if (v_mirr != nullptr) {
|
||||||
if (respecthide && BM_elem_flag_test(v_mirr, BM_ELEM_HIDDEN)) {
|
if (respecthide && BM_elem_flag_test(v_mirr, BM_ELEM_HIDDEN)) {
|
||||||
v_mirr = NULL;
|
v_mirr = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1357,8 +1357,8 @@ void EDBM_verts_mirror_cache_begin_ex(BMEditMesh *em,
|
||||||
copy_v3_v3(co, v->co);
|
copy_v3_v3(co, v->co);
|
||||||
co[axis] *= -1.0f;
|
co[axis] *= -1.0f;
|
||||||
|
|
||||||
v_mirr = NULL;
|
v_mirr = nullptr;
|
||||||
i_mirr = BLI_kdtree_3d_find_nearest(tree, co, NULL);
|
i_mirr = BLI_kdtree_3d_find_nearest(tree, co, nullptr);
|
||||||
if (i_mirr != -1) {
|
if (i_mirr != -1) {
|
||||||
BMVert *v_test = BM_vert_at_index(bm, i_mirr);
|
BMVert *v_test = BM_vert_at_index(bm, i_mirr);
|
||||||
if (len_squared_v3v3(co, v_test->co) < maxdist_sq) {
|
if (len_squared_v3v3(co, v_test->co) < maxdist_sq) {
|
||||||
|
@ -1403,12 +1403,13 @@ void EDBM_verts_mirror_cache_begin(BMEditMesh *em,
|
||||||
/* extra args */
|
/* extra args */
|
||||||
use_topology,
|
use_topology,
|
||||||
BM_SEARCH_MAXDIST_MIRR,
|
BM_SEARCH_MAXDIST_MIRR,
|
||||||
NULL);
|
nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
BMVert *EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)
|
BMVert *EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)
|
||||||
{
|
{
|
||||||
const int *mirr = CustomData_bmesh_get_layer_n(&em->bm->vdata, v->head.data, em->mirror_cdlayer);
|
const int *mirr = static_cast<const int *>(
|
||||||
|
CustomData_bmesh_get_layer_n(&em->bm->vdata, v->head.data, em->mirror_cdlayer));
|
||||||
|
|
||||||
BLI_assert(em->mirror_cdlayer != -1); /* invalid use */
|
BLI_assert(em->mirror_cdlayer != -1); /* invalid use */
|
||||||
|
|
||||||
|
@ -1417,13 +1418,13 @@ BMVert *EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)
|
||||||
printf(
|
printf(
|
||||||
"err: should only be called between "
|
"err: should only be called between "
|
||||||
"EDBM_verts_mirror_cache_begin and EDBM_verts_mirror_cache_end");
|
"EDBM_verts_mirror_cache_begin and EDBM_verts_mirror_cache_end");
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return em->bm->vtable[*mirr];
|
return em->bm->vtable[*mirr];
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BMEdge *EDBM_verts_mirror_get_edge(BMEditMesh *em, BMEdge *e)
|
BMEdge *EDBM_verts_mirror_get_edge(BMEditMesh *em, BMEdge *e)
|
||||||
|
@ -1437,29 +1438,30 @@ BMEdge *EDBM_verts_mirror_get_edge(BMEditMesh *em, BMEdge *e)
|
||||||
return BM_edge_exists(v1_mirr, v2_mirr);
|
return BM_edge_exists(v1_mirr, v2_mirr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BMFace *EDBM_verts_mirror_get_face(BMEditMesh *em, BMFace *f)
|
BMFace *EDBM_verts_mirror_get_face(BMEditMesh *em, BMFace *f)
|
||||||
{
|
{
|
||||||
BMVert **v_mirr_arr = BLI_array_alloca(v_mirr_arr, f->len);
|
blender::Array<BMVert *, BM_DEFAULT_NGON_STACK_SIZE> v_mirr_arr(f->len);
|
||||||
|
|
||||||
BMLoop *l_iter, *l_first;
|
BMLoop *l_iter, *l_first;
|
||||||
uint i = 0;
|
uint i = 0;
|
||||||
|
|
||||||
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
||||||
do {
|
do {
|
||||||
if ((v_mirr_arr[i++] = EDBM_verts_mirror_get(em, l_iter->v)) == NULL) {
|
if ((v_mirr_arr[i++] = EDBM_verts_mirror_get(em, l_iter->v)) == nullptr) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
} while ((l_iter = l_iter->next) != l_first);
|
} while ((l_iter = l_iter->next) != l_first);
|
||||||
|
|
||||||
return BM_face_exists(v_mirr_arr, f->len);
|
return BM_face_exists(v_mirr_arr.data(), v_mirr_arr.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EDBM_verts_mirror_cache_clear(BMEditMesh *em, BMVert *v)
|
void EDBM_verts_mirror_cache_clear(BMEditMesh *em, BMVert *v)
|
||||||
{
|
{
|
||||||
int *mirr = CustomData_bmesh_get_layer_n(&em->bm->vdata, v->head.data, em->mirror_cdlayer);
|
int *mirr = static_cast<int *>(
|
||||||
|
CustomData_bmesh_get_layer_n(&em->bm->vdata, v->head.data, em->mirror_cdlayer));
|
||||||
|
|
||||||
BLI_assert(em->mirror_cdlayer != -1); /* invalid use */
|
BLI_assert(em->mirror_cdlayer != -1); /* invalid use */
|
||||||
|
|
||||||
|
@ -1478,7 +1480,7 @@ void EDBM_verts_mirror_apply(BMEditMesh *em, const int sel_from, const int sel_t
|
||||||
BMIter iter;
|
BMIter iter;
|
||||||
BMVert *v;
|
BMVert *v;
|
||||||
|
|
||||||
BLI_assert((em->bm->vtable != NULL) && ((em->bm->elem_table_dirty & BM_VERT) == 0));
|
BLI_assert((em->bm->vtable != nullptr) && ((em->bm->elem_table_dirty & BM_VERT) == 0));
|
||||||
|
|
||||||
BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
|
BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
|
||||||
if (BM_elem_flag_test(v, BM_ELEM_SELECT) == sel_from) {
|
if (BM_elem_flag_test(v, BM_ELEM_SELECT) == sel_from) {
|
||||||
|
@ -1611,17 +1613,16 @@ bool EDBM_mesh_reveal(BMEditMesh *em, bool select)
|
||||||
/** \name Update API
|
/** \name Update API
|
||||||
* \{ */
|
* \{ */
|
||||||
|
|
||||||
void EDBM_mesh_normals_update_ex(BMEditMesh *em, const struct BMeshNormalsUpdate_Params *params)
|
void EDBM_mesh_normals_update_ex(BMEditMesh *em, const BMeshNormalsUpdate_Params *params)
|
||||||
{
|
{
|
||||||
BM_mesh_normals_update_ex(em->bm, params);
|
BM_mesh_normals_update_ex(em->bm, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EDBM_mesh_normals_update(BMEditMesh *em)
|
void EDBM_mesh_normals_update(BMEditMesh *em)
|
||||||
{
|
{
|
||||||
EDBM_mesh_normals_update_ex(em,
|
BMeshNormalsUpdate_Params params{};
|
||||||
&(const struct BMeshNormalsUpdate_Params){
|
params.face_normals = true;
|
||||||
.face_normals = true,
|
EDBM_mesh_normals_update_ex(em, ¶ms);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EDBM_stats_update(BMEditMesh *em)
|
void EDBM_stats_update(BMEditMesh *em)
|
||||||
|
@ -1644,8 +1645,8 @@ void EDBM_stats_update(BMEditMesh *em)
|
||||||
em->bm->totvertsel = em->bm->totedgesel = em->bm->totfacesel = 0;
|
em->bm->totvertsel = em->bm->totedgesel = em->bm->totfacesel = 0;
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
ele = BM_iter_new(&iter, em->bm, iter_types[i], NULL);
|
ele = static_cast<BMElem *>(BM_iter_new(&iter, em->bm, iter_types[i], nullptr));
|
||||||
for (; ele; ele = BM_iter_step(&iter)) {
|
for (; ele; ele = static_cast<BMElem *>(BM_iter_step(&iter))) {
|
||||||
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
|
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
|
||||||
(*tots[i])++;
|
(*tots[i])++;
|
||||||
}
|
}
|
||||||
|
@ -1653,7 +1654,7 @@ void EDBM_stats_update(BMEditMesh *em)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EDBM_update(Mesh *mesh, const struct EDBMUpdate_Params *params)
|
void EDBM_update(Mesh *mesh, const EDBMUpdate_Params *params)
|
||||||
{
|
{
|
||||||
BMEditMesh *em = mesh->edit_mesh;
|
BMEditMesh *em = mesh->edit_mesh;
|
||||||
/* Order of calling isn't important. */
|
/* Order of calling isn't important. */
|
||||||
|
@ -1699,12 +1700,11 @@ void EDBM_update(Mesh *mesh, const struct EDBMUpdate_Params *params)
|
||||||
|
|
||||||
void EDBM_update_extern(Mesh *me, const bool do_tessellation, const bool is_destructive)
|
void EDBM_update_extern(Mesh *me, const bool do_tessellation, const bool is_destructive)
|
||||||
{
|
{
|
||||||
EDBM_update(me,
|
EDBMUpdate_Params params{};
|
||||||
&(const struct EDBMUpdate_Params){
|
params.calc_looptri = do_tessellation;
|
||||||
.calc_looptri = do_tessellation,
|
params.calc_normals = false;
|
||||||
.calc_normals = false,
|
params.is_destructive = is_destructive;
|
||||||
.is_destructive = is_destructive,
|
EDBM_update(me, ¶ms);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
@ -1739,7 +1739,7 @@ BMElem *EDBM_elem_from_selectmode(BMEditMesh *em, BMVert *eve, BMEdge *eed, BMFa
|
||||||
if ((em->selectmode & SCE_SELECT_FACE) && efa) {
|
if ((em->selectmode & SCE_SELECT_FACE) && efa) {
|
||||||
return (BMElem *)efa;
|
return (BMElem *)efa;
|
||||||
}
|
}
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int EDBM_elem_to_index_any(BMEditMesh *em, BMElem *ele)
|
int EDBM_elem_to_index_any(BMEditMesh *em, BMElem *ele)
|
||||||
|
@ -1781,7 +1781,7 @@ BMElem *EDBM_elem_from_index_any(BMEditMesh *em, uint index)
|
||||||
return (BMElem *)BM_face_at_index_find_or_table(bm, index);
|
return (BMElem *)BM_face_at_index_find_or_table(bm, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int EDBM_elem_to_index_any_multi(
|
int EDBM_elem_to_index_any_multi(
|
||||||
|
@ -1790,7 +1790,8 @@ int EDBM_elem_to_index_any_multi(
|
||||||
uint bases_len;
|
uint bases_len;
|
||||||
int elem_index = -1;
|
int elem_index = -1;
|
||||||
*r_object_index = -1;
|
*r_object_index = -1;
|
||||||
Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(scene, view_layer, NULL, &bases_len);
|
Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(
|
||||||
|
scene, view_layer, nullptr, &bases_len);
|
||||||
for (uint base_index = 0; base_index < bases_len; base_index++) {
|
for (uint base_index = 0; base_index < bases_len; base_index++) {
|
||||||
Base *base_iter = bases[base_index];
|
Base *base_iter = bases[base_index];
|
||||||
if (BKE_editmesh_from_object(base_iter->object) == em) {
|
if (BKE_editmesh_from_object(base_iter->object) == em) {
|
||||||
|
@ -1810,19 +1811,20 @@ BMElem *EDBM_elem_from_index_any_multi(const Scene *scene,
|
||||||
Object **r_obedit)
|
Object **r_obedit)
|
||||||
{
|
{
|
||||||
uint bases_len;
|
uint bases_len;
|
||||||
Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(scene, view_layer, NULL, &bases_len);
|
Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(
|
||||||
*r_obedit = NULL;
|
scene, view_layer, nullptr, &bases_len);
|
||||||
Object *obedit = (object_index < bases_len) ? bases[object_index]->object : NULL;
|
*r_obedit = nullptr;
|
||||||
|
Object *obedit = (object_index < bases_len) ? bases[object_index]->object : nullptr;
|
||||||
MEM_freeN(bases);
|
MEM_freeN(bases);
|
||||||
if (obedit != NULL) {
|
if (obedit != nullptr) {
|
||||||
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||||
BMElem *ele = EDBM_elem_from_index_any(em, elem_index);
|
BMElem *ele = EDBM_elem_from_index_any(em, elem_index);
|
||||||
if (ele != NULL) {
|
if (ele != nullptr) {
|
||||||
*r_obedit = obedit;
|
*r_obedit = obedit;
|
||||||
return ele;
|
return ele;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
@ -1834,10 +1836,10 @@ BMElem *EDBM_elem_from_index_any_multi(const Scene *scene,
|
||||||
static BMFace *edge_ray_cast(
|
static BMFace *edge_ray_cast(
|
||||||
BMBVHTree *tree, const float co[3], const float dir[3], float *r_hitout, BMEdge *e)
|
BMBVHTree *tree, const float co[3], const float dir[3], float *r_hitout, BMEdge *e)
|
||||||
{
|
{
|
||||||
BMFace *f = BKE_bmbvh_ray_cast(tree, co, dir, 0.0f, NULL, r_hitout, NULL);
|
BMFace *f = BKE_bmbvh_ray_cast(tree, co, dir, 0.0f, nullptr, r_hitout, nullptr);
|
||||||
|
|
||||||
if (f && BM_edge_in_face(e, f)) {
|
if (f && BM_edge_in_face(e, f)) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return f;
|
return f;
|
||||||
|
@ -1896,11 +1898,11 @@ bool BMBVH_EdgeVisible(
|
||||||
normalize_v3(dir3);
|
normalize_v3(dir3);
|
||||||
|
|
||||||
/* do three samplings: left, middle, right */
|
/* do three samplings: left, middle, right */
|
||||||
f = edge_ray_cast(tree, co1, dir1, NULL, e);
|
f = edge_ray_cast(tree, co1, dir1, nullptr, e);
|
||||||
if (f && !edge_ray_cast(tree, co2, dir2, NULL, e)) {
|
if (f && !edge_ray_cast(tree, co2, dir2, nullptr, e)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (f && !edge_ray_cast(tree, co3, dir3, NULL, e)) {
|
if (f && !edge_ray_cast(tree, co3, dir3, nullptr, e)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!f) {
|
if (!f) {
|
||||||
|
@ -1922,7 +1924,7 @@ void EDBM_project_snap_verts(
|
||||||
BMIter iter;
|
BMIter iter;
|
||||||
BMVert *eve;
|
BMVert *eve;
|
||||||
|
|
||||||
ED_view3d_init_mats_rv3d(obedit, region->regiondata);
|
ED_view3d_init_mats_rv3d(obedit, static_cast<RegionView3D *>(region->regiondata));
|
||||||
|
|
||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
SnapObjectContext *snap_context = ED_transform_snap_object_context_create(scene, 0);
|
SnapObjectContext *snap_context = ED_transform_snap_object_context_create(scene, 0);
|
||||||
|
@ -1942,22 +1944,22 @@ void EDBM_project_snap_verts(
|
||||||
float mval[2], co_proj[3];
|
float mval[2], co_proj[3];
|
||||||
if (ED_view3d_project_float_object(region, eve->co, mval, V3D_PROJ_TEST_NOP) ==
|
if (ED_view3d_project_float_object(region, eve->co, mval, V3D_PROJ_TEST_NOP) ==
|
||||||
V3D_PROJ_RET_OK) {
|
V3D_PROJ_RET_OK) {
|
||||||
|
SnapObjectParams params{};
|
||||||
|
params.snap_target_select = target_op;
|
||||||
|
params.edit_mode_type = SNAP_GEOM_FINAL;
|
||||||
|
params.use_occlusion_test = true;
|
||||||
if (ED_transform_snap_object_project_view3d(snap_context,
|
if (ED_transform_snap_object_project_view3d(snap_context,
|
||||||
depsgraph,
|
depsgraph,
|
||||||
region,
|
region,
|
||||||
CTX_wm_view3d(C),
|
CTX_wm_view3d(C),
|
||||||
SCE_SNAP_MODE_FACE,
|
SCE_SNAP_MODE_FACE,
|
||||||
&(const struct SnapObjectParams){
|
¶ms,
|
||||||
.snap_target_select = target_op,
|
nullptr,
|
||||||
.edit_mode_type = SNAP_GEOM_FINAL,
|
|
||||||
.use_occlusion_test = true,
|
|
||||||
},
|
|
||||||
NULL,
|
|
||||||
mval,
|
mval,
|
||||||
NULL,
|
nullptr,
|
||||||
NULL,
|
nullptr,
|
||||||
co_proj,
|
co_proj,
|
||||||
NULL))
|
nullptr))
|
||||||
{
|
{
|
||||||
mul_v3_m4v3(eve->co, obedit->world_to_object, co_proj);
|
mul_v3_m4v3(eve->co, obedit->world_to_object, co_proj);
|
||||||
}
|
}
|
|
@ -26,7 +26,7 @@ struct wmKeyMap;
|
||||||
struct wmOperator;
|
struct wmOperator;
|
||||||
struct wmOperatorType;
|
struct wmOperatorType;
|
||||||
|
|
||||||
/* *** editmesh_utils.c *** */
|
/* *** editmesh_utils.cc *** */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ok: the EDBM module is for editmode bmesh stuff. in contrast, the
|
* ok: the EDBM module is for editmode bmesh stuff. in contrast, the
|
||||||
|
|
|
@ -49,7 +49,7 @@ set(DEFSRC
|
||||||
rna_main.c
|
rna_main.c
|
||||||
rna_mask.cc
|
rna_mask.cc
|
||||||
rna_material.c
|
rna_material.c
|
||||||
rna_mesh.c
|
rna_mesh.cc
|
||||||
rna_meta.cc
|
rna_meta.cc
|
||||||
rna_modifier.c
|
rna_modifier.c
|
||||||
rna_movieclip.c
|
rna_movieclip.c
|
||||||
|
@ -109,7 +109,7 @@ set(APISRC
|
||||||
rna_lattice_api.cc
|
rna_lattice_api.cc
|
||||||
rna_main_api.c
|
rna_main_api.c
|
||||||
rna_material_api.c
|
rna_material_api.c
|
||||||
rna_mesh_api.c
|
rna_mesh_api.cc
|
||||||
rna_meta_api.c
|
rna_meta_api.c
|
||||||
rna_object_api.c
|
rna_object_api.c
|
||||||
rna_pose_api.c
|
rna_pose_api.c
|
||||||
|
@ -450,7 +450,7 @@ set(SRC
|
||||||
rna_access_internal.h
|
rna_access_internal.h
|
||||||
rna_internal.h
|
rna_internal.h
|
||||||
rna_internal_types.h
|
rna_internal_types.h
|
||||||
rna_mesh_utils.h
|
rna_mesh_utils.hh
|
||||||
)
|
)
|
||||||
|
|
||||||
set(LIB
|
set(LIB
|
||||||
|
|
|
@ -4561,7 +4561,7 @@ static RNAProcessItem PROCESS_ITEMS[] = {
|
||||||
{"rna_main.c", "rna_main_api.c", RNA_def_main},
|
{"rna_main.c", "rna_main_api.c", RNA_def_main},
|
||||||
{"rna_fluid.c", NULL, RNA_def_fluid},
|
{"rna_fluid.c", NULL, RNA_def_fluid},
|
||||||
{"rna_material.c", "rna_material_api.c", RNA_def_material},
|
{"rna_material.c", "rna_material_api.c", RNA_def_material},
|
||||||
{"rna_mesh.c", "rna_mesh_api.c", RNA_def_mesh},
|
{"rna_mesh.cc", "rna_mesh_api.cc", RNA_def_mesh},
|
||||||
{"rna_meta.cc", "rna_meta_api.c", RNA_def_meta},
|
{"rna_meta.cc", "rna_meta_api.c", RNA_def_meta},
|
||||||
{"rna_modifier.c", NULL, RNA_def_modifier},
|
{"rna_modifier.c", NULL, RNA_def_modifier},
|
||||||
{"rna_gpencil_legacy_modifier.c", NULL, RNA_def_greasepencil_modifier},
|
{"rna_gpencil_legacy_modifier.c", NULL, RNA_def_greasepencil_modifier},
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,8 +6,8 @@
|
||||||
* \ingroup RNA
|
* \ingroup RNA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "RNA_define.h"
|
#include "RNA_define.h"
|
||||||
|
|
||||||
|
@ -28,11 +28,15 @@
|
||||||
# include "BKE_mesh_mapping.h"
|
# include "BKE_mesh_mapping.h"
|
||||||
# include "BKE_mesh_runtime.h"
|
# include "BKE_mesh_runtime.h"
|
||||||
# include "BKE_mesh_tangent.h"
|
# include "BKE_mesh_tangent.h"
|
||||||
|
# include "BKE_report.h"
|
||||||
|
|
||||||
# include "ED_mesh.h"
|
# include "ED_mesh.h"
|
||||||
|
|
||||||
static const char *rna_Mesh_unit_test_compare(struct Mesh *mesh,
|
# include "DEG_depsgraph.h"
|
||||||
struct Mesh *mesh2,
|
|
||||||
float threshold)
|
# include "WM_api.h"
|
||||||
|
|
||||||
|
static const char *rna_Mesh_unit_test_compare(Mesh *mesh, Mesh *mesh2, float threshold)
|
||||||
{
|
{
|
||||||
const char *ret = BKE_mesh_cmp(mesh, mesh2, threshold);
|
const char *ret = BKE_mesh_cmp(mesh, mesh2, threshold);
|
||||||
|
|
||||||
|
@ -48,12 +52,13 @@ static void rna_Mesh_calc_tangents(Mesh *mesh, ReportList *reports, const char *
|
||||||
float(*r_looptangents)[4];
|
float(*r_looptangents)[4];
|
||||||
|
|
||||||
if (CustomData_has_layer(&mesh->ldata, CD_MLOOPTANGENT)) {
|
if (CustomData_has_layer(&mesh->ldata, CD_MLOOPTANGENT)) {
|
||||||
r_looptangents = CustomData_get_layer_for_write(&mesh->ldata, CD_MLOOPTANGENT, mesh->totloop);
|
r_looptangents = static_cast<float(*)[4]>(
|
||||||
|
CustomData_get_layer_for_write(&mesh->ldata, CD_MLOOPTANGENT, mesh->totloop));
|
||||||
memset(r_looptangents, 0, sizeof(float[4]) * mesh->totloop);
|
memset(r_looptangents, 0, sizeof(float[4]) * mesh->totloop);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
r_looptangents = CustomData_add_layer(
|
r_looptangents = static_cast<float(*)[4]>(
|
||||||
&mesh->ldata, CD_MLOOPTANGENT, CD_SET_DEFAULT, mesh->totloop);
|
CustomData_add_layer(&mesh->ldata, CD_MLOOPTANGENT, CD_SET_DEFAULT, mesh->totloop));
|
||||||
CustomData_set_layer_flag(&mesh->ldata, CD_MLOOPTANGENT, CD_FLAG_TEMPORARY);
|
CustomData_set_layer_flag(&mesh->ldata, CD_MLOOPTANGENT, CD_FLAG_TEMPORARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +202,7 @@ void RNA_api_mesh(StructRNA *srna)
|
||||||
"Transform mesh vertices by a matrix "
|
"Transform mesh vertices by a matrix "
|
||||||
"(Warning: inverts normals if matrix is negative)");
|
"(Warning: inverts normals if matrix is negative)");
|
||||||
parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f);
|
parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f);
|
||||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED);
|
||||||
RNA_def_boolean(func, "shape_keys", 0, "", "Transform Shape Keys");
|
RNA_def_boolean(func, "shape_keys", 0, "", "Transform Shape Keys");
|
||||||
|
|
||||||
func = RNA_def_function(srna, "flip_normals", "rna_Mesh_flip_normals");
|
func = RNA_def_function(srna, "flip_normals", "rna_Mesh_flip_normals");
|
||||||
|
@ -243,7 +248,7 @@ void RNA_api_mesh(StructRNA *srna)
|
||||||
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_OUTPUT);
|
RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_OUTPUT);
|
||||||
parm = RNA_def_int(
|
parm = RNA_def_int(
|
||||||
func, "groups", 0, 0, INT_MAX, "groups", "Total number of groups", 0, INT_MAX);
|
func, "groups", 0, 0, INT_MAX, "groups", "Total number of groups", 0, INT_MAX);
|
||||||
RNA_def_parameter_flags(parm, 0, PARM_OUTPUT);
|
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_OUTPUT);
|
||||||
|
|
||||||
func = RNA_def_function(srna, "normals_split_custom_set", "rna_Mesh_normals_split_custom_set");
|
func = RNA_def_function(srna, "normals_split_custom_set", "rna_Mesh_normals_split_custom_set");
|
||||||
RNA_def_function_ui_description(func,
|
RNA_def_function_ui_description(func,
|
|
@ -8,12 +8,12 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/* Macros to help reduce code clutter in rna_mesh.c */
|
/* Macros to help reduce code clutter in rna_mesh.cc */
|
||||||
|
|
||||||
/* Define the accessors for a basic CustomDataLayer collection, skipping anonymous layers */
|
/* Define the accessors for a basic CustomDataLayer collection, skipping anonymous layers */
|
||||||
#define DEFINE_CUSTOMDATA_LAYER_COLLECTION(collection_name, customdata_type, layer_type) \
|
#define DEFINE_CUSTOMDATA_LAYER_COLLECTION(collection_name, customdata_type, layer_type) \
|
||||||
/* check */ \
|
/* check */ \
|
||||||
static int rna_##collection_name##_check(CollectionPropertyIterator *UNUSED(iter), void *data) \
|
static int rna_##collection_name##_check(CollectionPropertyIterator *, void *data) \
|
||||||
{ \
|
{ \
|
||||||
CustomDataLayer *layer = (CustomDataLayer *)data; \
|
CustomDataLayer *layer = (CustomDataLayer *)data; \
|
||||||
return (layer->anonymous_id != NULL || layer->type != layer_type); \
|
return (layer->anonymous_id != NULL || layer->type != layer_type); \
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
} \
|
} \
|
||||||
/* index range */ \
|
/* index range */ \
|
||||||
static void rna_Mesh_##collection_name##_index_range( \
|
static void rna_Mesh_##collection_name##_index_range( \
|
||||||
PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax)) \
|
PointerRNA *ptr, int *min, int *max, int *, int *) \
|
||||||
{ \
|
{ \
|
||||||
CustomData *data = rna_mesh_##customdata_type(ptr); \
|
CustomData *data = rna_mesh_##customdata_type(ptr); \
|
||||||
*min = 0; \
|
*min = 0; \
|
||||||
|
@ -75,7 +75,7 @@
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static void rna_Mesh_##collection_name##_##active_type##_set( \
|
static void rna_Mesh_##collection_name##_##active_type##_set( \
|
||||||
PointerRNA *ptr, PointerRNA value, struct ReportList *UNUSED(reports)) \
|
PointerRNA *ptr, PointerRNA value, struct ReportList *) \
|
||||||
{ \
|
{ \
|
||||||
Mesh *me = rna_mesh(ptr); \
|
Mesh *me = rna_mesh(ptr); \
|
||||||
CustomData *data = rna_mesh_##customdata_type(ptr); \
|
CustomData *data = rna_mesh_##customdata_type(ptr); \
|
Loading…
Reference in New Issue