Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions addons/godot_rl_agents/sensors/sensors_2d/RGBCameraSensor2D.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
extends Node2D
class_name RGBCameraSensor2D
var camera_pixels = null

@export var camera_zoom_factor := Vector2(0.1, 0.1)
@onready var camera := $SubViewport/Camera
@onready var preview_window := $Control
@onready var camera_texture := $Control/CameraTexture as Sprite2D
@onready var processed_texture := $Control/ProcessedTexture as Sprite2D
@onready var sub_viewport := $SubViewport as SubViewport
@onready var displayed_image: ImageTexture

@export var render_image_resolution := Vector2(36, 36)
## Display size does not affect rendered or sent image resolution.
## Scale is relative to either render image or downscale image resolution
## depending on which mode is set.
@export var displayed_image_scale_factor := Vector2(8, 8)

@export_group("Downscale image options")
## Enable to downscale the rendered image before sending the obs.
@export var downscale_image: bool = false
## If downscale_image is true, will display the downscaled image instead of rendered image.
@export var display_downscaled_image: bool = true
## This is the resolution of the image that will be sent after downscaling
@export var resized_image_resolution := Vector2(36, 36)


func _ready():
DisplayServer.register_additional_output(self)

camera.zoom = camera_zoom_factor

var preview_size: Vector2

sub_viewport.world_2d = get_tree().get_root().get_world_2d()
sub_viewport.size = render_image_resolution
camera_texture.scale = displayed_image_scale_factor

if downscale_image and display_downscaled_image:
camera_texture.visible = false
processed_texture.scale = displayed_image_scale_factor
preview_size = displayed_image_scale_factor * resized_image_resolution
else:
processed_texture.visible = false
preview_size = displayed_image_scale_factor * render_image_resolution

preview_window.size = preview_size


func get_camera_pixel_encoding():
var image := camera_texture.get_texture().get_image() as Image

if downscale_image:
image.resize(
resized_image_resolution.x, resized_image_resolution.y, Image.INTERPOLATE_NEAREST
)
if display_downscaled_image:
if not processed_texture.texture:
displayed_image = ImageTexture.create_from_image(image)
processed_texture.texture = displayed_image
else:
displayed_image.update(image)

return image.get_data().hex_encode()


func get_camera_shape() -> Array:
var size = resized_image_resolution if downscale_image else render_image_resolution

assert(
size.x >= 36 and size.y >= 36,
"Camera sensor sent image resolution must be 36x36 or larger."
)
if sub_viewport.transparent_bg:
return [4, size.y, size.x]
else:
return [3, size.y, size.x]
36 changes: 36 additions & 0 deletions addons/godot_rl_agents/sensors/sensors_2d/RGBCameraSensor2D.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
[gd_scene load_steps=3 format=3 uid="uid://bav1cl8uwc45c"]

[ext_resource type="Script" path="res://addons/godot_rl_agents/sensors/sensors_2d/RGBCameraSensor2D.gd" id="1_txpo2"]

[sub_resource type="ViewportTexture" id="ViewportTexture_jks1s"]
viewport_path = NodePath("SubViewport")

[node name="RGBCameraSensor2D" type="Node2D"]
script = ExtResource("1_txpo2")
displayed_image_scale_factor = Vector2(3, 3)

[node name="RemoteTransform" type="RemoteTransform2D" parent="."]
remote_path = NodePath("../SubViewport/Camera")

[node name="SubViewport" type="SubViewport" parent="."]
canvas_item_default_texture_filter = 0
size = Vector2i(36, 36)
render_target_update_mode = 4

[node name="Camera" type="Camera2D" parent="SubViewport"]
position_smoothing_speed = 2.0

[node name="Control" type="Window" parent="."]
canvas_item_default_texture_filter = 0
title = "CameraSensor"
position = Vector2i(20, 40)
size = Vector2i(64, 64)
theme_override_font_sizes/title_font_size = 12
metadata/_edit_use_anchors_ = true

[node name="CameraTexture" type="Sprite2D" parent="Control"]
texture = SubResource("ViewportTexture_jks1s")
centered = false

[node name="ProcessedTexture" type="Sprite2D" parent="Control"]
centered = false