adding prototype

This commit is contained in:
Jonas Weinz 2023-01-19 19:08:00 +01:00
parent ac52443931
commit 9ed5f8bc3d
20 changed files with 506 additions and 0 deletions

2
01_prototype/.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

2
01_prototype/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# Godot 4+ specific ignores
.godot/

View File

@ -0,0 +1,37 @@
extends Node3D
@export var num_balls: int = 10
@export var force_strength: float = 10
# Called when the node enters the scene tree for the first time.
func _enter_tree():
for i in range(num_balls):
var x = randf_range(-10,10)
var y = 2
var z = randf_range(-10,10)
var charge = randf_range(-1,1)
#if charge > -0.8 and charge < 0:
# charge = -0.8
#if charge < 0.8 and charge > 0:
# charge = 0.8
var ball = preload("res://magnetic_ball.tscn").instantiate()
ball.position = Vector3(x,y,z)
ball.charge = charge
self.add_child(ball)
# add force field:
var ffield = Node3D.new()
ffield.set_script(MagneticForceField)
ffield.charge = charge
ffield.affected_objects_root = self
ffield.force_strength = self.force_strength
ball.add_child(ffield)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

1
01_prototype/icon.svg Normal file
View File

@ -0,0 +1 @@
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="translate(32 32)"><path d="m-16-32c-8.86 0-16 7.13-16 15.99v95.98c0 8.86 7.13 15.99 16 15.99h96c8.86 0 16-7.13 16-15.99v-95.98c0-8.85-7.14-15.99-16-15.99z" fill="#363d52"/><path d="m-16-32c-8.86 0-16 7.13-16 15.99v95.98c0 8.86 7.13 15.99 16 15.99h96c8.86 0 16-7.13 16-15.99v-95.98c0-8.85-7.14-15.99-16-15.99zm0 4h96c6.64 0 12 5.35 12 11.99v95.98c0 6.64-5.35 11.99-12 11.99h-96c-6.64 0-12-5.35-12-11.99v-95.98c0-6.64 5.36-11.99 12-11.99z" fill-opacity=".4"/></g><g stroke-width="9.92746" transform="matrix(.10073078 0 0 .10073078 12.425923 2.256365)"><path d="m0 0s-.325 1.994-.515 1.976l-36.182-3.491c-2.879-.278-5.115-2.574-5.317-5.459l-.994-14.247-27.992-1.997-1.904 12.912c-.424 2.872-2.932 5.037-5.835 5.037h-38.188c-2.902 0-5.41-2.165-5.834-5.037l-1.905-12.912-27.992 1.997-.994 14.247c-.202 2.886-2.438 5.182-5.317 5.46l-36.2 3.49c-.187.018-.324-1.978-.511-1.978l-.049-7.83 30.658-4.944 1.004-14.374c.203-2.91 2.551-5.263 5.463-5.472l38.551-2.75c.146-.01.29-.016.434-.016 2.897 0 5.401 2.166 5.825 5.038l1.959 13.286h28.005l1.959-13.286c.423-2.871 2.93-5.037 5.831-5.037.142 0 .284.005.423.015l38.556 2.75c2.911.209 5.26 2.562 5.463 5.472l1.003 14.374 30.645 4.966z" fill="#fff" transform="matrix(4.162611 0 0 -4.162611 919.24059 771.67186)"/><path d="m0 0v-47.514-6.035-5.492c.108-.001.216-.005.323-.015l36.196-3.49c1.896-.183 3.382-1.709 3.514-3.609l1.116-15.978 31.574-2.253 2.175 14.747c.282 1.912 1.922 3.329 3.856 3.329h38.188c1.933 0 3.573-1.417 3.855-3.329l2.175-14.747 31.575 2.253 1.115 15.978c.133 1.9 1.618 3.425 3.514 3.609l36.182 3.49c.107.01.214.014.322.015v4.711l.015.005v54.325c5.09692 6.4164715 9.92323 13.494208 13.621 19.449-5.651 9.62-12.575 18.217-19.976 26.182-6.864-3.455-13.531-7.369-19.828-11.534-3.151 3.132-6.7 5.694-10.186 8.372-3.425 2.751-7.285 4.768-10.946 7.118 1.09 8.117 1.629 16.108 1.846 24.448-9.446 4.754-19.519 7.906-29.708 10.17-4.068-6.837-7.788-14.241-11.028-21.479-3.842.642-7.702.88-11.567.926v.006c-.027 0-.052-.006-.075-.006-.024 0-.049.006-.073.006v-.006c-3.872-.046-7.729-.284-11.572-.926-3.238 7.238-6.956 14.642-11.03 21.479-10.184-2.264-20.258-5.416-29.703-10.17.216-8.34.755-16.331 1.848-24.448-3.668-2.35-7.523-4.367-10.949-7.118-3.481-2.678-7.036-5.24-10.188-8.372-6.297 4.165-12.962 8.079-19.828 11.534-7.401-7.965-14.321-16.562-19.974-26.182 4.4426579-6.973692 9.2079702-13.9828876 13.621-19.449z" fill="#478cbf" transform="matrix(4.162611 0 0 -4.162611 104.69892 525.90697)"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916 0-3.569 1.406-3.852 3.33l-2.211 14.994h-31.459l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616l-1.121 16.063-32.547 3.138c.015-3.498.06-7.33.06-8.093 0-34.374 43.605-50.896 97.781-51.086h.066.067c54.176.19 97.766 16.712 97.766 51.086 0 .777.047 4.593.063 8.093z" fill="#478cbf" transform="matrix(4.162611 0 0 -4.162611 784.07144 817.24284)"/><path d="m0 0c0-12.052-9.765-21.815-21.813-21.815-12.042 0-21.81 9.763-21.81 21.815 0 12.044 9.768 21.802 21.81 21.802 12.048 0 21.813-9.758 21.813-21.802" fill="#fff" transform="matrix(4.162611 0 0 -4.162611 389.21484 625.67104)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996 0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479c8 0 14.479-6.485 14.479-14.479" fill="#414042" transform="matrix(4.162611 0 0 -4.162611 367.36686 631.05679)"/><path d="m0 0c-3.878 0-7.021 2.858-7.021 6.381v20.081c0 3.52 3.143 6.381 7.021 6.381s7.028-2.861 7.028-6.381v-20.081c0-3.523-3.15-6.381-7.028-6.381" fill="#fff" transform="matrix(4.162611 0 0 -4.162611 511.99336 724.73954)"/><path d="m0 0c0-12.052 9.765-21.815 21.815-21.815 12.041 0 21.808 9.763 21.808 21.815 0 12.044-9.767 21.802-21.808 21.802-12.05 0-21.815-9.758-21.815-21.802" fill="#fff" transform="matrix(4.162611 0 0 -4.162611 634.78706 625.67104)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473 8.002 0 14.479 6.479 14.479 14.473s-6.477 14.479-14.479 14.479c-7.994 0-14.471-6.485-14.471-14.479" fill="#414042" transform="matrix(4.162611 0 0 -4.162611 656.64056 631.05679)"/></g></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b6fetoicgftd6"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/bptc_ldr=0
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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@ -0,0 +1,22 @@
[gd_scene load_steps=5 format=3 uid="uid://bs2xw1th37haf"]
[ext_resource type="Script" path="res://scripts/physics/ForceFieldAffected.gd" id="1_gtq1a"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_7eaan"]
albedo_color = Color(0.360784, 0.568627, 0.368627, 1)
[sub_resource type="SphereMesh" id="SphereMesh_b3k62"]
material = SubResource("StandardMaterial3D_7eaan")
[sub_resource type="SphereShape3D" id="SphereShape3D_6pl48"]
[node name="MagneticBall" type="RigidBody3D" node_paths=PackedStringArray("charge_color_mesh")]
mass = 3.65
script = ExtResource("1_gtq1a")
charge_color_mesh = NodePath("MeshInstance3D")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("SphereMesh_b3k62")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("SphereShape3D_6pl48")

View File

@ -0,0 +1,73 @@
[gd_scene load_steps=12 format=3 uid="uid://1fd7hw8r58ep"]
[ext_resource type="Script" path="res://scripts/physics/DirectedForceField.gd" id="2_6ebjs"]
[ext_resource type="Script" path="res://MagneticBallsSpawn.gd" id="3_ix4cr"]
[ext_resource type="Script" path="res://scripts/controller/PlayerController.gd" id="3_uswcu"]
[sub_resource type="BoxMesh" id="BoxMesh_rgta3"]
size = Vector3(100, 1, 100)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_41gng"]
albedo_color = Color(0.12549, 0.141176, 1, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_rybam"]
size = Vector3(100, 1, 100)
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_x5nsy"]
[sub_resource type="Sky" id="Sky_cjapr"]
sky_material = SubResource("ProceduralSkyMaterial_x5nsy")
[sub_resource type="Environment" id="Environment_qofx6"]
background_mode = 2
sky = SubResource("Sky_cjapr")
ambient_light_source = 3
[sub_resource type="BoxMesh" id="BoxMesh_mfi73"]
[sub_resource type="BoxShape3D" id="BoxShape3D_na5ql"]
[node name="Node3D" type="Node3D"]
[node name="StaticBody3D" type="StaticBody3D" parent="."]
[node name="MeshInstance3D" type="MeshInstance3D" parent="StaticBody3D"]
mesh = SubResource("BoxMesh_rgta3")
surface_material_override/0 = SubResource("StandardMaterial3D_41gng")
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"]
shape = SubResource("BoxShape3D_rybam")
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.825114, 0.564967, 0, -0.564967, 0.825114, 0, 7.97825, 14.5679)
environment = SubResource("Environment_qofx6")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.561708, 0.646526, -0.516225, 0, 0.623961, 0.781455, 0.827336, 0.43895, -0.350484, -8.24679, 4.72244, -8.38021)
[node name="MagneticBallsSpawn" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.03051, 0)
script = ExtResource("3_ix4cr")
num_balls = 100
force_strength = 200.0
[node name="Node3D" type="Node3D" parent="." node_paths=PackedStringArray("affected_objects_root")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0877838, -0.356995, 0.163391)
script = ExtResource("2_6ebjs")
field_extent = Vector3(3, 5, 3)
force_strength = 100.0
affected_objects_root = NodePath("../MagneticBallsSpawn")
[node name="RigidBody3D" type="RigidBody3D" parent="." node_paths=PackedStringArray("camera")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.33122, 0)
axis_lock_angular_x = true
axis_lock_angular_z = true
mass = 1.24
script = ExtResource("3_uswcu")
camera = NodePath("../Camera3D")
[node name="MeshInstance3D" type="MeshInstance3D" parent="RigidBody3D"]
mesh = SubResource("BoxMesh_mfi73")
[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"]
shape = SubResource("BoxShape3D_na5ql")

View File

@ -0,0 +1,53 @@
; 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="01 Prototype"
run/main_scene="res://playground.tscn"
config/features=PackedStringArray("4.0", "Forward Plus")
config/icon="res://icon.svg"
[editor]
export/convert_text_resources_to_binary=true
[input]
"↑"={
"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":0,"physical_keycode":87,"unicode":0,"echo":false,"script":null)
]
}
"↓"={
"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":0,"physical_keycode":83,"unicode":0,"echo":false,"script":null)
]
}
"←"={
"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":0,"physical_keycode":65,"unicode":0,"echo":false,"script":null)
]
}
"→"={
"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":0,"physical_keycode":68,"unicode":0,"echo":false,"script":null)
]
}
jump={
"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":0,"physical_keycode":32,"unicode":0,"echo":false,"script":null)
]
}
[physics]
3d/run_on_separate_thread=true
3d/physics_engine="GodotPhysics3D"

