Add Sprite3D and AnimatedSprite3D demo (#1191)

This commit is contained in:
Tianle
2025-04-24 08:45:14 -07:00
committed by GitHub
parent a531235db3
commit 90f309174d
40 changed files with 1460 additions and 0 deletions

3
.gitignore vendored
View File

@@ -24,3 +24,6 @@ mono_crash.*.json
# Jetbrains IDE files
.idea/
# Ignore addon plugins
3d/sprite3d/addons

670
3d/sprites/3d_sprites.tscn Normal file
View File

@@ -0,0 +1,670 @@
[gd_scene load_steps=27 format=3 uid="uid://b15ro0v2x7n5t"]
[ext_resource type="Script" uid="uid://v0e1avxpe8n7" path="res://scripts/3d_sprites.gd" id="1_omy0v"]
[ext_resource type="Texture2D" uid="uid://chjqieyps5n5r" path="res://textures/checker.png" id="2_013ql"]
[ext_resource type="Texture2D" uid="uid://cj6jj2qp2y3j0" path="res://textures/icon.svg" id="3_lk0vd"]
[ext_resource type="Script" uid="uid://bmij60kwbx48u" path="res://scripts/sprite_rotate.gd" id="4_osfvf"]
[ext_resource type="Shader" uid="uid://dfk1vupanuypi" path="res://shaders/negative.gdshader" id="5_013ql"]
[ext_resource type="Texture2D" uid="uid://chpmjfw7bwnpu" path="res://player/player_white.png" id="6_unyd2"]
[ext_resource type="PackedScene" uid="uid://b2inrhxoc37g7" path="res://player/player.tscn" id="7_unyd2"]
[ext_resource type="Shader" uid="uid://b5ee04rjhppn4" path="res://shaders/paper.gdshader" id="8_ht5yh"]
[ext_resource type="Shader" uid="uid://bbv8bmi15e7i0" path="res://shaders/paper_rainbow.gdshader" id="8_unyd2"]
[ext_resource type="Texture2D" uid="uid://cptljgccd1ike" path="res://player/player.png" id="9_wqw3d"]
[ext_resource type="Shader" uid="uid://2o41hrodgn04" path="res://shaders/paper_material.gdshader" id="10_omy0v"]
[ext_resource type="Shader" uid="uid://beecufb7fv40i" path="res://shaders/paper_emission.gdshader" id="11_8ak7l"]
[ext_resource type="Texture2D" uid="uid://cbb4xesensj5l" path="res://textures/paper_material.png" id="11_013ql"]
[sub_resource type="ProceduralSkyMaterial" id="9"]
[sub_resource type="Sky" id="10"]
sky_material = SubResource("9")
[sub_resource type="Environment" id="11"]
background_mode = 2
sky = SubResource("10")
tonemap_mode = 4
[sub_resource type="StandardMaterial3D" id="13"]
diffuse_mode = 1
albedo_texture = ExtResource("2_013ql")
uv1_scale = Vector3(32, 32, 1)
texture_filter = 5
[sub_resource type="PlaneMesh" id="14"]
material = SubResource("13")
size = Vector2(128, 128)
[sub_resource type="GDScript" id="GDScript_ddk2o"]
script/source = "extends Node3D
"
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lk0vd"]
render_priority = 0
shader = ExtResource("5_013ql")
shader_parameter/texture_albedo = ExtResource("3_lk0vd")
[sub_resource type="BoxMesh" id="BoxMesh_juuw1"]
[sub_resource type="SphereMesh" id="SphereMesh_wsjfy"]
radial_segments = 32
rings = 64
[sub_resource type="ShaderMaterial" id="ShaderMaterial_omy0v"]
render_priority = 0
shader = ExtResource("8_ht5yh")
shader_parameter/texture_albedo = ExtResource("9_wqw3d")
shader_parameter/outline_thickness = 0.1
shader_parameter/outline_color = Color(1, 1, 1, 1)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_osfvf"]
render_priority = 0
shader = ExtResource("10_omy0v")
shader_parameter/texture_albedo = ExtResource("9_wqw3d")
shader_parameter/normal_map = ExtResource("11_013ql")
shader_parameter/outline_thickness = 0.1
shader_parameter/outline_color = Color(1, 1, 1, 1)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_unyd2"]
render_priority = 0
shader = ExtResource("11_8ak7l")
shader_parameter/texture_albedo = ExtResource("9_wqw3d")
shader_parameter/normal_map = ExtResource("11_013ql")
shader_parameter/outline_thickness = 0.05
shader_parameter/outline_color = Color(0.301961, 1, 1, 1)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_013ql"]
render_priority = 0
shader = ExtResource("8_unyd2")
shader_parameter/texture_albedo = ExtResource("9_wqw3d")
shader_parameter/normal_map = ExtResource("11_013ql")
shader_parameter/outline_thickness = 0.043
shader_parameter/outline_color = Color(1, 1, 1, 1)
[node name="Sprite_3D" type="WorldEnvironment"]
environment = SubResource("11")
script = ExtResource("1_omy0v")
[node name="Plane" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00027895, -0.00270161, -22)
layers = 2
mesh = SubResource("14")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.677773, -0.484673, 0.552915, -0.0842485, 0.695844, 0.713235, -0.730428, -0.529994, 0.430791, 4.57578, 4.43873, 3.54442)
light_energy = 1.941
shadow_enabled = true
shadow_bias = 0.04
shadow_blur = 1.5
directional_shadow_mode = 0
directional_shadow_fade_start = 1.0
directional_shadow_max_distance = 24.0
[node name="CameraHolder" type="Node3D" parent="."]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.6, 0.9, 0)
[node name="RotationX" type="Node3D" parent="CameraHolder"]
[node name="Camera3D" type="Camera3D" parent="CameraHolder/RotationX"]
fov = 70.0
[node name="Testers" type="Node3D" parent="."]
[node name="Basic" type="Node3D" parent="Testers"]
transform = Transform3D(1.00002, 0, 0, 0, 1.00002, 0, 0, 0, 1.00002, 0, 0, 4.31099)
script = SubResource("GDScript_ddk2o")
[node name="Sprite3D" type="Sprite3D" parent="Testers/Basic"]
transform = Transform3D(-4.37263e-08, 0, 1.00034, 0, 1.00034, 0, -1.00034, 0, -4.37263e-08, 0, 0.746, 0)
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="UnshadedTwoSided" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.155091)
[node name="Back" type="Sprite3D" parent="Testers/UnshadedTwoSided"]
transform = Transform3D(1.1933e-08, 0, -1.00068, 0, 1.00068, 0, 1.00068, 0, 1.1933e-08, 0, 0.746, 0)
material_override = SubResource("ShaderMaterial_lk0vd")
double_sided = false
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="Front" type="Sprite3D" parent="Testers/UnshadedTwoSided"]
transform = Transform3D(-4.37263e-08, 0, 1.00034, 0, 1.00034, 0, -1.00034, 0, -4.37263e-08, -0.0109167, 0.746, 0)
double_sided = false
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="Alpha" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -5.43396)
[node name="LabelOpaquePrepass" type="Label3D" parent="Testers/Alpha"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 3.66124, -0.782)
cast_shadow = 1
shaded = true
texture_filter = 5
modulate = Color(1, 0.631373, 0.588235, 1)
text = "Opaque Pre-pass:
Cast and receive shadows
"
font_size = 50
outline_size = 5
horizontal_alignment = 0
[node name="OpaquePrepass" type="Sprite3D" parent="Testers/Alpha"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 3.60818, 0.234)
transparency = 0.32
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="LabelDiscard" type="Label3D" parent="Testers/Alpha"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 2.2416, -0.782)
cast_shadow = 1
shaded = true
texture_filter = 5
modulate = Color(1, 0.988235, 0.470588, 1)
text = "Alpha Cut (discard):
Cast and receive shadows,
no partial transparency
"
font_size = 50
outline_size = 5
horizontal_alignment = 0
[node name="Disscard" type="Sprite3D" parent="Testers/Alpha"]
transform = Transform3D(-4.37068e-08, 0, 0.999894, 0, 0.999894, 0, -0.999894, 0, -4.37068e-08, 0, 2.17861, 0.234)
transparency = 0.32
shaded = true
alpha_cut = 1
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="LabelAlphaBlend" type="Label3D" parent="Testers/Alpha"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 0.75187, -0.782)
cast_shadow = 1
shaded = true
texture_filter = 5
text = "Alpha (blend):
Only receive shadows
"
font_size = 50
outline_size = 5
horizontal_alignment = 0
[node name="AlphaBlend" type="Sprite3D" parent="Testers/Alpha"]
transform = Transform3D(-4.37068e-08, 0, 0.999894, 0, 0.999894, 0, -0.999894, 0, -4.37068e-08, 0, 0.75163, 0.234)
shaded = true
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/Alpha"]
transform = Transform3D(1, 0, 0, 0, 2.78523, 0, 0, 0, 1.24119, 1, 3.52522, 2.0058)
transparency = 0.58
mesh = SubResource("BoxMesh_juuw1")
[node name="TextureFilter" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -13.7283)
[node name="nearest" type="Label3D" parent="Testers/TextureFilter"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 3.50693, 1.67099)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Nearest
"
font_size = 50
outline_size = 5
horizontal_alignment = 0
[node name="Sprite3D_nearest" type="Sprite3D" parent="Testers/TextureFilter"]
transform = Transform3D(-3.03794e-07, 0, 6.95, 0, 6.95, 0, -6.95, 0, -3.03794e-07, 0, 2.64618, 1.07946)
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("6_unyd2")
[node name="nearestMipmap" type="Label3D" parent="Testers/TextureFilter"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 1.34682, 2.09971)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Nearest Mipmap
"
font_size = 50
outline_size = 5
horizontal_alignment = 0
[node name="Sprite3D_nearestMipmap" type="Sprite3D" parent="Testers/TextureFilter"]
transform = Transform3D(-3.03794e-07, 0, 6.95, 0, 6.95, 0, -6.95, 0, -3.03794e-07, 2.13163e-14, 0.582538, 1.07946)
shaded = true
alpha_cut = 2
texture_filter = 2
texture = ExtResource("6_unyd2")
[node name="linear" type="Label3D" parent="Testers/TextureFilter"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 3.50068, -0.669133)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Linear
"
font_size = 50
outline_size = 5
horizontal_alignment = 0
[node name="Sprite3D_linear" type="Sprite3D" parent="Testers/TextureFilter"]
transform = Transform3D(-3.03794e-07, 0, 6.95, 0, 6.95, 0, -6.95, 0, -3.03794e-07, 0, 2.64618, -1.13312)
shaded = true
alpha_cut = 2
texture_filter = 1
texture = ExtResource("6_unyd2")
[node name="linearMipmap" type="Label3D" parent="Testers/TextureFilter"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 1.4937, -0.200834)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Linear Mipmap
"
font_size = 50
outline_size = 5
horizontal_alignment = 0
[node name="Sprite3D_linearMipmap" type="Sprite3D" parent="Testers/TextureFilter"]
transform = Transform3D(-3.03794e-07, 0, 6.95, 0, 6.95, 0, -6.95, 0, -3.03794e-07, 0, 0.582538, -1.13312)
shaded = true
alpha_cut = 2
texture = ExtResource("6_unyd2")
[node name="Billboard" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -21.3081)
[node name="Disabled" type="Label3D" parent="Testers/Billboard"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 1.57302, 1.55512)
texture_filter = 5
render_priority = 1
outline_render_priority = 0
modulate = Color(0.996078, 1, 0.333333, 1)
text = "Disabled"
font_size = 50
outline_size = 3
[node name="Sprite3D_Bill_Disable" type="Sprite3D" parent="Testers/Billboard"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0.6874, 1.55132)
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="Enabled" type="Label3D" parent="Testers/Billboard"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 1.54264, -1.58877)
billboard = 1
texture_filter = 5
render_priority = 1
outline_render_priority = 0
modulate = Color(0.607843, 1, 0.505882, 1)
text = "Enabled"
font_size = 50
outline_size = 3
[node name="Sprite3D_Bill_Enable" type="Sprite3D" parent="Testers/Billboard"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0.67836, -1.57819)
billboard = 1
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="YBillboard" type="Label3D" parent="Testers/Billboard"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 1.58263, -0.00695992)
billboard = 2
texture_filter = 5
render_priority = 1
outline_render_priority = 0
modulate = Color(1, 0.392157, 0.454902, 1)
text = "Y-Billboard"
font_size = 50
outline_size = 3
[node name="Sprite3D_Bill_YBillboard" type="Sprite3D" parent="Testers/Billboard"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0.67303, -0.0113411)
billboard = 2
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="DistanceFade" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -28.9605)
[node name="NoDistanceFade" type="Label3D" parent="Testers/DistanceFade"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 1.70137, 1.54533)
texture_filter = 5
render_priority = 1
outline_render_priority = 0
modulate = Color(1, 0.741176, 0.831373, 1)
text = "No
Distance Fade"
font_size = 50
outline_size = 4
[node name="Sprite3D_N_Dis_Fade" type="Sprite3D" parent="Testers/DistanceFade"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0.6569, 1.5008)
billboard = 1
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="DistanceFade" type="Label3D" parent="Testers/DistanceFade"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 1.69938, -1.53823)
visibility_range_end = 5.0
visibility_range_end_margin = 2.5
visibility_range_fade_mode = 1
texture_filter = 5
render_priority = 1
outline_render_priority = 0
modulate = Color(0.32549, 1, 0.858824, 1)
text = "With
Distance Fade"
font_size = 50
outline_size = 4
[node name="Sprite3D_Dis_Fade" type="Sprite3D" parent="Testers/DistanceFade"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 3.55271e-15, 0.65325, -1.47058)
visibility_range_end = 5.0
visibility_range_end_margin = 2.5
visibility_range_fade_mode = 1
billboard = 1
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="DistanceFadeFixedSize" type="Label3D" parent="Testers/DistanceFade"]
transform = Transform3D(-4.36914e-08, 0.0302419, 0.999543, 1.32192e-09, 0.999543, -0.0302419, -1, 0, -4.37114e-08, -0.000778437, 1.70739, -1.90735e-05)
visibility_range_end = 5.0
visibility_range_end_margin = 2.5
visibility_range_fade_mode = 1
pixel_size = 0.001
billboard = 1
fixed_size = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
modulate = Color(0.760784, 0.690196, 1, 1)
text = "With
Distance Fade
(Billboard + Fixed Size)"
font_size = 50
outline_size = 4
[node name="Sprite3D_Fx_size_bill" type="Sprite3D" parent="Testers/DistanceFade"]
transform = Transform3D(-8.74228e-09, 0, 0.2, 0, 0.2, 0, -0.2, 0, -8.74228e-09, 0, 0.64401, -0.0236607)
visibility_range_end = 5.0
visibility_range_end_margin = 2.5
visibility_range_fade_mode = 1
billboard = 1
shaded = true
fixed_size = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="DepthTest" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -37.2639)
[node name="WithDepthTest" type="Label3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.21939, 0.405061, 2.68913)
texture_filter = 5
modulate = Color(1, 0.607843, 0.290196, 1)
text = "With Depth Test"
font_size = 50
outline_size = 4
[node name="Sprite3D_dep" type="Sprite3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.218, 1.62187, 2.77824)
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="NoDepthTest" type="Label3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.21939, 0.433499, 0.199995)
no_depth_test = true
texture_filter = 5
modulate = Color(1, 0.607843, 0.290196, 1)
text = "No Depth Test"
font_size = 50
outline_size = 4
[node name="Sprite3D_N_dep" type="Sprite3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.218, 1.59785, 0.118614)
shaded = true
no_depth_test = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="DepthTestXray" type="Label3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.21771, 0.371057, -2.91263)
texture_filter = 5
modulate = Color(1, 0.607843, 0.290196, 1)
text = "No Depth Test
(X-Ray with second Sprite3D)"
font_size = 50
outline_size = 4
[node name="NoDepthTestXray" type="Label3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.21771, 0.371057, -2.91263)
no_depth_test = true
texture_filter = 5
modulate = Color(1, 0.607843, 0.290196, 0.25098)
outline_modulate = Color(0, 0, 0, 0.25098)
text = "No Depth Test
(X-Ray with second Sprite3D)"
font_size = 50
outline_size = 4
[node name="Sprite3D_XRay" type="Sprite3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.218, 1.566, -2.70613)
modulate = Color(1, 1, 1, 0.388235)
shaded = true
no_depth_test = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="Sprite3D_N_dep_XRay" type="Sprite3D" parent="Testers/DepthTest"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -2.218, 1.566, -2.70613)
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("3_lk0vd")
script = ExtResource("4_osfvf")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/DepthTest"]
transform = Transform3D(0.619559, 0, 0, 0, 5.36089, 0, 0, 0, 6.64597, 0.0491439, 0.288069, 0.000623703)
mesh = SubResource("SphereMesh_wsjfy")
[node name="AnimatedSprite3D" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -47.7324)
[node name="Enable" type="Label3D" parent="Testers/AnimatedSprite3D"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0, 1.5, 0)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Use WASD to move"
font_size = 50
outline_size = 5
[node name="Player" parent="Testers/AnimatedSprite3D" instance=ExtResource("7_unyd2")]
transform = Transform3D(-2.75382e-08, 0, 0.63, 0, 0.63, 0, -0.63, 0, -2.75382e-08, 0, 0.688345, 0)
[node name="ShaderEffects" type="Node3D" parent="Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -57.9529)
[node name="d1" type="Label3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 1.4, 3.48974)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Outline"
font_size = 50
outline_size = 5
[node name="Sprite3D_Paper" type="Sprite3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-5.74368e-07, 0, 13.14, 0, 13.14, 0, -13.14, 0, -5.74368e-07, 0, 0.491784, 3.44599)
material_override = SubResource("ShaderMaterial_omy0v")
pixel_size = 0.005
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("9_wqw3d")
script = ExtResource("4_osfvf")
[node name="d2" type="Label3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 1.4, 1.12742)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Paper Wrinkling
"
font_size = 50
outline_size = 5
[node name="Sprite3D_Paper_material" type="Sprite3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-5.74368e-07, 0, 13.14, 0, 13.14, 0, -13.14, 0, -5.74368e-07, 0, 0.491784, 1.10744)
material_override = SubResource("ShaderMaterial_osfvf")
pixel_size = 0.005
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("9_wqw3d")
script = ExtResource("4_osfvf")
[node name="d3" type="Label3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, -0.0808217, 1.4, -1.25668)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Emission Edge
"
font_size = 50
outline_size = 5
[node name="Sprite3D_Paper_emission" type="Sprite3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-5.74368e-07, 0, 13.14, 0, 13.14, 0, -13.14, 0, -5.74368e-07, 0, 0.491784, -1.3107)
material_override = SubResource("ShaderMaterial_unyd2")
pixel_size = 0.005
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("9_wqw3d")
script = ExtResource("4_osfvf")
[node name="d4" type="Label3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-4.49386e-08, 0, 1.02807, 0, 1.02807, 0, -1.02807, 0, -4.49386e-08, 0.004, 1.5, -3.44756)
cast_shadow = 1
shaded = true
texture_filter = 5
render_priority = 1
outline_render_priority = 0
text = "Rainbow
Animated Edge
"
font_size = 50
outline_size = 5
[node name="Sprite3D_Paper_rainbow" type="Sprite3D" parent="Testers/ShaderEffects"]
transform = Transform3D(-5.74368e-07, 0, 13.14, 0, 13.14, 0, -13.14, 0, -5.74368e-07, 0, 0.491784, -3.52359)
material_override = SubResource("ShaderMaterial_013ql")
pixel_size = 0.005
shaded = true
alpha_cut = 2
texture_filter = 0
texture = ExtResource("9_wqw3d")
script = ExtResource("4_osfvf")
[node name="TestName" type="Label" parent="."]
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -192.0
offset_top = -58.0
offset_right = 192.0
offset_bottom = -24.0
grow_horizontal = 2
grow_vertical = 0
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
theme_override_constants/outline_size = 7
theme_override_font_sizes/font_size = 24
horizontal_alignment = 1
[node name="Previous" type="Button" parent="."]
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 24.0
offset_top = -55.0
offset_right = 135.0
offset_bottom = -24.0
grow_vertical = 0
text = "« Previous"
[node name="Next" type="Button" parent="."]
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -107.0
offset_top = -55.0
offset_right = -24.0
offset_bottom = -24.0
grow_horizontal = 0
grow_vertical = 0
text = "Next »"
[connection signal="pressed" from="Previous" to="." method="_on_previous_pressed"]
[connection signal="pressed" from="Next" to="." method="_on_next_pressed"]

34
3d/sprites/README.md Normal file
View File

@@ -0,0 +1,34 @@
># 3D Sprites and Animated Sprites
This project demonstrates the usage of Sprite3D and AnimatedSprite3D in 3D
space.
Both Sprite3D and AnimatedSprite3D are nodes that allow 2D textures or
animations to exist within a 3D world. They are particularly useful for stylized
or lightweight 3D effects using traditional 2D assets.
- **Sprite3D:** A node that renders a single 2D texture or frame in 3D space. It
can be rotated, scaled, and positioned like any 3D node. Optionally, it can
behave as a billboard to always face the camera.
- **AnimatedSprite3D:** Extends Sprite3D by supporting frame-based animation. You
can assign a SpriteFrames resource to play sequences of textures, making it
suitable for character sprites, visual effects, or flipbook-style animations in
3D.
Both types can be combined with custom shaders to simulate outlines, lighting
effects, or other visual enhancements. In most scenarios, Sprite3D is used for
static images or simple animations, while AnimatedSprite3D is preferred for more
complex animations or when you need to manage multiple frames efficiently.
This demo includes examples of basic rotation animation and showcases how
shaders can be applied to Sprite3D and AnimatedSprite3D for stylized results.
The shaders demostration also shows how to create paper-like effects, which can
be useful for creating a unique visual style in most of the game.
Language: GDScript
Renderer: Forward+
## Screenshots
![Screenshot](screenshots/3d_sprites.webp)

BIN
3d/sprites/icon.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://brwp8bimc75uu"
path="res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.webp"
dest_files=["res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cptljgccd1ike"
path="res://.godot/imported/player.png-1ad27fc2a62fa126eae918723933dd6f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://player/player.png"
dest_files=["res://.godot/imported/player.png-1ad27fc2a62fa126eae918723933dd6f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://b2inrhxoc37g7"]
[ext_resource type="Script" uid="uid://c7bu02ppdx1v5" path="res://scripts/player.gd" id="1_rkbax"]
[ext_resource type="SpriteFrames" uid="uid://4hw8gouu8yqs" path="res://player/player_frames.tres" id="2_4ntmi"]
[node name="Player" type="Node3D"]
script = ExtResource("1_rkbax")
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 12.7616, 0, 0, 0)
gi_mode = 2
pixel_size = 0.125
shaded = true
alpha_cut = 2
texture_filter = 0
sprite_frames = ExtResource("2_4ntmi")
animation = &"idle"

View File

@@ -0,0 +1,122 @@
[gd_resource type="SpriteFrames" load_steps=15 format=3 uid="uid://4hw8gouu8yqs"]
[ext_resource type="Texture2D" uid="uid://ddok6ds70nvl1" path="res://textures/small_8_direction_characters.png" id="1_76ojn"]
[sub_resource type="AtlasTexture" id="AtlasTexture_5dgwc"]
atlas = ExtResource("1_76ojn")
region = Rect2(64, 48, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_l3c4j"]
atlas = ExtResource("1_76ojn")
region = Rect2(64, 24, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_pk5se"]
atlas = ExtResource("1_76ojn")
region = Rect2(64, 48, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_35o62"]
atlas = ExtResource("1_76ojn")
region = Rect2(64, 72, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_kav2d"]
atlas = ExtResource("1_76ojn")
region = Rect2(96, 24, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_jalj5"]
atlas = ExtResource("1_76ojn")
region = Rect2(96, 48, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_lgiew"]
atlas = ExtResource("1_76ojn")
region = Rect2(96, 72, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_7rhvb"]
atlas = ExtResource("1_76ojn")
region = Rect2(32, 24, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_4cbp7"]
atlas = ExtResource("1_76ojn")
region = Rect2(32, 48, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_2f26o"]
atlas = ExtResource("1_76ojn")
region = Rect2(32, 72, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_v2fg8"]
atlas = ExtResource("1_76ojn")
region = Rect2(0, 24, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_6lyn2"]
atlas = ExtResource("1_76ojn")
region = Rect2(0, 48, 16, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_dv105"]
atlas = ExtResource("1_76ojn")
region = Rect2(0, 72, 16, 24)
[resource]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_5dgwc")
}],
"loop": true,
"name": &"idle",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_l3c4j")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_pk5se")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_35o62")
}],
"loop": true,
"name": &"walk_down",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_kav2d")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jalj5")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_lgiew")
}],
"loop": true,
"name": &"walk_left",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_7rhvb")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4cbp7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2f26o")
}],
"loop": true,
"name": &"walk_right",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_v2fg8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6lyn2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_dv105")
}],
"loop": true,
"name": &"walk_up",
"speed": 10.0
}]

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://chpmjfw7bwnpu"
path="res://.godot/imported/player_white.png-c6b013391b1feeb9d4ff0d9b35793b80.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://player/player_white.png"
dest_files=["res://.godot/imported/player_white.png-c6b013391b1feeb9d4ff0d9b35793b80.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

96
3d/sprites/project.godot Normal file
View File

@@ -0,0 +1,96 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[application]
config/name="3D Sprites and Animated Sprites"
config/description="This project showcases the use of Sprite3D and AnimatedSprite3D in a 3D environment.
Additionally, it demonstrates several possible shader effects applied to Sprite3D and AnimatedSprite3D."
config/tags=PackedStringArray("3d", "demo", "official", "rendering")
run/main_scene="uid://b15ro0v2x7n5t"
config/features=PackedStringArray("4.4")
config/icon="res://icon.webp"
[debug]
gdscript/warnings/untyped_declaration=1
[display]
window/stretch/mode="canvas_items"
window/stretch/aspect="expand"
[editor_plugins]
enabled=PackedStringArray()
[gui]
theme/default_font_multichannel_signed_distance_field=true
theme/default_font_generate_mipmaps=true
[input]
ui_left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
]
}
ui_right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
]
}
ui_up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
]
}
ui_down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
move_forward={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":122,"location":0,"echo":false,"script":null)
]
}
move_back={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
move_left={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null)
]
}
move_right={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
]
}
[rendering]
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=3
textures/default_filters/anisotropic_filtering_level=4
anti_aliasing/quality/msaa_3d=2

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

View File

@@ -0,0 +1,70 @@
extends Node
const ROT_SPEED = 0.003
const ZOOM_SPEED = 0.125
const MAIN_BUTTONS = MOUSE_BUTTON_MASK_LEFT | MOUSE_BUTTON_MASK_RIGHT | MOUSE_BUTTON_MASK_MIDDLE
var tester_index := 0
var rot_x := -TAU / 16 # This must be kept in sync with RotationX.
var rot_y := TAU / 6 # This must be kept in sync with CameraHolder.
var camera_distance := 3.4
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@onready var rotation_x: Node3D = $CameraHolder/RotationX
@onready var camera: Camera3D = $CameraHolder/RotationX/Camera3D
func _ready() -> void:
camera_holder.transform.basis = Basis.from_euler(Vector3(0, rot_y, 0))
rotation_x.transform.basis = Basis.from_euler(Vector3(rot_x, 0, 0))
update_gui()
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed(&"ui_left"):
_on_previous_pressed()
if event.is_action_pressed(&"ui_right"):
_on_next_pressed()
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_WHEEL_UP:
camera_distance -= ZOOM_SPEED
if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
camera_distance += ZOOM_SPEED
camera_distance = clamp(camera_distance, 1.5, 6)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height).
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height
rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED
rot_x = clamp(rot_x, -1.57, 0)
camera_holder.transform.basis = Basis.from_euler(Vector3(0, rot_y, 0))
rotation_x.transform.basis = Basis.from_euler(Vector3(rot_x, 0, 0))
func _process(delta: float) -> void:
var current_tester: Node3D = testers.get_child(tester_index)
# This code assumes CameraHolder's X and Y coordinates are already correct.
var current_position := camera_holder.global_transform.origin.z
var target_position := current_tester.global_transform.origin.z
camera_holder.global_transform.origin.z = lerpf(current_position, target_position, 3 * delta)
camera.position.z = lerpf(camera.position.z, camera_distance, 10 * delta)
func _on_previous_pressed() -> void:
tester_index = max(0, tester_index - 1)
update_gui()
func _on_next_pressed() -> void:
tester_index = min(tester_index + 1, testers.get_child_count() - 1)
update_gui()
func update_gui() -> void:
$TestName.text = str(testers.get_child(tester_index).name).capitalize()
$Previous.disabled = tester_index == 0
$Next.disabled = tester_index == testers.get_child_count() - 1

