summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2015-03-22 11:52:07 -0300
committerJuan Linietsky <reduzio@gmail.com>2015-03-22 11:52:07 -0300
commit78694d85425b35d2c6c0e0a4b0ef3e57375553c6 (patch)
tree57c10798550be2ce3029eb77b0a9abe5fc370e4d
parent92ab362afae275ac26ba24db88395d6d4977515d (diff)
gui in 3D demo now uses area for input
-rw-r--r--demos/viewport/gui_in_3d/gui_3d.gd49
-rw-r--r--demos/viewport/gui_in_3d/gui_3d.scnbin3498 -> 4668 bytes
-rw-r--r--scene/3d/spatial.cpp7
-rw-r--r--scene/3d/spatial.h1
4 files changed, 33 insertions, 24 deletions
diff --git a/demos/viewport/gui_in_3d/gui_3d.gd b/demos/viewport/gui_in_3d/gui_3d.gd
index 5309db9acb..c2a9df0069 100644
--- a/demos/viewport/gui_in_3d/gui_3d.gd
+++ b/demos/viewport/gui_in_3d/gui_3d.gd
@@ -7,38 +7,39 @@ extends Spatial
var prev_pos=null
-func _input(ev):
- if (ev.type in [InputEvent.MOUSE_BUTTON,InputEvent.MOUSE_MOTION]):
- var pos = ev.pos
- var rfrom = get_node("camera").project_ray_origin(pos)
- var rnorm = get_node("camera").project_ray_normal(pos)
+
+func _input( ev ):
+ #all other (non-mouse) events
+ if (not ev.type in [InputEvent.MOUSE_BUTTON,InputEvent.MOUSE_MOTION,InputEvent.SCREEN_DRAG,InputEvent.SCREEN_TOUCH]):
+ get_node("viewport").input(ev)
- #simple collision test against aligned plane
- #for game UIs of this kind consider more complex collision against plane
- var p = Plane(Vector3(0,0,1),0).intersects_ray(rfrom,rnorm)
- if (p==null):
- return
-
- pos.x=(p.x+1.5)*100
- pos.y=(-p.y+0.75)*100
- ev.pos=pos
- ev.global_pos=pos
- if (prev_pos==null):
- prev_pos=pos
- if (ev.type==InputEvent.MOUSE_MOTION):
- ev.relative_pos=pos-prev_pos
+
+#mouse events for area
+func _on_area_input_event( camera, ev, click_pos, click_normal, shape_idx ):
+
+ #use click pos (click in 3d space, convert to area space
+ var pos = get_node("area").get_global_transform().affine_inverse() * click_pos
+ #convert to 2D
+ pos = Vector2(pos.x,pos.y)
+ #convert to viewport coordinate system
+ pos.x=(pos.x+1.5)*100
+ pos.y=(-pos.y+0.75)*100
+ #set to event
+ ev.pos=pos
+ ev.global_pos=pos
+ if (prev_pos==null):
prev_pos=pos
+ if (ev.type==InputEvent.MOUSE_MOTION):
+ ev.relative_pos=pos-prev_pos
+ prev_pos=pos
get_node("viewport").input(ev)
-
-
+
func _ready():
# Initalization here
- get_node("quad").get_material_override().set_texture(FixedMaterial.PARAM_DIFFUSE, get_node("viewport").get_render_target_texture() )
+ get_node("area/quad").get_material_override().set_texture(FixedMaterial.PARAM_DIFFUSE, get_node("viewport").get_render_target_texture() )
set_process_input(true)
-
pass
-
diff --git a/demos/viewport/gui_in_3d/gui_3d.scn b/demos/viewport/gui_in_3d/gui_3d.scn
index df8f7d6dc5..c69d4dc73f 100644
--- a/demos/viewport/gui_in_3d/gui_3d.scn
+++ b/demos/viewport/gui_in_3d/gui_3d.scn
Binary files differ
diff --git a/scene/3d/spatial.cpp b/scene/3d/spatial.cpp
index edca62ece5..6e11855543 100644
--- a/scene/3d/spatial.cpp
+++ b/scene/3d/spatial.cpp
@@ -660,6 +660,12 @@ void Spatial::orthonormalize() {
}
+void Spatial::set_identity() {
+
+ set_transform(Transform());
+
+}
+
void Spatial::look_at(const Vector3& p_target, const Vector3& p_up_normal) {
@@ -735,6 +741,7 @@ void Spatial::_bind_methods() {
ObjectTypeDB::bind_method( _MD("translate","offset"),&Spatial::translate );
ObjectTypeDB::bind_method( _MD("global_translate","offset"),&Spatial::global_translate );
ObjectTypeDB::bind_method( _MD("orthonormalize"),&Spatial::orthonormalize );
+ ObjectTypeDB::bind_method( _MD("set_identity"),&Spatial::set_identity );
ObjectTypeDB::bind_method( _MD("look_at","target","up"),&Spatial::look_at );
ObjectTypeDB::bind_method( _MD("look_at_from_pos","pos","target","up"),&Spatial::look_at_from_pos );
diff --git a/scene/3d/spatial.h b/scene/3d/spatial.h
index d7addbb792..f2cde8f1e6 100644
--- a/scene/3d/spatial.h
+++ b/scene/3d/spatial.h
@@ -180,6 +180,7 @@ public:
void look_at_from_pos(const Vector3& p_pos,const Vector3& p_target, const Vector3& p_up_normal);
void orthonormalize();
+ void set_identity();
void show();
void hide();