View File

@ -0,0 +1,44 @@
extends RigidBody3D
@export var camera: Camera3D
@export var speed: float = 100
var target_y_rotation: float = 0
var jump: bool = false
func _ready():
pass
func _physics_process(delta):
# Get input for movement
var horizontal_input = Input.get_action_strength("") - Input.get_action_strength("")
var vertical_input = Input.get_action_strength("") - Input.get_action_strength("")
# Calculate movement based on camera's rotation
var camera_relative_input = Vector3(horizontal_input, 0, vertical_input).rotated(Vector3.UP, camera.rotation.y)
# Apply movement to player
self.apply_central_force(camera_relative_input * speed)
if Input.get_action_strength("jump") > 0:
if not jump:
self.apply_central_impulse(Vector3.UP * 10)
jump = true
else:
jump = false
#if camera_relative_input.length() > 0:
# var move_x = camera_relative_input.x
# var move_z = camera_relative_input.z
#
# target_y_rotation = asin(move_z / move_x)
#self.apply_torque(Vector3(0,self.rotation.y - target_y_rotation,0))

View File

@ -0,0 +1,29 @@
extends ForceField
class_name DirectedForceField
@export var field_extent: Vector3 = Vector3(1,5,1)
@export var force_direction: Vector3 = Vector3(0,1,0)
# Called when the node enters the scene tree for the first time.
func _ready():
super._ready()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func get_force(client):
var t1 = self.global_position
var t2 = client.global_position
var delta_p = t2 - t1
if abs(delta_p.x) < field_extent.x:
if abs(delta_p.y) < field_extent.y:
if abs(delta_p.z) < field_extent.z:
return client.mass * self.force_strength * force_direction
return Vector3.ZERO

