Blender  V3.3
Classes | Macros
view3d_navigate_walk.c File Reference
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_kdopbvh.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BLT_translation.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_transform_snap_object_context.h"
#include "PIL_time.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "GPU_immediate.h"
#include "DEG_depsgraph.h"
#include "view3d_intern.h"
#include "view3d_navigate.h"

Go to the source code of this file.

Classes

struct  WalkTeleport
 
struct  WalkInfo
 

Macros

#define USE_TABLET_SUPPORT
 
#define JUMP_SPEED_MIN   1.0f
 
#define JUMP_TIME_MAX   0.2f /* s */
 
#define JUMP_SPEED_MAX   sqrtf(2.0f * walk->gravity * walk->jump_height)
 
#define WALK_ROTATE_TABLET_FAC   8.8f /* Higher is faster, relative to region size. */
 
#define WALK_ROTATE_CONSTANT_FAC   DEG2RAD(0.15f) /* Higher is faster, radians per-pixel. */
 
#define WALK_TOP_LIMIT   DEG2RADF(85.0f)
 
#define WALK_BOTTOM_LIMIT   DEG2RADF(-80.0f)
 
#define WALK_MOVE_SPEED   base_speed
 
#define WALK_BOOST_FACTOR   ((void)0, walk->speed_factor)
 
#define WALK_ZUP_CORRECT_FAC   0.1f /* Amount to correct per step. */
 
#define WALK_ZUP_CORRECT_ACCEL   0.05f /* Increase upright momentum each step. */
 

Typedefs

Internal Walk Structs
typedef struct WalkTeleport WalkTeleport
 
typedef struct WalkInfo WalkInfo
 

Functions

Internal Walk Drawing
static int walkApply (bContext *C, struct WalkInfo *walk, bool is_confirm)
 
static float getVelocityZeroTime (const float gravity, const float velocity)
 
static void drawWalkPixel (const struct bContext *UNUSED(C), ARegion *region, void *arg)
 
Walk Operator
static int walk_invoke (bContext *C, wmOperator *op, const wmEvent *event)
 
static void walk_cancel (bContext *C, wmOperator *op)
 
static int walk_modal (bContext *C, wmOperator *op, const wmEvent *event)
 
void VIEW3D_OT_walk (wmOperatorType *ot)
 

Modal Key-map

enum  {
  WALK_MODAL_CANCEL = 1 , WALK_MODAL_CONFIRM , WALK_MODAL_DIR_FORWARD , WALK_MODAL_DIR_FORWARD_STOP ,
  WALK_MODAL_DIR_BACKWARD , WALK_MODAL_DIR_BACKWARD_STOP , WALK_MODAL_DIR_LEFT , WALK_MODAL_DIR_LEFT_STOP ,
  WALK_MODAL_DIR_RIGHT , WALK_MODAL_DIR_RIGHT_STOP , WALK_MODAL_DIR_UP , WALK_MODAL_DIR_UP_STOP ,
  WALK_MODAL_DIR_DOWN , WALK_MODAL_DIR_DOWN_STOP , WALK_MODAL_FAST_ENABLE , WALK_MODAL_FAST_DISABLE ,
  WALK_MODAL_SLOW_ENABLE , WALK_MODAL_SLOW_DISABLE , WALK_MODAL_JUMP , WALK_MODAL_JUMP_STOP ,
  WALK_MODAL_TELEPORT , WALK_MODAL_GRAVITY_TOGGLE , WALK_MODAL_ACCELERATE , WALK_MODAL_DECELERATE ,
  WALK_MODAL_AXIS_LOCK_Z
}
 
enum  {
  WALK_BIT_FORWARD = 1 << 0 , WALK_BIT_BACKWARD = 1 << 1 , WALK_BIT_LEFT = 1 << 2 , WALK_BIT_RIGHT = 1 << 3 ,
  WALK_BIT_UP = 1 << 4 , WALK_BIT_DOWN = 1 << 5
}
 
