Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/windowmanager/manipulators/intern/wm_manipulator.c')
-rw-r--r--source/blender/windowmanager/manipulators/intern/wm_manipulator.c800
1 files changed, 0 insertions, 800 deletions
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
deleted file mode 100644
index d6eb110dca0..00000000000
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * ***** 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.
- *
- * The Original Code is Copyright (C) 2014 Blender Foundation.
- * All rights reserved.
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/windowmanager/manipulators/intern/wm_manipulator.c
- * \ingroup wm
- */
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_listbase.h"
-#include "BLI_math.h"
-#include "BLI_string.h"
-#include "BLI_string_utils.h"
-
-#include "BKE_context.h"
-
-#include "GPU_batch.h"
-#include "GPU_glew.h"
-#include "GPU_immediate.h"
-
-#include "RNA_access.h"
-#include "RNA_define.h"
-
-#include "BKE_global.h"
-#include "BKE_main.h"
-#include "BKE_idprop.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "ED_screen.h"
-#include "ED_view3d.h"
-
-#include "UI_interface.h"
-
-#ifdef WITH_PYTHON
-#include "BPY_extern.h"
-#endif
-
-/* only for own init/exit calls (wm_manipulatortype_init/wm_manipulatortype_free) */
-#include "wm.h"
-
-/* own includes */
-#include "wm_manipulator_wmapi.h"
-#include "wm_manipulator_intern.h"
-
-static void wm_manipulator_register(
- wmManipulatorGroup *mgroup, wmManipulator *mpr);
-
-/**
- * \note Follow #wm_operator_create convention.
- */
-static wmManipulator *wm_manipulator_create(
- const wmManipulatorType *wt,
- PointerRNA *properties)
-{
- BLI_assert(wt != NULL);
- BLI_assert(wt->struct_size >= sizeof(wmManipulator));
-
- wmManipulator *mpr = MEM_callocN(
- wt->struct_size + (sizeof(wmManipulatorProperty) * wt->target_property_defs_len), __func__);
- mpr->type = wt;
-
- /* initialize properties, either copy or create */
- mpr->ptr = MEM_callocN(sizeof(PointerRNA), "wmManipulatorPtrRNA");
- if (properties && properties->data) {
- mpr->properties = IDP_CopyProperty(properties->data);
- }
- else {
- IDPropertyTemplate val = {0};
- mpr->properties = IDP_New(IDP_GROUP, &val, "wmManipulatorProperties");
- }
- RNA_pointer_create(G_MAIN->wm.first, wt->srna, mpr->properties, mpr->ptr);
-
- WM_manipulator_properties_sanitize(mpr->ptr, 0);
-
- unit_m4(mpr->matrix_space);
- unit_m4(mpr->matrix_basis);
- unit_m4(mpr->matrix_offset);
-
- mpr->drag_part = -1;
-
- return mpr;
-}
-
-wmManipulator *WM_manipulator_new_ptr(
- const wmManipulatorType *wt, wmManipulatorGroup *mgroup,
- PointerRNA *properties)
-{
- wmManipulator *mpr = wm_manipulator_create(wt, properties);
-
- wm_manipulator_register(mgroup, mpr);
-
- if (mpr->type->setup != NULL) {
- mpr->type->setup(mpr);
- }
-
- return mpr;
-}
-
-/**
- * \param wt: Must be valid,
- * if you need to check it exists use #WM_manipulator_new_ptr
- * because callers of this function don't NULL check the return value.
- */
-wmManipulator *WM_manipulator_new(
- const char *idname, wmManipulatorGroup *mgroup,
- PointerRNA *properties)
-{
- const wmManipulatorType *wt = WM_manipulatortype_find(idname, false);
- return WM_manipulator_new_ptr(wt, mgroup, properties);
-}
-
-/**
- * Initialize default values and allocate needed memory for members.
- */
-static void manipulator_init(wmManipulator *mpr)
-{
- const float color_default[4] = {1.0f, 1.0f, 1.0f, 1.0f};
-
- mpr->scale_basis = 1.0f;
- mpr->line_width = 1.0f;
-
- /* defaults */
- copy_v4_v4(mpr->color, color_default);
- copy_v4_v4(mpr->color_hi, color_default);
-}
-
-/**
- * Register \a manipulator.
- *
- * \param name: name used to create a unique idname for \a manipulator in \a mgroup
- *
- * \note Not to be confused with type registration from RNA.
- */
-static void wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *mpr)
-{
- manipulator_init(mpr);
- wm_manipulatorgroup_manipulator_register(mgroup, mpr);
-}
-
-/**
- * \warning this doesn't check #wmManipulatorMap (highlight, selection etc).
- * Typical use is when freeing the windowing data,
- * where caller can manage clearing selection, highlight... etc.
- */
-void WM_manipulator_free(wmManipulator *mpr)
-{
- if (mpr->type->free != NULL) {
- mpr->type->free(mpr);
- }
-
-#ifdef WITH_PYTHON
- if (mpr->py_instance) {
- /* do this first in case there are any __del__ functions or
- * similar that use properties */
- BPY_DECREF_RNA_INVALIDATE(mpr->py_instance);
- }
-#endif
-
- if (mpr->op_data) {
- for (int i = 0; i < mpr->op_data_len; i++) {
- WM_operator_properties_free(&mpr->op_data[i].ptr);
- }
- MEM_freeN(mpr->op_data);
- }
-
- if (mpr->ptr != NULL) {
- WM_manipulator_properties_free(mpr->ptr);
- MEM_freeN(mpr->ptr);
- }
-
- if (mpr->type->target_property_defs_len != 0) {
- wmManipulatorProperty *mpr_prop_array = WM_manipulator_target_property_array(mpr);
- for (int i = 0; i < mpr->type->target_property_defs_len; i++) {
- wmManipulatorProperty *mpr_prop = &mpr_prop_array[i];
- if (mpr_prop->custom_func.free_fn) {
- mpr_prop->custom_func.free_fn(mpr, mpr_prop);
- }
- }
- }
-
- MEM_freeN(mpr);
-}
-
-/**
- * Free \a manipulator and unlink from \a manipulatorlist.
- * \a manipulatorlist is allowed to be NULL.
- */
-void WM_manipulator_unlink(ListBase *manipulatorlist, wmManipulatorMap *mmap, wmManipulator *mpr, bContext *C)
-{
- if (mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) {
- wm_manipulatormap_highlight_set(mmap, C, NULL, 0);
- }
- if (mpr->state & WM_MANIPULATOR_STATE_MODAL) {
- wm_manipulatormap_modal_set(mmap, C, mpr, NULL, false);
- }
- /* Unlink instead of setting so we don't run callbacks. */
- if (mpr->state & WM_MANIPULATOR_STATE_SELECT) {
- WM_manipulator_select_unlink(mmap, mpr);
- }
-
- if (manipulatorlist) {
- BLI_remlink(manipulatorlist, mpr);
- }
-
- BLI_assert(mmap->mmap_context.highlight != mpr);
- BLI_assert(mmap->mmap_context.modal != mpr);
-
- WM_manipulator_free(mpr);
-}
-
-/* -------------------------------------------------------------------- */
-/** \name Manipulator Creation API
- *
- * API for defining data on manipulator creation.
- *
- * \{ */
-
-struct wmManipulatorOpElem *WM_manipulator_operator_get(
- wmManipulator *mpr, int part_index)
-{
- if (mpr->op_data && ((part_index >= 0) && (part_index < mpr->op_data_len))) {
- return &mpr->op_data[part_index];
- }
- return NULL;
-}
-
-PointerRNA *WM_manipulator_operator_set(
- wmManipulator *mpr, int part_index,
- wmOperatorType *ot, IDProperty *properties)
-{
- BLI_assert(part_index < 255);
- /* We could pre-allocate these but using multiple is such a rare thing. */
- if (part_index >= mpr->op_data_len) {
- mpr->op_data_len = part_index + 1;
- mpr->op_data = MEM_recallocN(mpr->op_data, sizeof(*mpr->op_data) * mpr->op_data_len);
- }
- wmManipulatorOpElem *mpop = &mpr->op_data[part_index];
- mpop->type = ot;
-
- if (mpop->ptr.data) {
- WM_operator_properties_free(&mpop->ptr);
- }
- WM_operator_properties_create_ptr(&mpop->ptr, ot);
-
- if (properties) {
- mpop->ptr.data = properties;
- }
-
- return &mpop->ptr;
-}
-
-static void wm_manipulator_set_matrix_rotation_from_z_axis__internal(
- float matrix[4][4], const float z_axis[3])
-{
- /* old code, seems we can use simpler method */
-#if 0
- const float z_global[3] = {0.0f, 0.0f, 1.0f};
- float rot[3][3];
-
- rotation_between_vecs_to_mat3(rot, z_global, z_axis);
- copy_v3_v3(matrix[0], rot[0]);
- copy_v3_v3(matrix[1], rot[1]);
- copy_v3_v3(matrix[2], rot[2]);
-#else
- normalize_v3_v3(matrix[2], z_axis);
- ortho_basis_v3v3_v3(matrix[0], matrix[1], matrix[2]);
-#endif
-
-}
-
-static void wm_manipulator_set_matrix_rotation_from_yz_axis__internal(
- float matrix[4][4], const float y_axis[3], const float z_axis[3])
-{
- normalize_v3_v3(matrix[1], y_axis);
- normalize_v3_v3(matrix[2], z_axis);
- cross_v3_v3v3(matrix[0], matrix[1], matrix[2]);
- normalize_v3(matrix[0]);
-}
-
-/**
- * wmManipulator.matrix utils.
- */
-void WM_manipulator_set_matrix_rotation_from_z_axis(
- wmManipulator *mpr, const float z_axis[3])
-{
- wm_manipulator_set_matrix_rotation_from_z_axis__internal(mpr->matrix_basis, z_axis);
-}
-void WM_manipulator_set_matrix_rotation_from_yz_axis(
- wmManipulator *mpr, const float y_axis[3], const float z_axis[3])
-{
- wm_manipulator_set_matrix_rotation_from_yz_axis__internal(mpr->matrix_basis, y_axis, z_axis);
-}
-void WM_manipulator_set_matrix_location(wmManipulator *mpr, const float origin[3])
-{
- copy_v3_v3(mpr->matrix_basis[3], origin);
-}
-
-/**
- * wmManipulator.matrix_offset utils.
- */
-void WM_manipulator_set_matrix_offset_rotation_from_z_axis(
- wmManipulator *mpr, const float z_axis[3])
-{
- wm_manipulator_set_matrix_rotation_from_z_axis__internal(mpr->matrix_offset, z_axis);
-}
-void WM_manipulator_set_matrix_offset_rotation_from_yz_axis(
- wmManipulator *mpr, const float y_axis[3], const float z_axis[3])
-{
- wm_manipulator_set_matrix_rotation_from_yz_axis__internal(mpr->matrix_offset, y_axis, z_axis);
-}
-void WM_manipulator_set_matrix_offset_location(wmManipulator *mpr, const float offset[3])
-{
- copy_v3_v3(mpr->matrix_offset[3], offset);
-}
-
-void WM_manipulator_set_flag(wmManipulator *mpr, const int flag, const bool enable)
-{
- if (enable) {
- mpr->flag |= flag;
- }
- else {
- mpr->flag &= ~flag;
- }
-}
-
-void WM_manipulator_set_scale(wmManipulator *mpr, const float scale)
-{
- mpr->scale_basis = scale;
-}
-
-void WM_manipulator_set_line_width(wmManipulator *mpr, const float line_width)
-{
- mpr->line_width = line_width;
-}
-
-/**
- * Set manipulator rgba colors.
- *
- * \param col Normal state color.
- * \param col_hi Highlighted state color.
- */
-void WM_manipulator_get_color(const wmManipulator *mpr, float color[4])
-{
- copy_v4_v4(color, mpr->color);
-}
-void WM_manipulator_set_color(wmManipulator *mpr, const float color[4])
-{
- copy_v4_v4(mpr->color, color);
-}
-
-void WM_manipulator_get_color_highlight(const wmManipulator *mpr, float color_hi[4])
-{
- copy_v4_v4(color_hi, mpr->color_hi);
-}
-void WM_manipulator_set_color_highlight(wmManipulator *mpr, const float color_hi[4])
-{
- copy_v4_v4(mpr->color_hi, color_hi);
-}
-
-
-/** \} */ // Manipulator Creation API
-
-
-/* -------------------------------------------------------------------- */
-/** \name Manipulator Callback Assignment
- *
- * \{ */
-
-void WM_manipulator_set_fn_custom_modal(struct wmManipulator *mpr, wmManipulatorFnModal fn)
-{
- mpr->custom_modal = fn;
-}
-
-/** \} */
-
-
-/* -------------------------------------------------------------------- */
-
-/**
- * Add/Remove \a manipulator to selection.
- * Reallocates memory for selected manipulators so better not call for selecting multiple ones.
- *
- * \return if the selection has changed.
- */
-bool wm_manipulator_select_set_ex(
- wmManipulatorMap *mmap, wmManipulator *mpr, bool select,
- bool use_array, bool use_callback)
-{
- bool changed = false;
-
- if (select) {
- if ((mpr->state & WM_MANIPULATOR_STATE_SELECT) == 0) {
- if (use_array) {
- wm_manipulatormap_select_array_push_back(mmap, mpr);
- }
- mpr->state |= WM_MANIPULATOR_STATE_SELECT;
- changed = true;
- }
- }
- else {
- if (mpr->state & WM_MANIPULATOR_STATE_SELECT) {
- if (use_array) {
- wm_manipulatormap_select_array_remove(mmap, mpr);
- }
- mpr->state &= ~WM_MANIPULATOR_STATE_SELECT;
- changed = true;
- }
- }
-
- /* In the case of unlinking we only want to remove from the array
- * and not write to the external state */
- if (use_callback && changed) {
- if (mpr->type->select_refresh) {
- mpr->type->select_refresh(mpr);
- }
- }
-
- return changed;
-}
-
-/* Remove from selection array without running callbacks. */
-bool WM_manipulator_select_unlink(wmManipulatorMap *mmap, wmManipulator *mpr)
-{
- return wm_manipulator_select_set_ex(mmap, mpr, false, true, false);
-}
-
-bool WM_manipulator_select_set(wmManipulatorMap *mmap, wmManipulator *mpr, bool select)
-{
- return wm_manipulator_select_set_ex(mmap, mpr, select, true, true);
-}
-
-void WM_manipulator_highlight_set(wmManipulatorMap *mmap, wmManipulator *mpr)
-{
- wm_manipulatormap_highlight_set(mmap, NULL, mpr, mpr ? mpr->highlight_part : 0);
-}
-
-bool wm_manipulator_select_and_highlight(bContext *C, wmManipulatorMap *mmap, wmManipulator *mpr)
-{
- if (WM_manipulator_select_set(mmap, mpr, true)) {
- wm_manipulatormap_highlight_set(mmap, C, mpr, mpr->highlight_part);
- return true;
- }
- else {
- return false;
- }
-}
-
-/**
- * Special function to run from setup so manipulators start out interactive.
- *
- * We could do this when linking them, but this complicates things since the window update code needs to run first.
- */
-void WM_manipulator_modal_set_from_setup(
- struct wmManipulatorMap *mmap, struct bContext *C,
- struct wmManipulator *mpr, int part_index, const wmEvent *event)
-{
- mpr->highlight_part = part_index;
- WM_manipulator_highlight_set(mmap, mpr);
- if (false) {
- wm_manipulatormap_modal_set(mmap, C, mpr, event, true);
- }
- else {
- /* WEAK: but it works. */
- WM_operator_name_call(C, "MANIPULATORGROUP_OT_manipulator_tweak", WM_OP_INVOKE_DEFAULT, NULL);
- }
-}
-
-void wm_manipulator_calculate_scale(wmManipulator *mpr, const bContext *C)
-{
- const RegionView3D *rv3d = CTX_wm_region_view3d(C);
- float scale = UI_DPI_FAC;
-
- if ((mpr->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SCALE) == 0) {
- scale *= U.manipulator_size;
- if (rv3d) {
- /* 'ED_view3d_pixel_size' includes 'U.pixelsize', remove it. */
- float matrix_world[4][4];
- if (mpr->type->matrix_basis_get) {
- float matrix_basis[4][4];
- mpr->type->matrix_basis_get(mpr, matrix_basis);
- mul_m4_m4m4(matrix_world, mpr->matrix_space, matrix_basis);
- }
- else {
- mul_m4_m4m4(matrix_world, mpr->matrix_space, mpr->matrix_basis);
- }
-
- /* Exclude matrix_offset from scale. */
- scale *= ED_view3d_pixel_size_no_ui_scale(rv3d, matrix_world[3]);
- }
- else {
- scale *= 0.02f;
- }
- }
-
- mpr->scale_final = mpr->scale_basis * scale;
-}
-
-static void manipulator_update_prop_data(wmManipulator *mpr)
-{
- /* manipulator property might have been changed, so update manipulator */
- if (mpr->type->property_update) {
- wmManipulatorProperty *mpr_prop_array = WM_manipulator_target_property_array(mpr);
- for (int i = 0; i < mpr->type->target_property_defs_len; i++) {
- wmManipulatorProperty *mpr_prop = &mpr_prop_array[i];
- if (WM_manipulator_target_property_is_valid(mpr_prop)) {
- mpr->type->property_update(mpr, mpr_prop);
- }
- }
- }
-}
-
-void wm_manipulator_update(wmManipulator *mpr, const bContext *C, const bool refresh_map)
-{
- if (refresh_map) {
- manipulator_update_prop_data(mpr);
- }
- wm_manipulator_calculate_scale(mpr, C);
-}
-
-int wm_manipulator_is_visible(wmManipulator *mpr)
-{
- if (mpr->flag & WM_MANIPULATOR_HIDDEN) {
- return 0;
- }
- if ((mpr->state & WM_MANIPULATOR_STATE_MODAL) &&
- !(mpr->flag & (WM_MANIPULATOR_DRAW_MODAL | WM_MANIPULATOR_DRAW_VALUE)))
- {
- /* don't draw while modal (dragging) */
- return 0;
- }
- if ((mpr->flag & WM_MANIPULATOR_DRAW_HOVER) &&
- !(mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) &&
- !(mpr->state & WM_MANIPULATOR_STATE_SELECT)) /* still draw selected manipulators */
- {
- /* update but don't draw */
- return WM_MANIPULATOR_IS_VISIBLE_UPDATE;
- }
-
- return WM_MANIPULATOR_IS_VISIBLE_UPDATE | WM_MANIPULATOR_IS_VISIBLE_DRAW;
-}
-
-void WM_manipulator_calc_matrix_final_params(
- const wmManipulator *mpr,
- const struct WM_ManipulatorMatrixParams *params,
- float r_mat[4][4])
-{
- const float (* const matrix_space)[4] = params->matrix_space ? params->matrix_space : mpr->matrix_space;
- const float (* const matrix_basis)[4] = params->matrix_basis ? params->matrix_basis : mpr->matrix_basis;
- const float (* const matrix_offset)[4] = params->matrix_offset ? params->matrix_offset : mpr->matrix_offset;
- const float *scale_final = params->scale_final ? params->scale_final : &mpr->scale_final;
-
- float final_matrix[4][4];
- if (params->matrix_basis == NULL && mpr->type->matrix_basis_get) {
- mpr->type->matrix_basis_get(mpr, final_matrix);
- }
- else {
- copy_m4_m4(final_matrix, matrix_basis);
- }
-
- if (mpr->flag & WM_MANIPULATOR_DRAW_NO_SCALE) {
- mul_m4_m4m4(final_matrix, final_matrix, matrix_offset);
- }
- else {
- if (mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) {
- mul_mat3_m4_fl(final_matrix, *scale_final);
- mul_m4_m4m4(final_matrix, final_matrix, matrix_offset);
- }
- else {
- mul_m4_m4m4(final_matrix, final_matrix, matrix_offset);
- mul_mat3_m4_fl(final_matrix, *scale_final);
- }
- }
-
- mul_m4_m4m4(r_mat, matrix_space, final_matrix);
-}
-
-void WM_manipulator_calc_matrix_final_no_offset(const wmManipulator *mpr, float r_mat[4][4])
-{
- float mat_identity[4][4];
- unit_m4(mat_identity);
-
- WM_manipulator_calc_matrix_final_params(
- mpr,
- &((struct WM_ManipulatorMatrixParams) {
- .matrix_space = NULL,
- .matrix_basis = NULL,
- .matrix_offset = mat_identity,
- .scale_final = NULL,
- }), r_mat
- );
-}
-
-void WM_manipulator_calc_matrix_final(const wmManipulator *mpr, float r_mat[4][4])
-{
- WM_manipulator_calc_matrix_final_params(
- mpr,
- &((struct WM_ManipulatorMatrixParams) {
- .matrix_space = NULL,
- .matrix_basis = NULL,
- .matrix_offset = NULL,
- .scale_final = NULL,
- }), r_mat
- );
-}
-
-/** \name Manipulator Propery Access
- *
- * Matches `WM_operator_properties` conventions.
- *
- * \{ */
-
-
-void WM_manipulator_properties_create_ptr(PointerRNA *ptr, wmManipulatorType *wt)
-{
- RNA_pointer_create(NULL, wt->srna, NULL, ptr);
-}
-
-void WM_manipulator_properties_create(PointerRNA *ptr, const char *wtstring)
-{
- const wmManipulatorType *wt = WM_manipulatortype_find(wtstring, false);
-
- if (wt)
- WM_manipulator_properties_create_ptr(ptr, (wmManipulatorType *)wt);
- else
- RNA_pointer_create(NULL, &RNA_ManipulatorProperties, NULL, ptr);
-}
-
-/* similar to the function above except its uses ID properties
- * used for keymaps and macros */
-void WM_manipulator_properties_alloc(PointerRNA **ptr, IDProperty **properties, const char *wtstring)
-{
- if (*properties == NULL) {
- IDPropertyTemplate val = {0};
- *properties = IDP_New(IDP_GROUP, &val, "wmOpItemProp");
- }
-
- if (*ptr == NULL) {
- *ptr = MEM_callocN(sizeof(PointerRNA), "wmOpItemPtr");
- WM_manipulator_properties_create(*ptr, wtstring);
- }
-
- (*ptr)->data = *properties;
-
-}
-
-void WM_manipulator_properties_sanitize(PointerRNA *ptr, const bool no_context)
-{
- RNA_STRUCT_BEGIN (ptr, prop)
- {
- switch (RNA_property_type(prop)) {
- case PROP_ENUM:
- if (no_context)
- RNA_def_property_flag(prop, PROP_ENUM_NO_CONTEXT);
- else
- RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT);
- break;
- case PROP_POINTER:
- {
- StructRNA *ptype = RNA_property_pointer_type(ptr, prop);
-
- /* recurse into manipulator properties */
- if (RNA_struct_is_a(ptype, &RNA_ManipulatorProperties)) {
- PointerRNA opptr = RNA_property_pointer_get(ptr, prop);
- WM_manipulator_properties_sanitize(&opptr, no_context);
- }
- break;
- }
- default:
- break;
- }
- }
- RNA_STRUCT_END;
-}
-
-
-/** set all props to their default,
- * \param do_update Only update un-initialized props.
- *
- * \note, theres nothing specific to manipulators here.
- * this could be made a general function.
- */
-bool WM_manipulator_properties_default(PointerRNA *ptr, const bool do_update)
-{
- bool changed = false;
- RNA_STRUCT_BEGIN (ptr, prop)
- {
- switch (RNA_property_type(prop)) {
- case PROP_POINTER:
- {
- StructRNA *ptype = RNA_property_pointer_type(ptr, prop);
- if (ptype != &RNA_Struct) {
- PointerRNA opptr = RNA_property_pointer_get(ptr, prop);
- changed |= WM_manipulator_properties_default(&opptr, do_update);
- }
- break;
- }
- default:
- if ((do_update == false) || (RNA_property_is_set(ptr, prop) == false)) {
- if (RNA_property_reset(ptr, prop, -1)) {
- changed = true;
- }
- }
- break;
- }
- }
- RNA_STRUCT_END;
-
- return changed;
-}
-
-/* remove all props without PROP_SKIP_SAVE */
-void WM_manipulator_properties_reset(wmManipulator *mpr)
-{
- if (mpr->ptr->data) {
- PropertyRNA *iterprop;
- iterprop = RNA_struct_iterator_property(mpr->type->srna);
-
- RNA_PROP_BEGIN (mpr->ptr, itemptr, iterprop)
- {
- PropertyRNA *prop = itemptr.data;
-
- if ((RNA_property_flag(prop) & PROP_SKIP_SAVE) == 0) {
- const char *identifier = RNA_property_identifier(prop);
- RNA_struct_idprops_unset(mpr->ptr, identifier);
- }
- }
- RNA_PROP_END;
- }
-}
-
-void WM_manipulator_properties_clear(PointerRNA *ptr)
-{
- IDProperty *properties = ptr->data;
-
- if (properties) {
- IDP_ClearProperty(properties);
- }
-}
-
-void WM_manipulator_properties_free(PointerRNA *ptr)
-{
- IDProperty *properties = ptr->data;
-
- if (properties) {
- IDP_FreeProperty(properties);
- MEM_freeN(properties);
- ptr->data = NULL; /* just in case */
- }
-}
-
-/** \} */
-
-/** \name General Utilities
- *
- * \{ */
-
-bool WM_manipulator_context_check_drawstep(const struct bContext *C, eWM_ManipulatorMapDrawStep step)
-{
- switch (step) {
- case WM_MANIPULATORMAP_DRAWSTEP_2D:
- {
- break;
- }
- case WM_MANIPULATORMAP_DRAWSTEP_3D:
- {
- wmWindowManager *wm = CTX_wm_manager(C);
- if (ED_screen_animation_playing(wm)) {
- return false;
- }
- break;
- }
- }
- return true;
-}
-
-/** \} */