2009-01-06 21:23:42 +00:00
|
|
|
/*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2009-01-06 21:23:42 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2006 by Nicholas Bishop
|
|
|
|
* All rights reserved.
|
2011-02-27 20:29:51 +00:00
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup edsculpt
|
2011-02-27 20:29:51 +00:00
|
|
|
*/
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-02-17 18:59:41 +00:00
|
|
|
#ifndef __SCULPT_INTERN_H__
|
|
|
|
#define __SCULPT_INTERN_H__
|
2009-01-06 21:23:42 +00:00
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
#include "DNA_brush_types.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "DNA_key_types.h"
|
2009-01-06 21:23:42 +00:00
|
|
|
#include "DNA_listBase.h"
|
|
|
|
#include "DNA_vec_types.h"
|
2010-07-14 14:11:03 +00:00
|
|
|
|
2012-03-14 06:32:43 +00:00
|
|
|
#include "BLI_bitmap.h"
|
2020-03-01 13:59:51 -07:00
|
|
|
#include "BLI_gsqueue.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "BLI_threads.h"
|
2017-09-28 01:38:17 +10:00
|
|
|
|
2020-03-01 19:53:40 +01:00
|
|
|
#include "BKE_paint.h"
|
2012-12-15 15:59:25 +00:00
|
|
|
#include "BKE_pbvh.h"
|
2009-01-06 21:23:42 +00:00
|
|
|
|
2009-12-09 11:09:56 +00:00
|
|
|
struct KeyBlock;
|
2009-01-06 21:23:42 +00:00
|
|
|
struct Object;
|
2020-02-10 10:08:31 +11:00
|
|
|
struct SculptPoseIKChainSegment;
|
2019-01-28 21:08:24 +11:00
|
|
|
struct SculptUndoNode;
|
|
|
|
struct bContext;
|
2009-01-06 21:23:42 +00:00
|
|
|
|
2020-03-01 19:53:40 +01:00
|
|
|
enum ePaintSymmetryFlags;
|
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
bool SCULPT_mode_poll(struct bContext *C);
|
|
|
|
bool SCULPT_mode_poll_view3d(struct bContext *C);
|
2013-07-16 06:49:03 +00:00
|
|
|
/* checks for a brush, not just sculpt mode */
|
2020-03-06 15:24:15 +01:00
|
|
|
bool SCULPT_poll(struct bContext *C);
|
|
|
|
bool SCULPT_poll_view3d(struct bContext *C);
|
2009-09-18 15:48:49 +00:00
|
|
|
|
2019-09-30 15:56:12 +02:00
|
|
|
/* Updates */
|
|
|
|
|
|
|
|
typedef enum SculptUpdateType {
|
|
|
|
SCULPT_UPDATE_COORDS = 1 << 0,
|
|
|
|
SCULPT_UPDATE_MASK = 1 << 1,
|
2020-03-05 14:53:23 +01:00
|
|
|
SCULPT_UPDATE_VISIBILITY = 1 << 2,
|
2019-09-30 15:56:12 +02:00
|
|
|
} SculptUpdateType;
|
|
|
|
|
2020-04-03 19:42:48 +02:00
|
|
|
void SCULPT_flush_update_step(bContext *C, SculptUpdateType update_flags);
|
|
|
|
void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType update_flags);
|
|
|
|
void SCULPT_flush_stroke_deform(struct Sculpt *sd, Object *ob, bool is_proxy_used);
|
|
|
|
|
2009-01-06 21:23:42 +00:00
|
|
|
/* Stroke */
|
2019-08-30 16:27:31 +02:00
|
|
|
|
|
|
|
typedef struct SculptCursorGeometryInfo {
|
|
|
|
float location[3];
|
|
|
|
float normal[3];
|
|
|
|
float active_vertex_co[3];
|
|
|
|
} SculptCursorGeometryInfo;
|
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
bool SCULPT_stroke_get_location(struct bContext *C, float out[3], const float mouse[2]);
|
|
|
|
bool SCULPT_cursor_geometry_info_update(bContext *C,
|
2019-08-30 16:27:31 +02:00
|
|
|
SculptCursorGeometryInfo *out,
|
|
|
|
const float mouse[2],
|
|
|
|
bool use_sampled_normal);
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_geometry_preview_lines_update(bContext *C, struct SculptSession *ss, float radius);
|
2020-01-07 16:46:56 +01:00
|
|
|
|
2020-04-03 23:41:54 +02:00
|
|
|
void SCULPT_stroke_modifiers_check(const bContext *C, Object *ob, const Brush *brush);
|
|
|
|
float SCULPT_raycast_init(struct ViewContext *vc,
|
|
|
|
const float mouse[2],
|
|
|
|
float ray_start[3],
|
|
|
|
float ray_end[3],
|
|
|
|
float ray_normal[3],
|
|
|
|
bool original);
|
|
|
|
|
2019-09-09 22:23:54 +02:00
|
|
|
/* Sculpt PBVH abstraction API */
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_vertex_random_access_init(struct SculptSession *ss);
|
2020-03-01 19:53:40 +01:00
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
int SCULPT_vertex_count_get(struct SculptSession *ss);
|
|
|
|
const float *SCULPT_vertex_co_get(struct SculptSession *ss, int index);
|
2020-04-03 21:46:08 +02:00
|
|
|
void SCULPT_vertex_normal_get(SculptSession *ss, int index, float no[3]);
|
2020-03-06 15:24:15 +01:00
|
|
|
float SCULPT_vertex_mask_get(struct SculptSession *ss, int index);
|
2020-02-28 14:40:40 +01:00
|
|
|
|
|
|
|
#define SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY 256
|
|
|
|
typedef struct SculptVertexNeighborIter {
|
|
|
|
/* Storage */
|
|
|
|
int *neighbors;
|
|
|
|
int size;
|
|
|
|
int capacity;
|
|
|
|
int neighbors_fixed[SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY];
|
|
|
|
|
|
|
|
/* Internal iterator. */
|
|
|
|
int num_duplicates;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* Public */
|
|
|
|
int index;
|
|
|
|
bool is_duplicate;
|
|
|
|
} SculptVertexNeighborIter;
|
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_vertex_neighbors_get(struct SculptSession *ss,
|
2020-02-28 14:40:40 +01:00
|
|
|
const int index,
|
|
|
|
const bool include_duplicates,
|
|
|
|
SculptVertexNeighborIter *iter);
|
|
|
|
|
|
|
|
/* Iterator over neighboring vertices. */
|
2020-03-27 10:52:14 +11:00
|
|
|
#define SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator) \
|
2020-03-06 15:24:15 +01:00
|
|
|
SCULPT_vertex_neighbors_get(ss, v_index, false, &neighbor_iterator); \
|
2020-02-28 14:40:40 +01:00
|
|
|
for (neighbor_iterator.i = 0; neighbor_iterator.i < neighbor_iterator.size; \
|
|
|
|
neighbor_iterator.i++) { \
|
|
|
|
neighbor_iterator.index = ni.neighbors[ni.i];
|
|
|
|
|
|
|
|
/* Iterate over neighboring and duplicate vertices (for PBVH_GRIDS). Duplicates come
|
|
|
|
* first since they are nearest for floodfill. */
|
2020-03-27 10:52:14 +11:00
|
|
|
#define SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator) \
|
2020-03-06 15:52:36 +01:00
|
|
|
SCULPT_vertex_neighbors_get(ss, v_index, true, &neighbor_iterator); \
|
2020-02-28 14:40:40 +01:00
|
|
|
for (neighbor_iterator.i = neighbor_iterator.size - 1; neighbor_iterator.i >= 0; \
|
|
|
|
neighbor_iterator.i--) { \
|
|
|
|
neighbor_iterator.index = ni.neighbors[ni.i]; \
|
|
|
|
neighbor_iterator.is_duplicate = (ni.i >= \
|
|
|
|
neighbor_iterator.size - neighbor_iterator.num_duplicates);
|
|
|
|
|
2020-03-27 10:52:14 +11:00
|
|
|
#define SCULPT_VERTEX_NEIGHBORS_ITER_END(neighbor_iterator) \
|
2020-02-28 14:40:40 +01:00
|
|
|
} \
|
|
|
|
if (neighbor_iterator.neighbors != neighbor_iterator.neighbors_fixed) { \
|
|
|
|
MEM_freeN(neighbor_iterator.neighbors); \
|
|
|
|
} \
|
|
|
|
((void)0)
|
2009-01-06 21:23:42 +00:00
|
|
|
|
2020-03-27 18:14:14 +01:00
|
|
|
int SCULPT_active_vertex_get(SculptSession *ss);
|
|
|
|
const float *SCULPT_active_vertex_co_get(SculptSession *ss);
|
2020-04-03 21:46:08 +02:00
|
|
|
void SCULPT_active_vertex_normal_get(SculptSession *ss, float normal[3]);
|
2020-03-27 18:14:14 +01:00
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
bool SCULPT_vertex_is_boundary(SculptSession *ss, const int index);
|
|
|
|
|
2020-04-03 19:16:49 +02:00
|
|
|
/* Sculpt Visibility API */
|
|
|
|
|
|
|
|
void SCULPT_vertex_visible_set(SculptSession *ss, int index, bool visible);
|
|
|
|
bool SCULPT_vertex_visible_get(SculptSession *ss, int index);
|
|
|
|
|
|
|
|
void SCULPT_visibility_sync_all_face_sets_to_vertices(struct SculptSession *ss);
|
|
|
|
void SCULPT_visibility_sync_all_vertex_to_face_sets(struct SculptSession *ss);
|
|
|
|
|
|
|
|
/* Face Sets API */
|
|
|
|
|
|
|
|
int SCULPT_active_face_set_get(SculptSession *ss);
|
|
|
|
int SCULPT_vertex_face_set_get(SculptSession *ss, int index);
|
|
|
|
void SCULPT_vertex_face_set_set(SculptSession *ss, int index, int face_set);
|
|
|
|
|
|
|
|
bool SCULPT_vertex_has_face_set(SculptSession *ss, int index, int face_set);
|
|
|
|
bool SCULPT_vertex_has_unique_face_set(SculptSession *ss, int index);
|
|
|
|
|
|
|
|
int SCULPT_face_set_next_available_get(SculptSession *ss);
|
|
|
|
|
|
|
|
void SCULPT_face_set_visibility_set(SculptSession *ss, int face_set, bool visible);
|
|
|
|
bool SCULPT_vertex_all_face_sets_visible_get(SculptSession *ss, int index);
|
|
|
|
bool SCULPT_vertex_any_face_set_visible_get(SculptSession *ss, int index);
|
|
|
|
|
|
|
|
void SCULPT_face_sets_visibility_invert(SculptSession *ss);
|
|
|
|
void SCULPT_face_sets_visibility_all_set(SculptSession *ss, bool visible);
|
|
|
|
|
2020-03-01 19:53:40 +01:00
|
|
|
/* Sculpt Original Data */
|
|
|
|
typedef struct {
|
|
|
|
struct BMLog *bm_log;
|
|
|
|
|
|
|
|
struct SculptUndoNode *unode;
|
|
|
|
float (*coords)[3];
|
|
|
|
short (*normals)[3];
|
|
|
|
const float *vmasks;
|
|
|
|
|
|
|
|
/* Original coordinate, normal, and mask. */
|
|
|
|
const float *co;
|
|
|
|
const short *no;
|
|
|
|
float mask;
|
|
|
|
} SculptOrigVertData;
|
|
|
|
|
|
|
|
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node);
|
|
|
|
void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter *iter);
|
|
|
|
|
2020-02-28 14:40:40 +01:00
|
|
|
/* Utils. */
|
|
|
|
void SCULPT_calc_brush_plane(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct PBVHNode **nodes,
|
|
|
|
int totnode,
|
|
|
|
float r_area_no[3],
|
|
|
|
float r_area_co[3]);
|
2020-03-06 16:00:33 +01:00
|
|
|
|
|
|
|
void SCULPT_calc_area_normal(
|
|
|
|
Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float r_area_no[3]);
|
|
|
|
|
2020-03-01 19:53:40 +01:00
|
|
|
int SCULPT_nearest_vertex_get(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
const float co[3],
|
|
|
|
float max_distance,
|
|
|
|
bool use_original);
|
|
|
|
|
2020-03-06 16:00:33 +01:00
|
|
|
int SCULPT_plane_point_side(const float co[3], const float plane[4]);
|
|
|
|
int SCULPT_plane_trim(const struct StrokeCache *cache,
|
|
|
|
const struct Brush *brush,
|
|
|
|
const float val[3]);
|
2020-04-03 21:05:20 +02:00
|
|
|
void SCULPT_clip(Sculpt *sd, SculptSession *ss, float co[3], const float val[3]);
|
2020-03-06 16:00:33 +01:00
|
|
|
|
|
|
|
float SCULPT_brush_plane_offset_get(Sculpt *sd, SculptSession *ss);
|
|
|
|
|
2020-03-01 19:53:40 +01:00
|
|
|
ePaintSymmetryAreas SCULPT_get_vertex_symm_area(const float co[3]);
|
|
|
|
bool SCULPT_check_vertex_pivot_symmetry(const float vco[3], const float pco[3], const char symm);
|
2020-04-03 21:05:20 +02:00
|
|
|
bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3],
|
|
|
|
const float br_co[3],
|
|
|
|
float radius,
|
|
|
|
char symm);
|
2020-03-01 19:53:40 +01:00
|
|
|
bool SCULPT_is_symmetry_iteration_valid(char i, char symm);
|
|
|
|
void SCULPT_flip_v3_by_symm_area(float v[3],
|
|
|
|
const ePaintSymmetryFlags symm,
|
|
|
|
const ePaintSymmetryAreas symmarea,
|
|
|
|
const float pivot[3]);
|
|
|
|
void SCULPT_flip_quat_by_symm_area(float quat[3],
|
|
|
|
const ePaintSymmetryFlags symm,
|
|
|
|
const ePaintSymmetryAreas symmarea,
|
|
|
|
const float pivot[3]);
|
|
|
|
|
|
|
|
/* Flood Fill. */
|
|
|
|
typedef struct {
|
2020-03-01 13:59:51 -07:00
|
|
|
GSQueue *queue;
|
2020-03-01 19:53:40 +01:00
|
|
|
char *visited_vertices;
|
|
|
|
} SculptFloodFill;
|
|
|
|
|
|
|
|
void SCULPT_floodfill_init(struct SculptSession *ss, SculptFloodFill *flood);
|
|
|
|
void SCULPT_floodfill_add_active(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct SculptSession *ss,
|
|
|
|
SculptFloodFill *flood,
|
|
|
|
float radius);
|
2020-03-27 18:14:14 +01:00
|
|
|
void SCULPT_floodfill_add_initial_with_symmetry(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct SculptSession *ss,
|
|
|
|
SculptFloodFill *flood,
|
|
|
|
int index,
|
|
|
|
float radius);
|
2020-04-03 21:05:20 +02:00
|
|
|
void SCULPT_floodfill_add_initial(SculptFloodFill *flood, int index);
|
2020-03-01 19:53:40 +01:00
|
|
|
void SCULPT_floodfill_execute(
|
|
|
|
struct SculptSession *ss,
|
|
|
|
SculptFloodFill *flood,
|
|
|
|
bool (*func)(SculptSession *ss, int from_v, int to_v, bool is_duplicate, void *userdata),
|
|
|
|
void *userdata);
|
|
|
|
void SCULPT_floodfill_free(SculptFloodFill *flood);
|
2020-02-28 14:40:40 +01:00
|
|
|
|
2020-04-03 19:42:48 +02:00
|
|
|
/* Dynamic topology */
|
2020-04-03 23:41:54 +02:00
|
|
|
|
|
|
|
enum eDynTopoWarnFlag {
|
|
|
|
DYNTOPO_WARN_VDATA = (1 << 0),
|
|
|
|
DYNTOPO_WARN_EDATA = (1 << 1),
|
|
|
|
DYNTOPO_WARN_LDATA = (1 << 2),
|
|
|
|
DYNTOPO_WARN_MODIFIER = (1 << 3),
|
|
|
|
};
|
|
|
|
|
|
|
|
void SCULPT_dynamic_topology_enable_ex(struct Main *bmain,
|
|
|
|
struct Depsgraph *depsgraph,
|
|
|
|
Scene *scene,
|
|
|
|
Object *ob);
|
|
|
|
void SCULPT_dynamic_topology_disable(bContext *C, struct SculptUndoNode *unode);
|
|
|
|
void sculpt_dynamic_topology_disable_with_undo(struct Main *bmain,
|
|
|
|
struct Depsgraph *depsgraph,
|
|
|
|
Scene *scene,
|
|
|
|
Object *ob);
|
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
bool SCULPT_stroke_is_dynamic_topology(const SculptSession *ss, const Brush *brush);
|
2020-04-03 19:42:48 +02:00
|
|
|
|
2020-04-03 23:41:54 +02:00
|
|
|
void SCULPT_dynamic_topology_triangulate(struct BMesh *bm);
|
|
|
|
void SCULPT_dyntopo_node_layers_add(struct SculptSession *ss);
|
|
|
|
|
|
|
|
enum eDynTopoWarnFlag SCULPT_dynamic_topology_check(Scene *scene, Object *ob);
|
|
|
|
|
|
|
|
void SCULPT_pbvh_clear(Object *ob);
|
|
|
|
|
2020-03-09 19:04:37 +01:00
|
|
|
/* Automasking. */
|
|
|
|
float SCULPT_automasking_factor_get(SculptSession *ss, int vert);
|
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
void SCULPT_automasking_init(Sculpt *sd, Object *ob);
|
|
|
|
void SCULPT_automasking_end(Object *ob);
|
|
|
|
|
|
|
|
bool SCULPT_is_automasking_mode_enabled(const Sculpt *sd,
|
|
|
|
const Brush *br,
|
|
|
|
const eAutomasking_flag mode);
|
|
|
|
bool SCULPT_is_automasking_enabled(const Sculpt *sd, const SculptSession *ss, const Brush *br);
|
|
|
|
|
|
|
|
typedef enum eBoundaryAutomaskMode {
|
|
|
|
AUTOMASK_INIT_BOUNDARY_EDGES = 1,
|
|
|
|
AUTOMASK_INIT_BOUNDARY_FACE_SETS = 2,
|
|
|
|
} eBoundaryAutomaskMode;
|
|
|
|
float *SCULPT_boundary_automasking_init(Object *ob,
|
|
|
|
eBoundaryAutomaskMode mode,
|
|
|
|
int propagation_steps,
|
|
|
|
float *automask_factor);
|
|
|
|
|
2020-04-03 19:42:48 +02:00
|
|
|
/* Filters. */
|
|
|
|
void SCULPT_filter_cache_init(Object *ob, Sculpt *sd);
|
|
|
|
void SCULPT_filter_cache_free(SculptSession *ss);
|
|
|
|
|
2020-04-03 21:46:08 +02:00
|
|
|
void SCULPT_mask_filter_smooth_apply(
|
|
|
|
Sculpt *sd, Object *ob, PBVHNode **nodes, const int totnode, const int smooth_iterations);
|
|
|
|
|
2020-02-28 14:40:40 +01:00
|
|
|
/* Brushes. */
|
|
|
|
|
|
|
|
/* Cloth Brush. */
|
|
|
|
void SCULPT_do_cloth_brush(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct PBVHNode **nodes,
|
|
|
|
int totnode);
|
|
|
|
void SCULPT_cloth_simulation_free(struct SculptClothSimulation *cloth_sim);
|
|
|
|
|
|
|
|
void SCULPT_cloth_simulation_limits_draw(const uint gpuattr,
|
|
|
|
const struct Brush *brush,
|
|
|
|
const float obmat[4][4],
|
|
|
|
const float location[3],
|
|
|
|
const float normal[3],
|
|
|
|
const float rds,
|
|
|
|
const float line_width,
|
|
|
|
const float outline_col[3],
|
|
|
|
const float alpha);
|
|
|
|
void SCULPT_cloth_plane_falloff_preview_draw(const uint gpuattr,
|
|
|
|
struct SculptSession *ss,
|
|
|
|
const float outline_col[3],
|
|
|
|
float outline_alpha);
|
2020-03-01 19:53:40 +01:00
|
|
|
/* Pose Brush. */
|
|
|
|
void SCULPT_do_pose_brush(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct PBVHNode **nodes,
|
|
|
|
int totnode);
|
|
|
|
void SCULPT_pose_calc_pose_data(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct SculptSession *ss,
|
|
|
|
float initial_location[3],
|
|
|
|
float radius,
|
|
|
|
float pose_offset,
|
|
|
|
float *r_pose_origin,
|
|
|
|
float *r_pose_factor);
|
|
|
|
void SCULPT_pose_brush_init(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct SculptSession *ss,
|
|
|
|
struct Brush *br);
|
|
|
|
struct SculptPoseIKChain *SCULPT_pose_ik_chain_init(struct Sculpt *sd,
|
|
|
|
struct Object *ob,
|
|
|
|
struct SculptSession *ss,
|
|
|
|
struct Brush *br,
|
|
|
|
const float initial_location[3],
|
|
|
|
const float radius);
|
|
|
|
void SCULPT_pose_ik_chain_free(struct SculptPoseIKChain *ik_chain);
|
2020-02-28 14:40:40 +01:00
|
|
|
|
2020-03-06 16:00:33 +01:00
|
|
|
/* Multiplane Scrape Brush. */
|
|
|
|
void SCULPT_do_multiplane_scrape_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode);
|
|
|
|
void SCULPT_multiplane_scrape_preview_draw(const uint gpuattr,
|
|
|
|
SculptSession *ss,
|
|
|
|
const float outline_col[3],
|
|
|
|
const float outline_alpha);
|
2020-04-03 19:16:49 +02:00
|
|
|
/* Draw Face Sets Brush. */
|
|
|
|
void SCULPT_do_draw_face_sets_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode);
|
2020-03-06 16:00:33 +01:00
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
/* Smooth Brush. */
|
|
|
|
|
|
|
|
void SCULPT_neighbor_average(SculptSession *ss, float avg[3], uint vert);
|
|
|
|
void SCULPT_bmesh_neighbor_average(float avg[3], struct BMVert *v);
|
|
|
|
|
|
|
|
void SCULPT_bmesh_four_neighbor_average(float avg[3], float direction[3], struct BMVert *v);
|
|
|
|
|
|
|
|
void SCULPT_neighbor_coords_average(SculptSession *ss, float result[3], int index);
|
|
|
|
float SCULPT_neighbor_mask_average(SculptSession *ss, int index);
|
|
|
|
|
|
|
|
void SCULPT_smooth(Sculpt *sd,
|
|
|
|
Object *ob,
|
|
|
|
PBVHNode **nodes,
|
|
|
|
const int totnode,
|
|
|
|
float bstrength,
|
|
|
|
const bool smooth_mask);
|
|
|
|
void SCULPT_do_smooth_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode);
|
|
|
|
|
|
|
|
/* Surface Smooth Brush. */
|
|
|
|
|
|
|
|
void SCULPT_surface_smooth_laplacian_step(SculptSession *ss,
|
|
|
|
float *disp,
|
|
|
|
const float co[3],
|
|
|
|
float (*laplacian_disp)[3],
|
|
|
|
const int v_index,
|
|
|
|
const float origco[3],
|
|
|
|
const float alpha);
|
|
|
|
void SCULPT_surface_smooth_displace_step(SculptSession *ss,
|
|
|
|
float *co,
|
|
|
|
float (*laplacian_disp)[3],
|
|
|
|
const int v_index,
|
|
|
|
const float beta,
|
|
|
|
const float fade);
|
|
|
|
void SCULPT_do_surface_smooth_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode);
|
|
|
|
|
2020-03-09 20:03:48 +01:00
|
|
|
/* Slide/Relax */
|
|
|
|
void SCULPT_relax_vertex(struct SculptSession *ss,
|
|
|
|
struct PBVHVertexIter *vd,
|
|
|
|
float factor,
|
|
|
|
bool filter_boundary_face_sets,
|
|
|
|
float *r_final_pos);
|
|
|
|
|
2010-07-14 14:11:03 +00:00
|
|
|
/* Undo */
|
|
|
|
|
2012-03-14 06:32:43 +00:00
|
|
|
typedef enum {
|
2019-04-17 06:17:24 +02:00
|
|
|
SCULPT_UNDO_COORDS,
|
|
|
|
SCULPT_UNDO_HIDDEN,
|
|
|
|
SCULPT_UNDO_MASK,
|
|
|
|
SCULPT_UNDO_DYNTOPO_BEGIN,
|
|
|
|
SCULPT_UNDO_DYNTOPO_END,
|
|
|
|
SCULPT_UNDO_DYNTOPO_SYMMETRIZE,
|
2019-08-14 18:37:46 +02:00
|
|
|
SCULPT_UNDO_GEOMETRY,
|
2020-03-05 14:53:23 +01:00
|
|
|
SCULPT_UNDO_FACE_SETS,
|
2012-03-14 06:32:43 +00:00
|
|
|
} SculptUndoType;
|
|
|
|
|
2020-03-27 16:37:29 +01:00
|
|
|
/* Storage of geometry for the undo node.
|
|
|
|
* Is used as a storage for either original or modified geometry. */
|
|
|
|
typedef struct SculptUndoNodeGeometry {
|
|
|
|
/* Is used for sanity check, helping with ensuring that two and only two
|
2020-04-03 12:38:04 +11:00
|
|
|
* geometry pushes happened in the undo stack. */
|
2020-03-27 16:37:29 +01:00
|
|
|
bool is_initialized;
|
|
|
|
|
|
|
|
CustomData vdata;
|
|
|
|
CustomData edata;
|
|
|
|
CustomData ldata;
|
|
|
|
CustomData pdata;
|
|
|
|
int totvert;
|
|
|
|
int totedge;
|
|
|
|
int totloop;
|
|
|
|
int totpoly;
|
|
|
|
} SculptUndoNodeGeometry;
|
|
|
|
|
2010-07-14 14:11:03 +00:00
|
|
|
typedef struct SculptUndoNode {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct SculptUndoNode *next, *prev;
|
|
|
|
|
|
|
|
SculptUndoType type;
|
|
|
|
|
|
|
|
char idname[MAX_ID_NAME]; /* name instead of pointer*/
|
|
|
|
void *node; /* only during push, not valid afterwards! */
|
|
|
|
|
|
|
|
float (*co)[3];
|
|
|
|
float (*orig_co)[3];
|
|
|
|
short (*no)[3];
|
|
|
|
float *mask;
|
|
|
|
int totvert;
|
|
|
|
|
|
|
|
/* non-multires */
|
|
|
|
int maxvert; /* to verify if totvert it still the same */
|
|
|
|
int *index; /* to restore into right location */
|
|
|
|
BLI_bitmap *vert_hidden;
|
|
|
|
|
|
|
|
/* multires */
|
|
|
|
int maxgrid; /* same for grid */
|
|
|
|
int gridsize; /* same for grid */
|
|
|
|
int totgrid; /* to restore into right location */
|
|
|
|
int *grids; /* to restore into right location */
|
|
|
|
BLI_bitmap **grid_hidden;
|
|
|
|
|
|
|
|
/* bmesh */
|
|
|
|
struct BMLogEntry *bm_entry;
|
|
|
|
bool applied;
|
|
|
|
|
|
|
|
/* shape keys */
|
|
|
|
char shapeName[sizeof(((KeyBlock *)0))->name];
|
|
|
|
|
2020-03-27 16:37:29 +01:00
|
|
|
/* Geometry modification operations.
|
|
|
|
*
|
|
|
|
* Original geometry is stored before some modification is run and is used to restore state of
|
|
|
|
* the object when undoing the operation
|
|
|
|
*
|
|
|
|
* Modified geometry is stored after the modification and is used to redo the modification. */
|
2020-03-30 09:35:01 +02:00
|
|
|
bool geometry_clear_pbvh;
|
2020-03-27 16:37:29 +01:00
|
|
|
SculptUndoNodeGeometry geometry_original;
|
|
|
|
SculptUndoNodeGeometry geometry_modified;
|
|
|
|
|
|
|
|
/* Geometry at the bmesh enter moment. */
|
|
|
|
SculptUndoNodeGeometry geometry_bmesh_enter;
|
2019-08-14 18:37:46 +02:00
|
|
|
|
2019-09-10 19:55:15 +02:00
|
|
|
/* pivot */
|
|
|
|
float pivot_pos[3];
|
|
|
|
float pivot_rot[4];
|
|
|
|
|
2020-03-05 14:53:23 +01:00
|
|
|
/* Sculpt Face Sets */
|
|
|
|
int *face_sets;
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
size_t undo_size;
|
2010-07-14 14:11:03 +00:00
|
|
|
} SculptUndoNode;
|
|
|
|
|
2017-09-28 01:38:17 +10:00
|
|
|
/* Factor of brush to have rake point following behind
|
2018-01-10 19:57:02 +11:00
|
|
|
* (could be configurable but this is reasonable default). */
|
2017-09-28 01:38:17 +10:00
|
|
|
#define SCULPT_RAKE_BRUSH_FACTOR 0.25f
|
|
|
|
|
|
|
|
struct SculptRakeData {
|
2019-04-17 06:17:24 +02:00
|
|
|
float follow_dist;
|
|
|
|
float follow_co[3];
|
2017-09-28 01:38:17 +10:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Single struct used by all BLI_task threaded callbacks, let's avoid adding 10's of those... */
|
|
|
|
typedef struct SculptThreadedTaskData {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct bContext *C;
|
|
|
|
struct Sculpt *sd;
|
|
|
|
struct Object *ob;
|
|
|
|
const struct Brush *brush;
|
|
|
|
struct PBVHNode **nodes;
|
|
|
|
int totnode;
|
|
|
|
|
|
|
|
struct VPaint *vp;
|
|
|
|
struct VPaintData *vpd;
|
|
|
|
struct WPaintData *wpd;
|
|
|
|
struct WeightPaintInfo *wpi;
|
|
|
|
unsigned int *lcol;
|
|
|
|
struct Mesh *me;
|
|
|
|
/* For passing generic params. */
|
|
|
|
void *custom_data;
|
|
|
|
|
|
|
|
/* Data specific to some callbacks. */
|
2019-04-22 00:18:34 +10:00
|
|
|
|
|
|
|
/* Note: even if only one or two of those are used at a time,
|
|
|
|
* keeping them separated, names help figuring out
|
|
|
|
* what it is, and memory overhead is ridiculous anyway. */
|
2019-04-17 06:17:24 +02:00
|
|
|
float flippedbstrength;
|
|
|
|
float angle;
|
|
|
|
float strength;
|
|
|
|
bool smooth_mask;
|
|
|
|
bool has_bm_orco;
|
|
|
|
|
|
|
|
struct SculptProjectVector *spvc;
|
|
|
|
float *offset;
|
|
|
|
float *grab_delta;
|
|
|
|
float *cono;
|
|
|
|
float *area_no;
|
|
|
|
float *area_no_sp;
|
|
|
|
float *area_co;
|
|
|
|
float (*mat)[4];
|
|
|
|
float (*vertCos)[3];
|
|
|
|
|
2020-02-02 20:11:51 +01:00
|
|
|
/* X and Z vectors aligned to the stroke direction for operations where perpendicular vectors to
|
|
|
|
* the stroke direction are needed. */
|
|
|
|
float (*stroke_xz)[3];
|
|
|
|
|
2019-09-10 19:55:15 +02:00
|
|
|
int filter_type;
|
|
|
|
float filter_strength;
|
|
|
|
|
2019-10-09 16:27:04 +02:00
|
|
|
bool use_area_cos;
|
|
|
|
bool use_area_nos;
|
2019-12-16 23:16:21 +01:00
|
|
|
|
|
|
|
/* 0=towards view, 1=flipped */
|
|
|
|
float (*area_cos)[3];
|
|
|
|
float (*area_nos)[3];
|
|
|
|
int *count_no;
|
|
|
|
int *count_co;
|
|
|
|
|
2019-08-30 16:27:31 +02:00
|
|
|
bool any_vertex_sampled;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2019-09-09 16:20:40 +02:00
|
|
|
float *prev_mask;
|
|
|
|
|
2019-09-27 18:03:18 +02:00
|
|
|
float *pose_factor;
|
2020-01-07 16:46:56 +01:00
|
|
|
float *pose_initial_co;
|
|
|
|
int pose_chain_segment;
|
2019-09-09 17:44:08 +02:00
|
|
|
|
2019-11-06 19:39:34 +01:00
|
|
|
float multiplane_scrape_angle;
|
|
|
|
float multiplane_scrape_planes[2][4];
|
|
|
|
|
2019-09-09 16:58:09 +02:00
|
|
|
float max_distance_squared;
|
|
|
|
float nearest_vertex_search_co[3];
|
|
|
|
|
2020-01-22 02:23:51 +01:00
|
|
|
/* Stabilized strength for the Clay Thumb brush. */
|
|
|
|
float clay_strength;
|
|
|
|
|
2019-09-10 15:11:33 +02:00
|
|
|
int mask_expand_update_it;
|
|
|
|
bool mask_expand_invert_mask;
|
|
|
|
bool mask_expand_use_normals;
|
|
|
|
bool mask_expand_keep_prev_mask;
|
2020-03-05 14:53:23 +01:00
|
|
|
bool mask_expand_create_face_set;
|
2019-09-10 15:11:33 +02:00
|
|
|
|
2019-09-10 19:55:15 +02:00
|
|
|
float transform_mats[8][4][4];
|
|
|
|
|
2020-02-28 14:40:40 +01:00
|
|
|
float cloth_time_step;
|
|
|
|
|
2019-09-30 15:37:37 +02:00
|
|
|
float dirty_mask_min;
|
|
|
|
float dirty_mask_max;
|
|
|
|
bool dirty_mask_dirty_only;
|
|
|
|
|
2020-03-05 14:53:23 +01:00
|
|
|
int face_set;
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ThreadMutex mutex;
|
2017-09-28 01:38:17 +10:00
|
|
|
|
|
|
|
} SculptThreadedTaskData;
|
|
|
|
|
|
|
|
/*************** Brush testing declarations ****************/
|
|
|
|
typedef struct SculptBrushTest {
|
2019-04-17 06:17:24 +02:00
|
|
|
float radius_squared;
|
2020-03-26 16:46:32 +01:00
|
|
|
float radius;
|
2019-04-17 06:17:24 +02:00
|
|
|
float location[3];
|
|
|
|
float dist;
|
|
|
|
int mirror_symmetry_pass;
|
2017-09-28 01:38:17 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* For circle (not sphere) projection. */
|
|
|
|
float plane_view[4];
|
2017-10-06 00:18:11 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Some tool code uses a plane for it's calculateions. */
|
|
|
|
float plane_tool[4];
|
2017-10-02 13:21:23 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* View3d clipping - only set rv3d for clipping */
|
|
|
|
struct RegionView3D *clip_rv3d;
|
2017-09-28 01:38:17 +10:00
|
|
|
} SculptBrushTest;
|
|
|
|
|
2017-10-02 21:07:25 +11:00
|
|
|
typedef bool (*SculptBrushTestFn)(SculptBrushTest *test, const float co[3]);
|
|
|
|
|
2017-09-28 01:38:17 +10:00
|
|
|
typedef struct {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct Sculpt *sd;
|
|
|
|
struct SculptSession *ss;
|
|
|
|
float radius_squared;
|
2020-01-07 16:46:56 +01:00
|
|
|
const float *center;
|
2019-04-17 06:17:24 +02:00
|
|
|
bool original;
|
2019-09-30 15:56:12 +02:00
|
|
|
bool ignore_fully_masked;
|
2017-09-28 01:38:17 +10:00
|
|
|
} SculptSearchSphereData;
|
|
|
|
|
2017-10-02 21:07:25 +11:00
|
|
|
typedef struct {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct Sculpt *sd;
|
|
|
|
struct SculptSession *ss;
|
|
|
|
float radius_squared;
|
|
|
|
bool original;
|
2019-09-30 15:56:12 +02:00
|
|
|
bool ignore_fully_masked;
|
2019-04-17 06:17:24 +02:00
|
|
|
struct DistRayAABB_Precalc *dist_ray_to_aabb_precalc;
|
2017-10-02 21:07:25 +11:00
|
|
|
} SculptSearchCircleData;
|
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_brush_test_init(struct SculptSession *ss, SculptBrushTest *test);
|
|
|
|
bool SCULPT_brush_test_sphere(SculptBrushTest *test, const float co[3]);
|
|
|
|
bool SCULPT_brush_test_sphere_sq(SculptBrushTest *test, const float co[3]);
|
|
|
|
bool SCULPT_brush_test_sphere_fast(const SculptBrushTest *test, const float co[3]);
|
|
|
|
bool SCULPT_brush_test_cube(SculptBrushTest *test,
|
2020-02-11 20:04:41 +01:00
|
|
|
const float co[3],
|
2020-02-13 14:01:52 +11:00
|
|
|
const float local[4][4],
|
2020-02-11 20:04:41 +01:00
|
|
|
const float roundness);
|
2020-03-06 15:24:15 +01:00
|
|
|
bool SCULPT_brush_test_circle_sq(SculptBrushTest *test, const float co[3]);
|
|
|
|
bool SCULPT_search_sphere_cb(PBVHNode *node, void *data_v);
|
|
|
|
bool SCULPT_search_circle_cb(PBVHNode *node, void *data_v);
|
2017-10-06 00:18:11 +11:00
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(SculptSession *ss,
|
2019-04-17 06:17:24 +02:00
|
|
|
SculptBrushTest *test,
|
|
|
|
char falloff_shape);
|
2020-03-06 15:24:15 +01:00
|
|
|
const float *SCULPT_brush_frontface_normal_from_falloff_shape(SculptSession *ss,
|
2019-04-17 06:17:24 +02:00
|
|
|
char falloff_shape);
|
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
float SCULPT_brush_strength_factor(struct SculptSession *ss,
|
|
|
|
const struct Brush *br,
|
|
|
|
const float point[3],
|
|
|
|
const float len,
|
|
|
|
const short vno[3],
|
|
|
|
const float fno[3],
|
|
|
|
const float mask,
|
|
|
|
const int vertex_index,
|
|
|
|
const int thread_id);
|
2017-09-28 01:38:17 +10:00
|
|
|
|
2017-09-29 22:47:08 +10:00
|
|
|
/* just for vertex paint. */
|
2020-03-06 15:24:15 +01:00
|
|
|
bool SCULPT_pbvh_calc_area_normal(const struct Brush *brush,
|
2019-04-17 06:17:24 +02:00
|
|
|
Object *ob,
|
|
|
|
PBVHNode **nodes,
|
|
|
|
int totnode,
|
|
|
|
bool use_threading,
|
|
|
|
float r_area_no[3]);
|
2017-09-28 01:38:17 +10:00
|
|
|
|
|
|
|
/* Cache stroke properties. Used because
|
2018-01-10 19:57:02 +11:00
|
|
|
* RNA property lookup isn't particularly fast.
|
|
|
|
*
|
|
|
|
* For descriptions of these settings, check the operator properties.
|
|
|
|
*/
|
2017-09-28 01:38:17 +10:00
|
|
|
|
2020-03-27 10:52:14 +11:00
|
|
|
#define SCULPT_CLAY_STABILIZER_LEN 10
|
2020-01-22 02:23:51 +01:00
|
|
|
|
2017-09-28 01:38:17 +10:00
|
|
|
typedef struct StrokeCache {
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Invariants */
|
|
|
|
float initial_radius;
|
|
|
|
float scale[3];
|
|
|
|
int flag;
|
|
|
|
float clip_tolerance[3];
|
|
|
|
float initial_mouse[2];
|
|
|
|
|
|
|
|
/* Variants */
|
|
|
|
float radius;
|
|
|
|
float radius_squared;
|
|
|
|
float true_location[3];
|
|
|
|
float true_last_location[3];
|
|
|
|
float location[3];
|
|
|
|
float last_location[3];
|
2019-11-24 21:15:48 +01:00
|
|
|
|
2020-03-09 20:03:48 +01:00
|
|
|
/* Used for alternating between deformation in brushes that need to apply different ones to
|
|
|
|
* achieve certain effects. */
|
|
|
|
int iteration_count;
|
|
|
|
|
2019-12-01 20:29:11 +01:00
|
|
|
/* Original pixel radius with the pressure curve applied for dyntopo detail size */
|
|
|
|
float dyntopo_pixel_radius;
|
2019-11-24 21:15:48 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
bool is_last_valid;
|
|
|
|
|
|
|
|
bool pen_flip;
|
|
|
|
bool invert;
|
|
|
|
float pressure;
|
|
|
|
float mouse[2];
|
|
|
|
float bstrength;
|
|
|
|
float normal_weight; /* from brush (with optional override) */
|
|
|
|
|
|
|
|
/* The rest is temporary storage that isn't saved as a property */
|
|
|
|
|
|
|
|
bool first_time; /* Beginning of stroke may do some things special */
|
|
|
|
|
|
|
|
/* from ED_view3d_ob_project_mat_get() */
|
|
|
|
float projection_mat[4][4];
|
|
|
|
|
|
|
|
/* Clean this up! */
|
|
|
|
struct ViewContext *vc;
|
|
|
|
const struct Brush *brush;
|
|
|
|
|
|
|
|
float special_rotation;
|
|
|
|
float grab_delta[3], grab_delta_symmetry[3];
|
|
|
|
float old_grab_location[3], orig_grab_location[3];
|
|
|
|
|
|
|
|
/* screen-space rotation defined by mouse motion */
|
|
|
|
float rake_rotation[4], rake_rotation_symmetry[4];
|
|
|
|
bool is_rake_rotation_valid;
|
|
|
|
struct SculptRakeData rake_data;
|
|
|
|
|
2020-03-05 14:53:23 +01:00
|
|
|
/* Face Sets */
|
|
|
|
int paint_face_set;
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Symmetry index between 0 and 7 bit combo 0 is Brush only;
|
|
|
|
* 1 is X mirror; 2 is Y mirror; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */
|
|
|
|
int symmetry;
|
|
|
|
int mirror_symmetry_pass; /* the symmetry pass we are currently on between 0 and 7*/
|
|
|
|
float true_view_normal[3];
|
|
|
|
float view_normal[3];
|
|
|
|
|
|
|
|
/* sculpt_normal gets calculated by calc_sculpt_normal(), then the
|
|
|
|
* sculpt_normal_symm gets updated quickly with the usual symmetry
|
|
|
|
* transforms */
|
|
|
|
float sculpt_normal[3];
|
|
|
|
float sculpt_normal_symm[3];
|
|
|
|
|
|
|
|
/* Used for area texture mode, local_mat gets calculated by
|
|
|
|
* calc_brush_local_mat() and used in tex_strength(). */
|
|
|
|
float brush_local_mat[4][4];
|
|
|
|
|
|
|
|
float plane_offset[3]; /* used to shift the plane around when doing tiled strokes */
|
|
|
|
int tile_pass;
|
|
|
|
|
|
|
|
float last_center[3];
|
|
|
|
int radial_symmetry_pass;
|
|
|
|
float symm_rot_mat[4][4];
|
|
|
|
float symm_rot_mat_inv[4][4];
|
|
|
|
bool original;
|
|
|
|
float anchored_location[3];
|
|
|
|
|
2019-09-09 17:44:08 +02:00
|
|
|
/* Pose brush */
|
2020-01-08 12:59:48 +11:00
|
|
|
struct SculptPoseIKChain *pose_ik_chain;
|
2019-09-09 17:44:08 +02:00
|
|
|
|
2020-01-22 02:23:51 +01:00
|
|
|
/* Clay Thumb brush */
|
|
|
|
/* Angle of the front tilting plane of the brush to simulate clay accumulation. */
|
|
|
|
float clay_thumb_front_angle;
|
|
|
|
/* Stores pressure samples to get an stabilized strength and radius variation. */
|
2020-03-27 10:52:14 +11:00
|
|
|
float clay_pressure_stabilizer[SCULPT_CLAY_STABILIZER_LEN];
|
2020-01-22 02:23:51 +01:00
|
|
|
int clay_pressure_stabilizer_index;
|
|
|
|
|
2020-02-28 14:40:40 +01:00
|
|
|
/* Cloth brush */
|
|
|
|
struct SculptClothSimulation *cloth_sim;
|
|
|
|
float initial_location[3];
|
|
|
|
float true_initial_location[3];
|
|
|
|
float initial_normal[3];
|
|
|
|
float true_initial_normal[3];
|
|
|
|
|
2020-03-26 16:05:46 +01:00
|
|
|
/* Surface Smooth Brush */
|
|
|
|
/* Stores the displacement produced by the laplacian step of HC smooth. */
|
|
|
|
float (*surface_smooth_laplacian_disp)[3];
|
|
|
|
|
2020-04-14 21:06:49 +02:00
|
|
|
/* Layer brush */
|
|
|
|
float *layer_displacement_factor;
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
float vertex_rotation; /* amount to rotate the vertices when using rotate brush */
|
|
|
|
struct Dial *dial;
|
|
|
|
|
|
|
|
char saved_active_brush_name[MAX_ID_NAME];
|
|
|
|
char saved_mask_brush_tool;
|
|
|
|
int saved_smooth_size; /* smooth tool copies the size of the current tool */
|
|
|
|
bool alt_smooth;
|
|
|
|
|
|
|
|
float plane_trim_squared;
|
|
|
|
|
|
|
|
bool supports_gravity;
|
|
|
|
float true_gravity_direction[3];
|
|
|
|
float gravity_direction[3];
|
|
|
|
|
2019-09-09 16:58:09 +02:00
|
|
|
float *automask;
|
|
|
|
|
2019-11-06 19:39:34 +01:00
|
|
|
float stroke_local_mat[4][4];
|
2020-03-01 19:12:30 +01:00
|
|
|
float multiplane_scrape_angle;
|
2019-11-06 19:39:34 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
rcti previous_r; /* previous redraw rectangle */
|
|
|
|
rcti current_r; /* current redraw rectangle */
|
2017-09-28 01:38:17 +10:00
|
|
|
|
|
|
|
} StrokeCache;
|
|
|
|
|
2019-09-09 15:42:51 +02:00
|
|
|
typedef struct FilterCache {
|
|
|
|
bool enabled_axis[3];
|
|
|
|
int random_seed;
|
|
|
|
|
2020-03-09 20:03:48 +01:00
|
|
|
/* Used for alternating between filter operations in filters that need to apply different ones to
|
|
|
|
* achieve certain effects. */
|
|
|
|
int iteration_count;
|
|
|
|
|
2020-03-26 16:05:46 +01:00
|
|
|
/* Stores the displacement produced by the laplacian step of HC smooth. */
|
|
|
|
float (*surface_smooth_laplacian_disp)[3];
|
|
|
|
float surface_smooth_shape_preservation;
|
|
|
|
float surface_smooth_current_vertex;
|
|
|
|
|
2020-04-05 02:00:50 +02:00
|
|
|
/* Sharpen mesh filter. */
|
|
|
|
float sharpen_smooth_ratio;
|
|
|
|
float *sharpen_factor;
|
|
|
|
float (*accum_disp)[3];
|
|
|
|
|
2019-09-09 15:42:51 +02:00
|
|
|
/* unmasked nodes */
|
|
|
|
PBVHNode **nodes;
|
|
|
|
int totnode;
|
|
|
|
|
|
|
|
/* mask expand iteration caches */
|
|
|
|
int mask_update_current_it;
|
|
|
|
int mask_update_last_it;
|
|
|
|
int *mask_update_it;
|
2019-09-10 15:11:33 +02:00
|
|
|
float *normal_factor;
|
2019-10-08 14:57:37 +02:00
|
|
|
float *edge_factor;
|
2019-09-10 15:11:33 +02:00
|
|
|
float *prev_mask;
|
2019-09-10 19:55:15 +02:00
|
|
|
float mask_expand_initial_co[3];
|
2020-03-05 14:53:23 +01:00
|
|
|
|
2020-03-10 19:01:57 +01:00
|
|
|
/* Used to prevent undesired results on certain mesh filters. */
|
|
|
|
float *automask;
|
|
|
|
|
2020-03-05 14:53:23 +01:00
|
|
|
int new_face_set;
|
|
|
|
int *prev_face_set;
|
|
|
|
|
|
|
|
int active_face_set;
|
2019-09-09 15:42:51 +02:00
|
|
|
} FilterCache;
|
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_cache_calc_brushdata_symm(StrokeCache *cache,
|
2019-04-17 06:17:24 +02:00
|
|
|
const char symm,
|
|
|
|
const char axis,
|
|
|
|
const float angle);
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_cache_free(StrokeCache *cache);
|
2017-09-28 01:38:17 +10:00
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
SculptUndoNode *SCULPT_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType type);
|
|
|
|
SculptUndoNode *SCULPT_undo_get_node(PBVHNode *node);
|
2020-05-06 08:17:27 +10:00
|
|
|
SculptUndoNode *SCULPT_undo_get_first_node(void);
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_undo_push_begin(const char *name);
|
|
|
|
void SCULPT_undo_push_end(void);
|
2020-04-03 02:35:25 +02:00
|
|
|
void SCULPT_undo_push_end_ex(const bool use_nested_undo);
|
2010-07-14 14:11:03 +00:00
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_vertcos_to_key(Object *ob, KeyBlock *kb, const float (*vertCos)[3]);
|
2010-07-14 14:11:03 +00:00
|
|
|
|
2020-03-06 15:24:15 +01:00
|
|
|
void SCULPT_update_object_bounding_box(struct Object *ob);
|
2014-02-04 19:47:17 +06:00
|
|
|
|
2020-03-06 16:56:42 +01:00
|
|
|
bool SCULPT_get_redraw_rect(struct ARegion *region,
|
|
|
|
struct RegionView3D *rv3d,
|
|
|
|
Object *ob,
|
|
|
|
rcti *rect);
|
2017-09-28 01:38:17 +10:00
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
/* Operators. */
|
2020-04-03 19:16:49 +02:00
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
/* Face Sets. */
|
2020-04-03 19:16:49 +02:00
|
|
|
void SCULPT_OT_face_sets_randomize_colors(struct wmOperatorType *ot);
|
|
|
|
void SCULPT_OT_face_sets_change_visibility(struct wmOperatorType *ot);
|
|
|
|
void SCULPT_OT_face_sets_init(struct wmOperatorType *ot);
|
|
|
|
void SCULPT_OT_face_sets_create(struct wmOperatorType *ot);
|
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
/* Transform. */
|
2020-04-03 19:42:48 +02:00
|
|
|
void SCULPT_OT_set_pivot_position(struct wmOperatorType *ot);
|
|
|
|
|
2020-04-03 21:05:20 +02:00
|
|
|
/* Mesh Filter. */
|
|
|
|
void SCULPT_OT_mesh_filter(struct wmOperatorType *ot);
|
|
|
|
|
2020-04-03 21:46:08 +02:00
|
|
|
/* Mask filter and Dirty Mask. */
|
|
|
|
void SCULPT_OT_mask_filter(struct wmOperatorType *ot);
|
|
|
|
void SCULPT_OT_dirty_mask(struct wmOperatorType *ot);
|
|
|
|
|
|
|
|
/* Mask and Face Sets Expand. */
|
|
|
|
void SCULPT_OT_mask_expand(struct wmOperatorType *ot);
|
|
|
|
|
2020-04-03 23:41:54 +02:00
|
|
|
/* Detail size. */
|
|
|
|
void SCULPT_OT_detail_flood_fill(struct wmOperatorType *ot);
|
|
|
|
void SCULPT_OT_sample_detail_size(struct wmOperatorType *ot);
|
|
|
|
void SCULPT_OT_set_detail_size(struct wmOperatorType *ot);
|
|
|
|
|
|
|
|
/* Dyntopo. */
|
|
|
|
void SCULPT_OT_dynamic_topology_toggle(struct wmOperatorType *ot);
|
|
|
|
|
2009-01-06 21:23:42 +00:00
|
|
|
#endif
|