enum  eWalkTeleportState { WALK_TELEPORT_STATE_OFF = 0 , WALK_TELEPORT_STATE_ON }
 
enum  eWalkMethod { WALK_MODE_FREE = 0 , WALK_MODE_GRAVITY }
 
enum  eWalkGravityState { WALK_GRAVITY_STATE_OFF = 0 , WALK_GRAVITY_STATE_JUMP , WALK_GRAVITY_STATE_START , WALK_GRAVITY_STATE_ON }
 
enum  eWalkLockState { WALK_AXISLOCK_STATE_OFF = 0 , WALK_AXISLOCK_STATE_ACTIVE = 2 , WALK_AXISLOCK_STATE_DONE = 3 }
 
typedef enum eWalkTeleportState eWalkTeleportState
 
typedef enum eWalkMethod eWalkMethod
 
typedef enum eWalkGravityState eWalkGravityState
 
typedef enum eWalkLockState eWalkLockState
 
void walk_modal_keymap (wmKeyConfig *keyconf)
 

Internal Walk Logic

enum  { WALK_RUNNING = 0 , WALK_CANCEL = 1 , WALK_CONFIRM = 2 }
 
static float base_speed = -1.0f
 
static float userdef_speed = -1.0f
 
static void walk_navigation_mode_set (WalkInfo *walk, eWalkMethod mode)
 
static bool walk_floor_distance_get (RegionView3D *rv3d, WalkInfo *walk, const float dvec[3], float *r_distance)
 
static bool walk_ray_cast (RegionView3D *rv3d, WalkInfo *walk, float r_location[3], float r_normal[3], float *ray_distance)
 
static bool initWalkInfo (bContext *C, WalkInfo *walk, wmOperator *op, const int mval[2])
 
static int walkEnd (bContext *C, WalkInfo *walk)
 
static void walkEvent (WalkInfo *walk, const wmEvent *event)
 
static void walkMoveCamera (bContext *C, WalkInfo *walk, const bool do_rotate, const bool do_translate, const bool is_confirm)
 
static float getFreeFallDistance (const float gravity, const float time)
 

Detailed Description

Interactive walk navigation modal operator (similar to walking around in a first person game).

Note
Similar logic to view3d_navigate_fly.c changes here may apply there too.

Definition in file view3d_navigate_walk.c.

Macro Definition Documentation

◆ JUMP_SPEED_MAX

#define JUMP_SPEED_MAX   sqrtf(2.0f * walk->gravity * walk->jump_height)

◆ JUMP_SPEED_MIN

#define JUMP_SPEED_MIN   1.0f

◆ JUMP_TIME_MAX

#define JUMP_TIME_MAX   0.2f /* s */

◆ USE_TABLET_SUPPORT

#define USE_TABLET_SUPPORT

Definition at line 56 of file view3d_navigate_walk.c.

◆ WALK_BOOST_FACTOR

#define WALK_BOOST_FACTOR   ((void)0, walk->speed_factor)

◆ WALK_BOTTOM_LIMIT

#define WALK_BOTTOM_LIMIT   DEG2RADF(-80.0f)

◆ WALK_MOVE_SPEED

#define WALK_MOVE_SPEED   base_speed

◆ WALK_ROTATE_CONSTANT_FAC

#define WALK_ROTATE_CONSTANT_FAC   DEG2RAD(0.15f) /* Higher is faster, radians per-pixel. */

◆ WALK_ROTATE_TABLET_FAC

#define WALK_ROTATE_TABLET_FAC   8.8f /* Higher is faster, relative to region size. */

◆ WALK_TOP_LIMIT

#define WALK_TOP_LIMIT   DEG2RADF(85.0f)

◆ WALK_ZUP_CORRECT_ACCEL

#define WALK_ZUP_CORRECT_ACCEL   0.05f /* Increase upright momentum each step. */

◆ WALK_ZUP_CORRECT_FAC

#define WALK_ZUP_CORRECT_FAC   0.1f /* Amount to correct per step. */

Typedef Documentation

◆ eWalkGravityState

◆ eWalkLockState

