diff --git a/.gitignore b/.gitignore index 917ddb7e..f285dcf8 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ mono_crash.*.json # Jetbrains IDE files .idea/ + +# Ignore addon plugins +3d/sprite3d/addons diff --git a/3d/sprites/3d_sprites.tscn b/3d/sprites/3d_sprites.tscn new file mode 100644 index 00000000..215dfd37 --- /dev/null +++ b/3d/sprites/3d_sprites.tscn @@ -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"] diff --git a/3d/sprites/README.md b/3d/sprites/README.md new file mode 100644 index 00000000..a4e78d2e --- /dev/null +++ b/3d/sprites/README.md @@ -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) diff --git a/3d/sprites/icon.webp b/3d/sprites/icon.webp new file mode 100644 index 00000000..8f62fb09 Binary files /dev/null and b/3d/sprites/icon.webp differ diff --git a/3d/sprites/icon.webp.import b/3d/sprites/icon.webp.import new file mode 100644 index 00000000..cc29159c --- /dev/null +++ b/3d/sprites/icon.webp.import @@ -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 diff --git a/3d/sprites/player/player.png b/3d/sprites/player/player.png new file mode 100644 index 00000000..93d58839 Binary files /dev/null and b/3d/sprites/player/player.png differ diff --git a/3d/sprites/player/player.png.import b/3d/sprites/player/player.png.import new file mode 100644 index 00000000..0231a9b9 --- /dev/null +++ b/3d/sprites/player/player.png.import @@ -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 diff --git a/3d/sprites/player/player.tscn b/3d/sprites/player/player.tscn new file mode 100644 index 00000000..a2c02227 --- /dev/null +++ b/3d/sprites/player/player.tscn @@ -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" diff --git a/3d/sprites/player/player_frames.tres b/3d/sprites/player/player_frames.tres new file mode 100644 index 00000000..f5df3a6f --- /dev/null +++ b/3d/sprites/player/player_frames.tres @@ -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 +}] diff --git a/3d/sprites/player/player_white.png b/3d/sprites/player/player_white.png new file mode 100644 index 00000000..38d82130 Binary files /dev/null and b/3d/sprites/player/player_white.png differ diff --git a/3d/sprites/player/player_white.png.import b/3d/sprites/player/player_white.png.import new file mode 100644 index 00000000..b3d31c8c --- /dev/null +++ b/3d/sprites/player/player_white.png.import @@ -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 diff --git a/3d/sprites/project.godot b/3d/sprites/project.godot new file mode 100644 index 00000000..b7f646da --- /dev/null +++ b/3d/sprites/project.godot @@ -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 diff --git a/3d/sprites/screenshots/.gdignore b/3d/sprites/screenshots/.gdignore new file mode 100644 index 00000000..e69de29b diff --git a/3d/sprites/screenshots/3d_sprites.webp b/3d/sprites/screenshots/3d_sprites.webp new file mode 100644 index 00000000..2599c7e9 Binary files /dev/null and b/3d/sprites/screenshots/3d_sprites.webp differ diff --git a/3d/sprites/scripts/3d_sprites.gd b/3d/sprites/scripts/3d_sprites.gd new file mode 100644 index 00000000..b8582a67 --- /dev/null +++ b/3d/sprites/scripts/3d_sprites.gd @@ -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 diff --git a/3d/sprites/scripts/3d_sprites.gd.uid b/3d/sprites/scripts/3d_sprites.gd.uid new file mode 100644 index 00000000..9f6ecd98 --- /dev/null +++ b/3d/sprites/scripts/3d_sprites.gd.uid @@ -0,0 +1 @@ +uid://v0e1avxpe8n7 diff --git a/3d/sprites/scripts/player.gd b/3d/sprites/scripts/player.gd new file mode 100644 index 00000000..a2998058 --- /dev/null +++ b/3d/sprites/scripts/player.gd @@ -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() diff --git a/3d/sprites/scripts/player.gd.uid b/3d/sprites/scripts/player.gd.uid new file mode 100644 index 00000000..4facb340 --- /dev/null +++ b/3d/sprites/scripts/player.gd.uid @@ -0,0 +1 @@ +uid://c7bu02ppdx1v5 diff --git a/3d/sprites/scripts/sprite_rotate.gd b/3d/sprites/scripts/sprite_rotate.gd new file mode 100644 index 00000000..ca489d53 --- /dev/null +++ b/3d/sprites/scripts/sprite_rotate.gd @@ -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)) diff --git a/3d/sprites/scripts/sprite_rotate.gd.uid b/3d/sprites/scripts/sprite_rotate.gd.uid new file mode 100644 index 00000000..67fa9e50 --- /dev/null +++ b/3d/sprites/scripts/sprite_rotate.gd.uid @@ -0,0 +1 @@ +uid://bmij60kwbx48u diff --git a/3d/sprites/shaders/negative.gdshader b/3d/sprites/shaders/negative.gdshader new file mode 100644 index 00000000..e0c9b17d --- /dev/null +++ b/3d/sprites/shaders/negative.gdshader @@ -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; +} diff --git a/3d/sprites/shaders/negative.gdshader.uid b/3d/sprites/shaders/negative.gdshader.uid new file mode 100644 index 00000000..b0ecc89c --- /dev/null +++ b/3d/sprites/shaders/negative.gdshader.uid @@ -0,0 +1 @@ +uid://dfk1vupanuypi diff --git a/3d/sprites/shaders/paper.gdshader b/3d/sprites/shaders/paper.gdshader new file mode 100644 index 00000000..bd9bce56 --- /dev/null +++ b/3d/sprites/shaders/paper.gdshader @@ -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; + } +} diff --git a/3d/sprites/shaders/paper.gdshader.uid b/3d/sprites/shaders/paper.gdshader.uid new file mode 100644 index 00000000..bf41a3c4 --- /dev/null +++ b/3d/sprites/shaders/paper.gdshader.uid @@ -0,0 +1 @@ +uid://b5ee04rjhppn4 diff --git a/3d/sprites/shaders/paper_emission.gdshader b/3d/sprites/shaders/paper_emission.gdshader new file mode 100644 index 00000000..b04d1e6f --- /dev/null +++ b/3d/sprites/shaders/paper_emission.gdshader @@ -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); + } +} diff --git a/3d/sprites/shaders/paper_emission.gdshader.uid b/3d/sprites/shaders/paper_emission.gdshader.uid new file mode 100644 index 00000000..a631a839 --- /dev/null +++ b/3d/sprites/shaders/paper_emission.gdshader.uid @@ -0,0 +1 @@ +uid://beecufb7fv40i diff --git a/3d/sprites/shaders/paper_material.gdshader b/3d/sprites/shaders/paper_material.gdshader new file mode 100644 index 00000000..7c8ab201 --- /dev/null +++ b/3d/sprites/shaders/paper_material.gdshader @@ -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; + } +} diff --git a/3d/sprites/shaders/paper_material.gdshader.uid b/3d/sprites/shaders/paper_material.gdshader.uid new file mode 100644 index 00000000..a0176ba3 --- /dev/null +++ b/3d/sprites/shaders/paper_material.gdshader.uid @@ -0,0 +1 @@ +uid://2o41hrodgn04 diff --git a/3d/sprites/shaders/paper_rainbow.gdshader b/3d/sprites/shaders/paper_rainbow.gdshader new file mode 100644 index 00000000..395dfb24 --- /dev/null +++ b/3d/sprites/shaders/paper_rainbow.gdshader @@ -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); + } +} diff --git a/3d/sprites/shaders/paper_rainbow.gdshader.uid b/3d/sprites/shaders/paper_rainbow.gdshader.uid new file mode 100644 index 00000000..4bb54204 --- /dev/null +++ b/3d/sprites/shaders/paper_rainbow.gdshader.uid @@ -0,0 +1 @@ +uid://bbv8bmi15e7i0 diff --git a/3d/sprites/textures/checker.LICENSE.md b/3d/sprites/textures/checker.LICENSE.md new file mode 100644 index 00000000..a7a1e0be --- /dev/null +++ b/3d/sprites/textures/checker.LICENSE.md @@ -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 diff --git a/3d/sprites/textures/checker.png b/3d/sprites/textures/checker.png new file mode 100644 index 00000000..46b3bf28 Binary files /dev/null and b/3d/sprites/textures/checker.png differ diff --git a/3d/sprites/textures/checker.png.import b/3d/sprites/textures/checker.png.import new file mode 100644 index 00000000..cfc5488d --- /dev/null +++ b/3d/sprites/textures/checker.png.import @@ -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 diff --git a/3d/sprites/textures/icon.svg b/3d/sprites/textures/icon.svg new file mode 100644 index 00000000..c6bbb7d8 --- /dev/null +++ b/3d/sprites/textures/icon.svg @@ -0,0 +1 @@ + diff --git a/3d/sprites/textures/icon.svg.import b/3d/sprites/textures/icon.svg.import new file mode 100644 index 00000000..0dfacf25 --- /dev/null +++ b/3d/sprites/textures/icon.svg.import @@ -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 diff --git a/3d/sprites/textures/paper_material.png b/3d/sprites/textures/paper_material.png new file mode 100644 index 00000000..bec08ef4 Binary files /dev/null and b/3d/sprites/textures/paper_material.png differ diff --git a/3d/sprites/textures/paper_material.png.import b/3d/sprites/textures/paper_material.png.import new file mode 100644 index 00000000..3d434e69 --- /dev/null +++ b/3d/sprites/textures/paper_material.png.import @@ -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 diff --git a/3d/sprites/textures/small_8_direction_characters.LICENSE.md b/3d/sprites/textures/small_8_direction_characters.LICENSE.md new file mode 100644 index 00000000..5b7d5b54 --- /dev/null +++ b/3d/sprites/textures/small_8_direction_characters.LICENSE.md @@ -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 diff --git a/3d/sprites/textures/small_8_direction_characters.png b/3d/sprites/textures/small_8_direction_characters.png new file mode 100644 index 00000000..948c6914 Binary files /dev/null and b/3d/sprites/textures/small_8_direction_characters.png differ diff --git a/3d/sprites/textures/small_8_direction_characters.png.import b/3d/sprites/textures/small_8_direction_characters.png.import new file mode 100644 index 00000000..46a50ab2 --- /dev/null +++ b/3d/sprites/textures/small_8_direction_characters.png.import @@ -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