View File

@@ -0,0 +1 @@
uid://v0e1avxpe8n7

View File

@@ -0,0 +1,27 @@
extends Node3D
@onready var sprite: AnimatedSprite3D = $AnimatedSprite3D
@export var move_speed: float = 5.0
var velocity: Vector3 = Vector3.ZERO
func _process(delta: float) -> void:
var input_vector: Vector2 = Vector2.ZERO
input_vector.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
input_vector.y = Input.get_action_strength("move_back") - Input.get_action_strength("move_forward")
if input_vector.length() > 0:
input_vector = input_vector.normalized()
# Update player's position in 3D space.
velocity = Vector3(input_vector.x, 0, input_vector.y) * move_speed
translate(velocity * delta)
# Play corresponding animation.
if abs(input_vector.x) > abs(input_vector.y):
sprite.play("walk_right" if input_vector.x > 0 else "walk_left")
else:
sprite.play("walk_down" if input_vector.y > 0 else "walk_up")
else:
sprite.stop()

View File

@@ -0,0 +1 @@
uid://c7bu02ppdx1v5

View File

@@ -0,0 +1,7 @@
extends Sprite3D
@export var speed_deg: float = 90.0
func _process(delta: float) -> void:
rotate_y(deg_to_rad(speed_deg * delta))

View File

@@ -0,0 +1 @@
uid://bmij60kwbx48u

View File

@@ -0,0 +1,14 @@
shader_type spatial;
render_mode depth_prepass_alpha, unshaded;
uniform sampler2D texture_albedo : filter_nearest;
void fragment() {
vec4 albedo = texture(texture_albedo, UV);
float alpha = albedo.a;
vec4 albedo_negative = vec4(1.0) - albedo;
ALBEDO = vec3(albedo_negative.rgb);
ALPHA = alpha;
}

View File

@@ -0,0 +1 @@
uid://dfk1vupanuypi

View File

@@ -0,0 +1,29 @@
shader_type spatial;
render_mode depth_draw_opaque, cull_disabled, depth_prepass_alpha;
uniform sampler2D texture_albedo : source_color, filter_nearest;
uniform float outline_thickness : hint_range(0.001, 0.05) = 0.1;
uniform vec4 outline_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
void fragment() {
vec2 uv = UV;
vec4 center = texture(texture_albedo, uv);
float threshold = 0.1;
float outline = 0.0;
vec2 offset = vec2(outline_thickness, 0.0);
outline += step(threshold, texture(texture_albedo, uv + offset).a);
outline += step(threshold, texture(texture_albedo, uv - offset).a);
outline += step(threshold, texture(texture_albedo, uv + vec2(0.0, outline_thickness)).a);
outline += step(threshold, texture(texture_albedo, uv - vec2(0.0, outline_thickness)).a);
if (center.a < threshold && outline > 0.0) {
ALBEDO = outline_color.rgb;
ALPHA = 1.0;
} else {
ALBEDO = center.rgb;
ALPHA = center.a;
}
}

