Skip to content

Commit d128d7e

Browse files
authored
Draw view_rect texture via RenderingServer. (#26)
1 parent 95a6d74 commit d128d7e

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

src/godot/view_rect/view_rect.cpp

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
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

1213
using namespace godot;
@@ -29,8 +30,10 @@ ViewRect::ViewRect()
2930

3031
ViewRect::~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

3639
void 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-
130122
void 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

251242
void 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
{

src/godot/view_rect/view_rect.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,17 @@ namespace godot {
2626
std::queue<MouseEvent> mouse_events;
2727
std::queue<KeyEvent> key_events;
2828
std::queue<ScrollEvent> scroll_events;
29+
30+
MouseEvent::Button latest_mouse_button = MouseEvent::Button::kButton_None;
2931

3032
RefPtr<View> view; // Ultralight view
3133
RefPtr<View> inspector_view; // Ultralight Inspector view
3234

3335
Ref<ImageTexture> image_texture;
3436
Ref<Image> image;
3537

38+
RID current_item;
39+
3640
void HandleMouseButton(InputEventMouseButton* event);
3741
void HandleMouseMotion(InputEventMouseMotion* event);
3842
void HandleKey(InputEventKey* event);
@@ -60,7 +64,6 @@ namespace godot {
6064

6165
void _process(double delta) override;
6266
void _gui_input(const Ref<InputEvent> &event) override;
63-
void _draw() override;
6467
// void _notification(int what);
6568

6669
// ALERT: Map generated by Claude AI. Someone should probably double check this. 😳

0 commit comments

Comments
 (0)