Browse Source

Added InputTracker test initPhysTest

legacy
Benjamin ‘Touky’ Huet touky 12 years ago
parent
commit
8838ef06b6
8 changed files with 511 additions and 183 deletions
  1. +2
    -1
      src/entity.h
  2. +112
    -74
      src/input/input.cpp
  3. +343
    -93
      src/input/input.h
  4. +22
    -4
      test/BtPhysTest.cpp
  5. +1
    -1
      test/PhysicObject.h
  6. +14
    -2
      test/Physics/Include/EasyCharacterController.h
  7. +5
    -4
      test/Physics/Include/LolBtPhysicsIntegration.h
  8. +12
    -4
      test/Physics/Src/EasyCharacterController.cpp

+ 2
- 1
src/entity.h View File

@@ -46,7 +46,8 @@ protected:
GAMEGROUP_BEFORE = 0,
GAMEGROUP_DEFAULT,
GAMEGROUP_AFTER,
GAMEGROUP_AFTER_POST,
GAMEGROUP_AFTER_0,
GAMEGROUP_AFTER_1,

// Must be the last element
GAMEGROUP_END


+ 112
- 74
src/input/input.cpp View File

@@ -31,7 +31,7 @@ namespace lol
* Input implementation class
*/

Array<ButtonSetting> Input::InputAssocationList;
InputTracker* Input::m_input_tracker = NULL;

static class InputData
{
@@ -60,6 +60,109 @@ inputdata;

static InputData * const data = &inputdata;

/*
* InputTracker class
*/

InputTracker::InputTracker()
{
m_gamegroup = GAMEGROUP_BEFORE;

Ticker::Ref(this);
}

//Internal : Updates the action status & timers
void InputTracker::UpdateActionStatus(float seconds)
{
for (int i = 0; i < m_input_assocation_list.Count(); i++)
{
ButtonSetting &CurIT = m_input_assocation_list[i];

CurIT.m_previous_status = CurIT.m_current_status;
CurIT.m_current_status = Input::GetButtonState(CurIT.m_raw_button_id);

for (int j = 0; j < CurIT.m_associated_action_list.Count(); j++)
{
ActionSetting &CurAS = CurIT.m_associated_action_list[j];

if (CurAS.BufferedSince <= CurAS.BufferingTime)
CurAS.BufferedSince += seconds;

if (CurIT.m_current_status && CurAS.BufferingTime >= .0f)
CurAS.BufferedSince = .0f;
}
}

}

//Helps link a software input Action-Id to an hardware input Button-Id.
void InputTracker::LinkActionIdToButtonId(int ActionId, int ButtonId)
{
int ITIdx = GetButtonSettingIdx(ButtonId);
if (ITIdx == -1)
{
ITIdx = m_input_assocation_list.Count();
m_input_assocation_list << ButtonSetting(ButtonId);
}

ButtonSetting &CurIT = m_input_assocation_list[ITIdx];

int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx == -1)
{
ASIdx = CurIT.m_associated_action_list.Count();
CurIT.m_associated_action_list << ActionSetting(ActionId);
}
}

//Helps unlink a software input Action-Id to an hardware input Button-Id.
void InputTracker::UnlinkActionId(int ActionId)
{
for (int i = 0; i < m_input_assocation_list.Count(); i++)
{
ButtonSetting &CurIT = m_input_assocation_list[i];
int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx != -1)
CurIT.m_associated_action_list.Remove(ASIdx);
}
}

//Returns the current status of a given action
int InputTracker::GetActionStatus(int ActionId)
{
for (int i = 0; i < m_input_assocation_list.Count(); i++)
{
ButtonSetting &CurIT = m_input_assocation_list[i];
int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx != -1)
{
ActionSetting &CurAS = CurIT.m_associated_action_list[ASIdx];

if (CurAS.BufferingTime >= .0f && CurAS.BufferedSince <= CurAS.BufferingTime)
return 1;
return 0;
}
}
return 0;
}

