77#include < godot_cpp/variant/packed_byte_array.hpp>
88
99#include < godot_cpp/classes/os.hpp>
10+ #include < godot_cpp/classes/rendering_server.hpp>
1011#include < godot_cpp/variant/utility_functions.hpp>
1112
1213using namespace godot ;
@@ -29,8 +30,10 @@ ViewRect::ViewRect()
2930
3031ViewRect::~ViewRect ()
3132{
32- RenderingServer::get_singleton ()->disconnect (" frame_post_draw" , Callable (this , " render_frame" ));
33+ auto rs = RenderingServer::get_singleton ();
34+ rs->disconnect (" frame_post_draw" , Callable (this , " render_frame" ));
3335 disconnect (" resized" , Callable (this , " size_changed" ));
36+ if (current_item.is_valid ()) rs->free_rid (current_item);
3437}
3538
3639void ViewRect::SetView (RefPtr<View> p_view)
@@ -112,21 +115,10 @@ void ViewRect::_gui_input(const Ref<InputEvent> &event)
112115 }
113116}
114117
115- void ViewRect::_draw ()
116- {
117- if (image_texture.is_valid ())
118- {
119- Vector2 size = get_size ();
120- draw_texture_rect (image_texture, Rect2 (0 , 0 , size.x , size.y ), false );
121- }
122- }
123-
124118#pragma endregion
125119
126120#pragma region ViewRect Private methods.
127121
128- MouseEvent::Button latest_mouse_button = MouseEvent::Button::kButton_None ;
129-
130122void ViewRect::HandleMouseButton (InputEventMouseButton *event)
131123{
132124 MouseButton index = event->get_button_index ();
@@ -245,7 +237,6 @@ void ViewRect::RenderFrame()
245237 // /
246238 surface->ClearDirtyBounds ();
247239 }
248- queue_redraw ();
249240}
250241
251242void ViewRect::SizeChanged ()
@@ -266,8 +257,19 @@ void ViewRect::CopyBitmapToTexture(RefPtr<Bitmap> bitmap)
266257 if (image.is_null ())
267258 {
268259 image = Image::create_from_data (bitmap->width (), bitmap->height (), false , Image::FORMAT_RGBA8, arr);
269- if (!image.is_valid () || image->is_empty ()) return ;
270- image_texture = ImageTexture::create_from_image (image);
260+ if (image.is_null () || image->is_empty ()) return ;
261+ if (image_texture.is_null ()) {
262+ image_texture = ImageTexture::create_from_image (image);
263+ } else {
264+ image_texture->set_image (image);
265+ }
266+ const auto rs = RenderingServer::get_singleton ();
267+ const auto canvas_item = get_canvas_item ();
268+ auto previous_item = current_item;
269+ current_item = rs->canvas_item_create ();
270+ rs->canvas_item_set_parent (current_item, canvas_item);
271+ rs->canvas_item_add_texture_rect (current_item, Rect2 (Vector2 (), get_size ()), image_texture->get_rid ());
272+ if (previous_item.is_valid ()) rs->free_rid (previous_item);
271273 }
272274 else
273275 {
0 commit comments