View File

@@ -0,0 +1 @@
uid://b5ee04rjhppn4

View File

@@ -0,0 +1,34 @@
shader_type spatial;
render_mode depth_draw_opaque, cull_disabled, depth_prepass_alpha;
uniform sampler2D texture_albedo : source_color, filter_nearest;
uniform sampler2D normal_map : hint_normal;
uniform float outline_thickness : hint_range(0.001, 0.05) = 0.1;
uniform vec4 outline_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
void fragment() {
vec2 uv = UV;
vec4 center = texture(texture_albedo, uv);
float threshold = 0.1;
float outline = 0.0;
vec2 offset = vec2(outline_thickness, 0.0);
outline += step(threshold, texture(texture_albedo, uv + offset).a);
outline += step(threshold, texture(texture_albedo, uv - offset).a);
outline += step(threshold, texture(texture_albedo, uv + vec2(0.0, outline_thickness)).a);
outline += step(threshold, texture(texture_albedo, uv - vec2(0.0, outline_thickness)).a);
if (center.a < threshold && outline > 0.0) {
ALBEDO = outline_color.rgb;
ALPHA = 1.0;
EMISSION = outline_color.rgb * 4.0;
} else {
ALBEDO = center.rgb;
ALPHA = center.a;
vec3 normal_tex = texture(normal_map, UV).rgb;
normal_tex = -(normal_tex * 2.0 - 1.0);
NORMAL = normalize(TANGENT * normal_tex.x + BINORMAL * normal_tex.y + NORMAL * normal_tex.z);
}
}

View File

@@ -0,0 +1 @@
uid://beecufb7fv40i

View File

@@ -0,0 +1,34 @@
shader_type spatial;
render_mode depth_draw_opaque, cull_disabled, depth_prepass_alpha;
uniform sampler2D texture_albedo : source_color, filter_nearest;
uniform sampler2D normal_map : hint_normal;
uniform float outline_thickness : hint_range(0.001, 0.05) = 0.1;
uniform vec4 outline_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
void fragment() {
vec2 uv = UV;
vec4 center = texture(texture_albedo, uv);
float threshold = 0.1;
float outline = 0.0;
vec2 offset = vec2(outline_thickness, 0.0);
outline += step(threshold, texture(texture_albedo, uv + offset).a);
outline += step(threshold, texture(texture_albedo, uv - offset).a);
outline += step(threshold, texture(texture_albedo, uv + vec2(0.0, outline_thickness)).a);
outline += step(threshold, texture(texture_albedo, uv - vec2(0.0, outline_thickness)).a);
vec3 normal_tex = texture(normal_map, UV).rgb;
normal_tex = -(normal_tex * 2.0 - 1.0);
NORMAL = normalize(TANGENT * normal_tex.x + BINORMAL * normal_tex.y + NORMAL * normal_tex.z);
if (center.a < threshold && outline > 0.0) {
ALBEDO = outline_color.rgb;
ALPHA = 1.0;
} else {
ALBEDO = center.rgb;
ALPHA = center.a;
}
}