//Returns TRUE if action status when from Active to Inactive this frame
bool InputTracker::WasActionJustReleased(int ActionId)
{
for (int i = 0; i < m_input_assocation_list.Count(); i++)
{
ButtonSetting &CurIT = m_input_assocation_list[i];
int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx != -1)
{
if (!CurIT.m_current_status && CurIT.m_previous_status)
return true;
return false;
}
}
return false;
}

/*
* Public Input class
*/
@@ -115,98 +218,33 @@ int Input::GetButtonState(int button)
#endif
}

//--

//---
//Internal : Updates the action status & timers
void Input::UpdateActionStatus(float seconds)
{
for (int i = 0; i < InputAssocationList.Count(); i++)
{
ButtonSetting &CurIT = InputAssocationList[i];

CurIT.PrevStatus = CurIT.CurStatus;
CurIT.CurStatus = Input::GetButtonState(CurIT.RawButtonId);

for (int j = 0; j < CurIT.AssociatedActionList.Count(); j++)
{
ActionSetting &CurAS = CurIT.AssociatedActionList[j];

if (CurAS.BufferedSince <= CurAS.BufferingTime)
CurAS.BufferedSince += seconds;

if (CurIT.CurStatus && CurAS.BufferingTime >= .0f)
CurAS.BufferedSince = .0f;
}
}

}

//Helps link a software input Action-Id to an hardware input Button-Id.
void Input::LinkActionIdToButtonId(int ActionId, int ButtonId)
{
int ITIdx = GetButtonSettingIdx(ButtonId);
if (ITIdx == -1)
{
ITIdx = InputAssocationList.Count();
InputAssocationList << ButtonSetting(ButtonId);
}

ButtonSetting &CurIT = InputAssocationList[ITIdx];

int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx == -1)
{
ASIdx = CurIT.AssociatedActionList.Count();
CurIT.AssociatedActionList << ActionSetting(ActionId);
}
if (CheckInputTrackerInit())
Input::m_input_tracker->LinkActionIdToButtonId(ActionId, ButtonId);
}

//Helps unlink a software input Action-Id to an hardware input Button-Id.
void Input::UnlinkActionId(int ActionId)
{
for (int i = 0; i < InputAssocationList.Count(); i++)
{
ButtonSetting &CurIT = InputAssocationList[i];
int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx != -1)
CurIT.AssociatedActionList.Remove(ASIdx);
}
if (CheckInputTrackerInit())
Input::m_input_tracker->UnlinkActionId(ActionId);
}

//Returns the current status of a given action
int Input::GetActionStatus(int ActionId)
{
for (int i = 0; i < InputAssocationList.Count(); i++)
{
ButtonSetting &CurIT = InputAssocationList[i];
int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx != -1)
{
ActionSetting &CurAS = CurIT.AssociatedActionList[ASIdx];
if (CurAS.BufferingTime >= .0f && CurAS.BufferedSince <= CurAS.BufferingTime)
return 1;
return 0;
}
}
if (CheckInputTrackerInit())
return Input::m_input_tracker->GetActionStatus(ActionId);
return 0;
}

//Returns TRUE if action status when from Active to Inactive this frame
bool Input::WasActionJustReleased(int ActionId)
{
for (int i = 0; i < InputAssocationList.Count(); i++)
{
ButtonSetting &CurIT = InputAssocationList[i];
int ASIdx = CurIT.GetActionSettingIdx(ActionId);
if (ASIdx != -1)
{
if (!CurIT.CurStatus && CurIT.PrevStatus)
return true;
return false;
}
}
if (CheckInputTrackerInit())
return Input::m_input_tracker->WasActionJustReleased(ActionId);
return false;
}



+ 343
- 93
src/input/input.h View File

@@ -17,6 +17,7 @@
#define __LOL_INPUT_INPUT_H__

#include <cstring>
#include "core.h"
#include "lol/math/vector.h"
#include "input/stick.h"

@@ -25,81 +26,301 @@ namespace lol

class WorldEntity;

//Partial Key reap-off of the SDLK enum
#define LOLK_UNKNOWN = 0;