◆ eWalkMethod

typedef enum eWalkMethod eWalkMethod

◆ eWalkTeleportState

◆ WalkInfo

typedef struct WalkInfo WalkInfo

◆ WalkTeleport

typedef struct WalkTeleport WalkTeleport

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
WALK_MODAL_CANCEL 
WALK_MODAL_CONFIRM 
WALK_MODAL_DIR_FORWARD 
WALK_MODAL_DIR_FORWARD_STOP 
WALK_MODAL_DIR_BACKWARD 
WALK_MODAL_DIR_BACKWARD_STOP 
WALK_MODAL_DIR_LEFT 
WALK_MODAL_DIR_LEFT_STOP 
WALK_MODAL_DIR_RIGHT 
WALK_MODAL_DIR_RIGHT_STOP 
WALK_MODAL_DIR_UP 
WALK_MODAL_DIR_UP_STOP 
WALK_MODAL_DIR_DOWN 
WALK_MODAL_DIR_DOWN_STOP 
WALK_MODAL_FAST_ENABLE 
WALK_MODAL_FAST_DISABLE 
WALK_MODAL_SLOW_ENABLE 
WALK_MODAL_SLOW_DISABLE 
WALK_MODAL_JUMP 
WALK_MODAL_JUMP_STOP 
WALK_MODAL_TELEPORT 
WALK_MODAL_GRAVITY_TOGGLE 
WALK_MODAL_ACCELERATE 
WALK_MODAL_DECELERATE 
WALK_MODAL_AXIS_LOCK_Z 

Definition at line 64 of file view3d_navigate_walk.c.

◆ anonymous enum

anonymous enum
Enumerator
WALK_BIT_FORWARD 
WALK_BIT_BACKWARD 
WALK_BIT_LEFT 
WALK_BIT_RIGHT 
WALK_BIT_UP 
WALK_BIT_DOWN 

Definition at line 92 of file view3d_navigate_walk.c.

◆ anonymous enum

anonymous enum
Enumerator
WALK_RUNNING 
WALK_CANCEL 
WALK_CONFIRM 

Definition at line 471 of file view3d_navigate_walk.c.

◆ eWalkGravityState

Enumerator
WALK_GRAVITY_STATE_OFF 
WALK_GRAVITY_STATE_JUMP 
WALK_GRAVITY_STATE_START 
WALK_GRAVITY_STATE_ON 

Definition at line 111 of file view3d_navigate_walk.c.

◆ eWalkLockState

Enumerator
WALK_AXISLOCK_STATE_OFF 
WALK_AXISLOCK_STATE_ACTIVE 
WALK_AXISLOCK_STATE_DONE 

Definition at line 119 of file view3d_navigate_walk.c.

◆ eWalkMethod

Enumerator
WALK_MODE_FREE 
WALK_MODE_GRAVITY 

Definition at line 106 of file view3d_navigate_walk.c.

◆ eWalkTeleportState

Enumerator
WALK_TELEPORT_STATE_OFF 
WALK_TELEPORT_STATE_ON 

Definition at line 101 of file view3d_navigate_walk.c.

Function Documentation

◆ drawWalkPixel()

static void drawWalkPixel ( const struct bContext UNUSEDC,
ARegion region,
void arg 
)
static

◆ getFreeFallDistance()

static float getFreeFallDistance ( const float  gravity,
const float  time 
)
static

Definition at line 915 of file view3d_navigate_walk.c.

References time.

Referenced by walkApply().

◆ getVelocityZeroTime()

static float getVelocityZeroTime ( const float  gravity,
const float  velocity 
)
static

Definition at line 920 of file view3d_navigate_walk.c.

Referenced by walkEvent().

◆ initWalkInfo()

static bool initWalkInfo ( bContext C,
WalkInfo walk,
wmOperator op,
const int  mval[2] 
)
static

Definition at line 481 of file view3d_navigate_walk.c.

