GPencil: Add Layer and Material to Blank objects
Instead to create only the Blank object, now a new Layer and a simple material is added. This is a common request of artists. Reviewed By: mendio, pepeland Differential Revision: https://developer.blender.org/D11110
This commit is contained in:
parent
baa51666ed
commit
5cb1e18f72
Notes:
blender-bot
2023-02-14 05:04:52 +01:00
Referenced by commit4338595a97
, Add break statement missing from5cb1e18f72
|
@ -36,6 +36,7 @@ set(SRC
|
|||
annotate_paint.c
|
||||
drawgpencil.c
|
||||
editaction_gpencil.c
|
||||
gpencil_add_blank.c
|
||||
gpencil_add_lineart.c
|
||||
gpencil_add_monkey.c
|
||||
gpencil_add_stroke.c
|
||||
|
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* 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,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2017 Blender Foundation
|
||||
* This is a new part of Blender
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \ingroup edgpencil
|
||||
*/
|
||||
|
||||
#include "BLI_math.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "DNA_gpencil_types.h"
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_gpencil.h"
|
||||
#include "BKE_gpencil_geom.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_material.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "ED_gpencil.h"
|
||||
|
||||
/* Definition of the most important info from a color */
|
||||
typedef struct ColorTemplate {
|
||||
const char *name;
|
||||
float line[4];
|
||||
float fill[4];
|
||||
} ColorTemplate;
|
||||
|
||||
/* Add color an ensure duplications (matched by name) */
|
||||
static int gpencil_stroke_material(Main *bmain, Object *ob, const ColorTemplate *pct)
|
||||
{
|
||||
int index;
|
||||
Material *ma = BKE_gpencil_object_material_ensure_by_name(bmain, ob, pct->name, &index);
|
||||
|
||||
copy_v4_v4(ma->gp_style->stroke_rgba, pct->line);
|
||||
srgb_to_linearrgb_v4(ma->gp_style->stroke_rgba, ma->gp_style->stroke_rgba);
|
||||
|
||||
copy_v4_v4(ma->gp_style->fill_rgba, pct->fill);
|
||||
srgb_to_linearrgb_v4(ma->gp_style->fill_rgba, ma->gp_style->fill_rgba);
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
/* ***************************************************************** */
|
||||
/* Stroke Geometry */
|
||||
|
||||
/* ***************************************************************** */
|
||||
/* Color Data */
|
||||
|
||||
static const ColorTemplate gp_stroke_material_black = {
|
||||
"Black",
|
||||
{0.0f, 0.0f, 0.0f, 1.0f},
|
||||
{0.0f, 0.0f, 0.0f, 0.0f},
|
||||
};
|
||||
|
||||
/* ***************************************************************** */
|
||||
/* Blank API */
|
||||
|
||||
/* Add a Simple empty object with one layer and one color. */
|
||||
void ED_gpencil_create_blank(bContext *C, Object *ob, float mat[4][4])
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
bGPdata *gpd = (bGPdata *)ob->data;
|
||||
|
||||
/* create colors */
|
||||
int color_black = gpencil_stroke_material(bmain, ob, &gp_stroke_material_black);
|
||||
|
||||
/* set first color as active and in brushes */
|
||||
ob->actcol = color_black + 1;
|
||||
|
||||
/* layers */
|
||||
bGPDlayer *layer = BKE_gpencil_layer_addnew(gpd, "GP_Layer", true);
|
||||
|
||||
/* frames */
|
||||
BKE_gpencil_frame_addnew(layer, CFRA);
|
||||
|
||||
/* update depsgraph */
|
||||
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
|
||||
gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
|
||||
}
|
|
@ -249,6 +249,7 @@ void ED_gpencil_brush_draw_eraser(struct Brush *brush, int x, int y);
|
|||
|
||||
/* ----------- Add Primitive Utilities -------------- */
|
||||
|
||||
void ED_gpencil_create_blank(struct bContext *C, struct Object *ob, float mat[4][4]);
|
||||
void ED_gpencil_create_monkey(struct bContext *C, struct Object *ob, float mat[4][4]);
|
||||
void ED_gpencil_create_stroke(struct bContext *C, struct Object *ob, float mat[4][4]);
|
||||
void ED_gpencil_create_lineart(struct bContext *C, struct Object *ob);
|
||||
|
|
|
@ -1321,12 +1321,14 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op)
|
|||
if (!ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, NULL, NULL, &local_view_bits, NULL)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
/* add new object if not currently editing a GP object,
|
||||
* or if "empty" was chosen (i.e. user wants a blank GP canvas)
|
||||
*/
|
||||
if ((gpd == NULL) || (GPENCIL_ANY_MODE(gpd) == false) || (type == GP_EMPTY)) {
|
||||
/* Add new object if not currently editing a GP object. */
|
||||
if ((gpd == NULL) || (GPENCIL_ANY_MODE(gpd) == false)) {
|
||||
const char *ob_name = NULL;
|
||||
switch (type) {
|
||||
case GP_EMPTY: {
|
||||
ob_name = "GPencil";
|
||||
break;
|
||||
}
|
||||
case GP_MONKEY: {
|
||||
ob_name = "Suzanne";
|
||||
break;
|
||||
|
@ -1356,6 +1358,13 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op)
|
|||
|
||||
/* create relevant geometry */
|
||||
switch (type) {
|
||||
case GP_EMPTY: {
|
||||
float mat[4][4];
|
||||
|
||||
ED_object_new_primitive_matrix(C, ob, loc, rot, mat);
|
||||
ED_gpencil_create_blank(C, ob, mat);
|
||||
break;
|
||||
}
|
||||
case GP_STROKE: {
|
||||
float radius = RNA_float_get(op->ptr, "radius");
|
||||
float mat[4][4];
|
||||
|
@ -1423,10 +1432,6 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op)
|
|||
/* Stroke object is drawn in front of meshes by default. */
|
||||
ob->dtx |= OB_DRAW_IN_FRONT;
|
||||
}
|
||||
case GP_EMPTY:
|
||||
/* do nothing */
|
||||
break;
|
||||
|
||||
default:
|
||||
BKE_report(op->reports, RPT_WARNING, "Not implemented");
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue