This patch is a cleanup required before refactoring the view layer syncing
process {T73411}.
* Remove FIRSTBASE.
* Remove LASTBASE.
* Remove BASACT.
* Remove OBEDIT_FROM_WORKSPACE.
* Replace OBACT with BKE_view_layer_active_object.
* Replace OBEDIT_FROM_VIEW_LAYER with BKE_view_layer_edit_object.
Reviewed By: mont29
Maniphest Tasks: T73411
Differential Revision: https://developer.blender.org/D15799
169 lines
4.6 KiB
C
169 lines
4.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2004-2008 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup spview3d
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "DNA_gpencil_types.h"
|
|
#include "DNA_object_types.h"
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "BLI_math_base.h"
|
|
#include "BLI_utildefines.h"
|
|
|
|
#include "BLT_translation.h"
|
|
|
|
#include "BKE_context.h"
|
|
#include "BKE_editmesh.h"
|
|
#include "BKE_layer.h"
|
|
|
|
#include "DEG_depsgraph.h"
|
|
|
|
#include "RNA_access.h"
|
|
#include "RNA_prototypes.h"
|
|
|
|
#include "WM_api.h"
|
|
#include "WM_types.h"
|
|
|
|
#include "ED_mesh.h"
|
|
#include "ED_undo.h"
|
|
|
|
#include "UI_interface.h"
|
|
#include "UI_resources.h"
|
|
|
|
#include "view3d_intern.h"
|
|
|
|
#define B_SEL_VERT 110
|
|
#define B_SEL_EDGE 111
|
|
#define B_SEL_FACE 112
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Toggle Matcap Flip Operator
|
|
* \{ */
|
|
|
|
static int toggle_matcap_flip(bContext *C, wmOperator *UNUSED(op))
|
|
{
|
|
View3D *v3d = CTX_wm_view3d(C);
|
|
|
|
if (v3d) {
|
|
v3d->shading.flag ^= V3D_SHADING_MATCAP_FLIP_X;
|
|
ED_view3d_shade_update(CTX_data_main(C), v3d, CTX_wm_area(C));
|
|
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d);
|
|
}
|
|
else {
|
|
Scene *scene = CTX_data_scene(C);
|
|
scene->display.shading.flag ^= V3D_SHADING_MATCAP_FLIP_X;
|
|
DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE);
|
|
WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene);
|
|
}
|
|
|
|
return OPERATOR_FINISHED;
|
|
}
|
|
|
|
void VIEW3D_OT_toggle_matcap_flip(wmOperatorType *ot)
|
|
{
|
|
/* identifiers */
|
|
ot->name = "Flip MatCap";
|
|
ot->description = "Flip MatCap";
|
|
ot->idname = "VIEW3D_OT_toggle_matcap_flip";
|
|
|
|
/* api callbacks */
|
|
ot->exec = toggle_matcap_flip;
|
|
}
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name UI Templates
|
|
* \{ */
|
|
|
|
void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C)
|
|
{
|
|
Object *obedit = CTX_data_edit_object(C);
|
|
if (!obedit || obedit->type != OB_MESH) {
|
|
return;
|
|
}
|
|
|
|
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
|
uiLayout *row = uiLayoutRow(layout, true);
|
|
|
|
PointerRNA op_ptr;
|
|
wmOperatorType *ot = WM_operatortype_find("MESH_OT_select_mode", true);
|
|
uiItemFullO_ptr(row,
|
|
ot,
|
|
"",
|
|
ICON_VERTEXSEL,
|
|
NULL,
|
|
WM_OP_INVOKE_DEFAULT,
|
|
(em->selectmode & SCE_SELECT_VERTEX) ? UI_ITEM_O_DEPRESS : 0,
|
|
&op_ptr);
|
|
RNA_enum_set(&op_ptr, "type", SCE_SELECT_VERTEX);
|
|
uiItemFullO_ptr(row,
|
|
ot,
|
|
"",
|
|
ICON_EDGESEL,
|
|
NULL,
|
|
WM_OP_INVOKE_DEFAULT,
|
|
(em->selectmode & SCE_SELECT_EDGE) ? UI_ITEM_O_DEPRESS : 0,
|
|
&op_ptr);
|
|
RNA_enum_set(&op_ptr, "type", SCE_SELECT_EDGE);
|
|
uiItemFullO_ptr(row,
|
|
ot,
|
|
"",
|
|
ICON_FACESEL,
|
|
NULL,
|
|
WM_OP_INVOKE_DEFAULT,
|
|
(em->selectmode & SCE_SELECT_FACE) ? UI_ITEM_O_DEPRESS : 0,
|
|
&op_ptr);
|
|
RNA_enum_set(&op_ptr, "type", SCE_SELECT_FACE);
|
|
}
|
|
|
|
static void uiTemplatePaintModeSelection(uiLayout *layout, struct bContext *C)
|
|
{
|
|
ViewLayer *view_layer = CTX_data_view_layer(C);
|
|
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
|
|
|
/* Gizmos aren't used in paint modes */
|
|
if (!ELEM(ob->mode, OB_MODE_SCULPT, OB_MODE_PARTICLE_EDIT)) {
|
|
/* masks aren't used for sculpt and particle painting */
|
|
PointerRNA meshptr;
|
|
|
|
RNA_pointer_create(ob->data, &RNA_Mesh, ob->data, &meshptr);
|
|
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
|
uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
|
|
}
|
|
else {
|
|
uiLayout *row = uiLayoutRow(layout, true);
|
|
uiItemR(row, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
|
|
uiItemR(row, &meshptr, "use_paint_mask_vertex", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void uiTemplateHeader3D_mode(uiLayout *layout, struct bContext *C)
|
|
{
|
|
ViewLayer *view_layer = CTX_data_view_layer(C);
|
|
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
|
Object *obedit = CTX_data_edit_object(C);
|
|
bGPdata *gpd = CTX_data_gpencil_data(C);
|
|
|
|
bool is_paint = (ob && !(gpd && (gpd->flag & GP_DATA_STROKE_EDITMODE)) &&
|
|
ELEM(ob->mode,
|
|
OB_MODE_SCULPT,
|
|
OB_MODE_VERTEX_PAINT,
|
|
OB_MODE_WEIGHT_PAINT,
|
|
OB_MODE_TEXTURE_PAINT));
|
|
|
|
uiTemplateEditModeSelection(layout, C);
|
|
if ((obedit == NULL) && is_paint) {
|
|
uiTemplatePaintModeSelection(layout, C);
|
|
}
|
|
}
|
|
|
|
/** \} */
|