summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/globals.cpp6
-rw-r--r--core/input_map.cpp58
-rw-r--r--core/input_map.h1
-rw-r--r--core/os/input_event.cpp1
-rw-r--r--core/variant_parser.cpp22
5 files changed, 84 insertions, 4 deletions
diff --git a/core/globals.cpp b/core/globals.cpp
index 17b139d1ad..1e60854f28 100644
--- a/core/globals.cpp
+++ b/core/globals.cpp
@@ -638,7 +638,9 @@ static Variant _decode_variant(const String& p_string) {
InputEvent ie;
ie.type=InputEvent::JOYSTICK_MOTION;
ie.device=params[0].to_int();
- ie.joy_motion.axis=params[1].to_int();
+ int axis = params[1].to_int();;
+ ie.joy_motion.axis=axis>>1;
+ ie.joy_motion.axis_value=axis&1?1:-1;
return ie;
}
@@ -1029,7 +1031,7 @@ static String _encode_variant(const Variant& p_variant) {
} break;
case InputEvent::JOYSTICK_MOTION: {
- return "jaxis("+itos(ev.device)+", "+itos(ev.joy_motion.axis)+")";
+ return "jaxis("+itos(ev.device)+", "+itos(ev.joy_motion.axis * 2 + (ev.joy_motion.axis_value<0?0:1))+")";
} break;
default: {
diff --git a/core/input_map.cpp b/core/input_map.cpp
index 6feec9af95..fc66d97a86 100644
--- a/core/input_map.cpp
+++ b/core/input_map.cpp
@@ -204,6 +204,64 @@ bool InputMap::event_is_action(const InputEvent& p_event, const StringName& p_ac
return _find_event(E->get().inputs,p_event)!=NULL;
}
+bool InputMap::event_is_joy_motion_action_pressed(const InputEvent& p_event) const {
+
+ ERR_FAIL_COND_V(p_event.type!=InputEvent::JOYSTICK_MOTION,false);
+ bool pressed=false;
+
+ //this could be optimized by having a separate list of joymotions?
+
+ for (Map<StringName, Action>::Element *A=input_map.front();A;A=A->next()) {
+
+ for (List<InputEvent>::Element *E=A->get().inputs.front();E;E=E->next()) {
+
+ const InputEvent& e=E->get();
+ if(e.type!=p_event.type)
+ continue;
+ if (e.type!=InputEvent::KEY && e.device!=p_event.device)
+ continue;
+
+ switch(p_event.type) {
+
+ case InputEvent::KEY: {
+
+ if (e.key.scancode==p_event.key.scancode && e.key.mod == p_event.key.mod)
+ return e.key.pressed;
+
+ } break;
+ case InputEvent::JOYSTICK_BUTTON: {
+
+ if (e.joy_button.button_index==p_event.joy_button.button_index) {
+ return e.joy_button.pressed;
+ }
+
+ } break;
+ case InputEvent::MOUSE_BUTTON: {
+
+ if (e.mouse_button.button_index==p_event.mouse_button.button_index) {
+ return e.mouse_button.pressed;
+ }
+
+ } break;
+ case InputEvent::JOYSTICK_MOTION: {
+
+ if (e.joy_motion.axis==p_event.joy_motion.axis) {
+ if (
+ (e.joy_motion.axis_value * p_event.joy_motion.axis_value >0) && //same axis
+ ABS(e.joy_motion.axis_value>0.5) && ABS(p_event.joy_motion.axis_value>0.5) )
+ pressed=true;
+ }
+
+ } break;
+ }
+
+ }
+ }
+
+ return pressed;
+
+}
+
void InputMap::load_from_globals() {
input_map.clear();;
diff --git a/core/input_map.h b/core/input_map.h
index c803d5bf04..5cd1e41922 100644
--- a/core/input_map.h
+++ b/core/input_map.h
@@ -68,6 +68,7 @@ public:
const List<InputEvent> *get_action_list(const StringName& p_action);
bool event_is_action(const InputEvent& p_event, const StringName& p_action) const;
+ bool event_is_joy_motion_action_pressed(const InputEvent& p_event) const;
void load_from_globals();
diff --git a/core/os/input_event.cpp b/core/os/input_event.cpp
index 25b10a76d3..2f39567a7e 100644
--- a/core/os/input_event.cpp
+++ b/core/os/input_event.cpp
@@ -156,6 +156,7 @@ bool InputEvent::is_pressed() const {
case MOUSE_BUTTON: return mouse_button.pressed;
case JOYSTICK_BUTTON: return joy_button.pressed;
case SCREEN_TOUCH: return screen_touch.pressed;
+ case JOYSTICK_MOTION: return InputMap::get_singleton()->event_is_joy_motion_action_pressed(*this);
case ACTION: return action.pressed;
default: {}
}
diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp
index 3c8c43f5b3..9f2727d33d 100644
--- a/core/variant_parser.cpp
+++ b/core/variant_parser.cpp
@@ -1072,8 +1072,24 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
ie.joy_motion.axis = token.value;
get_token(p_stream,token,line,r_err_str);
+
+ if (token.type!=TK_COMMA) {
+ r_err_str="Expected ',' after axis index";
+ return ERR_PARSE_ERROR;
+ }
+
+ get_token(p_stream,token,line,r_err_str);
+ if (token.type!=TK_NUMBER) {
+ r_err_str="Expected axis sign";
+ return ERR_PARSE_ERROR;
+ }
+
+ ie.joy_motion.axis_value = token.value;
+
+ get_token(p_stream,token,line,r_err_str);
+
if (token.type!=TK_PARENTHESIS_CLOSE) {
- r_err_str="Expected ')'";
+ r_err_str="Expected ')' for jaxis";
return ERR_PARSE_ERROR;
}
@@ -1339,7 +1355,9 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in
InputEvent ie;
ie.type=InputEvent::JOYSTICK_MOTION;
ie.device=params[0].to_int();
- ie.joy_motion.axis=params[1].to_int();
+ int axis=params[1].to_int();
+ ie.joy_motion.axis=axis>>1;
+ ie.joy_motion.axis_value=axis&1?1:-1;
value= ie;