View File

@ -0,0 +1,30 @@
extends ForceField
class_name DirectedMagneticForceField
@export var field_extent: Vector3 = Vector3(1,5,1)
@export var charge: float = 1.0
@export var force_direction: Vector3 = Vector3(0,1,0)
# Called when the node enters the scene tree for the first time.
func _ready():
super._ready()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func get_force(client):
var t1 = self.global_position
var t2 = client.global_position
var delta_p = t2 - t1
if abs(delta_p.x) < field_extent.x:
if abs(delta_p.y) < field_extent.y:
if abs(delta_p.z) < field_extent.z:
var charge_factor = self.charge * client.charge * self.force_strength
return client.mass * charge_factor * force_direction
return Vector3.ZERO

View File

@ -0,0 +1,20 @@
extends Node
class_name ForceField
@export var force_strength: float = 10
@export var affected_objects_root: Node = null
# Called when the node enters the scene tree for the first time.
func _ready():
if affected_objects_root != null:
for child in affected_objects_root.get_children():
if child is ForceFieldAffected and child != self:
child.add_force_field(self)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func get_force(client):
pass # overriten in clients

View File

@ -0,0 +1,39 @@
extends RigidBody3D
class_name ForceFieldAffected
var force_fields = []
@export var charge: float = -1.0
@export var charge_color_mesh: MeshInstance3D = null
@export var positive_charge_color: Color = Color.DARK_RED
@export var negative_charge_color: Color = Color.DARK_BLUE
# Called when the node enters the scene tree for the first time.
func _ready():
var material = charge_color_mesh.get_active_material(0)
charge_color_mesh.set_surface_override_material(0,material.duplicate())
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
var summed_force = Vector3.ZERO
for field in force_fields:
summed_force = summed_force + field.get_force(self)
self.apply_central_force(summed_force)# + Vector3(0,-9.81,0))
if charge_color_mesh != null:
var material = charge_color_mesh.get_active_material(0)
var color = negative_charge_color.lerp(positive_charge_color, 0.5 + 0.5 * charge)
material.albedo_color = color
func add_force_field(force_field: ForceField):
force_fields.append(force_field)

