MagicNStuff/source/addons/reflection_probe_preview/reflection_probe_preview.gd
SchimmelSpreu83 7e8f8a1d4d Changed the way materials are stored on some dev models
- also adjusted some stuff and added a few passivestar plugins/tools.
2025-10-14 20:15:05 +02:00

56 lines
1.7 KiB
GDScript

@tool
extends EditorPlugin
var _instance: RID
var _mesh: Mesh
var _probe: ReflectionProbe
func _enter_tree() -> void:
EditorInterface.get_selection().selection_changed.connect(_update_preview)
_create_instance()
func _exit_tree() -> void:
EditorInterface.get_selection().selection_changed.disconnect(_update_preview)
_clear_instance()
func _create_instance() -> void:
_instance = RenderingServer.instance_create()
_mesh = SphereMesh.new()
_mesh.radius = 0.5
_mesh.height = _mesh.radius * 2.0
var material = StandardMaterial3D.new()
material.roughness = 0
material.metallic = 1
_mesh.surface_set_material(0, material)
RenderingServer.instance_geometry_set_cast_shadows_setting(_instance, RenderingServer.SHADOW_CASTING_SETTING_OFF)
RenderingServer.instance_set_base(_instance, _mesh)
func _clear_instance() -> void:
if _instance:
RenderingServer.free_rid(_instance)
if _mesh:
RenderingServer.free_rid(_mesh)
func _update_preview() -> void:
var selection = EditorInterface.get_selection().get_selected_nodes()
if selection.size() == 1 and selection[0] is ReflectionProbe:
_probe = selection[0]
var scenario: RID = EditorInterface.get_edited_scene_root().get_world_3d().scenario
RenderingServer.instance_set_scenario(_instance, scenario)
RenderingServer.instance_set_visible(_instance, true)
return
RenderingServer.instance_set_visible(_instance, false)
_probe = null
func _process(_delta: float) -> void:
if not _instance.is_valid() or not _probe:
return
var probe_transform = _probe.global_transform
var origin_offset = _probe.origin_offset
var instance_transform = probe_transform * Transform3D(Basis(), origin_offset)
RenderingServer.instance_set_transform(_instance, instance_transform)