[Bf-blender-cvs] [08fc4eae2e1] temp-pbvh-texpaint-automasking: Merge branch 'master' into temp-pbvh-texpaint-automasking
Joseph Eagar
noreply at git.blender.org
Fri Jan 6 07:59:08 CET 2023
Commit: 08fc4eae2e1386ff22ca873cd7e3b6bbbd90693a
Author: Joseph Eagar
Date: Thu Jan 5 22:24:46 2023 -0800
Branches: temp-pbvh-texpaint-automasking
https://developer.blender.org/rB08fc4eae2e1386ff22ca873cd7e3b6bbbd90693a
Merge branch 'master' into temp-pbvh-texpaint-automasking
===================================================================
===================================================================
diff --cc source/blender/editors/sculpt_paint/sculpt.cc
index 00000000000,899044145d3..1753ad301f3
mode 000000,100644..100644
--- a/source/blender/editors/sculpt_paint/sculpt.cc
+++ b/source/blender/editors/sculpt_paint/sculpt.cc
@@@ -1,0 -1,6300 +1,6308 @@@
+ /* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2006 by Nicholas Bishop. All rights reserved. */
+
+ /** \file
+ * \ingroup edsculpt
+ * Implements the Sculpt Mode tools.
+ */
+
+ #include <cmath>
+ #include <cstdlib>
+ #include <cstring>
+
+ #include "MEM_guardedalloc.h"
+
+ #include "BLI_blenlib.h"
+ #include "BLI_dial_2d.h"
+ #include "BLI_ghash.h"
+ #include "BLI_gsqueue.h"
+ #include "BLI_math.h"
+ #include "BLI_task.h"
+ #include "BLI_task.hh"
+ #include "BLI_timeit.hh"
+ #include "BLI_utildefines.h"
+
+ #include "DNA_brush_types.h"
+ #include "DNA_customdata_types.h"
+ #include "DNA_mesh_types.h"
+ #include "DNA_meshdata_types.h"
+ #include "DNA_node_types.h"
+ #include "DNA_object_types.h"
+ #include "DNA_scene_types.h"
+
+ #include "BKE_attribute.h"
+ #include "BKE_attribute.hh"
+ #include "BKE_brush.h"
+ #include "BKE_ccg.h"
+ #include "BKE_colortools.h"
+ #include "BKE_context.h"
+ #include "BKE_image.h"
+ #include "BKE_key.h"
+ #include "BKE_lib_id.h"
+ #include "BKE_main.h"
+ #include "BKE_mesh.h"
+ #include "BKE_mesh_mapping.h"
+ #include "BKE_modifier.h"
+ #include "BKE_multires.h"
+ #include "BKE_node_runtime.hh"
+ #include "BKE_object.h"
+ #include "BKE_paint.h"
+ #include "BKE_pbvh.h"
+ #include "BKE_report.h"
+ #include "BKE_scene.h"
+ #include "BKE_subdiv_ccg.h"
+ #include "BKE_subsurf.h"
+
+ #include "NOD_texture.h"
+
+ #include "DEG_depsgraph.h"
+
+ #include "WM_api.h"
+ #include "WM_types.h"
+
+ #include "ED_paint.h"
+ #include "ED_screen.h"
+ #include "ED_sculpt.h"
+ #include "ED_view3d.h"
+
+ #include "paint_intern.h"
+ #include "sculpt_intern.h"
+
+ #include "RNA_access.h"
+ #include "RNA_define.h"
+
+ #include "bmesh.h"
+
+ using blender::MutableSpan;
+
+ /* -------------------------------------------------------------------- */
+ /** \name Sculpt PBVH Abstraction API
+ *
+ * This is read-only, for writing use PBVH vertex iterators. There vd.index matches
+ * the indices used here.
+ *
+ * For multi-resolution, the same vertex in multiple grids is counted multiple times, with
+ * different index for each grid.
+ * \{ */
+
+ void SCULPT_vertex_random_access_ensure(SculptSession *ss)
+ {
+ if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
+ BM_mesh_elem_index_ensure(ss->bm, BM_VERT);
+ BM_mesh_elem_table_ensure(ss->bm, BM_VERT);
+ }
+ }
+
+ int SCULPT_vertex_count_get(SculptSession *ss)
+ {
+ switch (BKE_pbvh_type(ss->pbvh)) {
+ case PBVH_FACES:
+ return ss->totvert;
+ case PBVH_BMESH:
+ return BM_mesh_elem_count(BKE_pbvh_get_bmesh(ss->pbvh), BM_VERT);
+ case PBVH_GRIDS:
+ return BKE_pbvh_get_grid_num_verts(ss->pbvh);
+ }
+
+ return 0;
+ }
+
+ const float *SCULPT_vertex_co_get(SculptSession *ss, PBVHVertRef vertex)
+ {
+ switch (BKE_pbvh_type(ss->pbvh)) {
+ case PBVH_FACES: {
+ if (ss->shapekey_active || ss->deform_modifiers_active) {
+ const MVert *mverts = BKE_pbvh_get_verts(ss->pbvh);
+ return mverts[vertex.i].co;
+ }
+ return ss->mvert[vertex.i].co;
+ }
+ case PBVH_BMESH:
+ return ((BMVert *)vertex.i)->co;
+ case PBVH_GRIDS: {
+ const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh);
+ const int grid_index = vertex.i / key->grid_area;
+ const int vertex_index = vertex.i - grid_index * key->grid_area;
+ CCGElem *elem = BKE_pbvh_get_grids(ss->pbvh)[grid_index];
+ return CCG_elem_co(key, CCG_elem_offset(key, elem, vertex_index));
+ }
+ }
+ return nullptr;
+ }
+
+ bool SCULPT_has_loop_colors(const Object *ob)
+ {
+ using namespace blender;
+ Mesh *me = BKE_object_get_original_mesh(ob);
+ const std::optional<bke::AttributeMetaData> meta_data = me->attributes().lookup_meta_data(
+ me->active_color_attribute);
+ if (!meta_data) {
+ return false;
+ }
+ if (meta_data->domain != ATTR_DOMAIN_CORNER) {
+ return false;
+ }
+ if (!(CD_TYPE_AS_MASK(meta_data->data_type) & CD_MASK_COLOR_ALL)) {
+ return false;
+ }
+ return true;
+ }
+
+ bool SCULPT_has_colors(const SculptSession *ss)
+ {
+ return ss->vcol || ss->mcol;
+ }
+
+ void SCULPT_vertex_color_get(const SculptSession *ss, PBVHVertRef vertex, float r_color[4])
+ {
+ BKE_pbvh_vertex_color_get(ss->pbvh, vertex, r_color);
+ }
+
+ void SCULPT_vertex_color_set(SculptSession *ss, PBVHVertRef vertex, const float color[4])
+ {
+ BKE_pbvh_vertex_color_set(ss->pbvh, vertex, color);
+ }
+
+ void SCULPT_vertex_normal_get(SculptSession *ss, PBVHVertRef vertex, float no[3])
+ {
+ switch (BKE_pbvh_type(ss->pbvh)) {
+ case PBVH_FACES: {
+ const float(*vert_normals)[3] = BKE_pbvh_get_vert_normals(ss->pbvh);
+ copy_v3_v3(no, vert_normals[vertex.i]);
+ break;
+ }
+ case PBVH_BMESH: {
+ BMVert *v = (BMVert *)vertex.i;
+ copy_v3_v3(no, v->no);
+ break;
+ }
+ case PBVH_GRIDS: {
+ const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh);
+ const int grid_index = vertex.i / key->grid_area;
+ const int vertex_index = vertex.i - grid_index * key->grid_area;
+ CCGElem *elem = BKE_pbvh_get_grids(ss->pbvh)[grid_index];
+ copy_v3_v3(no, CCG_elem_no(key, CCG_elem_offset(key, elem, vertex_index)));
+ break;
+ }
+ }
+ }
+
+ const float *SCULPT_vertex_persistent_co_get(SculptSession *ss, PBVHVertRef vertex)
+ {
+ if (ss->attrs.persistent_co) {
+ return (const float *)SCULPT_vertex_attr_get(vertex, ss->attrs.persistent_co);
+ }
+
+ return SCULPT_vertex_co_get(ss, vertex);
+ }
+
+ const float *SCULPT_vertex_co_for_grab_active_get(SculptSession *ss, PBVHVertRef vertex)
+ {
+ if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
+ /* Always grab active shape key if the sculpt happens on shapekey. */
+ if (ss->shapekey_active) {
+ const MVert *mverts = BKE_pbvh_get_verts(ss->pbvh);
+ return mverts[vertex.i].co;
+ }
+
+ /* Sculpting on the base mesh. */
+ return ss->mvert[vertex.i].co;
+ }
+
+ /* Everything else, such as sculpting on multires. */
+ return SCULPT_vertex_co_get(ss, vertex);
+ }
+
+ void SCULPT_vertex_limit_surface_get(SculptSession *ss, PBVHVertRef vertex, float r_co[3])
+ {
+ switch (BKE_pbvh_type(ss->pbvh)) {
+ case PBVH_FACES:
+ case PBVH_BMESH:
+ copy_v3_v3(r_co, SCULPT_vertex_co_get(ss, vertex));
+ break;
+ case PBVH_GRIDS: {
+ const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh);
+ const int grid_index = vertex.i / key->grid_area;
+ const int vertex_index = vertex.i - grid_index * key->grid_area;
+
+ SubdivCCGCoord coord{};
+ coord.grid_index = grid_index;
+ coord.x = vertex_index % key->grid_size;
+ coord.y = vertex_index / key->grid_size;
+ BKE_subdiv_ccg_eval_limit_point(ss->subdiv_ccg, &coord, r_co);
+ break;
+ }
+ }
+ }
+
+ void SCULPT_vertex_persistent_normal_get(SculptSession *ss, PBVHVertRef vertex, float no[3])
+ {
+ if (ss->attrs.persistent_no) {
+ copy_v3_v3(no, (float *)SCULPT_vertex_attr_get(vertex, ss->attrs.persistent_no));
+ return;
+ }
+ SCULPT_vertex_normal_get(ss, vertex, no);
+ }
+
+ float SCULPT_vertex_mask_get(SculptSession *ss, PBVHVertRef vertex)
+ {
+ switch (BKE_pbvh_type(ss->pbvh)) {
+ case PBVH_FACES:
+ return ss->vmask ? ss->vmask[vertex.i] : 0.0f;
+ case PBVH_BMESH: {
+ BMVert *v;
+ int cd_mask = CustomData_get_offset(&ss->bm->vdata, CD_PAINT_MASK);
+
+ v = (BMVert *)vertex.i;
+ return cd_mask != -1 ? BM_ELEM_CD_GET_FLOAT(v, cd_mask) : 0.0f;
+ }
+ case PBVH_GRIDS: {
+ const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh);
+ const int grid_index = vertex.i / key->grid_area;
+ const int vertex_index = vertex.i - grid_index * key->grid_area;
+ CCGElem *elem = BKE_pbvh_get_grids(ss->pbvh)[grid_index];
+ return *CCG_elem_mask(key, CCG_elem_offset(key, elem, vertex_index));
+ }
+ }
+
+ return 0.0f;
+ }
+
+ PBVHVertRef SCULPT_active_vertex_get(SculptSession *ss)
+ {
+ if (ELEM(BKE_pbvh_type(ss->pbvh), PBVH_FACES, PBVH_BMESH, PBVH_GRIDS)) {
+ return ss->active_vertex;
+ }
+
+ return BKE_pbvh_make_vref(PBVH_REF_NONE);
+ }
+
+ const float *SCULPT_active_vertex_co_get(SculptSession *ss)
+ {
+ return SCULPT_vertex_co_get(ss, SCULPT_active_vertex_get(ss));
+ }
+
+ void SCULPT_active_vertex_normal_get(SculptSession *ss, float normal[3])
+ {
+ SCULPT_vertex_normal_get(ss, SCULPT_active_vertex_get(ss), normal);
+ }
+
+ MVert *SCULPT_mesh_deformed_mverts_get(SculptSession *ss)
+ {
+ switch (BKE_pbvh_type(ss->pbvh)) {
+ case PBVH_FACES:
+ if (ss->shapekey_active || ss->deform_modifiers_active) {
+ return BKE_pbvh_get_verts(ss->pbvh);
+ }
+ return ss->mvert;
+ case PBVH_BMESH:
+ case PBVH_GRIDS:
+ return nullptr;
+ }
+ return nullptr;
+ }
+
+ float *SCULPT_brush_deform_target_vertex_co_get(SculptSession *ss,
+ const int deform_target,
+ PBVHVertexIter *iter)
+ {
+ switch (deform_target) {
+ case BRUSH_DEFORM_TARGET_GEOMETRY:
+ return iter->co;
+ case BRUSH_DEFORM_TARGET_CLOTH_SIM:
+ return ss->cache->cloth_sim->deformation_pos[iter->index];
+ }
+ return iter->co;
+ }
+
+ char SCULPT_mesh_symmetry_xyz_get(Object *object)
+ {
+ const Mesh *mesh = BKE_mesh_from_object(object);
+ return mesh->symmetry;
+ }
+
+ /* Sculpt Face Sets and Visibility. */
+
+ int SCULPT_active_face_set_get(SculptSession *ss)
+ {
+ switch (BKE_pbvh_type(ss->pbvh)) {
+ case PBVH_FACES:
+ if (!ss->face_sets) {
+ return SCULPT_FACE_SET_NONE;
+ }
+ return ss->face_sets[ss->active_face_index];
+ case PBVH_GRIDS: {
+ if (!ss->face_sets) {
+ return SCULPT_FACE_SET_NONE;
+ }
+ const int face_index = BKE_subdiv_ccg_grid_to_face_index(ss->subdiv_ccg,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list