View File

@ -0,0 +1,27 @@
extends ForceField
class_name MagneticForceField
@export var charge: float = 1.0
# Called when the node enters the scene tree for the first time.
func _ready():
super._ready()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func get_force(client):
var t1 = self.global_position
var t2 = client.global_position
var direction = t2 - t1
var l = direction.length()
var charge_factor = self.charge * client.charge * self.force_strength
if l < 0.001:
return Vector3.ZERO
return (1 / l**2) * client.mass * charge_factor * direction.normalized()

Binary file not shown.

View File

@ -0,0 +1,30 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://cvactbbw6md0s"
path="res://.godot/imported/floor_basic.glb-aa59e4f92d27e9709cdae5060b3b0ed3.scn"
[deps]
source_file="res://tiles/floor_basic.glb"
dest_files=["res://.godot/imported/floor_basic.glb-aa59e4f92d27e9709cdae5060b3b0ed3.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
import_script/path=""
_subresources={}

Binary file not shown.

View File

@ -0,0 +1,30 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bsaa1my5m4l01"
path="res://.godot/imported/floor_wall1_basic.glb-dc6570441337dce4af62d8a8c6d8e11b.scn"
[deps]
source_file="res://tiles/floor_wall1_basic.glb"
dest_files=["res://.godot/imported/floor_wall1_basic.glb-dc6570441337dce4af62d8a8c6d8e11b.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
import_script/path=""
_subresources={}

Binary file not shown.

View File

@ -0,0 +1,30 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bg03gv1vnq7ns"
path="res://.godot/imported/floor_wall2_basic.glb-dbd38f765ababc2442bb867d93cad71e.scn"
[deps]
source_file="res://tiles/floor_wall2_basic.glb"
dest_files=["res://.godot/imported/floor_wall2_basic.glb-dbd38f765ababc2442bb867d93cad71e.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
import_script/path=""
_subresources={}