View File

@@ -0,0 +1 @@
uid://2o41hrodgn04

View File

@@ -0,0 +1,39 @@
shader_type spatial;
render_mode depth_draw_opaque, cull_disabled, depth_prepass_alpha;
uniform sampler2D texture_albedo : source_color, filter_nearest;
uniform sampler2D normal_map : hint_normal;
uniform float outline_thickness : hint_range(0.001, 0.05) = 0.1;
uniform vec4 outline_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
void fragment() {
vec2 uv = UV;
vec4 center = texture(texture_albedo, uv);
float threshold = 0.1;
float outline = 0.0;
vec2 offset = vec2(outline_thickness, 0.0);
outline += step(threshold, texture(texture_albedo, uv + offset).a);
outline += step(threshold, texture(texture_albedo, uv - offset).a);
outline += step(threshold, texture(texture_albedo, uv + vec2(0.0, outline_thickness)).a);
outline += step(threshold, texture(texture_albedo, uv - vec2(0.0, outline_thickness)).a);
if (center.a < threshold && outline > 0.0) {
float t = TIME * 2.0 + uv.x * 10.0 + uv.y * 10.0;
vec3 rainbow = vec3(
0.5 + 0.5 * sin(t),
0.5 + 0.5 * sin(t + 2.0),
0.5 + 0.5 * sin(t + 4.0)
);
ALBEDO = rainbow;
ALPHA = 1.0;
} else {
ALBEDO = center.rgb;
ALPHA = center.a;
vec3 normal_tex = texture(normal_map, UV).rgb;
normal_tex = -(normal_tex * 2.0 - 1.0);
NORMAL = normalize(TANGENT * normal_tex.x + BINORMAL * normal_tex.y + NORMAL * normal_tex.z);
}
}

