class_name PropInspectorIcons extends RefCounted ## Small flat 2D glyphs for the Prop Editor inspector. ## SVG is rasterized at runtime so colors can follow the editor and material tokens. const ICON_SIZE := 24 static func material(preset: int, tint: Color) -> Texture2D: if preset == 0: return _texture(_svg('')) return _texture(_svg('' % _hex(tint))) static func shape(shape_id: String, tint: Color = Color("#22C6FF")) -> Texture2D: var color := _hex(tint) var content := "" match shape_id: "box": content = '' % color "plank": content = '' % color "triangle": content = '' % color "line": content = '' % color "circle": content = '' % color _: content = '' % color return _texture(_svg(content)) static func section(section_id: String) -> Texture2D: var content := "" match section_id: "material": content = '' "selected_shape": content = '' "add_shape": content = '' "tags": content = '' return _texture(_svg(content)) static func tag(tag_id: String) -> Texture2D: var color := "#66C681" var body := "" match tag_id: "nature": color = "#66C681" body = '' % color "buildings": color = "#F3A653" body = '' % color "walls": color = "#F36B5B" body = '' % color "roads": color = "#9BAEC9" body = '' % color "objects": color = "#E8A96D" body = '' % color return _texture(_svg(body)) static func popup_item(texture: Texture2D, size: int = 44) -> Texture2D: if texture == null: return null var source: Image = texture.get_image() var canvas := Image.create(size, size, false, Image.FORMAT_RGBA8) var draw_size: Vector2i = Vector2i(mini(source.get_width(), size), mini(source.get_height(), size)) var source_rect := Rect2i(Vector2i.ZERO, draw_size) var destination := Vector2i((size - draw_size.x) / 2, (size - draw_size.y) / 2) canvas.blit_rect(source, source_rect, destination) return ImageTexture.create_from_image(canvas) static func _svg(content: String) -> String: return '%s' % [ICON_SIZE, ICON_SIZE, content] static func _texture(svg: String) -> Texture2D: var image := Image.new() var error: Error = image.load_svg_from_string(svg) if error != OK: push_warning("Prop Inspector icon could not be rasterized (%s)." % error_string(error)) return null return ImageTexture.create_from_image(image) static func _hex(color: Color) -> String: return "#" + color.to_html(false)