Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
godot
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
community
godot
Commits
ebfa7310
Commit
ebfa7310
authored
Feb 21, 2018
by
Gilles Roudiere
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Allow actions to provide an analog value
parent
93ae37f1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
172 additions
and
56 deletions
+172
-56
input_map.cpp
core/input_map.cpp
+46
-21
input_map.h
core/input_map.h
+5
-2
input.cpp
core/os/input.cpp
+2
-1
input.h
core/os/input.h
+1
-0
input_event.cpp
core/os/input_event.cpp
+64
-19
input_event.h
core/os/input_event.h
+14
-8
project_settings.cpp
core/project_settings.cpp
+20
-1
project_settings.h
core/project_settings.h
+2
-0
project_settings_editor.cpp
editor/project_settings_editor.cpp
+0
-0
project_settings_editor.h
editor/project_settings_editor.h
+2
-0
input_default.cpp
main/input_default.cpp
+14
-4
input_default.h
main/input_default.h
+2
-0
No files found.
core/input_map.cpp
View file @
ebfa7310
...
...
@@ -41,9 +41,10 @@ void InputMap::_bind_methods() {
ClassDB
::
bind_method
(
D_METHOD
(
"has_action"
,
"action"
),
&
InputMap
::
has_action
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_actions"
),
&
InputMap
::
_get_actions
);
ClassDB
::
bind_method
(
D_METHOD
(
"add_action"
,
"action"
),
&
InputMap
::
add_action
);
ClassDB
::
bind_method
(
D_METHOD
(
"add_action"
,
"action"
,
"deadzone"
),
&
InputMap
::
add_action
,
DEFVAL
(
0.5
f
)
);
ClassDB
::
bind_method
(
D_METHOD
(
"erase_action"
,
"action"
),
&
InputMap
::
erase_action
);
ClassDB
::
bind_method
(
D_METHOD
(
"action_set_deadzone"
,
"deadzone"
),
&
InputMap
::
action_set_deadzone
);
ClassDB
::
bind_method
(
D_METHOD
(
"action_add_event"
,
"action"
,
"event"
),
&
InputMap
::
action_add_event
);
ClassDB
::
bind_method
(
D_METHOD
(
"action_has_event"
,
"action"
,
"event"
),
&
InputMap
::
action_has_event
);
ClassDB
::
bind_method
(
D_METHOD
(
"action_erase_event"
,
"action"
,
"event"
),
&
InputMap
::
action_erase_event
);
...
...
@@ -52,12 +53,13 @@ void InputMap::_bind_methods() {
ClassDB
::
bind_method
(
D_METHOD
(
"load_from_globals"
),
&
InputMap
::
load_from_globals
);
}
void
InputMap
::
add_action
(
const
StringName
&
p_action
)
{
void
InputMap
::
add_action
(
const
StringName
&
p_action
,
float
p_deadzone
)
{
ERR_FAIL_COND
(
input_map
.
has
(
p_action
));
input_map
[
p_action
]
=
Action
();
static
int
last_id
=
1
;
input_map
[
p_action
].
id
=
last_id
;
input_map
[
p_action
].
deadzone
=
p_deadzone
;
last_id
++
;
}
...
...
@@ -96,9 +98,9 @@ List<StringName> InputMap::get_actions() const {
return
actions
;
}
List
<
Ref
<
InputEvent
>
>::
Element
*
InputMap
::
_find_event
(
List
<
Ref
<
InputEvent
>
>
&
p_list
,
const
Ref
<
InputEvent
>
&
p_event
,
bool
p_action_test
)
const
{
List
<
Ref
<
InputEvent
>
>::
Element
*
InputMap
::
_find_event
(
Action
p_action
,
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
)
const
{
for
(
List
<
Ref
<
InputEvent
>
>::
Element
*
E
=
p_
list
.
front
();
E
;
E
=
E
->
next
())
{
for
(
List
<
Ref
<
InputEvent
>
>::
Element
*
E
=
p_
action
.
inputs
.
front
();
E
;
E
=
E
->
next
())
{
const
Ref
<
InputEvent
>
e
=
E
->
get
();
...
...
@@ -106,9 +108,11 @@ List<Ref<InputEvent> >::Element *InputMap::_find_event(List<Ref<InputEvent> > &p
// continue;
int
device
=
e
->
get_device
();
if
(
device
==
ALL_DEVICES
||
device
==
p_event
->
get_device
())
if
(
e
->
action_match
(
p_event
))
if
(
device
==
ALL_DEVICES
||
device
==
p_event
->
get_device
())
{
if
(
e
->
action_match
(
p_event
,
p_pressed
,
p_strength
,
p_action
.
deadzone
))
{
return
E
;
}
}
}
return
NULL
;
...
...
@@ -119,11 +123,18 @@ bool InputMap::has_action(const StringName &p_action) const {
return
input_map
.
has
(
p_action
);
}
void
InputMap
::
action_set_deadzone
(
const
StringName
&
p_action
,
float
p_deadzone
)
{
ERR_FAIL_COND
(
!
input_map
.
has
(
p_action
));
input_map
[
p_action
].
deadzone
=
p_deadzone
;
}
void
InputMap
::
action_add_event
(
const
StringName
&
p_action
,
const
Ref
<
InputEvent
>
&
p_event
)
{
ERR_FAIL_COND
(
p_event
.
is_null
());
ERR_FAIL_COND
(
!
input_map
.
has
(
p_action
));
if
(
_find_event
(
input_map
[
p_action
]
.
inputs
,
p_event
))
if
(
_find_event
(
input_map
[
p_action
],
p_event
))
return
;
//already gots
input_map
[
p_action
].
inputs
.
push_back
(
p_event
);
...
...
@@ -132,14 +143,14 @@ void InputMap::action_add_event(const StringName &p_action, const Ref<InputEvent
bool
InputMap
::
action_has_event
(
const
StringName
&
p_action
,
const
Ref
<
InputEvent
>
&
p_event
)
{
ERR_FAIL_COND_V
(
!
input_map
.
has
(
p_action
),
false
);
return
(
_find_event
(
input_map
[
p_action
]
.
inputs
,
p_event
)
!=
NULL
);
return
(
_find_event
(
input_map
[
p_action
],
p_event
)
!=
NULL
);
}
void
InputMap
::
action_erase_event
(
const
StringName
&
p_action
,
const
Ref
<
InputEvent
>
&
p_event
)
{
ERR_FAIL_COND
(
!
input_map
.
has
(
p_action
));
List
<
Ref
<
InputEvent
>
>::
Element
*
E
=
_find_event
(
input_map
[
p_action
]
.
inputs
,
p_event
);
List
<
Ref
<
InputEvent
>
>::
Element
*
E
=
_find_event
(
input_map
[
p_action
],
p_event
);
if
(
E
)
input_map
[
p_action
].
inputs
.
erase
(
E
);
}
...
...
@@ -168,19 +179,33 @@ const List<Ref<InputEvent> > *InputMap::get_action_list(const StringName &p_acti
}
bool
InputMap
::
event_is_action
(
const
Ref
<
InputEvent
>
&
p_event
,
const
StringName
&
p_action
)
const
{
return
event_get_action_status
(
p_event
,
p_action
);
}
bool
InputMap
::
event_get_action_status
(
const
Ref
<
InputEvent
>
&
p_event
,
const
StringName
&
p_action
,
bool
*
p_pressed
,
float
*
p_strength
)
const
{
Map
<
StringName
,
Action
>::
Element
*
E
=
input_map
.
find
(
p_action
);
if
(
!
E
)
{
ERR_EXPLAIN
(
"Request for nonexistent InputMap action: "
+
String
(
p_action
));
ERR_FAIL_COND_V
(
!
E
,
false
);
}
Ref
<
InputEventAction
>
i
ea
=
p_event
;
if
(
i
ea
.
is_valid
())
{
return
i
ea
->
get_action
()
==
p_action
;
Ref
<
InputEventAction
>
i
nput_event_action
=
p_event
;
if
(
i
nput_event_action
.
is_valid
())
{
return
i
nput_event_action
->
get_action
()
==
p_action
;
}
return
_find_event
(
E
->
get
().
inputs
,
p_event
,
true
)
!=
NULL
;
bool
pressed
;
float
strength
;
List
<
Ref
<
InputEvent
>
>::
Element
*
event
=
_find_event
(
E
->
get
(),
p_event
,
&
pressed
,
&
strength
);
if
(
event
!=
NULL
)
{
if
(
p_pressed
!=
NULL
)
*
p_pressed
=
pressed
;
if
(
p_strength
!=
NULL
)
*
p_strength
=
strength
;
return
true
;
}
else
{
return
false
;
}
}
const
Map
<
StringName
,
InputMap
::
Action
>
&
InputMap
::
get_action_map
()
const
{
...
...
@@ -202,16 +227,16 @@ void InputMap::load_from_globals() {
String
name
=
pi
.
name
.
substr
(
pi
.
name
.
find
(
"/"
)
+
1
,
pi
.
name
.
length
());
add_action
(
name
);
Array
va
=
ProjectSettings
::
get_singleton
()
->
get
(
pi
.
name
);
for
(
int
i
=
0
;
i
<
va
.
size
();
i
++
)
{
Dictionary
action
=
ProjectSettings
::
get_singleton
()
->
get
(
pi
.
name
);
float
deadzone
=
action
.
has
(
"deadzone"
)
?
(
float
)
action
[
"deadzone"
]
:
0.5
f
;
Array
events
=
action
[
"events"
];
Ref
<
InputEvent
>
ie
=
va
[
i
];
if
(
ie
.
is_null
())
add_action
(
name
,
deadzone
);
for
(
int
i
=
0
;
i
<
events
.
size
();
i
++
)
{
Ref
<
InputEvent
>
event
=
events
[
i
];
if
(
event
.
is_null
())
continue
;
action_add_event
(
name
,
ie
);
action_add_event
(
name
,
event
);
}
}
}
...
...
core/input_map.h
View file @
ebfa7310
...
...
@@ -46,6 +46,7 @@ public:
struct
Action
{
int
id
;
float
deadzone
;
List
<
Ref
<
InputEvent
>
>
inputs
;
};
...
...
@@ -54,7 +55,7 @@ private:
mutable
Map
<
StringName
,
Action
>
input_map
;
List
<
Ref
<
InputEvent
>
>::
Element
*
_find_event
(
List
<
Ref
<
InputEvent
>
>
&
p_list
,
const
Ref
<
InputEvent
>
&
p_event
,
bool
p_action_test
=
false
)
const
;
List
<
Ref
<
InputEvent
>
>::
Element
*
_find_event
(
Action
p_action
,
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
=
NULL
,
float
*
p_strength
=
NULL
)
const
;
Array
_get_action_list
(
const
StringName
&
p_action
);
Array
_get_actions
();
...
...
@@ -67,15 +68,17 @@ public:
bool
has_action
(
const
StringName
&
p_action
)
const
;
List
<
StringName
>
get_actions
()
const
;
void
add_action
(
const
StringName
&
p_action
);
void
add_action
(
const
StringName
&
p_action
,
float
p_deadzone
=
0
.
5
);
void
erase_action
(
const
StringName
&
p_action
);
void
action_set_deadzone
(
const
StringName
&
p_action
,
float
p_deadzone
);
void
action_add_event
(
const
StringName
&
p_action
,
const
Ref
<
InputEvent
>
&
p_event
);
bool
action_has_event
(
const
StringName
&
p_action
,
const
Ref
<
InputEvent
>
&
p_event
);
void
action_erase_event
(
const
StringName
&
p_action
,
const
Ref
<
InputEvent
>
&
p_event
);
const
List
<
Ref
<
InputEvent
>
>
*
get_action_list
(
const
StringName
&
p_action
);
bool
event_is_action
(
const
Ref
<
InputEvent
>
&
p_event
,
const
StringName
&
p_action
)
const
;
bool
event_get_action_status
(
const
Ref
<
InputEvent
>
&
p_event
,
const
StringName
&
p_action
,
bool
*
p_pressed
=
NULL
,
float
*
p_strength
=
NULL
)
const
;
const
Map
<
StringName
,
Action
>
&
get_action_map
()
const
;
void
load_from_globals
();
...
...
core/os/input.cpp
View file @
ebfa7310
...
...
@@ -57,6 +57,7 @@ void Input::_bind_methods() {
ClassDB
::
bind_method
(
D_METHOD
(
"is_action_pressed"
,
"action"
),
&
Input
::
is_action_pressed
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_action_just_pressed"
,
"action"
),
&
Input
::
is_action_just_pressed
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_action_just_released"
,
"action"
),
&
Input
::
is_action_just_released
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_action_strength"
,
"action"
),
&
Input
::
get_action_strength
);
ClassDB
::
bind_method
(
D_METHOD
(
"add_joy_mapping"
,
"mapping"
,
"update_existing"
),
&
Input
::
add_joy_mapping
,
DEFVAL
(
false
));
ClassDB
::
bind_method
(
D_METHOD
(
"remove_joy_mapping"
,
"guid"
),
&
Input
::
remove_joy_mapping
);
ClassDB
::
bind_method
(
D_METHOD
(
"joy_connection_changed"
,
"device"
,
"connected"
,
"name"
,
"guid"
),
&
Input
::
joy_connection_changed
);
...
...
@@ -118,7 +119,7 @@ void Input::get_argument_options(const StringName &p_function, int p_idx, List<S
#ifdef TOOLS_ENABLED
String
pf
=
p_function
;
if
(
p_idx
==
0
&&
(
pf
==
"is_action_pressed"
||
pf
==
"action_press"
||
pf
==
"action_release"
||
pf
==
"is_action_just_pressed"
||
pf
==
"is_action_just_released"
))
{
if
(
p_idx
==
0
&&
(
pf
==
"is_action_pressed"
||
pf
==
"action_press"
||
pf
==
"action_release"
||
pf
==
"is_action_just_pressed"
||
pf
==
"is_action_just_released"
||
pf
==
"get_action_strength"
))
{
List
<
PropertyInfo
>
pinfo
;
ProjectSettings
::
get_singleton
()
->
get_property_list
(
&
pinfo
);
...
...
core/os/input.h
View file @
ebfa7310
...
...
@@ -85,6 +85,7 @@ public:
virtual
bool
is_action_pressed
(
const
StringName
&
p_action
)
const
=
0
;
virtual
bool
is_action_just_pressed
(
const
StringName
&
p_action
)
const
=
0
;
virtual
bool
is_action_just_released
(
const
StringName
&
p_action
)
const
=
0
;
virtual
float
get_action_strength
(
const
StringName
&
p_action
)
const
=
0
;
virtual
float
get_joy_axis
(
int
p_device
,
int
p_axis
)
const
=
0
;
virtual
String
get_joy_name
(
int
p_idx
)
=
0
;
...
...
core/os/input_event.cpp
View file @
ebfa7310
...
...
@@ -41,11 +41,6 @@ int InputEvent::get_device() const {
return
device
;
}
bool
InputEvent
::
is_pressed
()
const
{
return
false
;
}
bool
InputEvent
::
is_action
(
const
StringName
&
p_action
)
const
{
return
InputMap
::
get_singleton
()
->
event_is_action
(
Ref
<
InputEvent
>
((
InputEvent
*
)
this
),
p_action
);
...
...
@@ -53,11 +48,29 @@ bool InputEvent::is_action(const StringName &p_action) const {
bool
InputEvent
::
is_action_pressed
(
const
StringName
&
p_action
)
const
{
return
(
is_pressed
()
&&
!
is_echo
()
&&
is_action
(
p_action
));
bool
pressed
;
bool
valid
=
InputMap
::
get_singleton
()
->
event_get_action_status
(
Ref
<
InputEvent
>
((
InputEvent
*
)
this
),
p_action
,
&
pressed
);
return
valid
&&
pressed
&&
!
is_echo
();
}
bool
InputEvent
::
is_action_released
(
const
StringName
&
p_action
)
const
{
return
(
!
is_pressed
()
&&
is_action
(
p_action
));
bool
pressed
;
bool
valid
=
InputMap
::
get_singleton
()
->
event_get_action_status
(
Ref
<
InputEvent
>
((
InputEvent
*
)
this
),
p_action
,
&
pressed
);
return
valid
&&
!
pressed
;
}
float
InputEvent
::
get_action_strength
(
const
StringName
&
p_action
)
const
{
bool
pressed
;
float
strength
;
bool
valid
=
InputMap
::
get_singleton
()
->
event_get_action_status
(
Ref
<
InputEvent
>
((
InputEvent
*
)
this
),
p_action
,
&
pressed
,
&
strength
);
return
valid
?
strength
:
0.0
f
;
}
bool
InputEvent
::
is_pressed
()
const
{
return
false
;
}
bool
InputEvent
::
is_echo
()
const
{
...
...
@@ -75,7 +88,7 @@ String InputEvent::as_text() const {
return
String
();
}
bool
InputEvent
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
{
bool
InputEvent
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
{
return
false
;
}
...
...
@@ -95,15 +108,16 @@ void InputEvent::_bind_methods() {
ClassDB
::
bind_method
(
D_METHOD
(
"set_device"
,
"device"
),
&
InputEvent
::
set_device
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_device"
),
&
InputEvent
::
get_device
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_pressed"
),
&
InputEvent
::
is_pressed
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_action"
,
"action"
),
&
InputEvent
::
is_action
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_action_pressed"
,
"action"
),
&
InputEvent
::
is_action_pressed
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_action_released"
,
"action"
),
&
InputEvent
::
is_action_released
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_action_strength"
,
"action"
),
&
InputEvent
::
get_action_strength
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_pressed"
),
&
InputEvent
::
is_pressed
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_echo"
),
&
InputEvent
::
is_echo
);
ClassDB
::
bind_method
(
D_METHOD
(
"as_text"
),
&
InputEvent
::
as_text
);
ClassDB
::
bind_method
(
D_METHOD
(
"action_match"
,
"event"
),
&
InputEvent
::
action_match
);
ClassDB
::
bind_method
(
D_METHOD
(
"shortcut_match"
,
"event"
),
&
InputEvent
::
shortcut_match
);
ClassDB
::
bind_method
(
D_METHOD
(
"is_action_type"
),
&
InputEvent
::
is_action_type
);
...
...
@@ -281,7 +295,7 @@ String InputEventKey::as_text() const {
return
kc
;
}
bool
InputEventKey
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
{
bool
InputEventKey
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
{
Ref
<
InputEventKey
>
key
=
p_event
;
if
(
key
.
is_null
())
...
...
@@ -290,7 +304,14 @@ bool InputEventKey::action_match(const Ref<InputEvent> &p_event) const {
uint32_t
code
=
get_scancode_with_modifiers
();
uint32_t
event_code
=
key
->
get_scancode_with_modifiers
();
return
get_scancode
()
==
key
->
get_scancode
()
&&
(
!
key
->
is_pressed
()
||
(
code
&
event_code
)
==
code
);
bool
match
=
get_scancode
()
==
key
->
get_scancode
()
&&
(
!
key
->
is_pressed
()
||
(
code
&
event_code
)
==
code
);
if
(
match
)
{
if
(
p_pressed
!=
NULL
)
*
p_pressed
=
key
->
is_pressed
();
if
(
p_strength
!=
NULL
)
*
p_strength
=
(
*
p_pressed
)
?
1.0
f
:
0.0
f
;
}
return
match
;
}
bool
InputEventKey
::
shortcut_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
{
...
...
@@ -446,13 +467,21 @@ Ref<InputEvent> InputEventMouseButton::xformed_by(const Transform2D &p_xform, co
return
mb
;
}
bool
InputEventMouseButton
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
{
bool
InputEventMouseButton
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
{
Ref
<
InputEventMouseButton
>
mb
=
p_event
;
if
(
mb
.
is_null
())
return
false
;
return
mb
->
button_index
==
button_index
;
bool
match
=
mb
->
button_index
==
button_index
;
if
(
match
)
{
if
(
p_pressed
!=
NULL
)
*
p_pressed
=
mb
->
is_pressed
();
if
(
p_strength
!=
NULL
)
*
p_strength
=
(
*
p_pressed
)
?
1.0
f
:
0.0
f
;
}
return
match
;
}
String
InputEventMouseButton
::
as_text
()
const
{
...
...
@@ -610,6 +639,7 @@ void InputEventJoypadMotion::set_axis_value(float p_value) {
axis_value
=
p_value
;
}
float
InputEventJoypadMotion
::
get_axis_value
()
const
{
return
axis_value
;
...
...
@@ -617,16 +647,23 @@ float InputEventJoypadMotion::get_axis_value() const {
bool
InputEventJoypadMotion
::
is_pressed
()
const
{
return
Math
::
abs
(
axis_value
)
>
0.5
f
;
return
Math
::
abs
(
axis_value
)
>
=
0.5
f
;
}
bool
InputEventJoypadMotion
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
{
bool
InputEventJoypadMotion
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
{
Ref
<
InputEventJoypadMotion
>
jm
=
p_event
;
if
(
jm
.
is_null
())
return
false
;
return
(
axis
==
jm
->
axis
&&
((
axis_value
<
0
)
==
(
jm
->
axis_value
<
0
)
||
jm
->
axis_value
==
0
));
bool
match
=
(
axis
==
jm
->
axis
&&
((
axis_value
<
0
)
==
(
jm
->
axis_value
<
0
)
||
jm
->
axis_value
==
0
));
if
(
match
)
{
if
(
p_pressed
!=
NULL
)
*
p_pressed
=
Math
::
abs
(
jm
->
get_axis_value
()
>=
p_deadzone
);
if
(
p_strength
!=
NULL
)
*
p_strength
=
(
*
p_pressed
)
?
Math
::
inverse_lerp
(
p_deadzone
,
1.0
f
,
Math
::
abs
(
jm
->
get_axis_value
()))
:
0.0
f
;
}
return
match
;
}
String
InputEventJoypadMotion
::
as_text
()
const
{
...
...
@@ -681,13 +718,21 @@ float InputEventJoypadButton::get_pressure() const {
return
pressure
;
}
bool
InputEventJoypadButton
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
{
bool
InputEventJoypadButton
::
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
{
Ref
<
InputEventJoypadButton
>
jb
=
p_event
;
if
(
jb
.
is_null
())
return
false
;
return
button_index
==
jb
->
button_index
;
bool
match
=
button_index
==
jb
->
button_index
;
if
(
match
)
{
if
(
p_pressed
!=
NULL
)
*
p_pressed
=
jb
->
is_pressed
();
if
(
p_strength
!=
NULL
)
*
p_strength
=
(
*
p_pressed
)
?
1.0
f
:
0.0
f
;
}
return
match
;
}
String
InputEventJoypadButton
::
as_text
()
const
{
...
...
core/os/input_event.h
View file @
ebfa7310
...
...
@@ -154,16 +154,21 @@ public:
void
set_device
(
int
p_device
);
int
get_device
()
const
;
bool
is_action
(
const
StringName
&
p_action
)
const
;
bool
is_action_pressed
(
const
StringName
&
p_action
)
const
;
bool
is_action_released
(
const
StringName
&
p_action
)
const
;
float
get_action_strength
(
const
StringName
&
p_action
)
const
;
// To be removed someday, since they do not make sense for all events
virtual
bool
is_pressed
()
const
;
virtual
bool
is_action
(
const
StringName
&
p_action
)
const
;
virtual
bool
is_action_pressed
(
const
StringName
&
p_action
)
const
;
virtual
bool
is_action_released
(
const
StringName
&
p_action
)
const
;
virtual
bool
is_echo
()
const
;
// ...-.
virtual
String
as_text
()
const
;
virtual
Ref
<
InputEvent
>
xformed_by
(
const
Transform2D
&
p_xform
,
const
Vector2
&
p_local_ofs
=
Vector2
())
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
;
virtual
bool
shortcut_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
;
virtual
bool
is_action_type
()
const
;
...
...
@@ -244,7 +249,7 @@ public:
uint32_t
get_scancode_with_modifiers
()
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
;
virtual
bool
shortcut_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
;
virtual
bool
is_action_type
()
const
{
return
true
;
}
...
...
@@ -305,7 +310,7 @@ public:
bool
is_doubleclick
()
const
;
virtual
Ref
<
InputEvent
>
xformed_by
(
const
Transform2D
&
p_xform
,
const
Vector2
&
p_local_ofs
=
Vector2
())
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
;
virtual
bool
is_action_type
()
const
{
return
true
;
}
virtual
String
as_text
()
const
;
...
...
@@ -352,7 +357,8 @@ public:
float
get_axis_value
()
const
;
virtual
bool
is_pressed
()
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
;
virtual
bool
is_action_type
()
const
{
return
true
;
}
virtual
String
as_text
()
const
;
...
...
@@ -379,7 +385,7 @@ public:
void
set_pressure
(
float
p_pressure
);
float
get_pressure
()
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
)
const
;
virtual
bool
action_match
(
const
Ref
<
InputEvent
>
&
p_event
,
bool
*
p_pressed
,
float
*
p_strength
,
float
p_deadzone
)
const
;
virtual
bool
is_action_type
()
const
{
return
true
;
}
virtual
String
as_text
()
const
;
...
...
core/project_settings.cpp
View file @
ebfa7310
...
...
@@ -42,7 +42,7 @@
#include "variant_parser.h"
#include <zlib.h>
#define FORMAT_VERSION
3
#define FORMAT_VERSION
4
ProjectSettings
*
ProjectSettings
::
singleton
=
NULL
;
...
...
@@ -262,6 +262,23 @@ bool ProjectSettings::_load_resource_pack(const String &p_pack) {
return
true
;
}
void
ProjectSettings
::
_convert_to_last_version
()
{
if
(
!
has_setting
(
"config_version"
)
||
(
int
)
get_setting
(
"config_version"
)
<=
3
)
{
// Converts the actions from array to dictionary (array of events to dictionary with deadzone + events)
for
(
Map
<
StringName
,
ProjectSettings
::
VariantContainer
>::
Element
*
E
=
props
.
front
();
E
;
E
=
E
->
next
())
{
Variant
value
=
E
->
get
().
variant
;
if
(
String
(
E
->
key
()).
begins_with
(
"input/"
)
&&
value
.
get_type
()
==
Variant
::
ARRAY
)
{
Array
array
=
value
;
Dictionary
action
;
action
[
"deadzone"
]
=
Variant
(
0.5
f
);
action
[
"events"
]
=
array
;
E
->
get
().
variant
=
action
;
}
}
}
}
Error
ProjectSettings
::
setup
(
const
String
&
p_path
,
const
String
&
p_main_pack
,
bool
p_upwards
)
{
//If looking for files in network, just use network!
...
...
@@ -390,6 +407,8 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
if
(
resource_path
.
length
()
&&
resource_path
[
resource_path
.
length
()
-
1
]
==
'/'
)
resource_path
=
resource_path
.
substr
(
0
,
resource_path
.
length
()
-
1
);
// chop end
_convert_to_last_version
();
return
OK
;
}
...
...
core/project_settings.h
View file @
ebfa7310
...
...
@@ -102,6 +102,8 @@ protected:
Error
_save_custom_bnd
(
const
String
&
p_file
);
void
_convert_to_last_version
();
bool
_load_resource_pack
(
const
String
&
p_pack
);
void
_add_property_info_bind
(
const
Dictionary
&
p_info
);
...
...
editor/project_settings_editor.cpp
View file @
ebfa7310
This diff is collapsed.
Click to expand it.
editor/project_settings_editor.h
View file @
ebfa7310
...
...
@@ -83,6 +83,8 @@ class ProjectSettingsEditor : public AcceptDialog {
OptionButton
*
device_id
;
OptionButton
*
device_index
;
Label
*
device_index_label
;
SpinBox
*
device_special_value
;
Label
*
device_special_value_label
;
MenuButton
*
popup_copy_to_feature
;
LineEdit
*
action_name
;
...
...
main/input_default.cpp
View file @
ebfa7310
...
...
@@ -127,6 +127,14 @@ bool InputDefault::is_action_just_released(const StringName &p_action) const {
}
}
float
InputDefault
::
get_action_strength
(
const
StringName
&
p_action
)
const
{
const
Map
<
StringName
,
Action
>::
Element
*
E
=
action_state
.
find
(
p_action
);
if
(
!
E
)
return
0.0
f
;
return
E
->
get
().
strength
;
}
float
InputDefault
::
get_joy_axis
(
int
p_device
,
int
p_axis
)
const
{
_THREAD_SAFE_METHOD_
...
...
@@ -330,16 +338,18 @@ void InputDefault::parse_input_event(const Ref<InputEvent> &p_event) {
}
}
if
(
!
p_event
->
is_echo
())
{
for
(
const
Map
<
StringName
,
InputMap
::
Action
>::
Element
*
E
=
InputMap
::
get_singleton
()
->
get_action_map
().
front
();
E
;
E
=
E
->
next
(
))
{
for
(
const
Map
<
StringName
,
InputMap
::
Action
>::
Element
*
E
=
InputMap
::
get_singleton
()
->
get_action_map
().
front
();
E
;
E
=
E
->
next
())
{
if
(
InputMap
::
get_singleton
()
->
event_is_action
(
p_event
,
E
->
key
()
))
{
if
(
InputMap
::
get_singleton
()
->
event_is_action
(
p_event
,
E
->
key
())
&&
is_action_pressed
(
E
->
key
())
!=
p_event
->
is_pressed
())
{
// Save the action's state
if
(
!
p_event
->
is_echo
()
&&
is_action_pressed
(
E
->
key
())
!=
p_event
->
is_action_pressed
(
E
->
key
()))
{
Action
action
;
action
.
physics_frame
=
Engine
::
get_singleton
()
->
get_physics_frames
();
action
.
idle_frame
=
Engine
::
get_singleton
()
->
get_idle_frames
();
action
.
pressed
=
p_event
->
is_
pressed
(
);
action
.
pressed
=
p_event
->
is_
action_pressed
(
E
->
key
()
);
action_state
[
E
->
key
()]
=
action
;
}
action_state
[
E
->
key
()].
strength
=
p_event
->
get_action_strength
(
E
->
key
());
}
}
...
...
main/input_default.h
View file @
ebfa7310
...
...
@@ -55,6 +55,7 @@ class InputDefault : public Input {
uint64_t
physics_frame
;
uint64_t
idle_frame
;
bool
pressed
;
float
strength
;
};
Map
<
StringName
,
Action
>
action_state
;
...
...
@@ -182,6 +183,7 @@ public:
virtual
bool
is_action_pressed
(
const
StringName
&
p_action
)
const
;
virtual
bool
is_action_just_pressed
(
const
StringName
&
p_action
)
const
;
virtual
bool
is_action_just_released
(
const
StringName
&
p_action
)
const
;
virtual
float
get_action_strength
(
const
StringName
&
p_action
)
const
;
virtual
float
get_joy_axis
(
int
p_device
,
int
p_axis
)
const
;
String
get_joy_name
(
int
p_idx
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment