Merge branch 'blockz' into stairs-map
This commit is contained in:
		
						commit
						4d549f708a
					
				
							
								
								
									
										13
									
								
								materials/building_block_hover.tres
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								materials/building_block_hover.tres
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| [gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://pu02smf107o8"] | ||||
| 
 | ||||
| [ext_resource type="Shader" path="res://materials/building_block.gdshader" id="1_fkxdu"] | ||||
| 
 | ||||
| [resource] | ||||
| render_priority = 0 | ||||
| shader = ExtResource("1_fkxdu") | ||||
| shader_parameter/albedo = Color(0.356373, 0.507339, 1, 1) | ||||
| shader_parameter/roughness = 0.533 | ||||
| shader_parameter/specular = 0.45 | ||||
| shader_parameter/metallic = null | ||||
| shader_parameter/uv1_scale = Vector3(1, 1, 1) | ||||
| shader_parameter/uv1_offset = null | ||||
| @ -121,6 +121,21 @@ toggle_pause_menu={ | ||||
| , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":6,"pressure":0.0,"pressed":true,"script":null) | ||||
| ] | ||||
| } | ||||
| interact={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(238, 22),"global_position":Vector2(252, 92),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) | ||||
| ] | ||||
| } | ||||
| drag_orbit={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":4,"position":Vector2(272, 24),"global_position":Vector2(286, 94),"factor":1.0,"button_index":3,"canceled":false,"pressed":true,"double_click":false,"script":null) | ||||
| ] | ||||
| } | ||||
| release_block={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(224, 40),"global_position":Vector2(238, 110),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) | ||||
| ] | ||||
| } | ||||
| toggle_noclip={ | ||||
| "deadzone": 0.5, | ||||
| "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":4194334,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
|  | ||||
| @ -3,11 +3,12 @@ | ||||
| [ext_resource type="CameraAttributesPhysical" uid="uid://cxyj2tvfksjl6" path="res://scenes/hazy_env_camera_attrs.tres" id="1_r2j1d"] | ||||
| [ext_resource type="PackedScene" uid="uid://br315evr8x2gt" path="res://scenes/hazy_env.tscn" id="2_le85m"] | ||||
| [ext_resource type="LightmapGIData" uid="uid://bp05p4yab2ukx" path="res://scenes/demo/demo.lmbake" id="2_thfwf"] | ||||
| [ext_resource type="PackedScene" uid="uid://d4fn0ljcmjdnb" path="res://scenes/demo/demo_map.tscn" id="4_0ojvw"] | ||||
| [ext_resource type="PackedScene" uid="uid://bqts60gpnb82d" path="res://scenes/demo/demo_map.tscn" id="4_0ojvw"] | ||||
| [ext_resource type="PackedScene" uid="uid://wjbuh7jk50nm" path="res://scenes/player.tscn" id="10_3xiy2"] | ||||
| [ext_resource type="PackedScene" uid="uid://d02cqylu3xwos" path="res://scenes/table.tscn" id="11_7trvw"] | ||||
| [ext_resource type="PackedScene" uid="uid://c670g1qg5gaug" path="res://scenes/interface/pause_menu.tscn" id="11_lav3p"] | ||||
| [ext_resource type="Material" uid="uid://bq5oqyuwekryv" path="res://materials/building_block.tres" id="12_i3ahj"] | ||||
| [ext_resource type="PackedScene" uid="uid://b5asfx4vribls" path="res://scenes/interface/hud.tscn" id="7_g7tfv"] | ||||
| 
 | ||||
| [node name="Demo" type="Node3D"] | ||||
| 
 | ||||
| @ -53,14 +54,12 @@ size = Vector3(43.3174, 26.5295, 43.4319) | ||||
| [node name="Player" parent="." instance=ExtResource("10_3xiy2")] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.332064, 1.5426, 3.65156) | ||||
| 
 | ||||
| [node name="table" parent="." node_paths=PackedStringArray("TrenchbroomMap") instance=ExtResource("11_7trvw")] | ||||
| transform = Transform3D(-0.0123217, 0, 0.999924, 0, 1, 0, -0.999924, 0, -0.0123217, 2.83695, 0, -4.36558) | ||||
| TrenchbroomMap = NodePath("../DemoMap") | ||||
| RelativeScale = 0.005 | ||||
| 
 | ||||
| [node name="HUD" parent="." node_paths=PackedStringArray("Player") instance=ExtResource("7_g7tfv")] | ||||
| Player = NodePath("../Player") | ||||
| 
 | ||||
| [node name="PauseMenu" parent="." instance=ExtResource("11_lav3p")] | ||||
| 
 | ||||
| [node name="table" parent="." instance=ExtResource("11_7trvw")] | ||||
| transform = Transform3D(-0.0123217, 0, 0.999924, 0, 1, 0, -0.999924, 0, -0.0123217, 0, 0, 0) | ||||
| 
 | ||||
| [node name="Node3D" parent="table" index="2" node_paths=PackedStringArray("TrenchbroomMap")] | ||||
| TrenchbroomMap = NodePath("../../DemoMap") | ||||
| BuildingBlockMaterial = ExtResource("12_i3ahj") | ||||
| BuildingBlockScale = 0.005 | ||||
| 
 | ||||
| [editable path="table"] | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| [gd_scene load_steps=135 format=4 uid="uid://d4fn0ljcmjdnb"] | ||||
| [gd_scene load_steps=135 format=4 uid="uid://bqts60gpnb82d"] | ||||
| 
 | ||||
| [ext_resource type="Script" path="res://addons/func_godot/src/map/func_godot_map.gd" id="1_2fyf3"] | ||||
| [ext_resource type="Resource" uid="uid://byyagd41ivbt1" path="res://trenchbroom/map_settings.tres" id="2_bv511"] | ||||
| [ext_resource type="Material" uid="uid://bpikku6t3gxi5" path="res://textures/white.tres" id="3_lw60r"] | ||||
| [ext_resource type="Material" uid="uid://cobb5bm4y7nk7" path="res://textures/steel.tres" id="4_ae80v"] | ||||
| [ext_resource type="Material" uid="uid://dgf570wtqn17j" path="res://textures/steel_fence.tres" id="5_jlrhq"] | ||||
| [ext_resource type="Material" uid="uid://bpikku6t3gxi5" path="res://materials/white.tres" id="3_lw60r"] | ||||
| [ext_resource type="Material" uid="uid://cobb5bm4y7nk7" path="res://materials/steel.tres" id="4_ae80v"] | ||||
| [ext_resource type="Material" uid="uid://dgf570wtqn17j" path="res://materials/steel_fence.tres" id="5_jlrhq"] | ||||
| 
 | ||||
| [sub_resource type="ArrayMesh" id="ArrayMesh_wgnqo"] | ||||
| lightmap_size_hint = Vector2i(1234, 1226) | ||||
|  | ||||
							
								
								
									
										51
									
								
								scenes/interface/hud.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								scenes/interface/hud.tscn
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| [gd_scene load_steps=2 format=3 uid="uid://b5asfx4vribls"] | ||||
| 
 | ||||
| [ext_resource type="Script" path="res://scripts/Hud.cs" id="1_hvqpl"] | ||||
| 
 | ||||
| [node name="HUD" type="Control" node_paths=PackedStringArray("HoverText")] | ||||
| layout_mode = 3 | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| mouse_filter = 2 | ||||
| script = ExtResource("1_hvqpl") | ||||
| HoverText = NodePath("HoverText") | ||||
| 
 | ||||
| [node name="HoverText" type="RichTextLabel" parent="."] | ||||
| layout_mode = 1 | ||||
| anchors_preset = 7 | ||||
| anchor_left = 0.5 | ||||
| anchor_top = 1.0 | ||||
| anchor_right = 0.5 | ||||
| anchor_bottom = 1.0 | ||||
| offset_left = -94.0 | ||||
| offset_top = -163.0 | ||||
| offset_right = 95.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 0 | ||||
| theme_override_font_sizes/normal_font_size = 32 | ||||
| bbcode_enabled = true | ||||
| text = "[Hover Text]" | ||||
| fit_content = true | ||||
| scroll_active = false | ||||
| autowrap_mode = 0 | ||||
| 
 | ||||
| [node name="CenterContainer" type="CenterContainer" parent="."] | ||||
| layout_mode = 1 | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| 
 | ||||
| [node name="ColorRect" type="ColorRect" parent="CenterContainer"] | ||||
| custom_minimum_size = Vector2(16, 2) | ||||
| layout_mode = 2 | ||||
| mouse_filter = 1 | ||||
| 
 | ||||
| [node name="ColorRect2" type="ColorRect" parent="CenterContainer"] | ||||
| custom_minimum_size = Vector2(2, 16) | ||||
| layout_mode = 2 | ||||
| mouse_filter = 1 | ||||
| @ -8,7 +8,7 @@ | ||||
| height = 1.9 | ||||
| radius = 0.3 | ||||
| 
 | ||||
| [node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("Eye", "HeightBasedWindPlayer", "FootstepPlayer")] | ||||
| [node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("Eye", "LookingAt", "HeightBasedWindPlayer", "FootstepPlayer")] | ||||
| floor_block_on_wall = false | ||||
| floor_snap_length = 0.25 | ||||
| script = ExtResource("1_aff2a") | ||||
| @ -16,6 +16,7 @@ MovementSpeed = 4.0 | ||||
| JumpVelocity = 6.0 | ||||
| Gravity = 13.0 | ||||
| Eye = NodePath("PlayerEyeCamera") | ||||
| LookingAt = NodePath("PlayerEyeCamera/LookAt") | ||||
| HeightBasedWindPlayer = NodePath("HeightBasedWindFx") | ||||
| MinVolumeWindHeight = -5.0 | ||||
| MaxVolumeWindHeight = 20.0 | ||||
| @ -28,27 +29,16 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7, 0) | ||||
| [node name="Ears" type="AudioListener3D" parent="PlayerEyeCamera"] | ||||
| current = true | ||||
| 
 | ||||
| [node name="LookAt" type="RayCast3D" parent="PlayerEyeCamera"] | ||||
| target_position = Vector3(0, 0, -4) | ||||
| collision_mask = 4 | ||||
| debug_shape_custom_color = Color(1, 1, 1, 1) | ||||
| debug_shape_thickness = 5 | ||||
| 
 | ||||
| [node name="CollisionShape3D" type="CollisionShape3D" parent="."] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.95, 0) | ||||
| shape = SubResource("CylinderShape3D_rgktv") | ||||
| 
 | ||||
| [node name="CenterContainer" type="CenterContainer" parent="."] | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| 
 | ||||
| [node name="ColorRect" type="ColorRect" parent="CenterContainer"] | ||||
| custom_minimum_size = Vector2(16, 2) | ||||
| layout_mode = 2 | ||||
| mouse_filter = 1 | ||||
| 
 | ||||
| [node name="ColorRect2" type="ColorRect" parent="CenterContainer"] | ||||
| custom_minimum_size = Vector2(2, 16) | ||||
| layout_mode = 2 | ||||
| mouse_filter = 1 | ||||
| 
 | ||||
| [node name="HeightBasedWindFx" type="AudioStreamPlayer" parent="."] | ||||
| process_mode = 3 | ||||
| stream = ExtResource("2_ab4w4") | ||||
|  | ||||
| @ -1,21 +1,79 @@ | ||||
| [gd_scene load_steps=4 format=3 uid="uid://d02cqylu3xwos"] | ||||
| [gd_scene load_steps=10 format=3 uid="uid://d02cqylu3xwos"] | ||||
| 
 | ||||
| [ext_resource type="PackedScene" uid="uid://diwlyi146eroa" path="res://models/table.fbx" id="1_1soa3"] | ||||
| [ext_resource type="Script" path="res://scripts/BuildingBlockCreator.cs" id="2_rqgiy"] | ||||
| [ext_resource type="Script" path="res://scripts/Table.cs" id="1_cb7s1"] | ||||
| [ext_resource type="Material" uid="uid://bq5oqyuwekryv" path="res://materials/building_block.tres" id="2_1s35y"] | ||||
| [ext_resource type="Material" uid="uid://pu02smf107o8" path="res://materials/building_block_hover.tres" id="3_m64id"] | ||||
| [ext_resource type="Script" path="res://scripts/Orbit.cs" id="4_nyqjn"] | ||||
| 
 | ||||
| [sub_resource type="BoxShape3D" id="BoxShape3D_iiew7"] | ||||
| size = Vector3(1.26587, 0.102112, 2.3989) | ||||
| size = Vector3(1.26587, 1.10037, 2.3989) | ||||
| 
 | ||||
| [node name="table" type="StaticBody3D"] | ||||
| collision_layer = 2 | ||||
| collision_mask = 2 | ||||
| [sub_resource type="BoxShape3D" id="BoxShape3D_kn6mn"] | ||||
| size = Vector3(5, 5, 5) | ||||
| 
 | ||||
| [sub_resource type="BoxShape3D" id="BoxShape3D_5k7xn"] | ||||
| size = Vector3(5, 5, 5) | ||||
| 
 | ||||
| [sub_resource type="BoxShape3D" id="BoxShape3D_3kmm7"] | ||||
| size = Vector3(1.3, 0.2, 2.4) | ||||
| 
 | ||||
| [node name="table" type="RigidBody3D" node_paths=PackedStringArray("SpawnPoint", "Orbit")] | ||||
| collision_layer = 7 | ||||
| collision_mask = 7 | ||||
| lock_rotation = true | ||||
| freeze = true | ||||
| script = ExtResource("1_cb7s1") | ||||
| BlockMaterial = ExtResource("2_1s35y") | ||||
| BlockHoverMaterial = ExtResource("3_m64id") | ||||
| SpawnPoint = NodePath("SpawnPoint") | ||||
| BlockMask = 10 | ||||
| Orbit = NodePath("Orbit") | ||||
| InteractName = "build" | ||||
| 
 | ||||
| [node name="table" parent="." instance=ExtResource("1_1soa3")] | ||||
| 
 | ||||
| [node name="CollisionShape3D" type="CollisionShape3D" parent="."] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00354004, 1.05606, -0.00126699) | ||||
| [node name="TableCollider" type="CollisionShape3D" parent="."] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00354004, 0.55693, -0.00126699) | ||||
| shape = SubResource("BoxShape3D_iiew7") | ||||
| 
 | ||||