References WalkInfo::active_directions, WalkInfo::anim_playing, base_speed, BKE_id_is_editable(), BKE_report(), C, View3D::camera, Object::constraints, copy_v2_v2_int(), CTX_data_ensure_evaluated_depsgraph(), CTX_data_main(), CTX_data_scene(), CTX_wm_manager(), CTX_wm_region(), CTX_wm_region_view3d(), CTX_wm_view3d(), CTX_wm_window(), WalkInfo::depsgraph, WalkInfo::draw_handle_pixel, drawWalkPixel(), WalkTeleport::duration, WalkInfo::dvec_prev, ED_region_draw_cb_activate(), ED_screen_animation_playing(), ED_transform_snap_object_context_create(), ED_view3d_cameracontrol_acquire(), ED_view3d_offset_lock_check(), fabsf, ListBase::first, PhysicsSettings::flag, WalkInfo::gravity, PhysicsSettings::gravity, WalkInfo::gravity_state, WalkInfo::grid, Object::id, if(), WalkInfo::init_mval, WalkInfo::is_cursor_absolute, WalkInfo::is_fast, WalkInfo::is_reversed, WalkInfo::is_slow, WalkInfo::jump_height, WalkInfo::mouse_speed, WalkInfo::need_rotation_keyframe, WalkInfo::need_translation_keyframe, NULL, RegionView3D::persp, PHYS_GLOBAL_GRAVITY, Scene::physics_settings, PIL_check_seconds_timer(), WalkInfo::prev_mval, WalkInfo::redraw, WalkInfo::region, REGION_DRAW_POST_PIXEL, wmOperator::reports, RegionView3D::rflag, RPT_ERROR, WalkInfo::rv3d, RV3D_CAMOB, RV3D_NAVIGATING, RV3D_PERSP, UnitSettings::scale_length, WalkInfo::scene, WalkInfo::snap_context, WalkInfo::speed, WalkInfo::speed_factor, WalkInfo::state, UnitSettings::system, WalkInfo::teleport, WalkInfo::time_lastdraw, WalkInfo::timer, TIMER, ARegion::type, Scene::unit, USER_UNIT_NONE, USER_WALK_GRAVITY, USER_WALK_MOUSE_REVERSE, userdef_speed, WalkInfo::v3d, WalkInfo::v3d_camera_control, WalkInfo::view_height, WALK_AXISLOCK_STATE_OFF, WALK_GRAVITY_STATE_OFF, WALK_MODE_FREE, WALK_MODE_GRAVITY, walk_navigation_mode_set(), WALK_RUNNING, WM_cursor_grab_enable(), WM_event_add_timer(), zero_v3(), and WalkInfo::zlock.

Referenced by walk_invoke().

◆ VIEW3D_OT_walk()

void VIEW3D_OT_walk ( wmOperatorType ot)

◆ walk_cancel()

static void walk_cancel ( bContext C,
wmOperator op 
)
static

Definition at line 1377 of file view3d_navigate_walk.c.

References C, wmOperator::customdata, NULL, WalkInfo::state, WALK_CANCEL, and walkEnd().

Referenced by VIEW3D_OT_walk().

◆ walk_floor_distance_get()

static bool walk_floor_distance_get ( RegionView3D rv3d,
WalkInfo walk,
const float  dvec[3],
float r_distance 
)
static

◆ walk_invoke()

static int walk_invoke ( bContext C,
wmOperator op,
const wmEvent event 
)
static

◆ walk_modal()

static int walk_modal ( bContext C,
wmOperator op,
const wmEvent event 
)
static

◆ walk_modal_keymap()

void walk_modal_keymap ( wmKeyConfig keyconf)

◆ walk_navigation_mode_set()

static void walk_navigation_mode_set ( WalkInfo walk,
eWalkMethod  mode 
)
static

◆ walk_ray_cast()

static bool walk_ray_cast ( RegionView3D rv3d,
WalkInfo walk,
float  r_location[3],
float  r_normal[3],
float ray_distance 
)
static
Parameters
ray_distanceDistance to the hit point
r_locationLocation of the hit point
r_normalNormal of the hit surface, transformed to always face the camera

