diff options
Diffstat (limited to 'scene/2d/sprite.cpp')
| -rw-r--r-- | scene/2d/sprite.cpp | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp index ad9a76ee35..7d033ed87f 100644 --- a/scene/2d/sprite.cpp +++ b/scene/2d/sprite.cpp @@ -29,6 +29,8 @@ #include "sprite.h" #include "core/core_string_names.h" #include "scene/scene_string_names.h" +#include "scene/main/viewport.h" + void Sprite::edit_set_pivot(const Point2& p_pivot) { set_offset(p_pivot); @@ -335,3 +337,202 @@ Sprite::Sprite() { } + + + + +//////////////////////////// VPSPRITE +/// +/// +/// + + +void ViewportSprite::edit_set_pivot(const Point2& p_pivot) { + + set_offset(p_pivot); +} + +Point2 ViewportSprite::edit_get_pivot() const { + + return get_offset(); +} +bool ViewportSprite::edit_has_pivot() const { + + return true; +} + +void ViewportSprite::_notification(int p_what) { + + switch(p_what) { + + case NOTIFICATION_ENTER_SCENE: { + + if (!viewport_path.is_empty()) { + + Node *n = get_node(viewport_path); + ERR_FAIL_COND(!n); + Viewport *vp=n->cast_to<Viewport>(); + ERR_FAIL_COND(!vp); + + Ref<RenderTargetTexture> rtt = vp->get_render_target_texture(); + texture=rtt; + texture->connect("changed",this,"update"); + item_rect_changed(); + } + } break; + case NOTIFICATION_EXIT_SCENE: { + + if (texture.is_valid()) { + + texture->disconnect("changed",this,"update"); + texture=Ref<Texture>(); + } + } break; + case NOTIFICATION_DRAW: { + + if (texture.is_null()) + return; + + RID ci = get_canvas_item(); + + /* + texture->draw(ci,Point2()); + break; + */ + + Size2i s; + Rect2i src_rect; + + s = texture->get_size(); + + src_rect.size=s; + + Point2i ofs=offset; + if (centered) + ofs-=s/2; + + Rect2i dst_rect(ofs,s); + texture->draw_rect_region(ci,dst_rect,src_rect,modulate); + + } break; + } +} + +void ViewportSprite::set_viewport_path(const NodePath& p_viewport) { + + viewport_path=p_viewport; + update(); + if (!is_inside_scene()) + return; + + if (texture.is_valid()) { + texture->disconnect("changed",this,"update"); + texture=Ref<Texture>(); + } + + if (viewport_path.is_empty()) + return; + + + Node *n = get_node(viewport_path); + ERR_FAIL_COND(!n); + Viewport *vp=n->cast_to<Viewport>(); + ERR_FAIL_COND(!vp); + + Ref<RenderTargetTexture> rtt = vp->get_render_target_texture(); + texture=rtt; + + if (texture.is_valid()) { + texture->connect("changed",this,"update"); + } + + item_rect_changed(); + +} + +NodePath ViewportSprite::get_viewport_path() const { + + return viewport_path; +} + +void ViewportSprite::set_centered(bool p_center) { + + centered=p_center; + update(); + item_rect_changed(); +} + +bool ViewportSprite::is_centered() const { + + return centered; +} + +void ViewportSprite::set_offset(const Point2& p_offset) { + + offset=p_offset; + update(); + item_rect_changed(); +} +Point2 ViewportSprite::get_offset() const { + + return offset; +} +void ViewportSprite::set_modulate(const Color& p_color) { + + modulate=p_color; + update(); +} + +Color ViewportSprite::get_modulate() const{ + + return modulate; +} + + +Rect2 ViewportSprite::get_item_rect() const { + + if (texture.is_null()) + return Rect2(0,0,1,1); + //if (texture.is_null()) + // return CanvasItem::get_item_rect(); + + Size2i s; + + s = texture->get_size(); + Point2i ofs=offset; + if (centered) + ofs-=s/2; + + if (s==Size2(0,0)) + s=Size2(1,1); + + return Rect2(ofs,s); +} + + +void ViewportSprite::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("set_viewport_path","path"),&ViewportSprite::set_viewport_path); + ObjectTypeDB::bind_method(_MD("get_viewport_path"),&ViewportSprite::get_viewport_path); + + ObjectTypeDB::bind_method(_MD("set_centered","centered"),&ViewportSprite::set_centered); + ObjectTypeDB::bind_method(_MD("is_centered"),&ViewportSprite::is_centered); + + ObjectTypeDB::bind_method(_MD("set_offset","offset"),&ViewportSprite::set_offset); + ObjectTypeDB::bind_method(_MD("get_offset"),&ViewportSprite::get_offset); + + ObjectTypeDB::bind_method(_MD("set_modulate","modulate"),&ViewportSprite::set_modulate); + ObjectTypeDB::bind_method(_MD("get_modulate"),&ViewportSprite::get_modulate); + + ADD_PROPERTY( PropertyInfo( Variant::NODE_PATH, "viewport"), _SCS("set_viewport_path"),_SCS("get_viewport_path")); + ADD_PROPERTY( PropertyInfo( Variant::BOOL, "centered"), _SCS("set_centered"),_SCS("is_centered")); + ADD_PROPERTY( PropertyInfo( Variant::VECTOR2, "offset"), _SCS("set_offset"),_SCS("get_offset")); + ADD_PROPERTY( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate")); + +} + +ViewportSprite::ViewportSprite() { + + centered=true; + modulate=Color(1,1,1,1); +} |