#define LOLK_RETURN = '\r';
#define LOLK_ESCAPE = '\033';
#define LOLK_BACKSPACE = '\b';
#define LOLK_TAB = '\t';
#define LOLK_SPACE = ' ';
#define LOLK_EXCLAIM = '!';
#define LOLK_QUOTEDBL = '"';
#define LOLK_HASH = '#';
#define LOLK_PERCENT = '%';
#define LOLK_DOLLAR = '$';
#define LOLK_AMPERSAND = '&';
#define LOLK_QUOTE = '\'';
#define LOLK_LEFTPAREN = '(';
#define LOLK_RIGHTPAREN = ')';
#define LOLK_ASTERISK = '*';
#define LOLK_PLUS = '+';
#define LOLK_COMMA = ';';
#define LOLK_MINUS = '-';
#define LOLK_PERIOD = '.';
#define LOLK_SLASH = '/';
#define LOLK_0 = '0';
#define LOLK_1 = '1';
#define LOLK_2 = '2';
#define LOLK_3 = '3';
#define LOLK_4 = '4';
#define LOLK_5 = '5';
#define LOLK_6 = '6';
#define LOLK_7 = '7';
#define LOLK_8 = '8';
#define LOLK_9 = '9';
#define LOLK_COLON = ':';
#define LOLK_SEMICOLON = ';';
#define LOLK_LESS = '<';
#define LOLK_EQUALS = '=';
#define LOLK_GREATER = '>';
#define LOLK_QUESTION = '?';
#define LOLK_AT = '@';
/*
Skip uppercase letters
*/
#define LOLK_LEFTBRACKET = '[';
#define LOLK_BACKSLASH = '\\';
#define LOLK_RIGHTBRACKET = ']';
#define LOLK_CARET = '^';
#define LOLK_UNDERSCORE = '_';
#define LOLK_BACKQUOTE = '`';
#define LOLK_a = 'a';
#define LOLK_b = 'b';
#define LOLK_c = 'c';
#define LOLK_d = 'd';
#define LOLK_e = 'e';
#define LOLK_f = 'f';
#define LOLK_g = 'g';
#define LOLK_h = 'h';
#define LOLK_i = 'i';
#define LOLK_j = 'j';
#define LOLK_k = 'k';
#define LOLK_l = 'l';
#define LOLK_m = 'm';
#define LOLK_n = 'n';
#define LOLK_o = 'o';
#define LOLK_p = 'p';
#define LOLK_q = 'q';
#define LOLK_r = 'r';
#define LOLK_s = 's';
#define LOLK_t = 't';
#define LOLK_u = 'u';
#define LOLK_v = 'v';
#define LOLK_w = 'w';
#define LOLK_x = 'x';
#define LOLK_y = 'y';
#define LOLK_z = 'z';
//FULL Key reap-off of the SDLK enum
typedef enum {
/** @name ASCII mapped keysyms
* The keyboard syms have been cleverly chosen to map to ASCII
*/
/*@{*/
LOLK_UNKNOWN = 0,
LOLK_FIRST = 0,
LOLK_BACKSPACE = 8,
LOLK_TAB = 9,
LOLK_CLEAR = 12,
LOLK_RETURN = 13,
LOLK_PAUSE = 19,
LOLK_ESCAPE = 27,
LOLK_SPACE = 32,
LOLK_EXCLAIM = 33,
LOLK_QUOTEDBL = 34,
LOLK_HASH = 35,
LOLK_DOLLAR = 36,
LOLK_AMPERSAND = 38,
LOLK_QUOTE = 39,
LOLK_LEFTPAREN = 40,
LOLK_RIGHTPAREN = 41,
LOLK_ASTERISK = 42,
LOLK_PLUS = 43,
LOLK_COMMA = 44,
LOLK_MINUS = 45,
LOLK_PERIOD = 46,
LOLK_SLASH = 47,
LOLK_0 = 48,
LOLK_1 = 49,
LOLK_2 = 50,
LOLK_3 = 51,
LOLK_4 = 52,
LOLK_5 = 53,
LOLK_6 = 54,
LOLK_7 = 55,
LOLK_8 = 56,
LOLK_9 = 57,
LOLK_COLON = 58,
LOLK_SEMICOLON = 59,
LOLK_LESS = 60,
LOLK_EQUALS = 61,
LOLK_GREATER = 62,
LOLK_QUESTION = 63,
LOLK_AT = 64,
/*
Skip uppercase letters
*/
LOLK_LEFTBRACKET = 91,
LOLK_BACKSLASH = 92,
LOLK_RIGHTBRACKET = 93,
LOLK_CARET = 94,
LOLK_UNDERSCORE = 95,
LOLK_BACKQUOTE = 96,
LOLK_a = 97,
LOLK_b = 98,
LOLK_c = 99,
LOLK_d = 100,
LOLK_e = 101,
LOLK_f = 102,
LOLK_g = 103,
LOLK_h = 104,
LOLK_i = 105,
LOLK_j = 106,
LOLK_k = 107,
LOLK_l = 108,
LOLK_m = 109,
LOLK_n = 110,
LOLK_o = 111,
LOLK_p = 112,
LOLK_q = 113,
LOLK_r = 114,
LOLK_s = 115,
LOLK_t = 116,
LOLK_u = 117,
LOLK_v = 118,
LOLK_w = 119,
LOLK_x = 120,
LOLK_y = 121,
LOLK_z = 122,
LOLK_DELETE = 127,
/* End of ASCII mapped keysyms */
/*@}*/

/** @name International keyboard syms */
/*@{*/
LOLK_WORLD_0 = 160, /* 0xA0 */
LOLK_WORLD_1 = 161,
LOLK_WORLD_2 = 162,
LOLK_WORLD_3 = 163,
LOLK_WORLD_4 = 164,
LOLK_WORLD_5 = 165,
LOLK_WORLD_6 = 166,
LOLK_WORLD_7 = 167,
LOLK_WORLD_8 = 168,
LOLK_WORLD_9 = 169,
LOLK_WORLD_10 = 170,
LOLK_WORLD_11 = 171,
LOLK_WORLD_12 = 172,
LOLK_WORLD_13 = 173,
LOLK_WORLD_14 = 174,
LOLK_WORLD_15 = 175,
LOLK_WORLD_16 = 176,
LOLK_WORLD_17 = 177,
LOLK_WORLD_18 = 178,
LOLK_WORLD_19 = 179,
LOLK_WORLD_20 = 180,
LOLK_WORLD_21 = 181,
LOLK_WORLD_22 = 182,
LOLK_WORLD_23 = 183,
LOLK_WORLD_24 = 184,
LOLK_WORLD_25 = 185,
LOLK_WORLD_26 = 186,
LOLK_WORLD_27 = 187,
LOLK_WORLD_28 = 188,
LOLK_WORLD_29 = 189,
LOLK_WORLD_30 = 190,
LOLK_WORLD_31 = 191,
LOLK_WORLD_32 = 192,
LOLK_WORLD_33 = 193,
LOLK_WORLD_34 = 194,
LOLK_WORLD_35 = 195,
LOLK_WORLD_36 = 196,
LOLK_WORLD_37 = 197,
LOLK_WORLD_38 = 198,
LOLK_WORLD_39 = 199,
LOLK_WORLD_40 = 200,
LOLK_WORLD_41 = 201,
LOLK_WORLD_42 = 202,
LOLK_WORLD_43 = 203,
LOLK_WORLD_44 = 204,
LOLK_WORLD_45 = 205,
LOLK_WORLD_46 = 206,
LOLK_WORLD_47 = 207,
LOLK_WORLD_48 = 208,
LOLK_WORLD_49 = 209,
LOLK_WORLD_50 = 210,
LOLK_WORLD_51 = 211,
LOLK_WORLD_52 = 212,
LOLK_WORLD_53 = 213,
LOLK_WORLD_54 = 214,
LOLK_WORLD_55 = 215,
LOLK_WORLD_56 = 216,
LOLK_WORLD_57 = 217,
LOLK_WORLD_58 = 218,
LOLK_WORLD_59 = 219,
LOLK_WORLD_60 = 220,
LOLK_WORLD_61 = 221,
LOLK_WORLD_62 = 222,
LOLK_WORLD_63 = 223,
LOLK_WORLD_64 = 224,
LOLK_WORLD_65 = 225,
LOLK_WORLD_66 = 226,
LOLK_WORLD_67 = 227,
LOLK_WORLD_68 = 228,
LOLK_WORLD_69 = 229,
LOLK_WORLD_70 = 230,
LOLK_WORLD_71 = 231,
LOLK_WORLD_72 = 232,
LOLK_WORLD_73 = 233,
LOLK_WORLD_74 = 234,
LOLK_WORLD_75 = 235,
LOLK_WORLD_76 = 236,
LOLK_WORLD_77 = 237,
LOLK_WORLD_78 = 238,
LOLK_WORLD_79 = 239,
LOLK_WORLD_80 = 240,
LOLK_WORLD_81 = 241,
LOLK_WORLD_82 = 242,
LOLK_WORLD_83 = 243,
LOLK_WORLD_84 = 244,
LOLK_WORLD_85 = 245,
LOLK_WORLD_86 = 246,
LOLK_WORLD_87 = 247,
LOLK_WORLD_88 = 248,
LOLK_WORLD_89 = 249,
LOLK_WORLD_90 = 250,
LOLK_WORLD_91 = 251,
LOLK_WORLD_92 = 252,
LOLK_WORLD_93 = 253,
LOLK_WORLD_94 = 254,
LOLK_WORLD_95 = 255, /* 0xFF */
/*@}*/

/** @name Numeric keypad */
/*@{*/
LOLK_KP0 = 256,
LOLK_KP1 = 257,
LOLK_KP2 = 258,
LOLK_KP3 = 259,
LOLK_KP4 = 260,
LOLK_KP5 = 261,
LOLK_KP6 = 262,
LOLK_KP7 = 263,
LOLK_KP8 = 264,
LOLK_KP9 = 265,
LOLK_KP_PERIOD = 266,
LOLK_KP_DIVIDE = 267,
LOLK_KP_MULTIPLY = 268,
LOLK_KP_MINUS = 269,
LOLK_KP_PLUS = 270,
LOLK_KP_ENTER = 271,
LOLK_KP_EQUALS = 272,
/*@}*/

/** @name Arrows + Home/End pad */
/*@{*/
LOLK_UP = 273,
LOLK_DOWN = 274,
LOLK_RIGHT = 275,
LOLK_LEFT = 276,
LOLK_INSERT = 277,
LOLK_HOME = 278,
LOLK_END = 279,
LOLK_PAGEUP = 280,
LOLK_PAGEDOWN = 281,
/*@}*/

/** @name Function keys */
/*@{*/
LOLK_F1 = 282,
LOLK_F2 = 283,
LOLK_F3 = 284,
LOLK_F4 = 285,
LOLK_F5 = 286,
LOLK_F6 = 287,
LOLK_F7 = 288,
LOLK_F8 = 289,
LOLK_F9 = 290,
LOLK_F10 = 291,
LOLK_F11 = 292,
LOLK_F12 = 293,
LOLK_F13 = 294,
LOLK_F14 = 295,
LOLK_F15 = 296,
/*@}*/

/** @name Key state modifier keys */
/*@{*/
LOLK_NUMLOCK = 300,
LOLK_CAPSLOCK = 301,
LOLK_SCROLLOCK = 302,
LOLK_RSHIFT = 303,
LOLK_LSHIFT = 304,
LOLK_RCTRL = 305,
LOLK_LCTRL = 306,
LOLK_RALT = 307,
LOLK_LALT = 308,
LOLK_RMETA = 309,
LOLK_LMETA = 310,
LOLK_LSUPER = 311, /**< Left "Windows" key */
LOLK_RSUPER = 312, /**< Right "Windows" key */
LOLK_MODE = 313, /**< "Alt Gr" key */
LOLK_COMPOSE = 314, /**< Multi-key compose key */
/*@}*/

/** @name Miscellaneous function keys */
/*@{*/
LOLK_HELP = 315,
LOLK_PRINT = 316,
LOLK_SYSREQ = 317,
LOLK_BREAK = 318,
LOLK_MENU = 319,
LOLK_POWER = 320, /**< Power Macintosh power key */
LOLK_EURO = 321, /**< Some european keyboards */
LOLK_UNDO = 322, /**< Atari keyboard has Undo */
/*@}*/

/* Add any other keys here */

LOLK_LAST
} LOLKey;