Definition at line 429 of file view3d_navigate_walk.c.

References BVH_RAYCAST_DIST_MAX, copy_v3_v3(), WalkInfo::depsgraph, dot_v3v3(), ED_transform_snap_object_project_ray(), WalkInfo::grid, mul_mat3_m4_v3(), negate_v3(), normalize_v3(), NULL, ret, WalkInfo::snap_context, WalkInfo::v3d, and RegionView3D::viewinv.

Referenced by walkEvent().

◆ walkApply()

static int walkApply ( bContext C,
struct WalkInfo walk,
bool  is_confirm 
)
static

Definition at line 925 of file view3d_navigate_walk.c.

References WalkInfo::active_directions, add_v3_v3(), angle(), asinf, axis_angle_to_quat(), axis_angle_to_quat_single(), C, copy_m3_m4(), copy_v2_v2(), copy_v2_v2_int(), copy_v3_fl3(), copy_v3_v3(), WalkTeleport::direction, WalkTeleport::duration, WalkInfo::dvec_prev, ELEM, fabsf, float(), getFreeFallDistance(), WalkInfo::gravity, WalkInfo::gravity_state, WalkInfo::grid, WalkTeleport::initial_time, WalkInfo::is_cursor_absolute, WalkInfo::is_fast, WalkInfo::is_reversed, WalkInfo::is_slow, len_squared_v3(), min_ff(), WalkInfo::moffset, WalkInfo::mouse_speed, mul_m3_v3(), mul_qt_qtqt(), mul_v3_fl(), mul_v3_v3fl(), WalkTeleport::navigation_mode, WalkInfo::navigation_mode, WalkInfo::need_rotation_keyframe, WalkInfo::need_translation_keyframe, normalize_v3(), RegionView3D::ofs, OPERATOR_FINISHED, WalkTeleport::origin, RegionView3D::persp, PIL_check_seconds_timer(), WalkInfo::redraw, WalkInfo::region, ret, WalkInfo::rv3d, RV3D_CAMOB, WalkInfo::speed, WalkInfo::speed_jump, WalkTeleport::state, sub_v3_v3v3(), t, WalkInfo::teleport, WalkInfo::time_lastdraw, WalkInfo::view_height, RegionView3D::viewinv, RegionView3D::viewmat, RegionView3D::viewquat, WALK_AXISLOCK_STATE_ACTIVE, WALK_AXISLOCK_STATE_DONE, WALK_BIT_BACKWARD, WALK_BIT_DOWN, WALK_BIT_FORWARD, WALK_BIT_LEFT, WALK_BIT_RIGHT, WALK_BIT_UP, WALK_BOOST_FACTOR, WALK_BOTTOM_LIMIT, walk_floor_distance_get(), WALK_GRAVITY_STATE_JUMP, WALK_GRAVITY_STATE_OFF, WALK_GRAVITY_STATE_ON, WALK_GRAVITY_STATE_START, WALK_MODE_FREE, WALK_MODE_GRAVITY, WALK_MOVE_SPEED, walk_navigation_mode_set(), WALK_ROTATE_CONSTANT_FAC, WALK_ROTATE_TABLET_FAC, WALK_TELEPORT_STATE_OFF, WALK_TELEPORT_STATE_ON, WALK_TOP_LIMIT, WALK_ZUP_CORRECT_ACCEL, WALK_ZUP_CORRECT_FAC, walkMoveCamera(), ARegion::winx, ARegion::winy, x, y, zero_v3(), WalkInfo::zlock, and WalkInfo::zlock_momentum.

Referenced by walk_modal(), and walkEnd().

◆ walkEnd()

static int walkEnd ( bContext C,
WalkInfo walk 
)
static

◆ walkEvent()

static void walkEvent ( WalkInfo walk,
const wmEvent event 
)
static

Definition at line 657 of file view3d_navigate_walk.c.