| [node name="Node3D" type="Node3D" parent="."] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.58235, 0) | ||||
| script = ExtResource("2_rqgiy") | ||||
| [node name="SpawnPoint" type="Node3D" parent="."] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7677, 0) | ||||
| 
 | ||||
| [node name="TableWalls" type="StaticBody3D" parent="."] | ||||
| collision_layer = 2 | ||||
| collision_mask = 2 | ||||
| 
 | ||||
| [node name="Wall1" type="CollisionShape3D" parent="TableWalls"] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.6, 3.66627) | ||||
| shape = SubResource("BoxShape3D_kn6mn") | ||||
| 
 | ||||
| [node name="Wall2" type="CollisionShape3D" parent="TableWalls"] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.6, -3.69933) | ||||
| shape = SubResource("BoxShape3D_kn6mn") | ||||
| 
 | ||||
| [node name="Wall3" type="CollisionShape3D" parent="TableWalls"] | ||||
| transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -3.1173, 3.6, 0) | ||||
| shape = SubResource("BoxShape3D_5k7xn") | ||||
| 
 | ||||
| [node name="Wall4" type="CollisionShape3D" parent="TableWalls"] | ||||
| transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 3.1173, 3.6, 0) | ||||
| shape = SubResource("BoxShape3D_5k7xn") | ||||
| 
 | ||||
| [node name="Roof" type="CollisionShape3D" parent="TableWalls"] | ||||
| transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 6, 0) | ||||
| shape = SubResource("BoxShape3D_3kmm7") | ||||
| 
 | ||||
| [node name="Orbit" type="Node3D" parent="." node_paths=PackedStringArray("Camera", "Hand")] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.12311, 0) | ||||
| script = ExtResource("4_nyqjn") | ||||
| Camera = NodePath("OrbitCamera") | ||||
| Hand = NodePath("OrbitCamera/OrbitHand") | ||||
| 
 | ||||
| [node name="OrbitCamera" type="Camera3D" parent="Orbit"] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1) | ||||
| 
 | ||||
| [node name="OrbitHand" type="Node3D" parent="Orbit/OrbitCamera"] | ||||
| transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, -0.1, -0.26) | ||||
| 
 | ||||
| [connection signal="Interacted" from="." to="." method="Interact"] | ||||
|  | ||||
							
								
								
									
										144
									
								
								scripts/BuildingBlock.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								scripts/BuildingBlock.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,144 @@ | ||||
