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/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c')
-rw-r--r--source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c498
1 files changed, 0 insertions, 498 deletions
diff --git a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
deleted file mode 100644
index a5bcef7ed5e..00000000000
--- a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
+++ /dev/null
@@ -1,498 +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 arrow3d_manipulator.c
- * \ingroup wm
- *
- * \name Arrow Manipulator
- *
- * 3D Manipulator
- *
- * \brief Simple arrow manipulator which is dragged into a certain direction.
- * The arrow head can have varying shapes, e.g. cone, box, etc.
- *
- * - `matrix[0]` is derived from Y and Z.
- * - `matrix[1]` is 'up' for manipulator types that have an up.
- * - `matrix[2]` is the arrow direction (for all arrowes).
- */
-
-#include "BIF_gl.h"
-
-#include "BLI_math.h"
-
-#include "DNA_view3d_types.h"
-
-#include "BKE_context.h"
-
-#include "GPU_draw.h"
-#include "GPU_immediate.h"
-#include "GPU_immediate_util.h"
-#include "GPU_matrix.h"
-#include "GPU_select.h"
-#include "GPU_state.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "RNA_access.h"
-#include "RNA_define.h"
-
-#include "WM_types.h"
-#include "WM_api.h"
-
-#include "ED_view3d.h"
-#include "ED_screen.h"
-#include "ED_manipulator_library.h"
-
-/* own includes */
-#include "../manipulator_geometry.h"
-#include "../manipulator_library_intern.h"
-
-/* to use custom arrows exported to geom_arrow_manipulator.c */
-//#define USE_MANIPULATOR_CUSTOM_ARROWS
-
-typedef struct ArrowManipulator3D {
- wmManipulator manipulator;
- ManipulatorCommonData data;
-} ArrowManipulator3D;
-
-
-/* -------------------------------------------------------------------- */
-
-static void manipulator_arrow_matrix_basis_get(const wmManipulator *mpr, float r_matrix[4][4])
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
-
- copy_m4_m4(r_matrix, arrow->manipulator.matrix_basis);
- madd_v3_v3fl(r_matrix[3], arrow->manipulator.matrix_basis[2], arrow->data.offset);
-}
-
-static void arrow_draw_geom(const ArrowManipulator3D *arrow, const bool select, const float color[4])
-{
- uint pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
- bool unbind_shader = true;
- const int draw_style = RNA_enum_get(arrow->manipulator.ptr, "draw_style");
- const int draw_options = RNA_enum_get(arrow->manipulator.ptr, "draw_options");
-
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
-
- if (draw_style == ED_MANIPULATOR_ARROW_STYLE_CROSS) {
- immUniformColor4fv(color);
-
- immBegin(GWN_PRIM_LINES, 4);
- immVertex3f(pos, -1.0f, 0.0f, 0.0f);
- immVertex3f(pos, 1.0f, 0.0f, 0.0f);
- immVertex3f(pos, 0.0f, -1.0f, 0.0f);
- immVertex3f(pos, 0.0f, 1.0f, 0.0f);
- immEnd();
- }
- else if (draw_style == ED_MANIPULATOR_ARROW_STYLE_CONE) {
- float aspect[2];
- RNA_float_get_array(arrow->manipulator.ptr, "aspect", aspect);
- const float unitx = aspect[0];
- const float unity = aspect[1];
- const float vec[4][3] = {
- {-unitx, -unity, 0},
- { unitx, -unity, 0},
- { unitx, unity, 0},
- {-unitx, unity, 0},
- };
-
- GPU_line_width(arrow->manipulator.line_width);
- wm_manipulator_vec_draw(color, vec, ARRAY_SIZE(vec), pos, GWN_PRIM_LINE_LOOP);
- }
- else {
-#ifdef USE_MANIPULATOR_CUSTOM_ARROWS
- wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_arrow, select, color);
-#else
- const float arrow_length = RNA_float_get(arrow->manipulator.ptr, "length");
-
- const float vec[2][3] = {
- {0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, arrow_length},
- };
-
- if (draw_options & ED_MANIPULATOR_ARROW_DRAW_FLAG_STEM) {
- GPU_line_width(arrow->manipulator.line_width);
- wm_manipulator_vec_draw(color, vec, ARRAY_SIZE(vec), pos, GWN_PRIM_LINE_STRIP);
- }
- else {
- immUniformColor4fv(color);
- }
-
- /* *** draw arrow head *** */
-
- gpuPushMatrix();
-
- if (draw_style == ED_MANIPULATOR_ARROW_STYLE_BOX) {
- const float size = 0.05f;
-
- /* translate to line end with some extra offset so box starts exactly where line ends */
- gpuTranslate3f(0.0f, 0.0f, arrow_length + size);
- /* scale down to box size */
- gpuScale3f(size, size, size);
-
- /* draw cube */
- immUnbindProgram();
- unbind_shader = false;
- wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_cube, select, color);
- }
- else {
- BLI_assert(draw_style == ED_MANIPULATOR_ARROW_STYLE_NORMAL);
-
- const float len = 0.25f;
- const float width = 0.06f;
- const bool use_lighting = (!select && ((U.manipulator_flag & USER_MANIPULATOR_SHADED) != 0));
-
- /* translate to line end */
- gpuTranslate3f(0.0f, 0.0f, arrow_length);
-
- if (use_lighting) {
- immUnbindProgram();
- immBindBuiltinProgram(GPU_SHADER_3D_SMOOTH_COLOR);
- }
-
- imm_draw_circle_fill_3d(pos, 0.0, 0.0, width, 8);
- imm_draw_cylinder_fill_3d(pos, width, 0.0, len, 8, 1);
- }
-
- gpuPopMatrix();
-#endif /* USE_MANIPULATOR_CUSTOM_ARROWS */
- }
-
- if (unbind_shader) {
- immUnbindProgram();
- }
-}
-
-static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, const bool highlight)
-{
- wmManipulator *mpr = &arrow->manipulator;
- float color[4];
- float matrix_final[4][4];
-
- manipulator_color_get(mpr, highlight, color);
-
- WM_manipulator_calc_matrix_final(mpr, matrix_final);
-
- gpuPushMatrix();
- gpuMultMatrix(matrix_final);
- GPU_blend(true);
- arrow_draw_geom(arrow, select, color);
- GPU_blend(false);
-
- gpuPopMatrix();
-
- if (mpr->interaction_data) {
- ManipulatorInteraction *inter = mpr->interaction_data;
-
- gpuPushMatrix();
- gpuMultMatrix(inter->init_matrix_final);
-
-
- GPU_blend(true);
- arrow_draw_geom(arrow, select, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f});
- GPU_blend(false);
-
- gpuPopMatrix();
- }
-}
-
-static void manipulator_arrow_draw_select(
- const bContext *UNUSED(C), wmManipulator *mpr,
- int select_id)
-{
- GPU_select_load_id(select_id);
- arrow_draw_intern((ArrowManipulator3D *)mpr, true, false);
-}
-
-static void manipulator_arrow_draw(const bContext *UNUSED(C), wmManipulator *mpr)
-{
- arrow_draw_intern((ArrowManipulator3D *)mpr, false, (mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) != 0);
-}
-
-/**
- * Calculate arrow offset independent from prop min value,
- * meaning the range will not be offset by min value first.
- */
-static int manipulator_arrow_modal(
- bContext *C, wmManipulator *mpr, const wmEvent *event,
- eWM_ManipulatorTweak tweak_flag)
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
- ManipulatorInteraction *inter = mpr->interaction_data;
- View3D *v3d = CTX_wm_view3d(C);
- ARegion *ar = CTX_wm_region(C);
- RegionView3D *rv3d = ar->regiondata;
-
- float offset[3];
- float facdir = 1.0f;
-
- /* (src, dst) */
- struct {
- float mval[2];
- float ray_origin[3], ray_direction[3];
- float location[3];
- } proj[2] = {
- {.mval = {UNPACK2(inter->init_mval)}},
- {.mval = {UNPACK2(event->mval)}},
- };
-
- float arrow_co[3];
- float arrow_no[3];
- copy_v3_v3(arrow_co, inter->init_matrix_basis[3]);
- normalize_v3_v3(arrow_no, arrow->manipulator.matrix_basis[2]);
-
- int ok = 0;
-
- for (int j = 0; j < 2; j++) {
- if (ED_view3d_win_to_ray(
- CTX_data_depsgraph(C),
- ar, v3d, proj[j].mval,
- proj[j].ray_origin, proj[j].ray_direction, false))
- {
- /* Force Y axis if we're view aligned */
- if (j == 0) {
- if (RAD2DEGF(acosf(dot_v3v3(proj[j].ray_direction, arrow->manipulator.matrix_basis[2]))) < 5.0f) {
- normalize_v3_v3(arrow_no, rv3d->viewinv[1]);
- }
- }
-
- float arrow_no_proj[3];
- project_plane_v3_v3v3(arrow_no_proj, arrow_no, proj[j].ray_direction);
-
- normalize_v3(arrow_no_proj);
-
- float plane[4];
- plane_from_point_normal_v3(plane, proj[j].ray_origin, arrow_no_proj);
-
- float lambda;
- if (isect_ray_plane_v3(arrow_co, arrow_no, plane, &lambda, false)) {
- madd_v3_v3v3fl(proj[j].location, arrow_co, arrow_no, lambda);
- ok++;
- }
- }
- }
-
- if (ok != 2) {
- return OPERATOR_RUNNING_MODAL;
- }
-
- sub_v3_v3v3(offset, proj[1].location, proj[0].location);
- facdir = dot_v3v3(arrow_no, offset) < 0.0f ? -1 : 1;
-
- ManipulatorCommonData *data = &arrow->data;
- const float ofs_new = facdir * len_v3(offset);
-
- wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
-
- /* set the property for the operator and call its modal function */
- if (WM_manipulator_target_property_is_valid(mpr_prop)) {
- const int transform_flag = RNA_enum_get(arrow->manipulator.ptr, "transform");
- const bool constrained = (transform_flag & ED_MANIPULATOR_ARROW_XFORM_FLAG_CONSTRAINED) != 0;
- const bool inverted = (transform_flag & ED_MANIPULATOR_ARROW_XFORM_FLAG_INVERTED) != 0;
- const bool use_precision = (tweak_flag & WM_MANIPULATOR_TWEAK_PRECISE) != 0;
- float value = manipulator_value_from_offset(data, inter, ofs_new, constrained, inverted, use_precision);
-
- WM_manipulator_target_property_value_set(C, mpr, mpr_prop, value);
- /* get clamped value */
- value = WM_manipulator_target_property_value_get(mpr, mpr_prop);
-
- data->offset = manipulator_offset_from_value(data, value, constrained, inverted);
- }
- else {
- data->offset = ofs_new;
- }
-
- /* tag the region for redraw */
- ED_region_tag_redraw(ar);
- WM_event_add_mousemove(C);
-
- return OPERATOR_RUNNING_MODAL;
-}
-
-static void manipulator_arrow_setup(wmManipulator *mpr)
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
-
- arrow->manipulator.flag |= WM_MANIPULATOR_DRAW_MODAL;
-
- arrow->data.range_fac = 1.0f;
-}
-
-static int manipulator_arrow_invoke(
- bContext *UNUSED(C), wmManipulator *mpr, const wmEvent *event)
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
- ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__);
- wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
-
- /* Some manipulators don't use properties. */
- if (WM_manipulator_target_property_is_valid(mpr_prop)) {
- inter->init_value = WM_manipulator_target_property_value_get(mpr, mpr_prop);
- }
-
- inter->init_offset = arrow->data.offset;
-
- inter->init_mval[0] = event->mval[0];
- inter->init_mval[1] = event->mval[1];
-
- manipulator_arrow_matrix_basis_get(mpr, inter->init_matrix_basis);
- WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final);
-
- mpr->interaction_data = inter;
-
- return OPERATOR_RUNNING_MODAL;
-}
-
-static void manipulator_arrow_property_update(wmManipulator *mpr, wmManipulatorProperty *mpr_prop)
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
- const int transform_flag = RNA_enum_get(arrow->manipulator.ptr, "transform");
- const bool constrained = (transform_flag & ED_MANIPULATOR_ARROW_XFORM_FLAG_CONSTRAINED) != 0;
- const bool inverted = (transform_flag & ED_MANIPULATOR_ARROW_XFORM_FLAG_INVERTED) != 0;
- manipulator_property_data_update(mpr, &arrow->data, mpr_prop, constrained, inverted);
-}
-
-static void manipulator_arrow_exit(bContext *C, wmManipulator *mpr, const bool cancel)
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
- ManipulatorCommonData *data = &arrow->data;
- wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
- const bool is_prop_valid = WM_manipulator_target_property_is_valid(mpr_prop);
-
- if (!cancel) {
- /* Assign incase applying the opetration needs an updated offset
- * editmesh bisect needs this. */
- if (is_prop_valid) {
- data->offset = WM_manipulator_target_property_value_get(mpr, mpr_prop);
- }
- return;
- }
-
- ManipulatorInteraction *inter = mpr->interaction_data;
- if (is_prop_valid) {
- manipulator_property_value_reset(C, mpr, inter, mpr_prop);
- }
- data->offset = inter->init_offset;
-}
-
-
-/* -------------------------------------------------------------------- */
-/** \name Arrow Manipulator API
- *
- * \{ */
-
-/**
- * Define a custom property UI range
- *
- * \note Needs to be called before WM_manipulator_target_property_def_rna!
- */
-void ED_manipulator_arrow3d_set_ui_range(wmManipulator *mpr, const float min, const float max)
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
-
- BLI_assert(min < max);
- BLI_assert(!(WM_manipulator_target_property_is_valid(WM_manipulator_target_property_find(mpr, "offset")) &&
- "Make sure this function is called before WM_manipulator_target_property_def_rna"));
-
- arrow->data.range = max - min;
- arrow->data.min = min;
- arrow->data.flag |= MANIPULATOR_CUSTOM_RANGE_SET;
-}
-
-/**
- * Define a custom factor for arrow min/max distance
- *
- * \note Needs to be called before WM_manipulator_target_property_def_rna!
- */
-void ED_manipulator_arrow3d_set_range_fac(wmManipulator *mpr, const float range_fac)
-{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
- BLI_assert(!(WM_manipulator_target_property_is_valid(WM_manipulator_target_property_find(mpr, "offset")) &&
- "Make sure this function is called before WM_manipulator_target_property_def_rna"));
-
- arrow->data.range_fac = range_fac;
-}
-
-static void MANIPULATOR_WT_arrow_3d(wmManipulatorType *wt)
-{
- /* identifiers */
- wt->idname = "MANIPULATOR_WT_arrow_3d";
-
- /* api callbacks */
- wt->draw = manipulator_arrow_draw;
- wt->draw_select = manipulator_arrow_draw_select;
- wt->matrix_basis_get = manipulator_arrow_matrix_basis_get;
- wt->modal = manipulator_arrow_modal;
- wt->setup = manipulator_arrow_setup;
- wt->invoke = manipulator_arrow_invoke;
- wt->property_update = manipulator_arrow_property_update;
- wt->exit = manipulator_arrow_exit;
-
- wt->struct_size = sizeof(ArrowManipulator3D);
-
- /* rna */
- static EnumPropertyItem rna_enum_draw_style_items[] = {
- {ED_MANIPULATOR_ARROW_STYLE_NORMAL, "NORMAL", 0, "Normal", ""},
- {ED_MANIPULATOR_ARROW_STYLE_CROSS, "CROSS", 0, "Cross", ""},
- {ED_MANIPULATOR_ARROW_STYLE_BOX, "BOX", 0, "Box", ""},
- {ED_MANIPULATOR_ARROW_STYLE_CONE, "CONE", 0, "Cone", ""},
- {0, NULL, 0, NULL, NULL}
- };
- static EnumPropertyItem rna_enum_draw_options_items[] = {
- {ED_MANIPULATOR_ARROW_DRAW_FLAG_STEM, "STEM", 0, "Stem", ""},
- {0, NULL, 0, NULL, NULL}
- };
- static EnumPropertyItem rna_enum_transform_items[] = {
- {ED_MANIPULATOR_ARROW_XFORM_FLAG_INVERTED, "INVERT", 0, "Inverted", ""},
- {ED_MANIPULATOR_ARROW_XFORM_FLAG_CONSTRAINED, "CONSTRAIN", 0, "Constrained", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
- RNA_def_enum(
- wt->srna, "draw_style", rna_enum_draw_style_items,
- ED_MANIPULATOR_ARROW_STYLE_NORMAL,
- "Draw Style", "");
- RNA_def_enum_flag(
- wt->srna, "draw_options", rna_enum_draw_options_items,
- ED_MANIPULATOR_ARROW_DRAW_FLAG_STEM,
- "Draw Options", "");
- RNA_def_enum_flag(
- wt->srna, "transform", rna_enum_transform_items,
- 0,
- "Transform", "");
-
- RNA_def_float(wt->srna, "length", 1.0f, 0.0f, FLT_MAX, "Arrow Line Length", "", 0.0f, FLT_MAX);
- RNA_def_float_vector(wt->srna, "aspect", 2, NULL, 0, FLT_MAX, "Aspect", "Cone/box style only", 0.0f, FLT_MAX);
-
- WM_manipulatortype_target_property_def(wt, "offset", PROP_FLOAT, 1);
-}
-
-void ED_manipulatortypes_arrow_3d(void)
-{
- WM_manipulatortype_append(MANIPULATOR_WT_arrow_3d);
-}
-
-/** \} */