References WalkInfo::active_directions, add_v3_v3(), base_speed, copy_v2_v2(), copy_v2_v2_int(), copy_v3_v3(), wmEvent::customdata, WalkTeleport::direction, blender::math::distance(), WalkTeleport::duration, WalkInfo::dvec_prev, EVT_MODAL_MAP, float(), getVelocityZeroTime(), WalkInfo::gravity, WalkInfo::gravity_state, WalkTeleport::initial_time, WalkInfo::is_cursor_absolute, WalkInfo::is_fast, wmTabletData::is_motion_absolute, WalkInfo::is_slow, ISMOUSE_MOTION, JUMP_SPEED_MAX, JUMP_SPEED_MIN, JUMP_TIME_MAX, MEM_dupallocN, MEM_freeN, min_ff(), WalkInfo::moffset, wmEvent::mval, WalkTeleport::navigation_mode, WalkInfo::navigation_mode, NDOF_MOTION, nor, normalize_v3_length(), NULL, WalkTeleport::origin, P_FINISHING, P_IN_PROGRESS, P_STARTING, PIL_check_seconds_timer(), WalkInfo::prev_mval, WalkInfo::redraw, ret, WalkInfo::rv3d, WalkInfo::speed_jump, WalkTeleport::state, WalkInfo::state, sub_v3_v3v3(), t, wmEvent::tablet, WalkInfo::teleport, WalkInfo::time_lastdraw, WalkInfo::timer, TIMER, wmEvent::type, wmEvent::val, WalkInfo::view_height, RegionView3D::viewinv, WALK_AXISLOCK_STATE_ACTIVE, WALK_AXISLOCK_STATE_DONE, WALK_BIT_BACKWARD, WALK_BIT_DOWN, WALK_BIT_FORWARD, WALK_BIT_LEFT, WALK_BIT_RIGHT, WALK_BIT_UP, WALK_CANCEL, WALK_CONFIRM, WALK_GRAVITY_STATE_JUMP, WALK_GRAVITY_STATE_OFF, WALK_GRAVITY_STATE_ON, WALK_MODAL_ACCELERATE, WALK_MODAL_AXIS_LOCK_Z, WALK_MODAL_CANCEL, WALK_MODAL_CONFIRM, WALK_MODAL_DECELERATE, WALK_MODAL_DIR_BACKWARD, WALK_MODAL_DIR_BACKWARD_STOP, WALK_MODAL_DIR_DOWN, WALK_MODAL_DIR_DOWN_STOP, WALK_MODAL_DIR_FORWARD, WALK_MODAL_DIR_FORWARD_STOP, WALK_MODAL_DIR_LEFT, WALK_MODAL_DIR_LEFT_STOP, WALK_MODAL_DIR_RIGHT, WALK_MODAL_DIR_RIGHT_STOP, WALK_MODAL_DIR_UP, WALK_MODAL_DIR_UP_STOP, WALK_MODAL_FAST_DISABLE, WALK_MODAL_FAST_ENABLE, WALK_MODAL_GRAVITY_TOGGLE, WALK_MODAL_JUMP, WALK_MODAL_JUMP_STOP, WALK_MODAL_SLOW_DISABLE, WALK_MODAL_SLOW_ENABLE, WALK_MODAL_TELEPORT, WALK_MODE_FREE, WALK_MODE_GRAVITY, walk_navigation_mode_set(), walk_ray_cast(), WALK_TELEPORT_STATE_OFF, WALK_TELEPORT_STATE_ON, WalkInfo::zlock, and WalkInfo::zlock_momentum.

Referenced by walk_invoke(), and walk_modal().

◆ walkMoveCamera()

static void walkMoveCamera ( bContext C,
WalkInfo walk,
const bool  do_rotate,
const bool  do_translate,
const bool  is_confirm 
)
static

Variable Documentation

◆ base_speed

float base_speed = -1.0f
static

Definition at line 478 of file view3d_navigate_walk.c.

Referenced by initWalkInfo(), and walkEvent().

◆ userdef_speed

float userdef_speed = -1.0f
static

Definition at line 479 of file view3d_navigate_walk.c.

Referenced by initWalkInfo().