Ver código fonte

gui in 3D demo now uses area for input

Juan Linietsky 10 anos atrás
pai
commit
78694d8542

+ 25 - 24
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
 
-

BIN
demos/viewport/gui_in_3d/gui_3d.scn


+ 7 - 0
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 );

+ 1 - 0
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();