summaryrefslogtreecommitdiffstats
path: root/scene/2d/sprite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/2d/sprite.cpp')
-rw-r--r--scene/2d/sprite.cpp201
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);
+}