269 lines
7.3 KiB
C
269 lines
7.3 KiB
C
|
/*
|
||
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
* ***** END GPL LICENSE BLOCK *****
|
||
|
*/
|
||
|
|
||
|
#include "DNA_dynamicpaint_types.h"
|
||
|
#include "DNA_modifier_types.h"
|
||
|
#include "DNA_object_types.h"
|
||
|
#include "DNA_scene_types.h"
|
||
|
|
||
|
#include "BKE_context.h"
|
||
|
#include "BKE_deform.h"
|
||
|
#include "BKE_depsgraph.h"
|
||
|
#include "BKE_dynamicpaint.h"
|
||
|
#include "BKE_modifier.h"
|
||
|
|
||
|
#include "ED_mesh.h"
|
||
|
#include "ED_screen.h"
|
||
|
|
||
|
#include "RNA_access.h"
|
||
|
#include "RNA_define.h"
|
||
|
#include "RNA_enum_types.h"
|
||
|
|
||
|
#include "WM_types.h"
|
||
|
#include "WM_api.h"
|
||
|
|
||
|
static int dynamicpaint_bake_exec(bContext *C, wmOperator *op)
|
||
|
{
|
||
|
/* Bake dynamic paint */
|
||
|
if(!dynamicPaint_initBake(C, op)) {
|
||
|
return OPERATOR_CANCELLED;}
|
||
|
|
||
|
return OPERATOR_FINISHED;
|
||
|
}
|
||
|
|
||
|
void DPAINT_OT_bake(wmOperatorType *ot)
|
||
|
{
|
||
|
/* identifiers */
|
||
|
ot->name= "Dynamic Paint Bake";
|
||
|
ot->description= "Bake dynamic paint image sequence surface";
|
||
|
ot->idname= "DPAINT_OT_bake";
|
||
|
|
||
|
/* api callbacks */
|
||
|
ot->exec= dynamicpaint_bake_exec;
|
||
|
ot->poll= ED_operator_object_active_editable;
|
||
|
}
|
||
|
|
||
|
static int surface_slot_add_exec(bContext *C, wmOperator *op)
|
||
|
{
|
||
|
DynamicPaintModifierData *pmd = 0;
|
||
|
Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
|
||
|
DynamicPaintSurface *surface;
|
||
|
|
||
|
/* Make sure we're dealing with a canvas */
|
||
|
pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
|
||
|
if (!pmd) return OPERATOR_CANCELLED;
|
||
|
if (!pmd->canvas) return OPERATOR_CANCELLED;
|
||
|
|
||
|
surface = dynamicPaint_createNewSurface(pmd->canvas, CTX_data_scene(C));
|
||
|
|
||
|
if (!surface) return OPERATOR_CANCELLED;
|
||
|
|
||
|
/* set preview for this surface only and set active */
|
||
|
pmd->canvas->active_sur = 0;
|
||
|
for(surface=surface->prev; surface; surface=surface->prev) {
|
||
|
surface->flags &= ~MOD_DPAINT_PREVIEW;
|
||
|
pmd->canvas->active_sur++;
|
||
|
}
|
||
|
|
||
|
return OPERATOR_FINISHED;
|
||
|
}
|
||
|
|
||
|
/* add surface slot */
|
||
|
void DPAINT_OT_surface_slot_add(wmOperatorType *ot)
|
||
|
{
|
||
|
/* identifiers */
|
||
|
ot->name= "Add Surface Slot";
|
||
|
ot->idname= "DPAINT_OT_surface_slot_add";
|
||
|
ot->description="Add a new Dynamic Paint surface slot";
|
||
|
|
||
|
/* api callbacks */
|
||
|
ot->exec= surface_slot_add_exec;
|
||
|
ot->poll= ED_operator_object_active_editable;
|
||
|
|
||
|
/* flags */
|
||
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||
|
}
|
||
|
|
||
|
static int surface_slot_remove_exec(bContext *C, wmOperator *op)
|
||
|
{
|
||
|
DynamicPaintModifierData *pmd = 0;
|
||
|
Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
|
||
|
DynamicPaintSurface *surface;
|
||
|
int id=0;
|
||
|
|
||
|
/* Make sure we're dealing with a canvas */
|
||
|
pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
|
||
|
if (!pmd) return OPERATOR_CANCELLED;
|
||
|
if (!pmd->canvas) return OPERATOR_CANCELLED;
|
||
|
|
||
|
surface = pmd->canvas->surfaces.first;
|
||
|
|
||
|
/* find active surface and remove it */
|
||
|
for(; surface; surface=surface->next) {
|
||
|
if(id == pmd->canvas->active_sur) {
|
||
|
pmd->canvas->active_sur -= 1;
|
||
|
dynamicPaint_freeSurface(surface);
|
||
|
break;
|
||
|
}
|
||
|
id++;
|
||
|
}
|
||
|
|
||
|
dynamicPaint_resetPreview(pmd->canvas);
|
||
|
DAG_id_tag_update(&cObject->id, OB_RECALC_DATA);
|
||
|
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, cObject);
|
||
|
|
||
|
return OPERATOR_FINISHED;
|
||
|
}
|
||
|
|
||
|
/* remove surface slot */
|
||
|
void DPAINT_OT_surface_slot_remove(wmOperatorType *ot)
|
||
|
{
|
||
|
/* identifiers */
|
||
|
ot->name= "Remove Surface Slot";
|
||
|
ot->idname= "DPAINT_OT_surface_slot_remove";
|
||
|
ot->description="Remove the selected surface slot";
|
||
|
|
||
|
/* api callbacks */
|
||
|
ot->exec= surface_slot_remove_exec;
|
||
|
ot->poll= ED_operator_object_active_editable;
|
||
|
|
||
|
/* flags */
|
||
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||
|
}
|
||
|
|
||
|
static int type_toggle_exec(bContext *C, wmOperator *op)
|
||
|
{
|
||
|
|
||
|
Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
|
||
|
Scene *scene = CTX_data_scene(C);
|
||
|
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
|
||
|
int type= RNA_enum_get(op->ptr, "type");
|
||
|
|
||
|
if (!pmd) return OPERATOR_CANCELLED;
|
||
|
|
||
|
/* if type is already enabled, toggle it off */
|
||
|
if (type == MOD_DYNAMICPAINT_TYPE_CANVAS && pmd->canvas) {
|
||
|
dynamicPaint_freeCanvas(pmd);
|
||
|
}
|
||
|
else if (type == MOD_DYNAMICPAINT_TYPE_BRUSH && pmd->brush) {
|
||
|
dynamicPaint_freeBrush(pmd);
|
||
|
}
|
||
|
/* else create a new type */
|
||
|
else {
|
||
|
if (!dynamicPaint_createType(pmd, type, scene))
|
||
|
return OPERATOR_CANCELLED;
|
||
|
}
|
||
|
|
||
|
/* update dependancy */
|
||
|
DAG_id_tag_update(&cObject->id, OB_RECALC_DATA);
|
||
|
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, cObject);
|
||
|
DAG_scene_sort(CTX_data_main(C), scene);
|
||
|
|
||
|
return OPERATOR_FINISHED;
|
||
|
}
|
||
|
|
||
|
void DPAINT_OT_type_toggle(wmOperatorType *ot)
|
||
|
{
|
||
|
PropertyRNA *prop;
|
||
|
|
||
|
/* identifiers */
|
||
|
ot->name= "Toggle Type Active";
|
||
|
ot->idname= "DPAINT_OT_type_toggle";
|
||
|
ot->description = "Toggles whether given type is active or not";
|
||
|
|
||
|
/* api callbacks */
|
||
|
ot->exec= type_toggle_exec;
|
||
|
ot->poll= ED_operator_object_active_editable;
|
||
|
|
||
|
/* flags */
|
||
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||
|
|
||
|
/* properties */
|
||
|
prop= RNA_def_enum(ot->srna, "type", prop_dynamicpaint_type_items, MOD_DYNAMICPAINT_TYPE_CANVAS, "Type", "");
|
||
|
ot->prop= prop;
|
||
|
}
|
||
|
|
||
|
static int output_toggle_exec(bContext *C, wmOperator *op)
|
||
|
{
|
||
|
|
||
|
Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
|
||
|
Scene *scene = CTX_data_scene(C);
|
||
|
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
|
||
|
int index= RNA_int_get(op->ptr, "index");
|
||
|
|
||
|
if (!pmd) return OPERATOR_CANCELLED;
|
||
|
|
||
|
|
||
|
/* if type is already enabled, toggle it off */
|
||
|
if (pmd->canvas) {
|
||
|
DynamicPaintSurface *surface = get_activeSurface(pmd->canvas);
|
||
|
|
||
|
if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
|
||
|
int exists = dynamicPaint_outputLayerExists(surface, ob, index);
|
||
|
char *name;
|
||
|
|
||
|
if (index == 0)
|
||
|
name = surface->output_name;
|
||
|
else if (index == 1)
|
||
|
name = surface->output_name2;
|
||
|
|
||
|
/* Vertex Color Layer */
|
||
|
if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
|
||
|
if (!exists)
|
||
|
ED_mesh_color_add(C, scene, ob, ob->data, name, 1);
|
||
|
else
|
||
|
ED_mesh_color_remove_named(C, ob, ob->data, name);
|
||
|
}
|
||
|
/* Vertex Weight Layer */
|
||
|
else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
|
||
|
if (!exists)
|
||
|
ED_vgroup_add_name(ob, name);
|
||
|
else {
|
||
|
bDeformGroup *defgroup = defgroup_find_name(ob, name);
|
||
|
if (defgroup) ED_vgroup_delete(ob, defgroup);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return OPERATOR_FINISHED;
|
||
|
}
|
||
|
|
||
|
void DPAINT_OT_output_toggle(wmOperatorType *ot)
|
||
|
{
|
||
|
PropertyRNA *prop;
|
||
|
|
||
|
/* identifiers */
|
||
|
ot->name= "Toggle Output Layer";
|
||
|
ot->idname= "DPAINT_OT_output_toggle";
|
||
|
ot->description = "Adds or removes Dynamic Paint output data layer.";
|
||
|
|
||
|
/* api callbacks */
|
||
|
ot->exec= output_toggle_exec;
|
||
|
ot->poll= ED_operator_object_active_editable;
|
||
|
|
||
|
/* flags */
|
||
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||
|
|
||
|
/* properties */
|
||
|
prop= RNA_def_int(ot->srna, "index", 0, 0, 1, "Index", "", 0, 1);
|
||
|
ot->prop= prop;
|
||
|
}
|