| using Godot; | ||||
| using Godot.Collections; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class BuildingBlock : Interactible { | ||||
|         [Signal] | ||||
|         public delegate void PickUpEventHandler(BuildingBlock block); | ||||
| 
 | ||||
|         public BaseBlock Base; | ||||
|         public ShaderMaterial Material; | ||||
|         public ShaderMaterial HoverMaterial; | ||||
|         public float RelativeScale; | ||||
|         public uint PhysicalModeLayer; | ||||
| 
 | ||||
|         public BlockMode Mode { private set; get; } = BlockMode.Physical; | ||||
| 
 | ||||
|         private MeshInstance3D MeshInstance; | ||||
| 
 | ||||
|         private ShaderMaterial[] NormalMaterialArr; | ||||
|         private ShaderMaterial[] HoverMaterialArr; | ||||
| 
 | ||||
|         public BuildingBlock() { | ||||
|             Name = "BuildingBlock"; | ||||
|             FreezeMode = FreezeModeEnum.Kinematic; | ||||
|             CanSleep = false; | ||||
|         } | ||||
| 
 | ||||
|         public override void _Ready() { | ||||
|             base._Ready(); | ||||
| 
 | ||||
|             UpdatePhysics(); | ||||
| 
 | ||||
|             HoverMaterial ??= Material; | ||||
| 
 | ||||
|             Hovered += OnHover; | ||||
|             Interacted += OnInteract; | ||||
| 
 | ||||
|             MeshInstance = new MeshInstance3D() { | ||||
|                 Mesh = Base.Mesh, | ||||
|                 Scale = Vector3.One * RelativeScale, | ||||
|             }; | ||||
|             AddChild(MeshInstance); | ||||
| 
 | ||||
|             int count = MeshInstance.GetSurfaceOverrideMaterialCount(); | ||||
| 
 | ||||
|             NormalMaterialArr = new ShaderMaterial[count]; | ||||
|             HoverMaterialArr = new ShaderMaterial[count]; | ||||
| 
 | ||||
|             for (int i = 0; i < MeshInstance.GetSurfaceOverrideMaterialCount(); i++) { | ||||
|                 var replacedMaterial = MeshInstance.Mesh.SurfaceGetMaterial(i); | ||||
|                 var transparency = replacedMaterial.Get("transparency"); | ||||
|                 if (((int)transparency) != 0) { | ||||
|                     ShaderMaterial newMat = (ShaderMaterial)Material.Duplicate(); | ||||
|                     newMat.SetShaderParameter("texture_albedo_for_alpha", replacedMaterial.Get("albedo_texture")); | ||||
| 
 | ||||
|                     ShaderMaterial newHoverMat = (ShaderMaterial)HoverMaterial.Duplicate(); | ||||
|                     newHoverMat.SetShaderParameter("texture_albedo_for_alpha", replacedMaterial.Get("albedo_texture")); | ||||
| 
 | ||||
|                     NormalMaterialArr[i] = newMat; | ||||
|                     HoverMaterialArr[i] = newHoverMat; | ||||
|                 } else { | ||||
|                     NormalMaterialArr[i] = Material; | ||||
|                 } | ||||
|                 MeshInstance.SetSurfaceOverrideMaterial(i, NormalMaterialArr[i]); | ||||
|             } | ||||
| 
 | ||||
|             foreach (var shape in Base.Colliders) { | ||||
|                 var bigPoints = ((ConvexPolygonShape3D)shape.Shape).Points; | ||||
|                 var points = new Vector3[bigPoints.Length]; | ||||
|                 for (int i = 0; i < bigPoints.Length; i++) { | ||||
|                     points[i] = bigPoints[i] * RelativeScale; | ||||
|                 } | ||||
|                 AddChild(new CollisionShape3D { | ||||
|                     Shape = new ConvexPolygonShape3D { | ||||
|                         Points = points, | ||||
|                     }, | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void SetMode(BlockMode mode) { | ||||
|             GD.Print(mode); | ||||
|             Mode = mode; | ||||
|             SetMaterial(false); | ||||
|             UpdatePhysics(); | ||||
|         } | ||||
| 
 | ||||
|         private void UpdatePhysics() { | ||||
|             if (Mode != BlockMode.NonPhysical) { | ||||
|                 CollisionLayer = PhysicalModeLayer; | ||||
|                 CollisionMask = PhysicalModeLayer; | ||||
|                 if (Mode == BlockMode.Dragged) { | ||||
|                     FreezeMode = FreezeModeEnum.Kinematic; | ||||
|                     Freeze = true; | ||||
|                 } else { | ||||
|                     Freeze = false; | ||||
|                 } | ||||
|             } else { | ||||
|                 CollisionLayer = 0; | ||||
|                 CollisionMask = 0; | ||||
|                 FreezeMode = FreezeModeEnum.Static; | ||||
|                 Freeze = true; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void OnHover(bool hovered) { | ||||
|             if (Mode != BlockMode.NonPhysical) { | ||||
|                 SetMaterial(hovered); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void SetMaterial(bool hoverMaterial) { | ||||
|             for (int i = 0; i < MeshInstance.GetSurfaceOverrideMaterialCount(); i++) { | ||||
|                 if (hoverMaterial) | ||||
|                     MeshInstance.SetSurfaceOverrideMaterial(i, HoverMaterialArr[i]); | ||||
|                 else | ||||
|                     MeshInstance.SetSurfaceOverrideMaterial(i, NormalMaterialArr[i]); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void OnInteract(InputEvent _) { | ||||
|             EmitSignal(SignalName.PickUp, this); | ||||
|         } | ||||
| 
 | ||||
|         public struct BaseBlock { | ||||
|             public Mesh Mesh; | ||||
|             public Array<CollisionShape3D> Colliders; | ||||
| 
 | ||||
|             public BaseBlock(StaticBody3D reference) { | ||||
|                 Mesh = ((MeshInstance3D)reference.FindChild("*_mesh_instance")).Mesh; | ||||
|                 Colliders = new Array<CollisionShape3D>(); | ||||
|                 foreach (var shape in reference.FindChildren("*_collision_shape")) { | ||||
|                     Colliders.Add((CollisionShape3D)shape); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public enum BlockMode { | ||||
|             Physical, | ||||
|             Dragged, | ||||
|             NonPhysical, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,64 +0,0 @@ | ||||
| using Godot; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class BuildingBlockCreator : Node3D { | ||||
|         [Export] | ||||
|         public Node3D TrenchbroomMap; | ||||
|         // [Export] | ||||
|         // public PackedScene BuildingBlockPrefab; | ||||
|         [Export] | ||||
|         public ShaderMaterial BuildingBlockMaterial; | ||||
|         [Export] | ||||
|         public float BuildingBlockScale = 0.05f; | ||||
| 
 | ||||
|         public override void _Ready() { | ||||
|             var children = TrenchbroomMap.FindChildren("*_buildingblock"); | ||||
|             foreach (var buildingBlockStaticBody in children) { | ||||
|                 var buildingBlock = new RigidBody3D() { | ||||
|                     CollisionMask = 0b10, | ||||
|                     CollisionLayer = 0b10, | ||||
|                 }; | ||||
| 
 | ||||
|                 var smallMesh = new MeshInstance3D { | ||||
|                     Mesh = buildingBlockStaticBody.GetChild<MeshInstance3D>(0).Mesh, | ||||
|                     Scale = Vector3.One * BuildingBlockScale, | ||||
|                 }; | ||||
|                 for (int i = 0; i < smallMesh.GetSurfaceOverrideMaterialCount(); i++) { | ||||
|                     var replacedMaterial = smallMesh.Mesh.SurfaceGetMaterial(i); | ||||
|                     var transparency = replacedMaterial.Get("transparency"); | ||||
|                     if (((int)transparency) != 0) { | ||||
|                         // Make a new material, using the partly-transparent albedo as an alpha mask | ||||
|                         var blockMaterialWithAlphaMask = (ShaderMaterial)BuildingBlockMaterial.Duplicate(); | ||||
|                         blockMaterialWithAlphaMask.SetShaderParameter("texture_albedo_for_alpha", replacedMaterial.Get("albedo_texture")); | ||||
|                         smallMesh.SetSurfaceOverrideMaterial(i, blockMaterialWithAlphaMask); | ||||
|                     } else { | ||||
|                         smallMesh.SetSurfaceOverrideMaterial(i, BuildingBlockMaterial); | ||||
|                     } | ||||
|                 } | ||||
|                 buildingBlock.AddChild(smallMesh); | ||||
| 
 | ||||
|                 var collisionShapes = buildingBlockStaticBody.FindChildren("*_collision_shape"); | ||||
|                 foreach (var shape in collisionShapes) { | ||||
|                     var bigPoints = ((ConvexPolygonShape3D)((CollisionShape3D)shape).Shape).Points; | ||||
|                     var points = new Vector3[bigPoints.Length]; | ||||
|                     for (int i = 0; i < bigPoints.Length; i++) { | ||||
|                         points[i] = bigPoints[i] * BuildingBlockScale; | ||||
|                     } | ||||
|                     buildingBlock.AddChild(new CollisionShape3D { | ||||
|                         Shape = new ConvexPolygonShape3D { | ||||
|                             Points = points, | ||||
|                         }, | ||||
|                     }); | ||||
|                 } | ||||
| 
 | ||||
|                 AddChild(buildingBlock); | ||||
|                 var rng = new RandomNumberGenerator(); | ||||
|                 buildingBlock.Translate(Vector3.One * rng.Randf() * 0.5f); | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public override void _Process(double delta) { | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										54
									
								
								scripts/Hud.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								scripts/Hud.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| using Godot; | ||||
| using System.Text; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class Hud : Control { | ||||
|         [Export] | ||||
|         public Player Player; | ||||
|         [Export] | ||||
|         public RichTextLabel HoverText; | ||||
| 
 | ||||
|         private Interactible Hovered; | ||||
| 
 | ||||
|         public override void _Process(double delta) { | ||||
|             if (Player == null) | ||||
|                 return; | ||||
| 
 | ||||
|             GodotObject collider = null; | ||||
|             if (Input.MouseMode == Input.MouseModeEnum.Captured) { | ||||
|                 if (Player.Eye.Current) | ||||
|                     collider = Player.LookingAt.GetCollider(); | ||||
|             } else { | ||||
|                 var results = Util.RaycastFromMouse(GetViewport().GetCamera3D()); | ||||
|                 collider = results?.Collider; | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             if (collider is Interactible interactible) { | ||||
|                 if (interactible != Hovered) { | ||||
|                     Hovered?.SetHovered(false); | ||||
|                     interactible.SetHovered(true); | ||||
|                 } | ||||
| 
 | ||||
|                 Hovered = interactible; | ||||
| 
 | ||||
|                 StringBuilder Builder = new StringBuilder(); | ||||
|                 foreach (var e in InputMap.ActionGetEvents("interact")) { | ||||
|                     Builder.Append($"{e.AsText().Replace("(Physical)", "")}: {interactible.InteractName}"); | ||||
|                 } | ||||
| 
 | ||||
|                 HoverText.Text = Builder.ToString(); | ||||
|             } else { | ||||
|                 Hovered?.SetHovered(false); | ||||
|                 Hovered = null; | ||||
|                 HoverText.Text = ""; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public override void _UnhandledInput(InputEvent @event) { | ||||
|             if (@event.IsAction("interact") && Hovered != null) { | ||||
|                 Hovered.HandleInput(@event); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										23
									
								
								scripts/Interactible.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								scripts/Interactible.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| 
 | ||||
| using Godot; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class Interactible : RigidBody3D { | ||||
|         [Signal] | ||||
|         public delegate void InteractedEventHandler(InputEvent e); | ||||
|         [Signal] | ||||
|         public delegate void HoveredEventHandler(bool hovered); | ||||
| 
 | ||||
|         [Export] | ||||
|         public string InteractName; | ||||
| 
 | ||||
|         public void HandleInput(InputEvent e) { | ||||
|             if (e.IsPressed()) | ||||
|                 EmitSignal(SignalName.Interacted, e); | ||||
|         } | ||||
| 
 | ||||
|         public void SetHovered(bool hovered) { | ||||
|             EmitSignal(SignalName.Hovered, hovered); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										90
									
								
								scripts/Orbit.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								scripts/Orbit.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | ||||
| using Godot; | ||||
| using System; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class Orbit : Node3D { | ||||
|         [Export(PropertyHint.Range, "0,10,0.1")] | ||||
|         public float MaxCameraDistance = 1f; | ||||
|         [Export(PropertyHint.Range, "0,10,0.1")] | ||||
|         public float MinCameraDistance = 0.1f; | ||||
| 
 | ||||
|         [Export] | ||||
|         public Camera3D Camera; | ||||
|         [Export] | ||||
|         public Node3D Hand; | ||||
|         [Export] | ||||
|         public BuildingBlock HeldBlock { private set; get; } | ||||
| 
 | ||||
|         [Export] | ||||
|         public bool IsEnabled { private set; get; } = false; | ||||
| 
 | ||||
|         private float CurrentYaw = 0; | ||||
|         private float CurrentPitch = 0; | ||||
| 
 | ||||
|         // Called when the node enters the scene tree for the first time. | ||||
|         public override void _Ready() { | ||||
|         } | ||||
| 
 | ||||
|         // Called every frame. 'delta' is the elapsed time since the previous frame. | ||||
|         public override void _Process(double delta) { | ||||
|             Quaternion = new Quaternion(Vector3.Up, CurrentYaw) * new Quaternion(Vector3.Right, CurrentPitch); | ||||
|             if (HeldBlock != null) | ||||
|                 HeldBlock.Position = HeldBlock.Position.Lerp(Vector3.Zero, 0.2f); | ||||
|         } | ||||
| 
 | ||||
|         public void SetEnabled(bool enabled) { | ||||
|             IsEnabled = enabled; | ||||
|             Camera.Current = enabled; | ||||
|             if (IsEnabled) | ||||
|                 Input.MouseMode = Input.MouseModeEnum.Visible; | ||||
|             else | ||||
|                 Input.MouseMode = Input.MouseModeEnum.Captured; | ||||
|         } | ||||
| 
 | ||||
|         public override void _UnhandledInput(InputEvent @event) { | ||||
|             if (!IsEnabled) | ||||
|                 return; | ||||
| 
 | ||||
|             if (@event.IsActionPressed("drag_orbit")) | ||||
|                 Input.MouseMode = Input.MouseModeEnum.Captured; | ||||
|             if (@event.IsActionReleased("drag_orbit")) | ||||
|                 Input.MouseMode = Input.MouseModeEnum.Visible; | ||||
| 
 | ||||
|             if (Input.IsActionPressed("drag_orbit") && @event is InputEventMouseMotion mouseMotion) { | ||||
|                 var cameraSensitivity = UserSettings.Singleton.GetCameraSpeedMultipliers(); | ||||
|                 var mouseMultiplier = 0.0003f; | ||||
|                 CurrentYaw -= mouseMotion.ScreenRelative.X * mouseMultiplier * cameraSensitivity.X; | ||||
|                 CurrentPitch -= mouseMotion.ScreenRelative.Y * mouseMultiplier * cameraSensitivity.Y; | ||||
| 
 | ||||
|                 CurrentPitch = Mathf.Clamp(CurrentPitch, -Mathf.Pi * 0.49f, 0); | ||||
|             } | ||||
| 
 | ||||
|             if (@event.IsActionPressed("release_block")) { | ||||
|                 HeldBlock.SetMode(BuildingBlock.BlockMode.Physical); | ||||
|                 HeldBlock.Reparent(GetParent()); | ||||
|                 var normal = Camera.ProjectRayNormal(Camera.GetViewport().GetMousePosition()); | ||||
|                 var direction = normal * 10; | ||||
| 
 | ||||
|                 var res = Util.RaycastFromMouse(Camera, 0b1111); | ||||
|                 if (res is RaycastResult results) { | ||||
|                     GD.Print(results.Position); | ||||
|                     direction = (results.Position - HeldBlock.GlobalPosition + Vector3.Up * 0.5f) * 3; | ||||
|                 } | ||||
|                 HeldBlock.ApplyImpulse(direction); | ||||
| 
 | ||||
|                 HeldBlock = null; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public bool HoldBlock(BuildingBlock block) { | ||||
|             if (HeldBlock != null) | ||||
|                 return false; // TODO | ||||
| 
 | ||||
|             HeldBlock = block; | ||||
|             HeldBlock.SetMode(BuildingBlock.BlockMode.NonPhysical); | ||||
|             HeldBlock.Reparent(Hand, true); | ||||
|             HeldBlock.Rotation = Vector3.Zero; | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -2,6 +2,7 @@ using Godot; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class Player : CharacterBody3D { | ||||
|         [ExportCategory("Movement")] | ||||
|         [Export] | ||||
|         public float MovementSpeed = 7; | ||||
|         [Export] | ||||
| @ -12,8 +13,11 @@ namespace Gmtk24 { | ||||
|         public float JumpBufferLengthSeconds = 0.2f; | ||||
|         [Export] | ||||
|         public float Gravity = 20; | ||||
|         [ExportCategory("Vision")] | ||||
|         [Export] | ||||
|         public Node3D Eye; | ||||
|         public Camera3D Eye; | ||||
|         [Export] | ||||
|         public RayCast3D LookingAt; | ||||
|         [ExportCategory("Noises")] | ||||
|         [Export] | ||||
|         public AudioStreamPlayer HeightBasedWindPlayer; | ||||
|  | ||||
| @ -0,0 +1,64 @@ | ||||
| using Godot; | ||||
| using System.Linq; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class Table : Interactible { | ||||
|         [Export(PropertyHint.NodeType, "FuncGodotMap")] | ||||
|         public Node3D TrenchbroomMap; | ||||
|         [Export(PropertyHint.Range, "0.005,0.1,0.005,or_greater")] | ||||
|         public float RelativeScale = 0.05f; | ||||
|         [Export] | ||||
|         public ShaderMaterial BlockMaterial; | ||||
|         [Export] | ||||
|         public ShaderMaterial BlockHoverMaterial; | ||||
|         [Export] | ||||
|         public Node3D SpawnPoint; | ||||
|         [Export(PropertyHint.LayersAvoidance)] | ||||
|         public uint BlockMask; | ||||
| 
 | ||||
|         [Export] | ||||
|         public Orbit Orbit; | ||||
| 
 | ||||
|         // Called when the node enters the scene tree for the first time. | ||||
|         public override void _Ready() { | ||||
|             Vector3 SpawnPos = Vector3.Zero; | ||||
| 
 | ||||
|             if (SpawnPoint != null) | ||||
|                 SpawnPos = SpawnPoint.GlobalPosition - GlobalPosition; | ||||
| 
 | ||||
|             SpawnBlocks(SpawnPos); | ||||
|         } | ||||
| 
 | ||||
|         public void SpawnBlocks(Vector3 position) { | ||||
|             var rng = new RandomNumberGenerator(); | ||||
| 
 | ||||
|             var children = TrenchbroomMap.FindChildren("*_buildingblock"); | ||||
|             foreach (StaticBody3D buildingBlockStaticBody in children.Cast<StaticBody3D>()) { | ||||
| 
 | ||||
|                 var baseBlock = new BuildingBlock.BaseBlock(buildingBlockStaticBody); | ||||
| 
 | ||||
|                 var block = new BuildingBlock() { | ||||
|                     Base = baseBlock, | ||||
|                     Material = BlockMaterial, | ||||
|                     HoverMaterial = BlockHoverMaterial, | ||||
|                     Position = position + Vector3.One * (rng.Randf() * 0.5f - 0.25f) + Vector3.Up * rng.Randf(), | ||||
|                     PhysicalModeLayer = BlockMask, | ||||
|                     RelativeScale = RelativeScale, | ||||
|                 }; | ||||
| 
 | ||||
|                 AddChild(block); | ||||
| 
 | ||||
|                 block.PickUp += OnBlockPickup; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void Interact(InputEvent _) { | ||||
|             Orbit.SetEnabled(true); | ||||
|         } | ||||
| 
 | ||||
|         public void OnBlockPickup(BuildingBlock block) { | ||||
|             Orbit.HoldBlock(block); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
							
								
								
									
										36
									
								
								scripts/Util.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								scripts/Util.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| 
 | ||||
| using Godot; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public static class Util { | ||||
|         public static RaycastResult? RaycastFromMouse(Camera3D camera, uint mask = 0b1000) { | ||||
|             var viewport = camera.GetViewport(); | ||||
|             var origin = camera.ProjectRayOrigin(viewport.GetMousePosition()); | ||||
|             var normal = camera.ProjectRayNormal(viewport.GetMousePosition()) * 10000; | ||||
|             var ray = new PhysicsRayQueryParameters3D { | ||||
|                 From = origin, | ||||
|                 To = normal, | ||||
|                 CollideWithBodies = true, | ||||
|                 CollisionMask = mask, | ||||
|                 HitBackFaces = false, | ||||
|                 HitFromInside = false, | ||||
|             }; | ||||
|             var results = camera.GetWorld3D().DirectSpaceState.IntersectRay(ray); | ||||
|             if (results.ContainsKey("position")) { | ||||
|                 return new RaycastResult() { | ||||
|                     Collider = (GodotObject)results["collider"], | ||||
|                     Position = (Vector3)results["position"], | ||||
|                     Normal = (Vector3)results["normal"], | ||||
|                 }; | ||||
|             } | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public struct RaycastResult { | ||||
|         public Vector3 Position; | ||||
|         public Vector3 Normal; | ||||
|         public GodotObject Collider; | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user