2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
* 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,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
*
|
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*/
|
2011-02-27 20:29:51 +00:00
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
|
* \ingroup edtransform
|
2011-02-27 20:29:51 +00:00
|
|
|
*/
|
|
|
|
|
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
#include <float.h>
|
|
|
|
|
|
|
|
|
|
#include "PIL_time.h"
|
|
|
|
|
|
2009-03-29 19:52:53 +00:00
|
|
|
#include "DNA_windowmanager_types.h"
|
|
|
|
|
|
2009-02-24 00:45:40 +00:00
|
|
|
#include "BLI_blenlib.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "BLI_math.h"
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2017-02-02 03:14:52 -02:00
|
|
|
#include "GPU_immediate.h"
|
2018-06-27 19:07:23 -06:00
|
|
|
#include "GPU_state.h"
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
|
|
|
|
#include "BKE_context.h"
|
2013-04-13 20:31:52 +00:00
|
|
|
#include "BKE_editmesh.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "BKE_layer.h"
|
|
|
|
|
#include "BKE_object.h"
|
2020-07-22 12:00:02 -03:00
|
|
|
#include "BKE_scene.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "BKE_sequencer.h"
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2013-03-07 02:44:55 +00:00
|
|
|
#include "RNA_access.h"
|
|
|
|
|
|
|
|
|
|
#include "WM_types.h"
|
|
|
|
|
|
2020-05-27 00:14:11 -03:00
|
|
|
#include "ED_gizmo_library.h"
|
2019-10-28 09:51:53 -03:00
|
|
|
#include "ED_markers.h"
|
2012-06-29 14:34:46 +00:00
|
|
|
#include "ED_node.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "ED_transform_snap_object_context.h"
|
2009-01-28 21:43:43 +00:00
|
|
|
#include "ED_uvedit.h"
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2009-01-10 18:33:16 +00:00
|
|
|
#include "UI_resources.h"
|
2009-01-28 21:43:43 +00:00
|
|
|
#include "UI_view2d.h"
|
2009-01-10 18:33:16 +00:00
|
|
|
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
|
|
#include "transform.h"
|
2020-06-06 10:30:32 -03:00
|
|
|
#include "transform_convert.h"
|
2019-10-29 00:45:05 +11:00
|
|
|
#include "transform_snap.h"
|
2009-01-10 18:33:16 +00:00
|
|
|
|
2013-04-03 09:48:21 +00:00
|
|
|
/* this should be passed as an arg for use in snap functions */
|
2017-11-09 13:23:01 -02:00
|
|
|
#undef BASACT
|
2013-04-03 09:48:21 +00:00
|
|
|
|
2013-04-11 10:17:06 +00:00
|
|
|
/* use half of flt-max so we can scale up without an exception */
|
2012-10-05 01:34:47 +00:00
|
|
|
|
2019-10-28 09:32:59 -03:00
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Prototypes
|
|
|
|
|
* \{ */
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void setSnappingCallback(TransInfo *t);
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2011-11-19 00:52:54 +00:00
|
|
|
/* static void CalcSnapGrid(TransInfo *t, float *vec); */
|
2011-11-15 16:38:48 +00:00
|
|
|
static void CalcSnapGeometry(TransInfo *t, float *vec);
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void TargetSnapMedian(TransInfo *t);
|
|
|
|
|
static void TargetSnapCenter(TransInfo *t);
|
|
|
|
|
static void TargetSnapClosest(TransInfo *t);
|
|
|
|
|
static void TargetSnapActive(TransInfo *t);
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2019-10-28 09:32:59 -03:00
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Implementations
|
|
|
|
|
* \{ */
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2017-10-17 13:43:10 +11:00
|
|
|
static bool snapNodeTest(View2D *v2d, bNode *node, eSnapSelect snap_select);
|
2012-06-29 14:34:46 +00:00
|
|
|
static NodeBorder snapNodeBorder(int snap_node_mode);
|
|
|
|
|
|
2011-02-07 12:07:26 +00:00
|
|
|
#if 0
|
2008-12-31 22:43:29 +00:00
|
|
|
int BIF_snappingSupported(Object *obedit)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
int status = 0;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* only support object mesh, armature, curves */
|
|
|
|
|
if (obedit == NULL || ELEM(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE, OB_LATTICE, OB_MBALL)) {
|
|
|
|
|
status = 1;
|
|
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
return status;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
2011-02-07 12:07:26 +00:00
|
|
|
#endif
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2020-07-22 12:00:02 -03:00
|
|
|
static bool snap_use_backface_culling(const TransInfo *t)
|
|
|
|
|
{
|
|
|
|
|
BLI_assert(t->spacetype == SPACE_VIEW3D);
|
|
|
|
|
View3D *v3d = t->view;
|
|
|
|
|
if ((v3d->shading.type == OB_SOLID) && (v3d->shading.flag & V3D_SHADING_BACKFACE_CULLING)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (v3d->shading.type == OB_RENDER &&
|
|
|
|
|
(t->scene->display.shading.flag & V3D_SHADING_BACKFACE_CULLING) &&
|
|
|
|
|
BKE_scene_uses_blender_workbench(t->scene)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (t->settings->snap_flag & SCE_SNAP_BACKFACE_CULLING) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 17:57:05 +02:00
|
|
|
bool validSnap(const TransInfo *t)
|
2009-12-03 19:18:00 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
return (t->tsnap.status & (POINT_INIT | TARGET_INIT)) == (POINT_INIT | TARGET_INIT) ||
|
|
|
|
|
(t->tsnap.status & (MULTI_POINTS | TARGET_INIT)) == (MULTI_POINTS | TARGET_INIT);
|
2009-12-01 18:26:18 +00:00
|
|
|
}
|
|
|
|
|
|
2018-07-09 17:57:05 +02:00
|
|
|
bool activeSnap(const TransInfo *t)
|
2009-12-03 19:18:00 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
return ((t->modifiers & (MOD_SNAP | MOD_SNAP_INVERT)) == MOD_SNAP) ||
|
|
|
|
|
((t->modifiers & (MOD_SNAP | MOD_SNAP_INVERT)) == MOD_SNAP_INVERT);
|
2009-12-03 19:18:00 +00:00
|
|
|
}
|
|
|
|
|
|
2018-12-18 11:54:02 +01:00
|
|
|
bool transformModeUseSnap(const TransInfo *t)
|
2018-12-18 10:03:50 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
ToolSettings *ts = t->settings;
|
|
|
|
|
if (t->mode == TFM_TRANSLATION) {
|
|
|
|
|
return (ts->snap_transform_mode_flag & SCE_SNAP_TRANSFORM_MODE_TRANSLATE) != 0;
|
|
|
|
|
}
|
|
|
|
|
if (t->mode == TFM_ROTATION) {
|
|
|
|
|
return (ts->snap_transform_mode_flag & SCE_SNAP_TRANSFORM_MODE_ROTATE) != 0;
|
|
|
|
|
}
|
|
|
|
|
if (t->mode == TFM_RESIZE) {
|
|
|
|
|
return (ts->snap_transform_mode_flag & SCE_SNAP_TRANSFORM_MODE_SCALE) != 0;
|
|
|
|
|
}
|
2020-06-22 09:07:51 -03:00
|
|
|
if (t->mode == TFM_VERT_SLIDE) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2020-06-22 15:28:25 -03:00
|
|
|
if (t->mode == TFM_EDGE_SLIDE) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
return false;
|
2018-12-18 10:03:50 +11:00
|
|
|
}
|
|
|
|
|
|
2018-12-18 11:54:02 +01:00
|
|
|
static bool doForceIncrementSnap(const TransInfo *t)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
return !transformModeUseSnap(t);
|
2018-12-18 11:54:02 +01:00
|
|
|
}
|
|
|
|
|
|
2009-03-28 20:46:38 +00:00
|
|
|
void drawSnapping(const struct bContext *C, TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2020-04-03 16:21:24 +11:00
|
|
|
uchar col[4], selectedCol[4], activeCol[4];
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-22 09:19:45 +10:00
|
|
|
if (!activeSnap(t)) {
|
2019-04-17 06:17:24 +02:00
|
|
|
return;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
|
|
|
|
|
col[3] = 128;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
UI_GetThemeColor3ubv(TH_SELECT, selectedCol);
|
|
|
|
|
selectedCol[3] = 128;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
UI_GetThemeColor3ubv(TH_ACTIVE, activeCol);
|
|
|
|
|
activeCol[3] = 192;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->spacetype == SPACE_VIEW3D) {
|
2019-08-23 15:20:25 -03:00
|
|
|
bool draw_target = (t->tsnap.status & TARGET_INIT) &&
|
|
|
|
|
(t->scene->toolsettings->snap_mode & SCE_SNAP_MODE_EDGE_PERPENDICULAR);
|
|
|
|
|
|
|
|
|
|
if (draw_target || validSnap(t)) {
|
2020-05-27 00:14:11 -03:00
|
|
|
const float *loc_cur = NULL;
|
|
|
|
|
const float *loc_prev = NULL;
|
|
|
|
|
const float *normal = NULL;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2020-08-20 16:38:34 +02:00
|
|
|
GPU_depth_test(GPU_DEPTH_NONE);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2020-05-27 00:14:11 -03:00
|
|
|
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
|
|
|
|
if (!BLI_listbase_is_empty(&t->tsnap.points)) {
|
|
|
|
|
/* Draw snap points. */
|
|
|
|
|
|
|
|
|
|
float size = 2.0f * UI_GetThemeValuef(TH_VERTEX_SIZE);
|
|
|
|
|
float view_inv[4][4];
|
|
|
|
|
copy_m4_m4(view_inv, rv3d->viewinv);
|
|
|
|
|
|
|
|
|
|
uint pos = GPU_vertformat_attr_add(
|
|
|
|
|
immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
|
|
|
|
|
|
|
|
|
|
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
|
|
|
|
|
|
|
|
|
|
LISTBASE_FOREACH (TransSnapPoint *, p, &t->tsnap.points) {
|
|
|
|
|
if (p == t->tsnap.selectedPoint) {
|
|
|
|
|
immUniformColor4ubv(selectedCol);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
immUniformColor4ubv(col);
|
|
|
|
|
}
|
|
|
|
|
imm_drawcircball(p->co, ED_view3d_pixel_size(rv3d, p->co) * size, view_inv, pos);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2020-05-27 00:14:11 -03:00
|
|
|
immUnbindProgram();
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* draw normal if needed */
|
|
|
|
|
if (usingSnappingNormal(t) && validSnappingNormal(t)) {
|
2020-05-27 00:14:11 -03:00
|
|
|
normal = t->tsnap.snapNormal;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2017-02-02 03:14:52 -02:00
|
|
|
|
2019-08-23 15:20:25 -03:00
|
|
|
if (draw_target) {
|
2020-05-27 00:14:11 -03:00
|
|
|
loc_prev = t->tsnap.snapTarget;
|
|
|
|
|
}
|
2019-08-23 15:20:25 -03:00
|
|
|
|
2020-05-27 00:14:11 -03:00
|
|
|
if (validSnap(t)) {
|
|
|
|
|
loc_cur = t->tsnap.snapPoint;
|
2019-08-23 15:20:25 -03:00
|
|
|
}
|
|
|
|
|
|
2020-05-27 00:14:11 -03:00
|
|
|
ED_gizmotypes_snap_3d_draw_util(
|
|
|
|
|
rv3d, loc_prev, loc_cur, normal, col, activeCol, t->tsnap.snapElem);
|
2017-02-02 03:14:52 -02:00
|
|
|
|
2020-08-20 16:38:34 +02:00
|
|
|
GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (t->spacetype == SPACE_IMAGE) {
|
|
|
|
|
if (validSnap(t)) {
|
|
|
|
|
/* This will not draw, and Im nor sure why - campbell */
|
|
|
|
|
/* TODO: see 2.7x for non-working code */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (t->spacetype == SPACE_NODE) {
|
|
|
|
|
if (validSnap(t)) {
|
2020-03-06 16:56:42 +01:00
|
|
|
ARegion *region = CTX_wm_region(C);
|
2019-04-17 06:17:24 +02:00
|
|
|
TransSnapPoint *p;
|
|
|
|
|
float size;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
size = 2.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2020-08-16 15:38:34 +02:00
|
|
|
GPU_blend(GPU_BLEND_ALPHA);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
uint pos = GPU_vertformat_attr_add(
|
|
|
|
|
immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
|
2017-02-02 03:14:52 -02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
|
2017-02-02 03:14:52 -02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
for (p = t->tsnap.points.first; p; p = p->next) {
|
|
|
|
|
if (p == t->tsnap.selectedPoint) {
|
|
|
|
|
immUniformColor4ubv(selectedCol);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
immUniformColor4ubv(col);
|
|
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2020-03-06 16:56:42 +01:00
|
|
|
ED_node_draw_snap(®ion->v2d, p->co, size, 0, pos);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->tsnap.status & POINT_INIT) {
|
|
|
|
|
immUniformColor4ubv(activeCol);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2020-03-06 16:56:42 +01:00
|
|
|
ED_node_draw_snap(®ion->v2d, t->tsnap.snapPoint, size, t->tsnap.snapNodeBorder, pos);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2017-02-02 03:14:52 -02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
immUnbindProgram();
|
2017-02-02 03:14:52 -02:00
|
|
|
|
2020-08-16 15:38:34 +02:00
|
|
|
GPU_blend(GPU_BLEND_NONE);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2013-10-23 06:48:36 +00:00
|
|
|
eRedrawFlag handleSnapping(TransInfo *t, const wmEvent *event)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
eRedrawFlag status = TREDRAW_NOTHING;
|
|
|
|
|
|
|
|
|
|
#if 0 // XXX need a proper selector for all snap mode
|
|
|
|
|
if (BIF_snappingSupported(t->obedit) && event->type == TABKEY && event->shift) {
|
|
|
|
|
/* toggle snap and reinit */
|
|
|
|
|
t->settings->snap_flag ^= SCE_SNAP;
|
|
|
|
|
initSnapping(t, NULL);
|
|
|
|
|
status = TREDRAW_HARD;
|
|
|
|
|
}
|
2009-11-26 19:47:55 +00:00
|
|
|
#endif
|
2019-04-17 06:17:24 +02:00
|
|
|
if (event->type == MOUSEMOVE) {
|
|
|
|
|
status |= updateSelectedSnapPoint(t);
|
|
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
return status;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2009-10-22 23:22:05 +00:00
|
|
|
void applyProject(TransInfo *t)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* XXX FLICKER IN OBJECT MODE */
|
|
|
|
|
if ((t->tsnap.project) && activeSnap(t) && (t->flag & T_NO_PROJECT) == 0) {
|
|
|
|
|
float tvec[3];
|
|
|
|
|
int i;
|
|
|
|
|
|
2019-04-21 04:40:16 +10:00
|
|
|
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
2019-04-17 06:17:24 +02:00
|
|
|
TransData *td = tc->data;
|
|
|
|
|
for (i = 0; i < tc->data_len; i++, td++) {
|
|
|
|
|
float iloc[3], loc[3], no[3];
|
|
|
|
|
float mval_fl[2];
|
2019-04-22 09:19:45 +10:00
|
|
|
if (td->flag & TD_SKIP) {
|
2019-04-17 06:17:24 +02:00
|
|
|
continue;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2019-04-22 09:19:45 +10:00
|
|
|
if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) {
|
2019-04-17 06:17:24 +02:00
|
|
|
continue;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
copy_v3_v3(iloc, td->loc);
|
|
|
|
|
if (tc->use_local_mat) {
|
|
|
|
|
mul_m4_v3(tc->mat, iloc);
|
|
|
|
|
}
|
|
|
|
|
else if (t->flag & T_OBJECT) {
|
|
|
|
|
BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob);
|
|
|
|
|
copy_v3_v3(iloc, td->ob->obmat[3]);
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-06 16:56:42 +01:00
|
|
|
if (ED_view3d_project_float_global(t->region, iloc, mval_fl, V3D_PROJ_TEST_NOP) ==
|
2019-04-17 06:17:24 +02:00
|
|
|
V3D_PROJ_RET_OK) {
|
|
|
|
|
if (ED_transform_snap_object_project_view3d(
|
|
|
|
|
t->tsnap.object_context,
|
2020-03-09 10:02:11 -03:00
|
|
|
t->depsgraph,
|
2019-04-17 06:17:24 +02:00
|
|
|
SCE_SNAP_MODE_FACE,
|
|
|
|
|
&(const struct SnapObjectParams){
|
|
|
|
|
.snap_select = t->tsnap.modeSelect,
|
|
|
|
|
.use_object_edit_cage = (t->flag & T_EDIT) != 0,
|
|
|
|
|
.use_occlusion_test = false,
|
2020-07-22 12:00:02 -03:00
|
|
|
.use_backface_culling = t->tsnap.use_backface_culling,
|
2019-04-17 06:17:24 +02:00
|
|
|
},
|
|
|
|
|
mval_fl,
|
2019-08-20 19:18:25 -03:00
|
|
|
NULL,
|
2019-04-17 06:17:24 +02:00
|
|
|
0,
|
|
|
|
|
loc,
|
|
|
|
|
no)) {
|
2018-04-16 17:54:33 +02:00
|
|
|
#if 0
|
2019-04-17 06:17:24 +02:00
|
|
|
if (tc->use_local_mat) {
|
|
|
|
|
mul_m4_v3(tc->imat, loc);
|
|
|
|
|
}
|
2018-04-16 17:54:33 +02:00
|
|
|
#endif
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
sub_v3_v3v3(tvec, loc, iloc);
|
2018-04-16 17:54:33 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
mul_m3_v3(td->smtx, tvec);
|
2018-04-16 17:54:33 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
add_v3_v3(td->loc, tvec);
|
2014-07-31 17:02:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->tsnap.align && (t->flag & T_OBJECT)) {
|
|
|
|
|
/* handle alignment as well */
|
|
|
|
|
const float *original_normal;
|
|
|
|
|
float mat[3][3];
|
2014-07-31 17:02:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* In pose mode, we want to align normals with Y axis of bones... */
|
|
|
|
|
original_normal = td->axismtx[2];
|
2018-04-16 17:54:33 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
rotation_between_vecs_to_mat3(mat, original_normal, no);
|
2018-04-16 17:54:33 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
transform_data_ext_rotate(td, mat, true);
|
2018-04-16 17:54:33 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* TODO support constraints for rotation too? see ElementRotation */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-04-16 17:54:33 +02:00
|
|
|
|
2019-05-01 11:09:22 +10:00
|
|
|
// XXX constraintTransLim(t, td);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-10-22 23:22:05 +00:00
|
|
|
}
|
|
|
|
|
|
2013-11-06 17:46:32 +00:00
|
|
|
void applyGridAbsolute(TransInfo *t)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
int i;
|
|
|
|
|
|
2019-04-22 09:19:45 +10:00
|
|
|
if (!(activeSnap(t) && (t->tsnap.mode & (SCE_SNAP_MODE_INCREMENT | SCE_SNAP_MODE_GRID)))) {
|
2019-04-17 06:17:24 +02:00
|
|
|
return;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
float grid_size = (t->modifiers & MOD_PRECISION) ? t->snap_spatial[2] : t->snap_spatial[1];
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
/* early exit on unusable grid size */
|
2019-04-22 09:19:45 +10:00
|
|
|
if (grid_size == 0.0f) {
|
2019-04-17 06:17:24 +02:00
|
|
|
return;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2019-04-21 04:40:16 +10:00
|
|
|
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
2019-04-17 06:17:24 +02:00
|
|
|
TransData *td;
|
|
|
|
|
|
|
|
|
|
for (i = 0, td = tc->data; i < tc->data_len; i++, td++) {
|
|
|
|
|
float iloc[3], loc[3], tvec[3];
|
2019-04-22 09:19:45 +10:00
|
|
|
if (td->flag & TD_SKIP) {
|
2019-04-17 06:17:24 +02:00
|
|
|
continue;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2019-04-22 09:19:45 +10:00
|
|
|
if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) {
|
2019-04-17 06:17:24 +02:00
|
|
|
continue;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
copy_v3_v3(iloc, td->loc);
|
|
|
|
|
if (tc->use_local_mat) {
|
|
|
|
|
mul_m4_v3(tc->mat, iloc);
|
|
|
|
|
}
|
|
|
|
|
else if (t->flag & T_OBJECT) {
|
|
|
|
|
BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob);
|
|
|
|
|
copy_v3_v3(iloc, td->ob->obmat[3]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mul_v3_v3fl(loc, iloc, 1.0f / grid_size);
|
|
|
|
|
loc[0] = roundf(loc[0]);
|
|
|
|
|
loc[1] = roundf(loc[1]);
|
|
|
|
|
loc[2] = roundf(loc[2]);
|
|
|
|
|
mul_v3_fl(loc, grid_size);
|
|
|
|
|
|
|
|
|
|
sub_v3_v3v3(tvec, loc, iloc);
|
|
|
|
|
mul_m3_v3(td->smtx, tvec);
|
|
|
|
|
add_v3_v3(td->loc, tvec);
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-11-06 17:46:32 +00:00
|
|
|
}
|
|
|
|
|
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
void applySnapping(TransInfo *t, float *vec)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Each Trans Data already makes the snap to face */
|
2020-08-31 10:14:40 -03:00
|
|
|
if (doForceIncrementSnap(t)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (t->tsnap.project && t->tsnap.mode == SCE_SNAP_MODE_FACE) {
|
|
|
|
|
/* The snap has already been resolved for each transdata. */
|
2019-04-17 06:17:24 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (t->tsnap.status & SNAP_FORCED) {
|
|
|
|
|
t->tsnap.targetSnap(t);
|
|
|
|
|
|
|
|
|
|
t->tsnap.applySnap(t, vec);
|
|
|
|
|
}
|
|
|
|
|
else if (((t->tsnap.mode & ~(SCE_SNAP_MODE_INCREMENT | SCE_SNAP_MODE_GRID)) != 0) &&
|
|
|
|
|
activeSnap(t)) {
|
|
|
|
|
double current = PIL_check_seconds_timer();
|
|
|
|
|
|
|
|
|
|
// Time base quirky code to go around findnearest slowness
|
|
|
|
|
/* !TODO! add exception for object mode, no need to slow it down then */
|
|
|
|
|
if (current - t->tsnap.last >= 0.01) {
|
|
|
|
|
t->tsnap.calcSnap(t, vec);
|
|
|
|
|
t->tsnap.targetSnap(t);
|
|
|
|
|
|
|
|
|
|
t->tsnap.last = current;
|
|
|
|
|
}
|
|
|
|
|
if (validSnap(t)) {
|
|
|
|
|
t->tsnap.applySnap(t, vec);
|
|
|
|
|
}
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void resetSnapping(TransInfo *t)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.status = 0;
|
|
|
|
|
t->tsnap.align = false;
|
|
|
|
|
t->tsnap.project = 0;
|
|
|
|
|
t->tsnap.mode = 0;
|
|
|
|
|
t->tsnap.modeSelect = 0;
|
|
|
|
|
t->tsnap.target = 0;
|
|
|
|
|
t->tsnap.last = 0;
|
|
|
|
|
|
|
|
|
|
t->tsnap.snapNormal[0] = 0;
|
|
|
|
|
t->tsnap.snapNormal[1] = 0;
|
|
|
|
|
t->tsnap.snapNormal[2] = 0;
|
|
|
|
|
|
|
|
|
|
t->tsnap.snapNodeBorder = 0;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2018-07-09 17:57:05 +02:00
|
|
|
bool usingSnappingNormal(const TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
return t->tsnap.align;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2018-07-09 17:57:05 +02:00
|
|
|
bool validSnappingNormal(const TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (validSnap(t)) {
|
|
|
|
|
if (!is_zero_v3(t->tsnap.snapNormal)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
return false;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2016-05-06 07:44:07 +10:00
|
|
|
static bool bm_edge_is_snap_target(BMEdge *e, void *UNUSED(user_data))
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (BM_elem_flag_test(e, BM_ELEM_SELECT | BM_ELEM_HIDDEN) ||
|
|
|
|
|
BM_elem_flag_test(e->v1, BM_ELEM_SELECT) || BM_elem_flag_test(e->v2, BM_ELEM_SELECT)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
2016-05-06 07:44:07 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool bm_face_is_snap_target(BMFace *f, void *UNUSED(user_data))
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (BM_elem_flag_test(f, BM_ELEM_SELECT | BM_ELEM_HIDDEN)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BMLoop *l_iter, *l_first;
|
|
|
|
|
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
|
|
|
|
|
do {
|
|
|
|
|
if (BM_elem_flag_test(l_iter->v, BM_ELEM_SELECT)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} while ((l_iter = l_iter->next) != l_first);
|
|
|
|
|
|
|
|
|
|
return true;
|
2016-05-06 07:44:07 +10:00
|
|
|
}
|
|
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
static void initSnappingMode(TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
ToolSettings *ts = t->settings;
|
|
|
|
|
/* All obedit types will match. */
|
|
|
|
|
const int obedit_type = t->data_container->obedit ? t->data_container->obedit->type : -1;
|
|
|
|
|
ViewLayer *view_layer = t->view_layer;
|
|
|
|
|
Base *base_act = view_layer->basact;
|
|
|
|
|
|
|
|
|
|
if (t->spacetype == SPACE_NODE) {
|
|
|
|
|
/* force project off when not supported */
|
|
|
|
|
t->tsnap.project = 0;
|
|
|
|
|
|
|
|
|
|
t->tsnap.mode = ts->snap_node_mode;
|
|
|
|
|
}
|
|
|
|
|
else if (t->spacetype == SPACE_IMAGE) {
|
|
|
|
|
/* force project off when not supported */
|
|
|
|
|
t->tsnap.project = 0;
|
|
|
|
|
|
|
|
|
|
t->tsnap.mode = ts->snap_uv_mode;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
/* force project off when not supported */
|
2019-04-22 09:19:45 +10:00
|
|
|
if ((ts->snap_mode & SCE_SNAP_MODE_FACE) == 0) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.project = 0;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
t->tsnap.mode = ts->snap_mode;
|
2020-08-31 10:14:40 -03:00
|
|
|
if ((t->tsnap.mode & SCE_SNAP_MODE_INCREMENT) && (ts->snap_flag & SCE_SNAP_ABS_GRID) &&
|
|
|
|
|
(t->mode == TFM_TRANSLATION)) {
|
|
|
|
|
/* Special case in which snap to increments is transformed to snap to grid. */
|
|
|
|
|
t->tsnap.mode &= ~SCE_SNAP_MODE_INCREMENT;
|
|
|
|
|
t->tsnap.mode |= SCE_SNAP_MODE_GRID;
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2020-06-18 09:08:27 -03:00
|
|
|
if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && (t->flag & T_CAMERA) == 0) {
|
|
|
|
|
/* Only 3D view or UV. */
|
|
|
|
|
/* Not with camera selected in camera view. */
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
setSnappingCallback(t);
|
|
|
|
|
|
2020-06-18 09:08:27 -03:00
|
|
|
if ((obedit_type != -1) &&
|
|
|
|
|
ELEM(obedit_type, OB_MESH, OB_ARMATURE, OB_CURVE, OB_LATTICE, OB_MBALL)) {
|
|
|
|
|
/* Edit mode */
|
|
|
|
|
/* Temporary limited to edit mode meshes, armature, curves, metaballs. */
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if ((obedit_type == OB_MESH) && (t->flag & T_PROP_EDIT)) {
|
2020-06-18 09:08:27 -03:00
|
|
|
/* Exclude editmesh if using proportional edit */
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.modeSelect = SNAP_NOT_ACTIVE;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
t->tsnap.modeSelect = t->tsnap.snap_self ? SNAP_ALL : SNAP_NOT_ACTIVE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-18 09:08:27 -03:00
|
|
|
else if ((obedit_type == -1) && base_act && base_act->object &&
|
|
|
|
|
(base_act->object->mode & OB_MODE_PARTICLE_EDIT)) {
|
|
|
|
|
/* Particles edit mode. */
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.modeSelect = SNAP_ALL;
|
|
|
|
|
}
|
2020-06-18 09:08:27 -03:00
|
|
|
else if (obedit_type == -1) {
|
|
|
|
|
/* Object mode */
|
2019-08-28 13:42:22 +10:00
|
|
|
if (t->options & (CTX_GPENCIL_STROKES | CTX_CURSOR | CTX_OBMODE_XFORM_OBDATA)) {
|
2019-08-26 14:40:00 +10:00
|
|
|
/* In "Edit Strokes" mode,
|
|
|
|
|
* snap tool can perform snap to selected or active objects (see T49632)
|
2019-08-28 13:42:22 +10:00
|
|
|
* TODO: perform self snap in gpencil_strokes.
|
|
|
|
|
*
|
|
|
|
|
* When we're moving the origins, allow snapping onto our own geometry (see T69132). */
|
2019-08-26 14:40:00 +10:00
|
|
|
t->tsnap.modeSelect = SNAP_ALL;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
t->tsnap.modeSelect = SNAP_NOT_SELECTED;
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
else {
|
2020-08-31 10:14:40 -03:00
|
|
|
/* Increment if snap is not possible */
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.mode = SCE_SNAP_MODE_INCREMENT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (t->spacetype == SPACE_NODE) {
|
|
|
|
|
setSnappingCallback(t);
|
2020-06-18 09:08:27 -03:00
|
|
|
t->tsnap.modeSelect = SNAP_NOT_SELECTED;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
else if (t->spacetype == SPACE_SEQ) {
|
|
|
|
|
/* We do our own snapping currently, so nothing here */
|
|
|
|
|
t->tsnap.mode = SCE_SNAP_MODE_GRID; /* Dummy, should we rather add a NOP mode? */
|
|
|
|
|
}
|
|
|
|
|
else {
|
2020-08-31 10:14:40 -03:00
|
|
|
/* Always increment outside of 3D view */
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.mode = SCE_SNAP_MODE_INCREMENT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (t->spacetype == SPACE_VIEW3D) {
|
|
|
|
|
if (t->tsnap.object_context == NULL) {
|
2020-07-22 12:00:02 -03:00
|
|
|
t->tsnap.use_backface_culling = snap_use_backface_culling(t);
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.object_context = ED_transform_snap_object_context_create_view3d(
|
2020-05-27 16:54:34 +10:00
|
|
|
t->scene, 0, t->region, t->view);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-06-12 22:07:27 -03:00
|
|
|
if (t->data_type == TC_MESH_VERTS) {
|
|
|
|
|
/* Ignore elements being transformed. */
|
|
|
|
|
ED_transform_snap_object_context_set_editmesh_callbacks(
|
|
|
|
|
t->tsnap.object_context,
|
|
|
|
|
(bool (*)(BMVert *, void *))BM_elem_cb_check_hflag_disabled,
|
|
|
|
|
bm_edge_is_snap_target,
|
|
|
|
|
bm_face_is_snap_target,
|
|
|
|
|
POINTER_FROM_UINT((BM_ELEM_SELECT | BM_ELEM_HIDDEN)));
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
}
|
2009-12-03 19:18:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void initSnapping(TransInfo *t, wmOperator *op)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
ToolSettings *ts = t->settings;
|
|
|
|
|
short snap_target = t->settings->snap_target;
|
|
|
|
|
|
|
|
|
|
resetSnapping(t);
|
|
|
|
|
|
|
|
|
|
/* if snap property exists */
|
|
|
|
|
if (op && RNA_struct_find_property(op->ptr, "snap") &&
|
|
|
|
|
RNA_struct_property_is_set(op->ptr, "snap")) {
|
|
|
|
|
if (RNA_boolean_get(op->ptr, "snap")) {
|
|
|
|
|
t->modifiers |= MOD_SNAP;
|
|
|
|
|
|
|
|
|
|
if (RNA_struct_property_is_set(op->ptr, "snap_target")) {
|
|
|
|
|
snap_target = RNA_enum_get(op->ptr, "snap_target");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (RNA_struct_property_is_set(op->ptr, "snap_point")) {
|
|
|
|
|
RNA_float_get_array(op->ptr, "snap_point", t->tsnap.snapPoint);
|
|
|
|
|
t->tsnap.status |= SNAP_FORCED | POINT_INIT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* snap align only defined in specific cases */
|
|
|
|
|
if (RNA_struct_find_property(op->ptr, "snap_align")) {
|
|
|
|
|
t->tsnap.align = RNA_boolean_get(op->ptr, "snap_align");
|
|
|
|
|
RNA_float_get_array(op->ptr, "snap_normal", t->tsnap.snapNormal);
|
|
|
|
|
normalize_v3(t->tsnap.snapNormal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (RNA_struct_find_property(op->ptr, "use_snap_project")) {
|
|
|
|
|
t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (RNA_struct_find_property(op->ptr, "use_snap_self")) {
|
|
|
|
|
t->tsnap.snap_self = RNA_boolean_get(op->ptr, "use_snap_self");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* use scene defaults only when transform is modal */
|
|
|
|
|
else if (t->flag & T_MODAL) {
|
|
|
|
|
if (ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE, SPACE_NODE)) {
|
|
|
|
|
if (transformModeUseSnap(t) && (ts->snap_flag & SCE_SNAP)) {
|
|
|
|
|
t->modifiers |= MOD_SNAP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) != 0);
|
|
|
|
|
t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) != 0);
|
|
|
|
|
t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) != 0);
|
|
|
|
|
t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) != 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
t->tsnap.target = snap_target;
|
|
|
|
|
|
|
|
|
|
initSnappingMode(t);
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2016-04-21 11:29:32 +10:00
|
|
|
void freeSnapping(TransInfo *t)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->tsnap.object_context) {
|
|
|
|
|
ED_transform_snap_object_context_destroy(t->tsnap.object_context);
|
|
|
|
|
t->tsnap.object_context = NULL;
|
|
|
|
|
}
|
2016-04-21 11:29:32 +10:00
|
|
|
}
|
|
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void setSnappingCallback(TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.calcSnap = CalcSnapGeometry;
|
|
|
|
|
|
|
|
|
|
switch (t->tsnap.target) {
|
|
|
|
|
case SCE_SNAP_TARGET_CLOSEST:
|
|
|
|
|
t->tsnap.targetSnap = TargetSnapClosest;
|
|
|
|
|
break;
|
|
|
|
|
case SCE_SNAP_TARGET_CENTER:
|
2020-06-19 09:44:57 +10:00
|
|
|
if (!ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) {
|
2020-06-18 09:08:27 -03:00
|
|
|
t->tsnap.targetSnap = TargetSnapCenter;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-06-19 09:44:57 +10:00
|
|
|
/* Can't do TARGET_CENTER with these modes,
|
|
|
|
|
* use TARGET_MEDIAN instead. */
|
|
|
|
|
ATTR_FALLTHROUGH;
|
2019-04-17 06:17:24 +02:00
|
|
|
case SCE_SNAP_TARGET_MEDIAN:
|
|
|
|
|
t->tsnap.targetSnap = TargetSnapMedian;
|
|
|
|
|
break;
|
|
|
|
|
case SCE_SNAP_TARGET_ACTIVE:
|
|
|
|
|
t->tsnap.targetSnap = TargetSnapActive;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2009-12-01 18:26:18 +00:00
|
|
|
void addSnapPoint(TransInfo *t)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Currently only 3D viewport works for snapping points. */
|
|
|
|
|
if (t->tsnap.status & POINT_INIT && t->spacetype == SPACE_VIEW3D) {
|
|
|
|
|
TransSnapPoint *p = MEM_callocN(sizeof(TransSnapPoint), "SnapPoint");
|
2009-12-01 18:26:18 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.selectedPoint = p;
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
copy_v3_v3(p->co, t->tsnap.snapPoint);
|
2009-12-01 18:26:18 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_addtail(&t->tsnap.points, p);
|
2009-12-01 18:26:18 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.status |= MULTI_POINTS;
|
|
|
|
|
}
|
2009-12-01 18:26:18 +00:00
|
|
|
}
|
|
|
|
|
|
2013-10-23 06:48:36 +00:00
|
|
|
eRedrawFlag updateSelectedSnapPoint(TransInfo *t)
|
2011-12-26 20:23:07 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
eRedrawFlag status = TREDRAW_NOTHING;
|
2013-10-23 06:48:36 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->tsnap.status & MULTI_POINTS) {
|
|
|
|
|
TransSnapPoint *p, *closest_p = NULL;
|
|
|
|
|
float dist_min_sq = TRANSFORM_SNAP_MAX_PX;
|
|
|
|
|
const float mval_fl[2] = {t->mval[0], t->mval[1]};
|
|
|
|
|
float screen_loc[2];
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
for (p = t->tsnap.points.first; p; p = p->next) {
|
|
|
|
|
float dist_sq;
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2020-03-06 16:56:42 +01:00
|
|
|
if (ED_view3d_project_float_global(t->region, p->co, screen_loc, V3D_PROJ_TEST_NOP) !=
|
2019-04-17 06:17:24 +02:00
|
|
|
V3D_PROJ_RET_OK) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
dist_sq = len_squared_v2v2(mval_fl, screen_loc);
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (dist_sq < dist_min_sq) {
|
|
|
|
|
closest_p = p;
|
|
|
|
|
dist_min_sq = dist_sq;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (closest_p) {
|
|
|
|
|
if (t->tsnap.selectedPoint != closest_p) {
|
|
|
|
|
status = TREDRAW_HARD;
|
|
|
|
|
}
|
2013-10-23 06:48:36 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.selectedPoint = closest_p;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
return status;
|
2011-12-26 20:23:07 +00:00
|
|
|
}
|
|
|
|
|
|
2009-12-01 18:26:18 +00:00
|
|
|
void removeSnapPoint(TransInfo *t)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->tsnap.status & MULTI_POINTS) {
|
|
|
|
|
updateSelectedSnapPoint(t);
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->tsnap.selectedPoint) {
|
|
|
|
|
BLI_freelinkN(&t->tsnap.points, t->tsnap.selectedPoint);
|
2011-12-26 20:23:07 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (BLI_listbase_is_empty(&t->tsnap.points)) {
|
|
|
|
|
t->tsnap.status &= ~MULTI_POINTS;
|
|
|
|
|
}
|
2009-12-01 18:26:18 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.selectedPoint = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-12-01 18:26:18 +00:00
|
|
|
}
|
|
|
|
|
|
2018-07-09 17:57:05 +02:00
|
|
|
void getSnapPoint(const TransInfo *t, float vec[3])
|
2009-12-01 18:26:18 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->tsnap.points.first) {
|
|
|
|
|
TransSnapPoint *p;
|
|
|
|
|
int total = 0;
|
|
|
|
|
|
|
|
|
|
vec[0] = vec[1] = vec[2] = 0;
|
|
|
|
|
|
|
|
|
|
for (p = t->tsnap.points.first; p; p = p->next, total++) {
|
|
|
|
|
add_v3_v3(vec, p->co);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (t->tsnap.status & POINT_INIT) {
|
|
|
|
|
add_v3_v3(vec, t->tsnap.snapPoint);
|
|
|
|
|
total++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mul_v3_fl(vec, 1.0f / total);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
copy_v3_v3(vec, t->tsnap.snapPoint);
|
|
|
|
|
}
|
2009-12-01 18:26:18 +00:00
|
|
|
}
|
|
|
|
|
|
2019-10-28 09:32:59 -03:00
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Calc Snap (Generic)
|
|
|
|
|
* \{ */
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->spacetype == SPACE_VIEW3D) {
|
|
|
|
|
float loc[3];
|
|
|
|
|
float no[3];
|
|
|
|
|
float mval[2];
|
|
|
|
|
bool found = false;
|
2019-08-23 15:20:25 -03:00
|
|
|
short snap_elem = 0;
|
2019-04-17 06:17:24 +02:00
|
|
|
float dist_px = SNAP_MIN_DISTANCE; // Use a user defined value here
|
|
|
|
|
|
|
|
|
|
mval[0] = t->mval[0];
|
|
|
|
|
mval[1] = t->mval[1];
|
|
|
|
|
|
2019-08-20 15:07:48 -03:00
|
|
|
if (t->tsnap.mode & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE |
|
2019-08-20 19:18:25 -03:00
|
|
|
SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR)) {
|
2019-04-17 06:17:24 +02:00
|
|
|
zero_v3(no); /* objects won't set this */
|
2019-08-23 15:20:25 -03:00
|
|
|
snap_elem = snapObjectsTransform(t, mval, &dist_px, loc, no);
|
|
|
|
|
found = snap_elem != 0;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
if ((found == false) && (t->tsnap.mode & SCE_SNAP_MODE_VOLUME)) {
|
|
|
|
|
found = peelObjectsTransform(
|
|
|
|
|
t, mval, (t->settings->snap_flag & SCE_SNAP_PEEL_OBJECT) != 0, loc, no, NULL);
|
2019-08-23 15:20:25 -03:00
|
|
|
|
|
|
|
|
if (found) {
|
|
|
|
|
snap_elem = SCE_SNAP_MODE_VOLUME;
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (found == true) {
|
|
|
|
|
copy_v3_v3(t->tsnap.snapPoint, loc);
|
|
|
|
|
copy_v3_v3(t->tsnap.snapNormal, no);
|
|
|
|
|
|
|
|
|
|
t->tsnap.status |= POINT_INIT;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
t->tsnap.status &= ~POINT_INIT;
|
|
|
|
|
}
|
2019-08-23 15:20:25 -03:00
|
|
|
|
|
|
|
|
t->tsnap.snapElem = (char)snap_elem;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
else if (t->spacetype == SPACE_IMAGE && t->obedit_type == OB_MESH) {
|
|
|
|
|
if (t->tsnap.mode & SCE_SNAP_MODE_VERTEX) {
|
|
|
|
|
float co[2];
|
|
|
|
|
|
2020-03-06 16:56:42 +01:00
|
|
|
UI_view2d_region_to_view(&t->region->v2d, t->mval[0], t->mval[1], &co[0], &co[1]);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
uint objects_len = 0;
|
|
|
|
|
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
|
|
|
|
|
t->view_layer, NULL, &objects_len);
|
|
|
|
|
|
|
|
|
|
float dist_sq = FLT_MAX;
|
|
|
|
|
if (ED_uvedit_nearest_uv_multi(
|
2020-05-22 21:56:04 +10:00
|
|
|
t->scene, objects, objects_len, co, &dist_sq, t->tsnap.snapPoint)) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapPoint[0] *= t->aspect[0];
|
|
|
|
|
t->tsnap.snapPoint[1] *= t->aspect[1];
|
|
|
|
|
|
|
|
|
|
t->tsnap.status |= POINT_INIT;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
t->tsnap.status &= ~POINT_INIT;
|
|
|
|
|
}
|
|
|
|
|
MEM_freeN(objects);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (t->spacetype == SPACE_NODE) {
|
|
|
|
|
if (t->tsnap.mode & (SCE_SNAP_MODE_NODE_X | SCE_SNAP_MODE_NODE_Y)) {
|
|
|
|
|
float loc[2];
|
|
|
|
|
float dist_px = SNAP_MIN_DISTANCE; // Use a user defined value here
|
|
|
|
|
char node_border;
|
|
|
|
|
|
|
|
|
|
if (snapNodesTransform(t, t->mval, loc, &dist_px, &node_border)) {
|
|
|
|
|
copy_v2_v2(t->tsnap.snapPoint, loc);
|
|
|
|
|
t->tsnap.snapNodeBorder = node_border;
|
|
|
|
|
|
|
|
|
|
t->tsnap.status |= POINT_INIT;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
t->tsnap.status &= ~POINT_INIT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2019-10-28 09:32:59 -03:00
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Target
|
|
|
|
|
* \{ */
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2012-06-29 14:34:46 +00:00
|
|
|
static void TargetSnapOffset(TransInfo *t, TransData *td)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (t->spacetype == SPACE_NODE && td != NULL) {
|
|
|
|
|
bNode *node = td->extra;
|
|
|
|
|
char border = t->tsnap.snapNodeBorder;
|
|
|
|
|
float width = BLI_rctf_size_x(&node->totr);
|
|
|
|
|
float height = BLI_rctf_size_y(&node->totr);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2014-01-21 13:13:41 +01:00
|
|
|
#ifdef USE_NODE_CENTER
|
2019-04-22 09:19:45 +10:00
|
|
|
if (border & NODE_LEFT) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[0] -= 0.5f * width;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
|
|
|
|
if (border & NODE_RIGHT) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[0] += 0.5f * width;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
|
|
|
|
if (border & NODE_BOTTOM) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[1] -= 0.5f * height;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
|
|
|
|
if (border & NODE_TOP) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[1] += 0.5f * height;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2014-01-21 13:13:41 +01:00
|
|
|
#else
|
2019-04-22 09:19:45 +10:00
|
|
|
if (border & NODE_LEFT) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[0] -= 0.0f;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
|
|
|
|
if (border & NODE_RIGHT) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[0] += width;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
|
|
|
|
if (border & NODE_BOTTOM) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[1] -= height;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
|
|
|
|
if (border & NODE_TOP) {
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[1] += 0.0f;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2014-01-21 13:13:41 +01:00
|
|
|
#endif
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2012-06-29 14:34:46 +00:00
|
|
|
}
|
|
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void TargetSnapCenter(TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Only need to calculate once */
|
|
|
|
|
if ((t->tsnap.status & TARGET_INIT) == 0) {
|
|
|
|
|
copy_v3_v3(t->tsnap.snapTarget, t->center_global);
|
|
|
|
|
TargetSnapOffset(t, NULL);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.status |= TARGET_INIT;
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void TargetSnapActive(TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Only need to calculate once */
|
|
|
|
|
if ((t->tsnap.status & TARGET_INIT) == 0) {
|
|
|
|
|
if (calculateCenterActive(t, true, t->tsnap.snapTarget)) {
|
|
|
|
|
TargetSnapOffset(t, NULL);
|
|
|
|
|
|
|
|
|
|
t->tsnap.status |= TARGET_INIT;
|
|
|
|
|
}
|
|
|
|
|
/* No active, default to median */
|
|
|
|
|
else {
|
|
|
|
|
t->tsnap.target = SCE_SNAP_TARGET_MEDIAN;
|
|
|
|
|
t->tsnap.targetSnap = TargetSnapMedian;
|
|
|
|
|
TargetSnapMedian(t);
|
|
|
|
|
}
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void TargetSnapMedian(TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
// Only need to calculate once
|
|
|
|
|
if ((t->tsnap.status & TARGET_INIT) == 0) {
|
|
|
|
|
int i_accum = 0;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.snapTarget[0] = 0;
|
|
|
|
|
t->tsnap.snapTarget[1] = 0;
|
|
|
|
|
t->tsnap.snapTarget[2] = 0;
|
2018-04-16 16:27:55 +02:00
|
|
|
|
2019-04-21 04:40:16 +10:00
|
|
|
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
2019-04-17 06:17:24 +02:00
|
|
|
TransData *td = tc->data;
|
|
|
|
|
int i;
|
|
|
|
|
float v[3];
|
|
|
|
|
zero_v3(v);
|
2018-08-22 09:45:11 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) {
|
|
|
|
|
add_v3_v3(v, td->center);
|
|
|
|
|
}
|
2018-08-22 09:45:11 +10:00
|
|
|
|
2019-08-15 08:29:34 -03:00
|
|
|
if (i == 0) {
|
|
|
|
|
/* Is this possible? */
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mul_v3_fl(v, 1.0 / i);
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (tc->use_local_mat) {
|
|
|
|
|
mul_m4_v3(tc->mat, v);
|
|
|
|
|
}
|
2018-08-22 09:45:11 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
add_v3_v3(t->tsnap.snapTarget, v);
|
2019-08-15 08:29:34 -03:00
|
|
|
i_accum++;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2018-04-16 16:27:55 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
mul_v3_fl(t->tsnap.snapTarget, 1.0 / i_accum);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
TargetSnapOffset(t, NULL);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.status |= TARGET_INIT;
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2011-11-15 16:38:48 +00:00
|
|
|
static void TargetSnapClosest(TransInfo *t)
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
// Only valid if a snap point has been selected
|
|
|
|
|
if (t->tsnap.status & POINT_INIT) {
|
|
|
|
|
float dist_closest = 0.0f;
|
|
|
|
|
TransData *closest = NULL;
|
|
|
|
|
|
|
|
|
|
/* Object mode */
|
|
|
|
|
if (t->flag & T_OBJECT) {
|
|
|
|
|
int i;
|
2019-04-21 04:40:16 +10:00
|
|
|
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
2019-04-17 06:17:24 +02:00
|
|
|
TransData *td = tc->data;
|
|
|
|
|
for (td = tc->data, i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) {
|
2019-08-24 21:22:30 +10:00
|
|
|
const BoundBox *bb = NULL;
|
|
|
|
|
|
2019-08-28 13:42:22 +10:00
|
|
|
if ((t->options & CTX_OBMODE_XFORM_OBDATA) == 0) {
|
2019-08-24 21:22:30 +10:00
|
|
|
bb = BKE_object_boundbox_get(td->ob);
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
/* use boundbox if possible */
|
|
|
|
|
if (bb) {
|
|
|
|
|
int j;
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
|
|
|
float loc[3];
|
|
|
|
|
float dist;
|
|
|
|
|
|
|
|
|
|
copy_v3_v3(loc, bb->vec[j]);
|
|
|
|
|
mul_m4_v3(td->ext->obmat, loc);
|
|
|
|
|
|
|
|
|
|
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
|
|
|
|
|
|
|
|
|
|
if ((dist != TRANSFORM_DIST_INVALID) &&
|
|
|
|
|
(closest == NULL || fabsf(dist) < fabsf(dist_closest))) {
|
|
|
|
|
copy_v3_v3(t->tsnap.snapTarget, loc);
|
|
|
|
|
closest = td;
|
|
|
|
|
dist_closest = dist;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* use element center otherwise */
|
|
|
|
|
else {
|
|
|
|
|
float loc[3];
|
|
|
|
|
float dist;
|
|
|
|
|
|
|
|
|
|
copy_v3_v3(loc, td->center);
|
|
|
|
|
|
|
|
|
|
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
|
|
|
|
|
|
|
|
|
|
if ((dist != TRANSFORM_DIST_INVALID) &&
|
|
|
|
|
(closest == NULL || fabsf(dist) < fabsf(dist_closest))) {
|
|
|
|
|
copy_v3_v3(t->tsnap.snapTarget, loc);
|
|
|
|
|
closest = td;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
2019-04-21 04:40:16 +10:00
|
|
|
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
2019-04-17 06:17:24 +02:00
|
|
|
TransData *td = tc->data;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) {
|
|
|
|
|
float loc[3];
|
|
|
|
|
float dist;
|
|
|
|
|
|
|
|
|
|
copy_v3_v3(loc, td->center);
|
|
|
|
|
|
|
|
|
|
if (tc->use_local_mat) {
|
|
|
|
|
mul_m4_v3(tc->mat, loc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
|
|
|
|
|
|
|
|
|
|
if ((dist != TRANSFORM_DIST_INVALID) &&
|
|
|
|
|
(closest == NULL || fabsf(dist) < fabsf(dist_closest))) {
|
|
|
|
|
copy_v3_v3(t->tsnap.snapTarget, loc);
|
|
|
|
|
closest = td;
|
|
|
|
|
dist_closest = dist;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TargetSnapOffset(t, closest);
|
|
|
|
|
|
|
|
|
|
t->tsnap.status |= TARGET_INIT;
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
2009-02-24 21:25:36 +00:00
|
|
|
|
2019-10-28 09:32:59 -03:00
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Snap Objects
|
|
|
|
|
* \{ */
|
|
|
|
|
|
2019-08-23 15:20:25 -03:00
|
|
|
short snapObjectsTransform(
|
2019-04-17 06:17:24 +02:00
|
|
|
TransInfo *t, const float mval[2], float *dist_px, float r_loc[3], float r_no[3])
|
2009-03-20 18:00:51 +00:00
|
|
|
{
|
2019-12-03 12:20:27 -03:00
|
|
|
float *target = (t->tsnap.status & TARGET_INIT) ? t->tsnap.snapTarget : t->center_global;
|
2019-08-23 15:20:25 -03:00
|
|
|
return ED_transform_snap_object_project_view3d_ex(
|
2019-04-17 06:17:24 +02:00
|
|
|
t->tsnap.object_context,
|
2020-03-09 10:02:11 -03:00
|
|
|
t->depsgraph,
|
2020-07-22 12:00:02 -03:00
|
|
|
t->settings->snap_mode,
|
2019-04-17 06:17:24 +02:00
|
|
|
&(const struct SnapObjectParams){
|
|
|
|
|
.snap_select = t->tsnap.modeSelect,
|
|
|
|
|
.use_object_edit_cage = (t->flag & T_EDIT) != 0,
|
2020-07-22 12:00:02 -03:00
|
|
|
.use_occlusion_test = t->settings->snap_mode != SCE_SNAP_MODE_FACE,
|
|
|
|
|
.use_backface_culling = t->tsnap.use_backface_culling,
|
2019-04-17 06:17:24 +02:00
|
|
|
},
|
|
|
|
|
mval,
|
2019-12-03 12:20:27 -03:00
|
|
|
target,
|
2019-04-17 06:17:24 +02:00
|
|
|
dist_px,
|
|
|
|
|
r_loc,
|
2019-08-23 15:20:25 -03:00
|
|
|
r_no,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL);
|
2013-04-03 09:48:21 +00:00
|
|
|
}
|
2009-03-20 18:00:51 +00:00
|
|
|
|
2019-10-28 09:32:59 -03:00
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Peeling
|
|
|
|
|
* \{ */
|
2009-02-24 00:45:40 +00:00
|
|
|
|
2020-03-09 10:02:11 -03:00
|
|
|
bool peelObjectsTransform(TransInfo *t,
|
|
|
|
|
const float mval[2],
|
|
|
|
|
const bool use_peel_object,
|
|
|
|
|
/* return args */
|
|
|
|
|
float r_loc[3],
|
|
|
|
|
float r_no[3],
|
|
|
|
|
float *r_thickness)
|
2009-02-24 00:45:40 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
ListBase depths_peel = {0};
|
2020-03-09 10:02:11 -03:00
|
|
|
ED_transform_snap_object_project_all_view3d_ex(
|
|
|
|
|
t->tsnap.object_context,
|
|
|
|
|
t->depsgraph,
|
|
|
|
|
&(const struct SnapObjectParams){
|
|
|
|
|
.snap_select = t->tsnap.modeSelect,
|
|
|
|
|
.use_object_edit_cage = (t->flag & T_EDIT) != 0,
|
|
|
|
|
},
|
|
|
|
|
mval,
|
|
|
|
|
-1.0f,
|
|
|
|
|
false,
|
|
|
|
|
&depths_peel);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
|
|
|
|
if (!BLI_listbase_is_empty(&depths_peel)) {
|
|
|
|
|
/* At the moment we only use the hits of the first object */
|
|
|
|
|
struct SnapObjectHitDepth *hit_min = depths_peel.first;
|
|
|
|
|
for (struct SnapObjectHitDepth *iter = hit_min->next; iter; iter = iter->next) {
|
|
|
|
|
if (iter->depth < hit_min->depth) {
|
|
|
|
|
hit_min = iter;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
struct SnapObjectHitDepth *hit_max = NULL;
|
|
|
|
|
|
|
|
|
|
if (use_peel_object) {
|
|
|
|
|
/* if peeling objects, take the first and last from each object */
|
|
|
|
|
hit_max = hit_min;
|
|
|
|
|
for (struct SnapObjectHitDepth *iter = depths_peel.first; iter; iter = iter->next) {
|
|
|
|
|
if ((iter->depth > hit_max->depth) && (iter->ob_uuid == hit_min->ob_uuid)) {
|
|
|
|
|
hit_max = iter;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
/* otherwise, pair first with second and so on */
|
|
|
|
|
for (struct SnapObjectHitDepth *iter = depths_peel.first; iter; iter = iter->next) {
|
|
|
|
|
if ((iter != hit_min) && (iter->ob_uuid == hit_min->ob_uuid)) {
|
|
|
|
|
if (hit_max == NULL) {
|
|
|
|
|
hit_max = iter;
|
|
|
|
|
}
|
|
|
|
|
else if (iter->depth < hit_max->depth) {
|
|
|
|
|
hit_max = iter;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* in this case has only one hit. treat as raycast */
|
|
|
|
|
if (hit_max == NULL) {
|
|
|
|
|
hit_max = hit_min;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mid_v3_v3v3(r_loc, hit_min->co, hit_max->co);
|
|
|
|
|
|
|
|
|
|
if (r_thickness) {
|
|
|
|
|
*r_thickness = hit_max->depth - hit_min->depth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* XXX, is there a correct normal in this case ???, for now just z up */
|
|
|
|
|
r_no[0] = 0.0;
|
|
|
|
|
r_no[1] = 0.0;
|
|
|
|
|
r_no[2] = 1.0;
|
|
|
|
|
|
|
|
|
|
BLI_freelistN(&depths_peel);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
2009-03-20 18:00:51 +00:00
|
|
|
}
|
|
|
|
|
|
2019-10-28 09:32:59 -03:00
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
2019-10-28 09:51:53 -03:00
|
|
|
/** \name snap Nodes
|
2019-10-28 09:32:59 -03:00
|
|
|
* \{ */
|
2012-06-29 14:34:46 +00:00
|
|
|
|
2017-10-17 13:43:10 +11:00
|
|
|
static bool snapNodeTest(View2D *v2d, bNode *node, eSnapSelect snap_select)
|
2012-06-29 14:34:46 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* node is use for snapping only if a) snap mode matches and b) node is inside the view */
|
|
|
|
|
return ((snap_select == SNAP_NOT_SELECTED && !(node->flag & NODE_SELECT)) ||
|
|
|
|
|
(snap_select == SNAP_ALL && !(node->flag & NODE_ACTIVE))) &&
|
|
|
|
|
(node->totr.xmin < v2d->cur.xmax && node->totr.xmax > v2d->cur.xmin &&
|
|
|
|
|
node->totr.ymin < v2d->cur.ymax && node->totr.ymax > v2d->cur.ymin);
|
2012-06-29 14:34:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NodeBorder snapNodeBorder(int snap_node_mode)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
NodeBorder flag = 0;
|
|
|
|
|
if (snap_node_mode & SCE_SNAP_MODE_NODE_X) {
|
|
|
|
|
flag |= NODE_LEFT | NODE_RIGHT;
|
|
|
|
|
}
|
|
|
|
|
if (snap_node_mode & SCE_SNAP_MODE_NODE_Y) {
|
|
|
|
|
flag |= NODE_TOP | NODE_BOTTOM;
|
|
|
|
|
}
|
|
|
|
|
return flag;
|
2012-06-29 14:34:46 +00:00
|
|
|
}
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
static bool snapNode(ToolSettings *ts,
|
|
|
|
|
SpaceNode *UNUSED(snode),
|
2020-03-06 16:56:42 +01:00
|
|
|
ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
bNode *node,
|
|
|
|
|
const int mval[2],
|
|
|
|
|
float r_loc[2],
|
|
|
|
|
float *r_dist_px,
|
|
|
|
|
char *r_node_border)
|
2012-06-29 14:34:46 +00:00
|
|
|
{
|
2020-03-06 16:56:42 +01:00
|
|
|
View2D *v2d = ®ion->v2d;
|
2019-04-17 06:17:24 +02:00
|
|
|
NodeBorder border = snapNodeBorder(ts->snap_node_mode);
|
|
|
|
|
bool retval = false;
|
|
|
|
|
rcti totr;
|
|
|
|
|
int new_dist;
|
|
|
|
|
|
|
|
|
|
UI_view2d_view_to_region_rcti(v2d, &node->totr, &totr);
|
|
|
|
|
|
|
|
|
|
if (border & NODE_LEFT) {
|
|
|
|
|
new_dist = abs(totr.xmin - mval[0]);
|
|
|
|
|
if (new_dist < *r_dist_px) {
|
|
|
|
|
UI_view2d_region_to_view(v2d, totr.xmin, mval[1], &r_loc[0], &r_loc[1]);
|
|
|
|
|
*r_dist_px = new_dist;
|
|
|
|
|
*r_node_border = NODE_LEFT;
|
|
|
|
|
retval = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (border & NODE_RIGHT) {
|
|
|
|
|
new_dist = abs(totr.xmax - mval[0]);
|
|
|
|
|
if (new_dist < *r_dist_px) {
|
|
|
|
|
UI_view2d_region_to_view(v2d, totr.xmax, mval[1], &r_loc[0], &r_loc[1]);
|
|
|
|
|
*r_dist_px = new_dist;
|
|
|
|
|
*r_node_border = NODE_RIGHT;
|
|
|
|
|
retval = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (border & NODE_BOTTOM) {
|
|
|
|
|
new_dist = abs(totr.ymin - mval[1]);
|
|
|
|
|
if (new_dist < *r_dist_px) {
|
|
|
|
|
UI_view2d_region_to_view(v2d, mval[0], totr.ymin, &r_loc[0], &r_loc[1]);
|
|
|
|
|
*r_dist_px = new_dist;
|
|
|
|
|
*r_node_border = NODE_BOTTOM;
|
|
|
|
|
retval = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (border & NODE_TOP) {
|
|
|
|
|
new_dist = abs(totr.ymax - mval[1]);
|
|
|
|
|
if (new_dist < *r_dist_px) {
|
|
|
|
|
UI_view2d_region_to_view(v2d, mval[0], totr.ymax, &r_loc[0], &r_loc[1]);
|
|
|
|
|
*r_dist_px = new_dist;
|
|
|
|
|
*r_node_border = NODE_TOP;
|
|
|
|
|
retval = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return retval;
|
2012-06-29 14:34:46 +00:00
|
|
|
}
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
static bool snapNodes(ToolSettings *ts,
|
|
|
|
|
SpaceNode *snode,
|
2020-03-06 16:56:42 +01:00
|
|
|
ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
const int mval[2],
|
|
|
|
|
eSnapSelect snap_select,
|
|
|
|
|
float r_loc[2],
|
|
|
|
|
float *r_dist_px,
|
|
|
|
|
char *r_node_border)
|
2012-06-29 14:34:46 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
bNodeTree *ntree = snode->edittree;
|
|
|
|
|
bNode *node;
|
|
|
|
|
bool retval = false;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
*r_node_border = 0;
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
for (node = ntree->nodes.first; node; node = node->next) {
|
2020-03-06 16:56:42 +01:00
|
|
|
if (snapNodeTest(®ion->v2d, node, snap_select)) {
|
|
|
|
|
retval |= snapNode(ts, snode, region, node, mval, r_loc, r_dist_px, r_node_border);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
}
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
return retval;
|
2012-06-29 14:34:46 +00:00
|
|
|
}
|
|
|
|
|
|
2015-12-02 18:08:48 +11:00
|
|
|
bool snapNodesTransform(
|
2019-04-17 06:17:24 +02:00
|
|
|
TransInfo *t, const int mval[2], float r_loc[2], float *r_dist_px, char *r_node_border)
|
2012-06-29 14:34:46 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
return snapNodes(t->settings,
|
2020-04-03 13:25:03 +02:00
|
|
|
t->area->spacedata.first,
|
2020-03-06 16:56:42 +01:00
|
|
|
t->region,
|
2019-04-17 06:17:24 +02:00
|
|
|
mval,
|
|
|
|
|
t->tsnap.modeSelect,
|
|
|
|
|
r_loc,
|
|
|
|
|
r_dist_px,
|
|
|
|
|
r_node_border);
|
2012-06-29 14:34:46 +00:00
|
|
|
}
|
|
|
|
|
|
2019-10-28 09:51:53 -03:00
|
|
|
/** \} */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name snap Frames
|
|
|
|
|
* \{ */
|
|
|
|
|
|
|
|
|
|
/* This function is used by Animation Editor specific transform functions to do
|
|
|
|
|
* the Snap Keyframe to Nearest Frame/Marker
|
|
|
|
|
*/
|
|
|
|
|
void snapFrameTransform(TransInfo *t,
|
|
|
|
|
const eAnimEdit_AutoSnap autosnap,
|
|
|
|
|
const bool is_frame_value,
|
|
|
|
|
const float delta,
|
|
|
|
|
float *r_val)
|
|
|
|
|
{
|
|
|
|
|
double val = delta;
|
|
|
|
|
switch (autosnap) {
|
|
|
|
|
case SACTSNAP_STEP:
|
|
|
|
|
case SACTSNAP_FRAME:
|
|
|
|
|
val = floor(val + 0.5);
|
|
|
|
|
break;
|
|
|
|
|
case SACTSNAP_MARKER:
|
|
|
|
|
/* snap to nearest marker */
|
|
|
|
|
// TODO: need some more careful checks for where data comes from
|
|
|
|
|
val = ED_markers_find_nearest_marker_time(&t->scene->markers, (float)val);
|
|
|
|
|
break;
|
|
|
|
|
case SACTSNAP_SECOND:
|
|
|
|
|
case SACTSNAP_TSTEP: {
|
|
|
|
|
/* second step */
|
|
|
|
|
const Scene *scene = t->scene;
|
|
|
|
|
const double secf = FPS;
|
|
|
|
|
val = floor((val / secf) + 0.5);
|
|
|
|
|
if (is_frame_value) {
|
|
|
|
|
val *= secf;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2019-10-29 00:45:05 +11:00
|
|
|
}
|
|
|
|
|
case SACTSNAP_OFF: {
|
|
|
|
|
break;
|
2019-10-28 09:51:53 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*r_val = (float)val;
|
|
|
|
|
}
|
|
|
|
|
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
/*================================================================*/
|
|
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
void snapSequenceBounds(TransInfo *t, const int mval[2])
|
2011-09-28 05:53:40 +00:00
|
|
|
{
|
2020-08-31 10:14:40 -03:00
|
|
|
/* Reuse increment, strictly speaking could be another snap mode, but leave as is. */
|
|
|
|
|
if (!(t->modifiers & MOD_SNAP_INVERT)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Convert to frame range. */
|
|
|
|
|
float xmouse, ymouse;
|
|
|
|
|
UI_view2d_region_to_view(&t->region->v2d, mval[0], mval[1], &xmouse, &ymouse);
|
|
|
|
|
const int frame_curr = round_fl_to_int(xmouse);
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
/* Now find the closest sequence. */
|
|
|
|
|
const int frame_near = BKE_sequencer_find_next_prev_edit(
|
|
|
|
|
t->scene, frame_curr, SEQ_SIDE_BOTH, true, false, true);
|
2018-05-13 06:44:03 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
const int frame_snap = transform_convert_sequencer_get_snap_bound(t);
|
|
|
|
|
t->values[0] = frame_near - frame_snap;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
static void snap_grid_apply_ex(
|
|
|
|
|
TransInfo *t, const int max_index, const float grid_dist, const float loc[3], float r_out[3])
|
2011-09-28 05:53:40 +00:00
|
|
|
{
|
2020-08-31 10:14:40 -03:00
|
|
|
const float *center_global = t->center_global;
|
|
|
|
|
const float *asp = t->aspect;
|
|
|
|
|
bool use_local_axis = false;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
/* use a fallback for cursor selection,
|
|
|
|
|
* this isn't useful as a global center for absolute grid snapping
|
|
|
|
|
* since its not based on the position of the selection. */
|
|
|
|
|
if (t->around == V3D_AROUND_CURSOR) {
|
|
|
|
|
const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CENTER_MEDIAN);
|
|
|
|
|
center_global = cd->global;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
if (t->con.mode & (CON_AXIS0 | CON_AXIS1 | CON_AXIS2)) {
|
|
|
|
|
use_local_axis = true;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
for (int i = 0; i <= max_index; i++) {
|
|
|
|
|
/* do not let unconstrained axis jump to absolute grid increments */
|
|
|
|
|
if (!(t->con.mode & CON_APPLY) || t->con.mode & (CON_AXIS0 << i)) {
|
|
|
|
|
const float iter_fac = grid_dist * asp[i];
|
|
|
|
|
|
|
|
|
|
if (use_local_axis) {
|
|
|
|
|
float local_axis[3];
|
|
|
|
|
float pos_on_axis[3];
|
|
|
|
|
|
|
|
|
|
copy_v3_v3(local_axis, t->spacemtx[i]);
|
|
|
|
|
copy_v3_v3(pos_on_axis, t->spacemtx[i]);
|
|
|
|
|
|
|
|
|
|
/* amount of movement on axis from initial pos */
|
|
|
|
|
mul_v3_fl(pos_on_axis, loc[i]);
|
|
|
|
|
|
|
|
|
|
/* actual global position on axis */
|
|
|
|
|
add_v3_v3(pos_on_axis, center_global);
|
|
|
|
|
|
|
|
|
|
float min_dist = INFINITY;
|
|
|
|
|
for (int j = 0; j < 3; j++) {
|
|
|
|
|
if (fabs(local_axis[j]) < 0.01f) {
|
|
|
|
|
/* Ignore very small (normalized) axis changes */
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* closest point on grid */
|
|
|
|
|
float grid_p = iter_fac * roundf(pos_on_axis[j] / iter_fac);
|
|
|
|
|
float dist_p = fabs((grid_p - pos_on_axis[j]) / local_axis[j]);
|
|
|
|
|
|
|
|
|
|
/* The amount of distance needed to travel along the
|
|
|
|
|
* local axis to snap to the closest grid point */
|
|
|
|
|
/* in the global j axis direction */
|
|
|
|
|
float move_dist = (grid_p - center_global[j]) / local_axis[j];
|
|
|
|
|
|
|
|
|
|
if (dist_p < min_dist) {
|
|
|
|
|
min_dist = dist_p;
|
|
|
|
|
r_out[i] = move_dist;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
r_out[i] = iter_fac * roundf((loc[i] + center_global[i]) / iter_fac) - center_global[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
|
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
static void snap_grid_apply(TransInfo *t, int max_index, const float grid_dist, float *r_val)
|
2014-11-24 18:18:35 +01:00
|
|
|
{
|
2020-08-31 10:14:40 -03:00
|
|
|
BLI_assert(t->tsnap.mode & SCE_SNAP_MODE_GRID);
|
|
|
|
|
BLI_assert(max_index <= 2);
|
|
|
|
|
|
|
|
|
|
/* Early bailing out if no need to snap */
|
|
|
|
|
if (grid_dist == 0.0f) {
|
2019-04-17 06:17:24 +02:00
|
|
|
return;
|
2019-04-22 09:19:45 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
/* absolute snapping on grid based on global center.
|
|
|
|
|
* for now only 3d view (others can be added if we want) */
|
|
|
|
|
snap_grid_apply_ex(t, max_index, grid_dist, r_val, r_val);
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
bool transform_snap_grid(TransInfo *t, float *val)
|
|
|
|
|
{
|
|
|
|
|
if ((!(t->tsnap.mode & SCE_SNAP_MODE_GRID)) || validSnap(t)) {
|
|
|
|
|
/* Don't do grid snapping if there is a valid snap point. */
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
if (t->spacetype != SPACE_VIEW3D) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (t->mode != TFM_TRANSLATION) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float grid_dist = activeSnap(t) ? (t->modifiers & MOD_PRECISION) ? t->snap[2] : t->snap[1] :
|
|
|
|
|
t->snap[0];
|
|
|
|
|
|
|
|
|
|
snap_grid_apply(t, t->idx_max, grid_dist, val);
|
|
|
|
|
return true;
|
2014-11-24 18:18:35 +01:00
|
|
|
}
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
|
2020-08-31 17:37:48 +02:00
|
|
|
static void snap_increment_apply_ex(TransInfo *UNUSED(t),
|
2020-08-31 10:14:40 -03:00
|
|
|
const int max_index,
|
|
|
|
|
const float increment_val,
|
|
|
|
|
const float aspect[3],
|
|
|
|
|
const float loc[3],
|
|
|
|
|
float r_out[3])
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
{
|
2020-08-31 10:14:40 -03:00
|
|
|
/* relative snapping in fixed increments */
|
|
|
|
|
for (int i = 0; i <= max_index; i++) {
|
|
|
|
|
const float iter_fac = increment_val * aspect[i];
|
|
|
|
|
r_out[i] = iter_fac * roundf(loc[i] / iter_fac);
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
static void snap_increment_apply(TransInfo *t,
|
|
|
|
|
int max_index,
|
|
|
|
|
const float increment_dist,
|
|
|
|
|
float *r_val)
|
|
|
|
|
{
|
|
|
|
|
BLI_assert((t->tsnap.mode & SCE_SNAP_MODE_INCREMENT) || doForceIncrementSnap(t));
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_assert(max_index <= 2);
|
|
|
|
|
|
|
|
|
|
/* Early bailing out if no need to snap */
|
2020-08-31 10:14:40 -03:00
|
|
|
if (increment_dist == 0.0f) {
|
2019-04-17 06:17:24 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
float asp_local[3] = {1, 1, 1};
|
|
|
|
|
const bool use_aspect = ELEM(t->mode, TFM_TRANSLATION);
|
|
|
|
|
const float *asp = use_aspect ? t->aspect : asp_local;
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (use_aspect) {
|
|
|
|
|
/* custom aspect for fcurve */
|
|
|
|
|
if (t->spacetype == SPACE_GRAPH) {
|
2020-03-06 16:56:42 +01:00
|
|
|
View2D *v2d = &t->region->v2d;
|
Refactor grid and scale indicator text drawing
This affects the timeline, dopesheet, graph editor, sequencer,
clip editor and nla editor.
Removed structs and enums: `V2D_ARG_DUMMY`, `eView2D_Units`,
`eView2D_Clamp`, `eView2D_Gridlines`, `View2DGrid`.
A main goal of this refactor is to get rid of the very generic
`View2DGrid` struct. The drawing code became very complex
because there were many different combinations of settings.
This refactor implements a different approach.
Instead of one very generic API, there are many slighly
different functions that do exactly, what we need in the
different editors. Only very little code is duplicated,
because the API functions compose some shared low level code.
This structure makes the code much easier to debug and change,
because every function has much fewer responsibilities.
Additionally, this refactor fixes some long standing bugs.
E.g. when `Show Seconds` is enabled, you zoom in and pan the view.
Or that the step size between displayed frame numbers was
always `>= 2`, no matter how close you zoom in.
Reviewers: brecht
Differential Revision: https://developer.blender.org/D4776
2019-05-02 12:00:12 +02:00
|
|
|
Scene *scene = t->scene;
|
2020-04-03 13:25:03 +02:00
|
|
|
SpaceGraph *sipo = t->area->spacedata.first;
|
Refactor grid and scale indicator text drawing
This affects the timeline, dopesheet, graph editor, sequencer,
clip editor and nla editor.
Removed structs and enums: `V2D_ARG_DUMMY`, `eView2D_Units`,
`eView2D_Clamp`, `eView2D_Gridlines`, `View2DGrid`.
A main goal of this refactor is to get rid of the very generic
`View2DGrid` struct. The drawing code became very complex
because there were many different combinations of settings.
This refactor implements a different approach.
Instead of one very generic API, there are many slighly
different functions that do exactly, what we need in the
different editors. Only very little code is duplicated,
because the API functions compose some shared low level code.
This structure makes the code much easier to debug and change,
because every function has much fewer responsibilities.
Additionally, this refactor fixes some long standing bugs.
E.g. when `Show Seconds` is enabled, you zoom in and pan the view.
Or that the step size between displayed frame numbers was
always `>= 2`, no matter how close you zoom in.
Reviewers: brecht
Differential Revision: https://developer.blender.org/D4776
2019-05-02 12:00:12 +02:00
|
|
|
asp_local[0] = UI_view2d_grid_resolution_x__frames_or_seconds(
|
|
|
|
|
v2d, scene, sipo->flag & SIPO_DRAWTIME);
|
|
|
|
|
asp_local[1] = UI_view2d_grid_resolution_y__values(v2d);
|
2019-04-17 06:17:24 +02:00
|
|
|
asp = asp_local;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
snap_increment_apply_ex(t, max_index, increment_dist, asp, r_val, r_val);
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
bool transform_snap_increment(TransInfo *t, float *val)
|
|
|
|
|
{
|
|
|
|
|
if (!(t->tsnap.mode & SCE_SNAP_MODE_INCREMENT) && !doForceIncrementSnap(t)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
if (t->spacetype != SPACE_VIEW3D && validSnap(t)) {
|
|
|
|
|
/* Only do something if using absolute or incremental grid snapping
|
|
|
|
|
* and there is no valid snap point. */
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
float increment_dist = activeSnap(t) ? (t->modifiers & MOD_PRECISION) ? t->snap[2] : t->snap[1] :
|
|
|
|
|
t->snap[0];
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2020-08-31 10:14:40 -03:00
|
|
|
snap_increment_apply(t, t->idx_max, increment_dist, val);
|
|
|
|
|
return true;
|
2.5
Transform:
First working port of the transform code:
- Object mode only (other conversions need to be ported)
- Contraints (global and local only) working
- Snap (no edit mode, obviously) working
- Numinput working
- Gears (Ctrl and Shift) working
- Only grap, rotate, scale, shear, warp and to sphere have been added as hotkey, but the rest should work too once accessible
- No manipulator
- No drawn feedback other than moving stuff and header print (no constraint line, snap circle, ...)
- No NDOF support
I've only tested Scons support, though Makefil *should* work, I *think*.
Misc:
-QuatIsNull function in arith
-Exporting project_* and view[line|ray] functions from view3d
2008-12-29 01:41:28 +00:00
|
|
|
}
|
2019-10-28 09:32:59 -03:00
|
|
|
|
|
|
|
|
/** \} */
|
2020-06-22 09:07:51 -03:00
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name Generic callbacks
|
|
|
|
|
* \{ */
|
|
|
|
|
|
2020-06-24 14:23:54 +10:00
|
|
|
float transform_snap_distance_len_squared_fn(TransInfo *UNUSED(t),
|
|
|
|
|
const float p1[3],
|
|
|
|
|
const float p2[3])
|
2020-06-22 09:07:51 -03:00
|
|
|
{
|
|
|
|
|
return len_squared_v3v3(p1, p2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** \} */
|