summaryrefslogtreecommitdiff
path: root/scene/2d
diff options
context:
space:
mode:
Diffstat (limited to 'scene/2d')
-rw-r--r--scene/2d/area_2d.cpp4
-rw-r--r--scene/2d/camera_2d.cpp70
-rw-r--r--scene/2d/camera_2d.h5
-rw-r--r--scene/2d/light_2d.cpp34
-rw-r--r--scene/2d/light_2d.h4
-rw-r--r--scene/2d/node_2d.cpp2
-rw-r--r--scene/2d/node_2d.h4
-rw-r--r--scene/2d/physics_body_2d.cpp35
-rw-r--r--scene/2d/physics_body_2d.h2
-rw-r--r--scene/2d/polygon_2d.cpp4
-rw-r--r--scene/2d/polygon_2d.h6
11 files changed, 129 insertions, 41 deletions
diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp
index 71728966fd..e8954b7e98 100644
--- a/scene/2d/area_2d.cpp
+++ b/scene/2d/area_2d.cpp
@@ -650,8 +650,8 @@ void Area2D::_bind_methods() {
ADD_SIGNAL( MethodInfo("body_enter",PropertyInfo(Variant::OBJECT,"body",PROPERTY_HINT_RESOURCE_TYPE,"PhysicsBody2D")));
ADD_SIGNAL( MethodInfo("body_exit",PropertyInfo(Variant::OBJECT,"body",PROPERTY_HINT_RESOURCE_TYPE,"PhysicsBody2D")));
- ADD_SIGNAL( MethodInfo("area_enter_shape",PropertyInfo(Variant::INT,"area_id"),PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D"),PropertyInfo(Variant::INT,"area_shape"),PropertyInfo(Variant::INT,"area_shape")));
- ADD_SIGNAL( MethodInfo("area_exit_shape",PropertyInfo(Variant::INT,"area_id"),PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D"),PropertyInfo(Variant::INT,"area_shape"),PropertyInfo(Variant::INT,"area_shape")));
+ ADD_SIGNAL( MethodInfo("area_enter_shape",PropertyInfo(Variant::INT,"area_id"),PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D"),PropertyInfo(Variant::INT,"area_shape"),PropertyInfo(Variant::INT,"self_shape")));
+ ADD_SIGNAL( MethodInfo("area_exit_shape",PropertyInfo(Variant::INT,"area_id"),PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D"),PropertyInfo(Variant::INT,"area_shape"),PropertyInfo(Variant::INT,"self_shape")));
ADD_SIGNAL( MethodInfo("area_enter",PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D")));
ADD_SIGNAL( MethodInfo("area_exit",PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D")));
diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp
index e576aa10e0..f33faaabd8 100644
--- a/scene/2d/camera_2d.cpp
+++ b/scene/2d/camera_2d.cpp
@@ -44,6 +44,9 @@ void Camera2D::_update_scroll() {
}
if (current) {
+
+ ERR_FAIL_COND( custom_viewport && !ObjectDB::get_instance(custom_viewport_id) );
+
Matrix32 xform = get_camera_transform();
if (viewport) {
@@ -73,8 +76,9 @@ Matrix32 Camera2D::get_camera_transform() {
if (!get_tree())
return Matrix32();
- Size2 screen_size = get_viewport_rect().size;
- screen_size=get_viewport_rect().size;
+ ERR_FAIL_COND_V( custom_viewport && !ObjectDB::get_instance(custom_viewport_id), Matrix32() );
+
+ Size2 screen_size = viewport->get_visible_rect().size;
Point2 new_camera_pos = get_global_transform().get_origin();
@@ -240,14 +244,10 @@ void Camera2D::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
- viewport = NULL;
- Node *n=this;
- while(n){
-
- viewport = n->cast_to<Viewport>();
- if (viewport)
- break;
- n=n->get_parent();
+ if (custom_viewport && ObjectDB::get_instance(custom_viewport_id)) {
+ viewport=custom_viewport;
+ } else {
+ viewport=get_viewport();
}
canvas = get_canvas();
@@ -270,8 +270,8 @@ void Camera2D::_notification(int p_what) {
} break;
case NOTIFICATION_EXIT_TREE: {
- if (is_current()) {
- if (viewport) {
+ if (is_current()) {
+ if (viewport && !(custom_viewport && !ObjectDB::get_instance(custom_viewport_id))) {
viewport->set_canvas_transform( Matrix32() );
}
}
@@ -447,8 +447,10 @@ void Camera2D::reset_smoothing() {
void Camera2D::align() {
- Size2 screen_size = get_viewport_rect().size;
- screen_size=get_viewport_rect().size;
+ ERR_FAIL_COND( custom_viewport && !ObjectDB::get_instance(custom_viewport_id) );
+
+ Size2 screen_size = viewport->get_visible_rect().size;
+
Point2 current_camera_pos = get_global_transform().get_origin();
if (anchor_mode==ANCHOR_MODE_DRAG_CENTER) {
if (h_ofs<0) {
@@ -549,6 +551,42 @@ bool Camera2D::is_follow_smoothing_enabled() const {
return smoothing_enabled;
}
+void Camera2D::set_custom_viewport(Node *p_viewport) {
+ ERR_FAIL_NULL(p_viewport);
+ if (is_inside_tree()) {
+ remove_from_group(group_name);
+ remove_from_group(canvas_group_name);
+ }
+
+ custom_viewport=p_viewport->cast_to<Viewport>();
+
+ if (custom_viewport) {
+ custom_viewport_id=custom_viewport->get_instance_ID();
+ } else {
+ custom_viewport_id=0;
+ }
+
+ if (is_inside_tree()) {
+
+ if (custom_viewport)
+ viewport=custom_viewport;
+ else
+ viewport=get_viewport();
+
+ RID vp = viewport->get_viewport();
+ group_name = "__cameras_"+itos(vp.get_id());
+ canvas_group_name ="__cameras_c"+itos(canvas.get_id());
+ add_to_group(group_name);
+ add_to_group(canvas_group_name);
+ }
+
+}
+
+Node* Camera2D::get_custom_viewport() const {
+
+ return custom_viewport;
+}
+
void Camera2D::_bind_methods() {
@@ -597,6 +635,8 @@ void Camera2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_zoom","zoom"),&Camera2D::set_zoom);
ObjectTypeDB::bind_method(_MD("get_zoom"),&Camera2D::get_zoom);
+ ObjectTypeDB::bind_method(_MD("set_custom_viewport","viewport:Viewport"),&Camera2D::set_custom_viewport);
+ ObjectTypeDB::bind_method(_MD("get_custom_viewport:Viewport"),&Camera2D::get_custom_viewport);
ObjectTypeDB::bind_method(_MD("set_follow_smoothing","follow_smoothing"),&Camera2D::set_follow_smoothing);
ObjectTypeDB::bind_method(_MD("get_follow_smoothing"),&Camera2D::get_follow_smoothing);
@@ -662,6 +702,8 @@ Camera2D::Camera2D() {
first=true;
smoothing_enabled=false;
limit_smoothing_enabled=false;
+ custom_viewport=NULL;
+ custom_viewport_id=0;
smoothing=5.0;
zoom = Vector2(1, 1);
diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h
index 9f3e4254bb..a4d6dc5b96 100644
--- a/scene/2d/camera_2d.h
+++ b/scene/2d/camera_2d.h
@@ -48,6 +48,8 @@ protected:
Point2 smoothed_camera_pos;
bool first;
+ ObjectID custom_viewport_id; // to check validity
+ Viewport *custom_viewport;
Viewport *viewport;
StringName group_name;
@@ -128,6 +130,9 @@ public:
Point2 get_camera_screen_center() const;
+ void set_custom_viewport(Node *p_viewport);
+ Node* get_custom_viewport() const;
+
Vector2 get_camera_pos() const;
void force_update_scroll();
void reset_smoothing();
diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp
index f37cef673d..3e548a24b0 100644
--- a/scene/2d/light_2d.cpp
+++ b/scene/2d/light_2d.cpp
@@ -67,7 +67,23 @@ void Light2D::_update_light_visibility() {
if (!is_inside_tree())
return;
- VS::get_singleton()->canvas_light_set_enabled(canvas_light,enabled && is_visible());
+ bool editor_ok=true;
+
+#ifdef TOOLS_ENABLED
+ if (editor_only) {
+ if (!get_tree()->is_editor_hint()) {
+ editor_ok=false;
+ } else {
+ editor_ok = (get_tree()->get_edited_scene_root() && (this==get_tree()->get_edited_scene_root() || get_owner()==get_tree()->get_edited_scene_root()));
+ }
+ }
+#else
+ if (editor_only) {
+ editor_ok=false;
+ }
+#endif
+
+ VS::get_singleton()->canvas_light_set_enabled(canvas_light,enabled && is_visible() && editor_ok);
}
void Light2D::set_enabled( bool p_enabled) {
@@ -82,6 +98,17 @@ bool Light2D::is_enabled() const {
return enabled;
}
+void Light2D::set_editor_only(bool p_editor_only) {
+
+ editor_only=p_editor_only;
+ _update_light_visibility();
+}
+
+bool Light2D::is_editor_only() const{
+
+ return editor_only;
+}
+
void Light2D::set_texture( const Ref<Texture>& p_texture) {
texture=p_texture;
@@ -328,6 +355,9 @@ void Light2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_enabled","enabled"),&Light2D::set_enabled);
ObjectTypeDB::bind_method(_MD("is_enabled"),&Light2D::is_enabled);
+ ObjectTypeDB::bind_method(_MD("set_editor_only","editor_only"), &Light2D::set_editor_only );
+ ObjectTypeDB::bind_method(_MD("is_editor_only"), &Light2D::is_editor_only );
+
ObjectTypeDB::bind_method(_MD("set_texture","texture"),&Light2D::set_texture);
ObjectTypeDB::bind_method(_MD("get_texture"),&Light2D::get_texture);
@@ -383,6 +413,7 @@ void Light2D::_bind_methods() {
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"enabled"),_SCS("set_enabled"),_SCS("is_enabled"));
+ ADD_PROPERTY( PropertyInfo(Variant::BOOL, "editor_only"),_SCS("set_editor_only"),_SCS("is_editor_only"));
ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"texture",PROPERTY_HINT_RESOURCE_TYPE,"Texture"),_SCS("set_texture"),_SCS("get_texture"));
ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"offset"),_SCS("set_texture_offset"),_SCS("get_texture_offset"));
ADD_PROPERTY( PropertyInfo(Variant::REAL,"scale",PROPERTY_HINT_RANGE,"0.01,50,0.01"),_SCS("set_texture_scale"),_SCS("get_texture_scale"));
@@ -413,6 +444,7 @@ Light2D::Light2D() {
canvas_light=VisualServer::get_singleton()->canvas_light_create();
enabled=true;
+ editor_only=false;
shadow=false;
color=Color(1,1,1);
height=0;
diff --git a/scene/2d/light_2d.h b/scene/2d/light_2d.h
index c03ef96eff..57c89b15e7 100644
--- a/scene/2d/light_2d.h
+++ b/scene/2d/light_2d.h
@@ -45,6 +45,7 @@ public:
private:
RID canvas_light;
bool enabled;
+ bool editor_only;
bool shadow;
Color color;
Color shadow_color;
@@ -78,6 +79,9 @@ public:
void set_enabled( bool p_enabled);
bool is_enabled() const;
+ void set_editor_only(bool p_editor_only);
+ bool is_editor_only() const;
+
void set_texture( const Ref<Texture>& p_texture);
Ref<Texture> get_texture() const;
diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp
index df43e8e373..b3f925cb14 100644
--- a/scene/2d/node_2d.cpp
+++ b/scene/2d/node_2d.cpp
@@ -253,7 +253,7 @@ void Node2D::global_translate(const Vector2& p_amount) {
set_global_pos( get_global_pos() + p_amount );
}
-void Node2D::scale(const Vector2& p_amount) {
+void Node2D::scale(const Size2& p_amount) {
set_scale( get_scale() * p_amount );
}
diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h
index aa8d0ef33c..b31ee08af6 100644
--- a/scene/2d/node_2d.h
+++ b/scene/2d/node_2d.h
@@ -79,7 +79,7 @@ public:
void move_y(float p_delta,bool p_scaled=false);
void translate(const Vector2& p_amount);
void global_translate(const Vector2& p_amount);
- void scale(const Vector2& p_amount);
+ void scale(const Size2& p_amount);
Point2 get_pos() const;
float get_rot() const;
@@ -110,8 +110,6 @@ public:
Matrix32 get_relative_transform_to_parent(const Node *p_parent) const;
-
-
Matrix32 get_transform() const;
Node2D();
diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp
index 16df36aa24..0c5c353766 100644
--- a/scene/2d/physics_body_2d.cpp
+++ b/scene/2d/physics_body_2d.cpp
@@ -436,7 +436,7 @@ bool RigidBody2D::_test_motion(const Vector2& p_motion,float p_margin,const Ref<
Physics2DServer::MotionResult *r=NULL;
if (p_result.is_valid())
r=p_result->get_result_ptr();
- return Physics2DServer::get_singleton()->body_test_motion(get_rid(),p_motion,p_margin,r);
+ return Physics2DServer::get_singleton()->body_test_motion(get_rid(),get_global_transform(),p_motion,p_margin,r);
}
@@ -1057,8 +1057,10 @@ Vector2 KinematicBody2D::get_travel() const {
Vector2 KinematicBody2D::move(const Vector2& p_motion) {
#if 1
+
+ Matrix32 gt = get_global_transform();
Physics2DServer::MotionResult result;
- colliding = Physics2DServer::get_singleton()->body_test_motion(get_rid(),p_motion,margin,&result);
+ colliding = Physics2DServer::get_singleton()->body_test_motion(get_rid(),gt,p_motion,margin,&result);
collider_metadata=result.collider_metadata;
collider_shape=result.collider_shape;
@@ -1067,10 +1069,12 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) {
normal=result.collision_normal;
collider=result.collider_id;
- Matrix32 gt = get_global_transform();
+
gt.elements[2]+=result.motion;
set_global_transform(gt);
travel=result.motion;
+
+
return result.remainder;
#else
@@ -1081,7 +1085,6 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) {
//this took about a week to get right..
//but is it right? who knows at this point..
-
colliding=false;
ERR_FAIL_COND_V(!is_inside_tree(),Vector2());
Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(get_world_2d()->get_space());
@@ -1099,17 +1102,15 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) {
bool collided=false;
uint32_t mask=0;
- if (collide_static)
+ if (true)
mask|=Physics2DDirectSpaceState::TYPE_MASK_STATIC_BODY;
- if (collide_kinematic)
+ if (true)
mask|=Physics2DDirectSpaceState::TYPE_MASK_KINEMATIC_BODY;
- if (collide_rigid)
+ if (true)
mask|=Physics2DDirectSpaceState::TYPE_MASK_RIGID_BODY;
- if (collide_character)
+ if (true)
mask|=Physics2DDirectSpaceState::TYPE_MASK_CHARACTER_BODY;
-// print_line("motion: "+p_motion+" margin: "+rtos(margin));
-
//print_line("margin: "+rtos(margin));
do {
@@ -1145,6 +1146,8 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) {
break;
}
+
+
Matrix32 gt = get_global_transform();
gt.elements[2]+=recover_motion;
set_global_transform(gt);
@@ -1191,6 +1194,8 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) {
if (safe>=1) {
//not collided
colliding=false;
+
+
} else {
//it collided, let's get the rest info in unsafe advance
@@ -1239,7 +1244,7 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2& p_linear_velocity,const V
move_and_slide_colliders.clear();
move_and_slide_floor_velocity=Vector2();
- while(motion!=Vector2() && p_max_bounces) {
+ while(p_max_bounces) {
motion=move(motion);
@@ -1280,6 +1285,8 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2& p_linear_velocity,const V
}
p_max_bounces--;
+ if (motion==Vector2())
+ break;
}
return lv;
@@ -1307,11 +1314,11 @@ Vector2 KinematicBody2D::move_to(const Vector2& p_position) {
return move(p_position-get_global_pos());
}
-bool KinematicBody2D::test_move(const Vector2& p_motion) {
+bool KinematicBody2D::test_move(const Matrix32& p_from,const Vector2& p_motion) {
ERR_FAIL_COND_V(!is_inside_tree(),false);
- return Physics2DServer::get_singleton()->body_test_motion(get_rid(),p_motion,margin);
+ return Physics2DServer::get_singleton()->body_test_motion(get_rid(),p_from,p_motion,margin);
}
@@ -1378,7 +1385,7 @@ void KinematicBody2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("move_to","position"),&KinematicBody2D::move_to);
ObjectTypeDB::bind_method(_MD("move_and_slide","linear_velocity","floor_normal","slope_stop_min_velocity","max_bounces"),&KinematicBody2D::move_and_slide,DEFVAL(Vector2(0,0)),DEFVAL(5),DEFVAL(4));
- ObjectTypeDB::bind_method(_MD("test_move","rel_vec"),&KinematicBody2D::test_move);
+ ObjectTypeDB::bind_method(_MD("test_move","from","rel_vec"),&KinematicBody2D::test_move);
ObjectTypeDB::bind_method(_MD("get_travel"),&KinematicBody2D::get_travel);
ObjectTypeDB::bind_method(_MD("revert_motion"),&KinematicBody2D::revert_motion);
diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h
index c088b64858..ea29d873bd 100644
--- a/scene/2d/physics_body_2d.h
+++ b/scene/2d/physics_body_2d.h
@@ -319,7 +319,7 @@ public:
Vector2 move(const Vector2& p_motion);
Vector2 move_to(const Vector2& p_position);
- bool test_move(const Vector2& p_motion);
+ bool test_move(const Matrix32 &p_from, const Vector2& p_motion);
bool is_colliding() const;
Vector2 get_travel() const;
diff --git a/scene/2d/polygon_2d.cpp b/scene/2d/polygon_2d.cpp
index cfb87fb998..12893524d1 100644
--- a/scene/2d/polygon_2d.cpp
+++ b/scene/2d/polygon_2d.cpp
@@ -288,12 +288,12 @@ float Polygon2D::_get_texture_rotationd() const{
}
-void Polygon2D::set_texture_scale(const Vector2& p_scale){
+void Polygon2D::set_texture_scale(const Size2& p_scale){
tex_scale=p_scale;
update();
}
-Vector2 Polygon2D::get_texture_scale() const{
+Size2 Polygon2D::get_texture_scale() const{
return tex_scale;
}
diff --git a/scene/2d/polygon_2d.h b/scene/2d/polygon_2d.h
index 04e8aeb6fd..cecb9081f7 100644
--- a/scene/2d/polygon_2d.h
+++ b/scene/2d/polygon_2d.h
@@ -40,7 +40,7 @@ class Polygon2D : public Node2D {
DVector<Color> vertex_colors;
Color color;
Ref<Texture> texture;
- Vector2 tex_scale;
+ Size2 tex_scale;
Vector2 tex_ofs;
bool tex_tile;
float tex_rot;
@@ -81,8 +81,8 @@ public:
void set_texture_rotation(float p_rot);
float get_texture_rotation() const;
- void set_texture_scale(const Vector2& p_scale);
- Vector2 get_texture_scale() const;
+ void set_texture_scale(const Size2& p_scale);
+ Size2 get_texture_scale() const;
void set_invert(bool p_rot);
bool get_invert() const;