/** Enumeration of valid key mods (possibly OR'd together) */
typedef enum {
LOLKMOD_NONE = 0x0000,
LOLKMOD_LSHIFT= 0x0001,
LOLKMOD_RSHIFT= 0x0002,
LOLKMOD_LCTRL = 0x0040,
LOLKMOD_RCTRL = 0x0080,
LOLKMOD_LALT = 0x0100,
LOLKMOD_RALT = 0x0200,
LOLKMOD_LMETA = 0x0400,
LOLKMOD_RMETA = 0x0800,
LOLKMOD_NUM = 0x1000,
LOLKMOD_CAPS = 0x2000,
LOLKMOD_MODE = 0x4000,
LOLKMOD_RESERVED = 0x8000
} LOLKeyMod;

#define LOLKMOD_CTRL (LOLKMOD_LCTRL|LOLKMOD_RCTRL)
#define LOLKMOD_SHIFT (LOLKMOD_LSHIFT|LOLKMOD_RSHIFT)
#define LOLKMOD_ALT (LOLKMOD_LALT|LOLKMOD_RALT)
#define LOLKMOD_META (LOLKMOD_LMETA|LOLKMOD_RMETA)

struct ActionSetting
{
@@ -116,39 +337,71 @@ struct ActionSetting

struct ButtonSetting
{
int RawButtonId;
int CurStatus;
int PrevStatus;
Array<ActionSetting> AssociatedActionList;
int m_raw_button_id;
int m_current_status;
int m_previous_status;
Array<ActionSetting> m_associated_action_list;

ButtonSetting(int NewRawButtonId)
{
memset(this, 0, sizeof(ButtonSetting));
RawButtonId = NewRawButtonId;
m_raw_button_id = NewRawButtonId;
}
int GetActionSettingIdx(int ActionId)
{
for (int i = 0; i < AssociatedActionList.Count(); i++)
if (AssociatedActionList[i].ActionId == ActionId)
for (int i = 0; i < m_associated_action_list.Count(); i++)
if (m_associated_action_list[i].ActionId == ActionId)
return i;
return -1;
}
};

class Input
class InputTracker : public Entity
{

friend class Input;

public:
InputTracker();

private:
static Array<ButtonSetting> InputAssocationList;
Array<ButtonSetting> m_input_assocation_list;

static int GetButtonSettingIdx(int ButtonId)
int GetButtonSettingIdx(int ButtonId)
{
for (int i = 0; i < InputAssocationList.Count(); i++)
if (InputAssocationList[i].RawButtonId == ButtonId)
for (int i = 0; i < m_input_assocation_list.Count(); i++)
if (m_input_assocation_list[i].m_raw_button_id == ButtonId)
return i;
return -1;
}

static void UpdateActionStatus(float seconds);
void UpdateActionStatus(float seconds);

protected:
virtual void TickGame(float seconds)
{
UpdateActionStatus(seconds);
}

void LinkActionIdToButtonId(int ActionId, int ButtonId);
void UnlinkActionId(int ActionId);
int GetActionStatus(int ActionId);
bool WasActionJustReleased(int ActionId);
};

class Input
{
private:
static InputTracker* m_input_tracker;

static bool CheckInputTrackerInit()
{
if (Input::m_input_tracker)
return true;

Input::m_input_tracker = new InputTracker();
return true;
}

public:

@@ -159,7 +412,7 @@ public:
//BH : Shouldn't use this
static int GetButtonState(int button);

//Action management
/* Action management */
static void LinkActionIdToButtonId(int ActionId, int ButtonId);
static void UnlinkActionId(int ActionId);
static int GetActionStatus(int ActionId);
@@ -174,10 +427,7 @@ public:
static void SetMouseButton(int index);
static void UnsetMouseButton(int index);

/*
* Joystick handling
*/

/* Joystick handling */
static Stick *CreateStick();
static void DestroyStick(Stick *stick);



+ 22
- 4
test/BtPhysTest.cpp View File

@@ -56,6 +56,15 @@ int gNumObjects = 64;
#define USE_ROTATION 0
#define USE_CHARACTER 1

enum eInputAction
{
IPT_MOVE_FORWARD,
IPT_MOVE_BACKWARD,
IPT_MOVE_STRAFE_LEFT,
IPT_MOVE_STRAFE_RIGHT,
IPT_MOVE_JUMP,
};

BtPhysTest::BtPhysTest(bool editor)
{
m_loop_value = .0f;
@@ -162,6 +171,13 @@ BtPhysTest::BtPhysTest(bool editor)
m_character_list << NewPhyobj;
Ticker::Ref(NewPhyobj);


Input::LinkActionIdToButtonId(IPT_MOVE_FORWARD, LOLK_UP);
Input::LinkActionIdToButtonId(IPT_MOVE_BACKWARD, LOLK_DOWN);
Input::LinkActionIdToButtonId(IPT_MOVE_STRAFE_LEFT, LOLK_LEFT);
Input::LinkActionIdToButtonId(IPT_MOVE_STRAFE_RIGHT, LOLK_RIGHT);
Input::LinkActionIdToButtonId(IPT_MOVE_JUMP, LOLK_SPACE);

//NewPhyobj->GetCharacter()->AttachTo(BasePhyobj->GetPhysic(), true, true);
}

@@ -300,12 +316,14 @@ void BtPhysTest::TickGame(float seconds)
PhysicsObject* PhysObj = m_character_list[i];
EasyCharacterController* Character = (EasyCharacterController*)PhysObj->GetCharacter();
mat4 CtlrMx = Character->GetTransform();
int HMovement = Input::GetButtonState(275 /*SDLK_RIGHT*/) - Input::GetButtonState(276 /*SDLK_LEFT*/);
int VMovement = Input::GetButtonState(273 /*SDLK_UP*/) - Input::GetButtonState(274 /*SDLK_DOWN*/);
int RMovement = Input::GetButtonState(280 /*SDLK_PAGEUP*/) - Input::GetButtonState(281 /*SDLK_PAGEDOWN*/);
int HMovement = Input::GetActionStatus(IPT_MOVE_STRAFE_LEFT) - Input::GetActionStatus(IPT_MOVE_STRAFE_RIGHT);
int VMovement = Input::GetActionStatus(IPT_MOVE_FORWARD) - Input::GetActionStatus(IPT_MOVE_BACKWARD);
int RMovement = 0;//Input::GetButtonState(280 /*SDLK_PAGEUP*/) - Input::GetButtonState(281 /*SDLK_PAGEDOWN*/);
vec3 CharMove = vec3((float)VMovement * seconds * 4.f, (float)RMovement * seconds * 10.f, (float)HMovement * seconds * 4.f);

if (Input::WasActionJustReleased(IPT_MOVE_JUMP))
Character->Jump();
Character->SetMovementForFrame(CharMove);

RayCastResult HitResult;


+ 1
- 1
test/PhysicObject.h View File

@@ -234,7 +234,7 @@ public:

EasyMesh *GetMesh() { return &m_mesh; }
EasyPhysic *GetPhysic() { return m_physics; }
EasyPhysic *GetCharacter() { return m_character; }
EasyCharacterController *GetCharacter() { return m_character; }

~PhysicsObject()
{


+ 14
- 2
test/Physics/Include/EasyCharacterController.h View File

@@ -49,11 +49,14 @@ public:
m_step_height(.0f),
m_base_is_updating(false),
m_base_cached_movement(vec3(0.f)),
m_frame_cached_movement(vec3(0.f))
m_frame_cached_movement(vec3(0.f)),
m_walk_velocity(vec3(0.f)),
m_current_velocity(vec3(0.f))
{
m_gamegroup = GAMEGROUP_EZP_CHAR_CTRLR;
m_up_axis = 1;
m_gravity = vec3(.0f, -9.81f, .0f);
m_walk_velocity_damping = 0.2f;
}
~EasyCharacterController()
{
@@ -65,6 +68,7 @@ public:
virtual void AddToSimulation(class Simulation* current_simulation);
virtual void RemoveFromSimulation(class Simulation* current_simulation);
virtual void SetMovementForFrame(vec3 const &MoveQuantity);
virtual void Jump();

virtual void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation);
protected:
@@ -84,8 +88,16 @@ protected:
bool m_base_is_updating;
vec3 m_base_cached_movement;
vec3 m_frame_cached_movement;

//----
float m_walk_velocity_damping;

//----
vec3 m_gravity;
vec3 m_velocity;

//----
vec3 m_walk_velocity;
vec3 m_current_velocity;

#else // NO PHYSIC IMPLEMENTATION



+ 5
- 4
test/Physics/Include/LolBtPhysicsIntegration.h View File

@@ -22,10 +22,11 @@ namespace lol
//Override Gamegroups names for Physic-useage
//"_ENT_" means that this is a group for Entities that use EasyPhysic primitives.
//"_EZP_" means that this is a group for EasyPhysic primitives.
#define GAMEGROUP_ENT_PLATFORM GAMEGROUP_BEFORE
#define GAMEGROUP_ENT_MAIN GAMEGROUP_DEFAULT
#define GAMEGROUP_EZP_CHAR_CTRLR GAMEGROUP_AFTER
#define GAMEGROUP_SIMULATION GAMEGROUP_AFTER_POST
#define GAMEGROUP_ENT_INPUT GAMEGROUP_BEFORE
#define GAMEGROUP_ENT_PLATFORM GAMEGROUP_DEFAULT
#define GAMEGROUP_ENT_MAIN GAMEGROUP_AFTER
#define GAMEGROUP_EZP_CHAR_CTRLR GAMEGROUP_AFTER_0
#define GAMEGROUP_SIMULATION GAMEGROUP_AFTER_1

#ifdef HAVE_PHYS_USE_BULLET



+ 12
- 4
test/Physics/Src/EasyCharacterController.cpp View File

@@ -90,6 +90,11 @@ void EasyCharacterController::RemoveFromSimulation(class Simulation* current_sim
}
}

void EasyCharacterController::Jump()
{
m_character->jump();
}

//Set movement for this frame
void EasyCharacterController::SetMovementForFrame(vec3 const &MoveQuantity)
{
@@ -125,10 +130,13 @@ void EasyCharacterController::TickGame(float seconds)
{
Entity::TickGame(seconds);

int IterationsNb = (int)(seconds / m_owner_simulation->m_timestep);
float NewSeconds = IterationsNb * m_owner_simulation->m_timestep;
m_character->setVelocityForTimeInterval(LOL2BT_VEC3(LOL2BT_UNIT * (m_base_cached_movement + m_frame_cached_movement)) / NewSeconds, NewSeconds);
m_base_cached_movement = vec3(.0f);
//Send final velocity in Bullet
{
int IterationsNb = (int)(seconds / m_owner_simulation->m_timestep);
float NewSeconds = IterationsNb * m_owner_simulation->m_timestep;
m_character->setVelocityForTimeInterval(LOL2BT_VEC3(LOL2BT_UNIT * (m_base_cached_movement + m_frame_cached_movement)) / NewSeconds, NewSeconds);
m_base_cached_movement = vec3(.0f);
}
}

#endif // HAVE_PHYS_USE_BULLET


Loading…
Cancel
Save