This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/makesrna/intern/rna_wm_gizmo_api.c

311 lines
12 KiB
C

/*
* 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.
*/
/** \file
* \ingroup RNA
*/
#include <stdio.h>
#include <stdlib.h>
#include "BLI_utildefines.h"
#include "BKE_report.h"
#include "RNA_define.h"
#include "RNA_enum_types.h"
#include "DNA_windowmanager_types.h"
#include "WM_api.h"
#include "rna_internal.h" /* own include */
#ifdef RNA_RUNTIME
# include "BKE_context.h"
# include "UI_interface.h"
# include "ED_gizmo_library.h"
static void rna_gizmo_draw_preset_box(wmGizmo *gz, float matrix[16], int select_id)
{
ED_gizmo_draw_preset_box(gz, (float(*)[4])matrix, select_id);
}
static void rna_gizmo_draw_preset_arrow(wmGizmo *gz, float matrix[16], int axis, int select_id)
{
ED_gizmo_draw_preset_arrow(gz, (float(*)[4])matrix, axis, select_id);
}
static void rna_gizmo_draw_preset_circle(wmGizmo *gz, float matrix[16], int axis, int select_id)
{
ED_gizmo_draw_preset_circle(gz, (float(*)[4])matrix, axis, select_id);
}
static void rna_gizmo_draw_preset_facemap(
wmGizmo *gz, struct bContext *C, struct Object *ob, int facemap, int select_id)
{
ED_gizmo_draw_preset_facemap(C, gz, ob, facemap, select_id);
}
/* -------------------------------------------------------------------- */
/** \name Gizmo Property Define
* \{ */
static void rna_gizmo_target_set_prop(wmGizmo *gz,
ReportList *reports,
const char *target_propname,
PointerRNA *ptr,
const char *propname,
int index)
{
const wmGizmoPropertyType *gz_prop_type = WM_gizmotype_target_property_find(gz->type,
target_propname);
if (gz_prop_type == NULL) {
BKE_reportf(reports,
RPT_ERROR,
"Gizmo target property '%s.%s' not found",
gz->type->idname,
target_propname);
return;
}
PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
if (prop == NULL) {
BKE_reportf(reports,
RPT_ERROR,
"Property '%s.%s' not found",
RNA_struct_identifier(ptr->type),
propname);
return;
}
if (gz_prop_type->data_type != RNA_property_type(prop)) {
const int gizmo_type_index = RNA_enum_from_value(rna_enum_property_type_items,
gz_prop_type->data_type);
const int prop_type_index = RNA_enum_from_value(rna_enum_property_type_items,
RNA_property_type(prop));
BLI_assert((gizmo_type_index != -1) && (prop_type_index == -1));
BKE_reportf(reports,
RPT_ERROR,
"Gizmo target '%s.%s' expects '%s', '%s.%s' is '%s'",
gz->type->idname,
target_propname,
rna_enum_property_type_items[gizmo_type_index].identifier,
RNA_struct_identifier(ptr->type),
propname,
rna_enum_property_type_items[prop_type_index].identifier);
return;
}
if (RNA_property_array_check(prop)) {
if (index == -1) {
const int prop_array_length = RNA_property_array_length(ptr, prop);
if (gz_prop_type->array_length != prop_array_length) {
BKE_reportf(reports,
RPT_ERROR,
"Gizmo target property '%s.%s' expects an array of length %d, found %d",
gz->type->idname,
target_propname,
gz_prop_type->array_length,
prop_array_length);
return;
}
}
}
else {
if (gz_prop_type->array_length != 1) {
BKE_reportf(reports,
RPT_ERROR,
"Gizmo target property '%s.%s' expects an array of length %d",
gz->type->idname,
target_propname,
gz_prop_type->array_length);
return;
}
}
if (index >= gz_prop_type->array_length) {
BKE_reportf(reports,
RPT_ERROR,
"Gizmo target property '%s.%s', index %d must be below %d",
gz->type->idname,
target_propname,
index,
gz_prop_type->array_length);
return;
}
WM_gizmo_target_property_def_rna_ptr(gz, gz_prop_type, ptr, prop, index);
}
static PointerRNA rna_gizmo_target_set_operator(wmGizmo *gz,
ReportList *reports,
const char *opname,
int part_index)
{
wmOperatorType *ot;
ot = WM_operatortype_find(opname, 0); /* print error next */
if (!ot || !ot->srna) {
BKE_reportf(
reports, RPT_ERROR, "%s '%s'", ot ? "unknown operator" : "operator missing srna", opname);
return PointerRNA_NULL;
}
/* For the return value to be usable, we need 'PointerRNA.data' to be set. */
IDProperty *properties;
{
IDPropertyTemplate val = {0};
properties = IDP_New(IDP_GROUP, &val, "wmGizmoProperties");
}
return *WM_gizmo_operator_set(gz, part_index, ot, properties);
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Gizmo Property Access
* \{ */
static bool rna_gizmo_target_is_valid(wmGizmo *gz,
ReportList *reports,
const char *target_propname)
{
wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, target_propname);
if (gz_prop == NULL) {
BKE_reportf(reports,
RPT_ERROR,
"Gizmo target property '%s.%s' not found",
gz->type->idname,
target_propname);
return false;
}
return WM_gizmo_target_property_is_valid(gz_prop);
}
/** \} */
#else
void RNA_api_gizmo(StructRNA *srna)
{
/* Utility draw functions, since we don't expose new OpenGL drawing wrappers via Python yet.
* exactly how these should be exposed isn't totally clear.
* However it's probably good to have some high level API's for this anyway.
* Just note that this could be re-worked once tests are done.
*/
FunctionRNA *func;
PropertyRNA *parm;
/* -------------------------------------------------------------------- */
/* Primitive Shapes */
/* draw_preset_box */
func = RNA_def_function(srna, "draw_preset_box", "rna_gizmo_draw_preset_box");
RNA_def_function_ui_description(func, "Draw a box");
parm = RNA_def_property(func, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_property_multi_array(parm, 2, rna_matrix_dimsize_4x4);
RNA_def_property_ui_text(parm, "", "The matrix to transform");
RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
/* draw_preset_box */
func = RNA_def_function(srna, "draw_preset_arrow", "rna_gizmo_draw_preset_arrow");
RNA_def_function_ui_description(func, "Draw a box");
parm = RNA_def_property(func, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_property_multi_array(parm, 2, rna_matrix_dimsize_4x4);
RNA_def_property_ui_text(parm, "", "The matrix to transform");
RNA_def_enum(func, "axis", rna_enum_object_axis_items, 2, "", "Arrow Orientation");
RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
func = RNA_def_function(srna, "draw_preset_circle", "rna_gizmo_draw_preset_circle");
RNA_def_function_ui_description(func, "Draw a box");
parm = RNA_def_property(func, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_property_multi_array(parm, 2, rna_matrix_dimsize_4x4);
RNA_def_property_ui_text(parm, "", "The matrix to transform");
RNA_def_enum(func, "axis", rna_enum_object_axis_items, 2, "", "Arrow Orientation");
RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
/* -------------------------------------------------------------------- */
/* Other Shapes */
/* draw_preset_facemap */
func = RNA_def_function(srna, "draw_preset_facemap", "rna_gizmo_draw_preset_facemap");
RNA_def_function_ui_description(func, "Draw the face-map of a mesh object");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm = RNA_def_pointer(func, "object", "Object", "", "Object");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_int(func, "face_map", 0, 0, INT_MAX, "Face map index", "", 0, INT_MAX);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
/* -------------------------------------------------------------------- */
/* Property API */
/* Define Properties */
/* note, 'target_set_handler' is defined in 'bpy_rna_gizmo.c' */
func = RNA_def_function(srna, "target_set_prop", "rna_gizmo_target_set_prop");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "");
parm = RNA_def_string(func, "target", NULL, 0, "", "Target property");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* similar to UILayout.prop */
parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_string(func, "property", NULL, 0, "", "Identifier of property in data");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_int(func, "index", -1, -1, INT_MAX, "", "", -1, INT_MAX); /* RNA_NO_INDEX == -1 */
func = RNA_def_function(srna, "target_set_operator", "rna_gizmo_target_set_operator");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func,
"Operator to run when activating the gizmo "
"(overrides property targets)");
parm = RNA_def_string(func, "operator", NULL, 0, "", "Target operator");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_int(func, "index", 0, 0, 255, "Part index", "", 0, 255);
/* similar to UILayout.operator */
parm = RNA_def_pointer(
func, "properties", "OperatorProperties", "", "Operator properties to fill in");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_function_return(func, parm);
/* Access Properties */
/* note, 'target_get', 'target_set' is defined in 'bpy_rna_gizmo.c' */
func = RNA_def_function(srna, "target_is_valid", "rna_gizmo_target_is_valid");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm = RNA_def_string(func, "property", NULL, 0, "", "Property identifier");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_function_ui_description(func, "");
parm = RNA_def_boolean(func, "result", 0, "", "");
RNA_def_function_return(func, parm);
}
void RNA_api_gizmogroup(StructRNA *UNUSED(srna))
{
/* nothing yet */
}
#endif