Cleanup: use enum types and improve argument naming for walk mode

This commit is contained in:
Campbell Barton
2023-11-05 18:32:41 +11:00
parent c62009a6ac
commit 1b3cfcc74f
2 changed files with 46 additions and 56 deletions

View File

@@ -7,11 +7,11 @@
*
* Interactive fly navigation modal operator (flying around in space).
*
* Defines #VIEW3D_OT_fly modal operator.
*
* \note Similar logic to `view3d_navigate_walk.cc` changes here may apply there too.
*/
/* defines VIEW3D_OT_fly modal operator */
#ifdef WITH_INPUT_NDOF
//# define NDOF_FLY_DEBUG
/* is this needed for ndof? - commented so redraw doesn't thrash - campbell */

View File

@@ -8,11 +8,11 @@
* Interactive walk navigation modal operator
* (similar to walking around in a first person game).
*
* Defines #VIEW3D_OT_navigate, walk modal operator.
*
* \note Similar logic to `view3d_navigate_fly.cc` changes here may apply there too.
*/
/* defines VIEW3D_OT_navigate - walk modal operator */
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -98,7 +98,7 @@ enum {
WALK_MODAL_DIR_LOCAL_DOWN_STOP,
};
enum {
enum eWalkDirectionFlag {
WALK_BIT_FORWARD = 1 << 0,
WALK_BIT_BACKWARD = 1 << 1,
WALK_BIT_LEFT = 1 << 2,
@@ -108,6 +108,7 @@ enum {
WALK_BIT_LOCAL_UP = 1 << 6,
WALK_BIT_LOCAL_DOWN = 1 << 7,
};
ENUM_OPERATORS(eWalkDirectionFlag, WALK_BIT_LOCAL_DOWN)
enum eWalkTeleportState {
WALK_TELEPORT_STATE_OFF = 0,
@@ -222,6 +223,13 @@ struct WalkTeleport {
eWalkMethod navigation_mode; /* teleport always set FREE mode on */
};
/** #WalkInfo::state */
enum eWalkState {
WALK_RUNNING = 0,
WALK_CANCEL = 1,
WALK_CONFIRM = 2,
};
struct WalkInfo {
/* context stuff */
RegionView3D *rv3d;
@@ -233,11 +241,11 @@ struct WalkInfo {
/** Needed for updating that isn't triggered by input. */
wmTimer *timer;
short state;
eWalkState state;
bool redraw;
/**
* Needed for auto-keyframing, when animation isn't playing, only keyframe on confirmation.
* Needed for auto-key-framing, when animation isn't playing, only keyframe on confirmation.
*
* Currently we can't cancel this operator usefully while recording on animation playback
* (this would need to un-key all previous frames).
@@ -305,7 +313,7 @@ struct WalkInfo {
float view_height;
/** Counting system to allow movement to continue if a direction (WASD) key is still pressed. */
int active_directions;
eWalkDirectionFlag active_directions;
float speed_jump;
/** Current maximum jump height. */
@@ -414,8 +422,8 @@ static bool walk_floor_distance_get(RegionView3D *rv3d,
{
const float ray_normal[3] = {0, 0, -1}; /* down */
float ray_start[3];
float r_location[3];
float r_normal_dummy[3];
float location_dummy[3];
float normal_dummy[3];
float dvec_tmp[3];
bool ret;
@@ -438,10 +446,10 @@ static bool walk_floor_distance_get(RegionView3D *rv3d,
ray_start,
ray_normal,
r_distance,
r_location,
r_normal_dummy);
location_dummy,
normal_dummy);
/* artificially scale the distance to the scene size */
/* Artificially scale the distance to the scene size. */
*r_distance /= walk->grid;
return ret;
}
@@ -455,13 +463,12 @@ static bool walk_ray_cast(RegionView3D *rv3d,
WalkInfo *walk,
float r_location[3],
float r_normal[3],
float *ray_distance)
float *r_ray_distance)
{
float ray_normal[3] = {0, 0, -1}; /* forward */
float ray_start[3];
bool ret;
*ray_distance = BVH_RAYCAST_DIST_MAX;
*r_ray_distance = BVH_RAYCAST_DIST_MAX;
copy_v3_v3(ray_start, rv3d->viewinv[3]);
@@ -472,15 +479,15 @@ static bool walk_ray_cast(RegionView3D *rv3d,
SnapObjectParams snap_params = {};
snap_params.snap_target_select = SCE_SNAP_TARGET_ALL;
ret = ED_transform_snap_object_project_ray(walk->snap_context,
walk->depsgraph,
walk->v3d,
&snap_params,
ray_start,
ray_normal,
nullptr,
r_location,
r_normal);
const bool ret = ED_transform_snap_object_project_ray(walk->snap_context,
walk->depsgraph,
walk->v3d,
&snap_params,
ray_start,
ray_normal,
nullptr,
r_location,
r_normal);
/* dot is positive if both rays are facing the same direction */
if (dot_v3v3(ray_normal, r_normal) > 0) {
@@ -488,18 +495,11 @@ static bool walk_ray_cast(RegionView3D *rv3d,
}
/* artificially scale the distance to the scene size */
*ray_distance /= walk->grid;
*r_ray_distance /= walk->grid;
return ret;
}
/* WalkInfo->state */
enum {
WALK_RUNNING = 0,
WALK_CANCEL = 1,
WALK_CONFIRM = 2,
};
/* Keep the previous speed and jump height until user changes preferences. */
static float base_speed = -1.0f;
static float userdef_speed = -1.0f;
@@ -598,10 +598,10 @@ static bool initWalkInfo(bContext *C, WalkInfo *walk, wmOperator *op, const int
walk->is_cursor_absolute = false;
#endif
walk->active_directions = 0;
walk->active_directions = eWalkDirectionFlag(0);
#ifdef NDOF_WALK_DRAW_TOOMUCH
walk->redraw = 1;
walk->redraw = true;
#endif
zero_v3(walk->dvec_prev);
@@ -892,7 +892,7 @@ static void walkEvent(WalkInfo *walk, const wmEvent *event)
case WALK_MODAL_TELEPORT: {
float loc[3], nor[3];
float distance;
bool ret = walk_ray_cast(walk->rv3d, walk, loc, nor, &distance);
const bool ret = walk_ray_cast(walk->rv3d, walk, loc, nor, &distance);
/* in case we are teleporting middle way from a jump */
walk->speed_jump = 0.0f;
@@ -1049,7 +1049,7 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm)
float time_redraw;
float time_redraw_clamped;
#ifdef NDOF_WALK_DRAW_TOOMUCH
walk->redraw = 1;
walk->redraw = true;
#endif
time_current = PIL_check_seconds_timer();
time_redraw = float(time_current - walk->time_lastdraw);
@@ -1271,15 +1271,11 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm)
if (walk->navigation_mode == WALK_MODE_GRAVITY &&
ELEM(walk->gravity_state, WALK_GRAVITY_STATE_OFF, WALK_GRAVITY_STATE_START))
{
bool ret;
float ray_distance;
float difference = -100.0f;
float fall_distance;
ret = walk_floor_distance_get(rv3d, walk, dvec, &ray_distance);
if (ret) {
if (walk_floor_distance_get(rv3d, walk, dvec, &ray_distance)) {
difference = walk->view_height - ray_distance;
}
@@ -1309,30 +1305,25 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm)
/* Falling or jumping) */
if (ELEM(walk->gravity_state, WALK_GRAVITY_STATE_ON, WALK_GRAVITY_STATE_JUMP)) {
float t;
float z_cur, z_new;
bool ret;
float ray_distance, difference = -100.0f;
/* delta time */
t = float(PIL_check_seconds_timer() - walk->teleport.initial_time);
const bool t = float(PIL_check_seconds_timer() - walk->teleport.initial_time);
/* keep moving if we were moving */
copy_v2_v2(dvec, walk->teleport.direction);
z_cur = walk->rv3d->viewinv[3][2] / walk->grid;
z_new = (walk->teleport.origin[2] / walk->grid) - getFreeFallDistance(walk->gravity, t);
/* jump */
z_new += t * walk->speed_jump;
const float z_cur = walk->rv3d->viewinv[3][2] / walk->grid;
const float z_new = ((walk->teleport.origin[2] / walk->grid) -
getFreeFallDistance(walk->gravity, t)) +
/* Jump. */
(t * walk->speed_jump);
/* duration is the jump duration */
if (t > walk->teleport.duration) {
/* check to see if we are landing */
ret = walk_floor_distance_get(rv3d, walk, dvec, &ray_distance);
if (ret) {
if (walk_floor_distance_get(rv3d, walk, dvec, &ray_distance)) {
difference = walk->view_height - ray_distance;
}
@@ -1475,7 +1466,6 @@ static void walk_cancel(bContext *C, wmOperator *op)
static int walk_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
int exit_code;
bool do_draw = false;
WalkInfo *walk = static_cast<WalkInfo *>(op->customdata);
View3D *v3d = walk->v3d;
@@ -1501,7 +1491,7 @@ static int walk_modal(bContext *C, wmOperator *op, const wmEvent *event)
do_draw |= walk->redraw;
exit_code = walkEnd(C, walk);
const int exit_code = walkEnd(C, walk);
if (exit_code != OPERATOR_RUNNING_MODAL) {
do_draw = true;