View File

@@ -0,0 +1 @@
uid://bbv8bmi15e7i0

View File

@@ -0,0 +1,7 @@
# License for `checker.png`
Copyright (c) 2020 Kenney
Licensed under CC0 1.0 Universal.
Downloaded from https://kenney.nl/assets/prototype-textures

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://chjqieyps5n5r"
path="res://.godot/imported/checker.png-d334a8ae07de292fd4162f184b9dd7bc.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://textures/checker.png"
dest_files=["res://.godot/imported/checker.png-d334a8ae07de292fd4162f184b9dd7bc.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg>

After

Width:  |  Height:  |  Size: 995 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cj6jj2qp2y3j0"
path="res://.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://textures/icon.svg"
dest_files=["res://.godot/imported/icon.svg-3540dd99eafb6c4e602e8c59cee418fa.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbb4xesensj5l"
path="res://.godot/imported/paper_material.png-988da716602184231e5af32a07b98b55.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://textures/paper_material.png"
dest_files=["res://.godot/imported/paper_material.png-988da716602184231e5af32a07b98b55.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -0,0 +1,7 @@
# License for `Small-8-Direction-Characters_by_AxulArt.png`
Copyright (c) AxulArt
Licensed under CC BY 4.0 International.
Downloaded from https://axulart.itch.io/small-8-direction-characters

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ddok6ds70nvl1"
path="res://.godot/imported/small_8_direction_characters.png-af6d8bf8c330945769034bf0c0715f89.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://textures/small_8_direction_characters.png"
dest_files=["res://.godot/imported/small_8_direction_characters.png-af6d8bf8c330945769034bf0c0715f89.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0