Compare commits
10 Commits
db7474043b
...
0bac49d257
Author | SHA1 | Date |
---|---|---|
Spencer Killen | 0bac49d257 | |
alex-kumpula | 7417ff9a11 | |
alex-kumpula | 9fb9b92aec | |
Spencer Killen | 8c1b431f84 | |
Spencer Killen | 3d4c75ddab | |
alex-kumpula | 5f6e7a3e8e | |
alex-kumpula | b3259e9585 | |
alex-kumpula | 84aa101636 | |
alex-kumpula | 27a98286ef | |
alex-kumpula | a7f5ea6fd5 |
|
@ -9,3 +9,7 @@ Fresnel: https://godotshaders.com/snippet/fresnel/
|
||||||
|
|
||||||
Code:
|
Code:
|
||||||
occlussion shader: https://www.reddit.com/r/godot/comments/rww6e9/comment/hrfa51g/?utm_source=share&utm_medium=web2x&context=3
|
occlussion shader: https://www.reddit.com/r/godot/comments/rww6e9/comment/hrfa51g/?utm_source=share&utm_medium=web2x&context=3
|
||||||
|
|
||||||
|
|
||||||
|
Sound:
|
||||||
|
billiard-clack: https://freesound.org/people/Za-Games/sounds/539854/
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
<Project Sdk="Godot.NET.Sdk/4.1.3">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<Project Sdk="Godot.NET.Sdk/4.1.1">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
|
@ -33,6 +33,11 @@ public partial class TAS_System : Node
|
||||||
private set { this._currentFrame = value; }
|
private set { this._currentFrame = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int AdvancedFramesRemaining
|
||||||
|
{
|
||||||
|
get { return this.LastAdvancedFrame - this.CurrentFrame; }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The last frame that can be advanced to. This will
|
/// The last frame that can be advanced to. This will
|
||||||
/// only be greater than CurrentFrame after the player
|
/// only be greater than CurrentFrame after the player
|
||||||
|
@ -59,21 +64,33 @@ public partial class TAS_System : Node
|
||||||
[Signal]
|
[Signal]
|
||||||
public delegate void FramesRegressedEventHandler(int startFrame, int endFrame);
|
public delegate void FramesRegressedEventHandler(int startFrame, int endFrame);
|
||||||
|
|
||||||
|
[Signal]
|
||||||
|
public delegate void StartedIncrementingEventHandler();
|
||||||
|
|
||||||
|
[Signal]
|
||||||
|
public delegate void StoppedIncrementingEventHandler();
|
||||||
|
|
||||||
|
[Signal]
|
||||||
|
public delegate void FramesResetEventHandler();
|
||||||
|
|
||||||
|
|
||||||
public void StartIncrementingFrames()
|
public void StartIncrementingFrames()
|
||||||
{
|
{
|
||||||
this.IsIncrementingFrames = true;
|
this.IsIncrementingFrames = true;
|
||||||
|
EmitSignal(SignalName.StartedIncrementing);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StopIncrementingFrames()
|
public void StopIncrementingFrames()
|
||||||
{
|
{
|
||||||
this.IsIncrementingFrames = false;
|
this.IsIncrementingFrames = false;
|
||||||
|
EmitSignal(SignalName.StoppedIncrementing);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ResetFrameCount()
|
public void ResetFrameCount()
|
||||||
{
|
{
|
||||||
this.CurrentFrame = 0;
|
this.CurrentFrame = 0;
|
||||||
this.LastAdvancedFrame = 0;
|
this.LastAdvancedFrame = 0;
|
||||||
|
EmitSignal(SignalName.FramesReset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns how many frames it could successfully advance
|
// Returns how many frames it could successfully advance
|
||||||
|
@ -112,18 +129,20 @@ public partial class TAS_System : Node
|
||||||
if (this.TimeSinceLastFrame >= this.FrameLength)
|
if (this.TimeSinceLastFrame >= this.FrameLength)
|
||||||
{
|
{
|
||||||
this.CurrentFrame++;
|
this.CurrentFrame++;
|
||||||
|
this.LastAdvancedFrame = this.CurrentFrame;
|
||||||
EmitSignal(SignalName.FrameIncremented, this.CurrentFrame);
|
EmitSignal(SignalName.FrameIncremented, this.CurrentFrame);
|
||||||
this.TimeSinceLastFrame = 0 + (this.TimeSinceLastFrame - this.FrameLength);
|
this.TimeSinceLastFrame = 0 + (this.TimeSinceLastFrame - this.FrameLength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GD.Print(CurrentFrame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void Test()
|
|
||||||
// {
|
|
||||||
// GD.Print("test123");
|
|
||||||
|
|
||||||
// // EmitSignal(SignalName.TestSignal, "test456");
|
|
||||||
// }
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
this.FrameLength = 0.1;
|
||||||
|
this.StartIncrementingFrames();
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,33 +1,70 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
|
||||||
public partial class TASable : Node
|
public partial class TASable : Node
|
||||||
{
|
{
|
||||||
Node3D _parent;
|
[Export] RigidBody3D _assignedRigidBody3D;
|
||||||
|
|
||||||
|
public RigidBody3D AssignedRigidBody3D
|
||||||
|
{
|
||||||
|
get { return this._assignedRigidBody3D; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Dictionary<int, Vector3> framePositions = new Dictionary<int, Vector3>();
|
||||||
|
|
||||||
|
|
||||||
|
public virtual void SaveState(int frame)
|
||||||
|
{
|
||||||
|
this.framePositions[frame] = this.AssignedRigidBody3D.Position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void LoadState(int frame)
|
||||||
|
{
|
||||||
|
this.AssignedRigidBody3D.Position = this.framePositions[frame];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
this._parent = this.GetParent<Node3D>();
|
|
||||||
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
|
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
|
||||||
|
|
||||||
TAS.FrameIncremented += this.OnFrameIncremented;
|
TAS.FrameIncremented += this.OnFrameIncremented;
|
||||||
TAS.FramesAdvanced += this.OnFramesAdvanced;
|
TAS.FramesAdvanced += this.OnFramesAdvanced;
|
||||||
TAS.FramesRegressed += this.OnFramesRegressed;
|
TAS.FramesRegressed += this.OnFramesRegressed;
|
||||||
|
TAS.StartedIncrementing += this.OnStartedIncrementing;
|
||||||
|
TAS.StoppedIncrementing += this.OnStoppedIncrementing;
|
||||||
|
|
||||||
|
this.SaveState(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void OnFrameIncremented(int newFrame)
|
public virtual void OnFrameIncremented(int newFrame)
|
||||||
{
|
{
|
||||||
GD.Print($"Frame advanced to {newFrame}, called from node {_parent.Name}");
|
this.SaveState(newFrame);
|
||||||
|
GD.Print($"Frame advanced to {newFrame}, called from node {this.AssignedRigidBody3D.Name}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void OnFramesAdvanced(int startFrame, int endFrame)
|
public virtual void OnFramesAdvanced(int startFrame, int endFrame)
|
||||||
{
|
{
|
||||||
GD.Print($"Frames advanced from {startFrame} to {endFrame}, called from node {_parent.Name}");
|
this.LoadState(endFrame);
|
||||||
|
GD.Print($"Frames advanced from {startFrame} to {endFrame}, called from node {this.AssignedRigidBody3D.Name}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void OnFramesRegressed(int startFrame, int endFrame)
|
public virtual void OnFramesRegressed(int startFrame, int endFrame)
|
||||||
{
|
{
|
||||||
GD.Print($"Frames regressed from {startFrame} to {endFrame}, called from node {_parent.Name}");
|
this.LoadState(endFrame);
|
||||||
|
GD.Print($"Frames regressed from {startFrame} to {endFrame}, called from node {this.AssignedRigidBody3D.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void OnStartedIncrementing()
|
||||||
|
{
|
||||||
|
this.AssignedRigidBody3D.Freeze = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void OnStoppedIncrementing()
|
||||||
|
{
|
||||||
|
this.AssignedRigidBody3D.Freeze = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class AdvanceButton : Button
|
||||||
|
{
|
||||||
|
TAS_System TAS;
|
||||||
|
// Called when the node enters the scene tree for the first time.
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
TAS = GetNode<TAS_System>("/root/TAS_System");
|
||||||
|
this.Pressed += () => { TAS.Advance(1); };
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
if (TAS.AdvancedFramesRemaining == 0)
|
||||||
|
{
|
||||||
|
this.Disabled = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.Disabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class CurrentFrameLabel : Label
|
||||||
|
{
|
||||||
|
TAS_System TAS;
|
||||||
|
// Called when the node enters the scene tree for the first time.
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
TAS = GetNode<TAS_System>("/root/TAS_System");
|
||||||
|
// TAS.FrameIncremented += OnFrameIncremented;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
this.Text = $"Current frame: {TAS.CurrentFrame}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void OnFrameIncremented(int newFrame)
|
||||||
|
{
|
||||||
|
this.Text = $"Current frame: {newFrame}";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class RegressButton : Button
|
||||||
|
{
|
||||||
|
TAS_System TAS;
|
||||||
|
|
||||||
|
// Called when the node enters the scene tree for the first time.
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
TAS = GetNode<TAS_System>("/root/TAS_System");
|
||||||
|
this.Pressed += () => { TAS.Regress(1); };
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void OnFrameIncremented(int newFrame)
|
||||||
|
{
|
||||||
|
this.Text = $"Current frame: {newFrame}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
if (TAS.CurrentFrame == 0)
|
||||||
|
{
|
||||||
|
this.Disabled = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.Disabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class ResetFramesButton : Button
|
||||||
|
{
|
||||||
|
// Called when the node enters the scene tree for the first time.
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
|
||||||
|
this.Pressed += () => { TAS.ResetFrameCount(); };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class StartIncrementButton : Button
|
||||||
|
{
|
||||||
|
// Called when the node enters the scene tree for the first time.
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
|
||||||
|
this.Pressed += () => { TAS.StartIncrementingFrames(); };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class StopIncrementButton : Button
|
||||||
|
{
|
||||||
|
// Called when the node enters the scene tree for the first time.
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
|
||||||
|
this.Pressed += () => { TAS.StopIncrementingFrames(); };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
[gd_scene load_steps=7 format=3 uid="uid://b1uf31ed6h0ir"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://UI/TAS UI/CurrentFrameLabel.cs" id="1_27u4w"]
|
||||||
|
[ext_resource type="Script" path="res://UI/TAS UI/RegressButton.cs" id="2_fhmsa"]
|
||||||
|
[ext_resource type="Script" path="res://UI/TAS UI/AdvanceButton.cs" id="3_0ti6q"]
|
||||||
|
[ext_resource type="Script" path="res://UI/TAS UI/StopIncrementButton.cs" id="4_4gd4c"]
|
||||||
|
[ext_resource type="Script" path="res://UI/TAS UI/StartIncrementButton.cs" id="5_5af83"]
|
||||||
|
[ext_resource type="Script" path="res://UI/TAS UI/ResetFramesButton.cs" id="6_nwwkv"]
|
||||||
|
|
||||||
|
[node name="TAS UI" type="Control"]
|
||||||
|
layout_mode = 3
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
mouse_filter = 2
|
||||||
|
|
||||||
|
[node name="DEBUG" type="Control" parent="."]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
mouse_filter = 2
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="DEBUG"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 2
|
||||||
|
anchor_top = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_top = -26.0
|
||||||
|
offset_right = 199.0
|
||||||
|
grow_vertical = 0
|
||||||
|
text = "Current Frame: 0"
|
||||||
|
script = ExtResource("1_27u4w")
|
||||||
|
|
||||||
|
[node name="FrameButtons" type="Control" 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 = -131.5
|
||||||
|
offset_top = -52.0
|
||||||
|
offset_right = 131.5
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 0
|
||||||
|
|
||||||
|
[node name="RegressButton" type="Button" parent="FrameButtons"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = -1
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_vertical = 2
|
||||||
|
text = "Regress"
|
||||||
|
script = ExtResource("2_fhmsa")
|
||||||
|
|
||||||
|
[node name="AdvanceButton" type="Button" parent="FrameButtons"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = -1
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_vertical = 2
|
||||||
|
disabled = true
|
||||||
|
text = "Advance"
|
||||||
|
script = ExtResource("3_0ti6q")
|
||||||
|
|
||||||
|
[node name="TASButtons" type="Control" parent="."]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 3
|
||||||
|
anchor_left = 1.0
|
||||||
|
anchor_top = 1.0
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_left = -205.0
|
||||||
|
offset_top = -103.0
|
||||||
|
grow_horizontal = 0
|
||||||
|
grow_vertical = 0
|
||||||
|
|
||||||
|
[node name="StopIncrementButton" type="Button" parent="TASButtons"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 10
|
||||||
|
anchor_right = 1.0
|
||||||
|
offset_bottom = 31.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
text = "Stop Increment"
|
||||||
|
script = ExtResource("4_4gd4c")
|
||||||
|
|
||||||
|
[node name="StartIncrementButton" type="Button" parent="TASButtons"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 14
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
offset_top = -15.5
|
||||||
|
offset_bottom = 15.5
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
text = "Start Increment"
|
||||||
|
script = ExtResource("5_5af83")
|
||||||
|
|
||||||
|
[node name="ResetFramesButton" type="Button" parent="TASButtons"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 12
|
||||||
|
anchor_top = 1.0
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_top = -31.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 0
|
||||||
|
text = "Reset Frames"
|
||||||
|
script = ExtResource("6_nwwkv")
|
Binary file not shown.
|
@ -0,0 +1,24 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="wav"
|
||||||
|
type="AudioStreamWAV"
|
||||||
|
uid="uid://c5v6c6x05lqg3"
|
||||||
|
path="res://.godot/imported/billiard-clack.wav-3f99ec74be11d1cb465d3dc06a94b10f.sample"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://audio/billiard-clack.wav"
|
||||||
|
dest_files=["res://.godot/imported/billiard-clack.wav-3f99ec74be11d1cb465d3dc06a94b10f.sample"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
force/8_bit=false
|
||||||
|
force/mono=false
|
||||||
|
force/max_rate=false
|
||||||
|
force/max_rate_hz=44100
|
||||||
|
edit/trim=false
|
||||||
|
edit/normalize=false
|
||||||
|
edit/loop_mode=0
|
||||||
|
edit/loop_begin=0
|
||||||
|
edit/loop_end=-1
|
||||||
|
compress/mode=0
|
|
@ -4,7 +4,8 @@ extends Node3D
|
||||||
@export var initial_target: Node3D
|
@export var initial_target: Node3D
|
||||||
var target: Targetable = null
|
var target: Targetable = null
|
||||||
@export var sensitivity := 0.01
|
@export var sensitivity := 0.01
|
||||||
@export var charge_time := 2
|
@export var charge_time := 1.7
|
||||||
|
@export var min_charge := 0.2
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
set_target(initial_target)
|
set_target(initial_target)
|
||||||
|
@ -13,26 +14,53 @@ func get_charge():
|
||||||
return %radial_ui.charge_amount
|
return %radial_ui.charge_amount
|
||||||
|
|
||||||
func _input(event):
|
func _input(event):
|
||||||
|
var billiard := target.get_billiard()
|
||||||
if event is InputEventMouseMotion and MouseControl.mouse_is_locked() and get_charge() == 0.0:
|
if event is InputEventMouseMotion and MouseControl.mouse_is_locked() and get_charge() == 0.0:
|
||||||
rotate_view(event.relative*sensitivity)
|
rotate_view(event.relative*sensitivity)
|
||||||
if event.is_action("charge"):
|
if event.is_action_released("charge") and not billiard.can_hit and charge_tween != null:
|
||||||
|
release()
|
||||||
|
if event.is_action_pressed("charge") and billiard.can_hit and charge_tween == null:
|
||||||
charge(event.get_action_strength("charge"))
|
charge(event.get_action_strength("charge"))
|
||||||
|
|
||||||
func _process(_delta):
|
func _process(_delta):
|
||||||
transform.origin = target.global_position
|
transform.origin = target.global_position
|
||||||
camera.global_position = %camera_spot.global_position
|
camera.global_position = %camera_spot.global_position
|
||||||
camera.look_at(target.global_position)
|
camera.look_at(target.global_position)
|
||||||
|
if get_charge() >= 1.0:
|
||||||
|
cancel_charge()
|
||||||
|
|
||||||
var charge_tween: Tween = null
|
func cancel_charge():
|
||||||
func charge(amount: float):
|
%radial_ui.set_charge(0.0)
|
||||||
|
%ChargeSound.stop()
|
||||||
if charge_tween != null:
|
if charge_tween != null:
|
||||||
charge_tween.kill()
|
charge_tween.kill()
|
||||||
if amount == 0.0:
|
charge_tween = null
|
||||||
%radial_ui.set_charge(0.0)
|
var billiard := target.get_billiard()
|
||||||
$AudioStreamPlayer.stop()
|
billiard.can_hit = true
|
||||||
|
|
||||||
|
func release():
|
||||||
|
if get_charge() <= min_charge:
|
||||||
|
cancel_charge()
|
||||||
return
|
return
|
||||||
|
%ChargeReleaseSound.volume_db = get_charge() * 12
|
||||||
|
%ChargeReleaseSound.play()
|
||||||
|
var billiard := target.get_billiard()
|
||||||
|
billiard.hit((target.global_position - %camera_spot.global_position).normalized(), get_charge())
|
||||||
|
%radial_ui.set_charge(0.0)
|
||||||
|
%ChargeSound.stop()
|
||||||
|
if charge_tween != null:
|
||||||
|
charge_tween.kill()
|
||||||
|
charge_tween = null
|
||||||
|
|
||||||
|
var charge_tween: Tween = null
|
||||||
|
func charge(_amount: float):
|
||||||
|
var billiard := target.get_billiard()
|
||||||
|
billiard.can_hit = false
|
||||||
|
if charge_tween != null:
|
||||||
|
charge_tween.kill()
|
||||||
charge_tween = create_tween()
|
charge_tween = create_tween()
|
||||||
charge_tween.tween_method(%radial_ui.set_charge, 0.0, 1.0, charge_time)
|
charge_tween.tween_method(%radial_ui.set_charge, 0.0, 1.0, charge_time)
|
||||||
$AudioStreamPlayer.play()
|
%ChargeSound.play()
|
||||||
|
|
||||||
func rotate_view(amount: Vector2):
|
func rotate_view(amount: Vector2):
|
||||||
rotate_y(-amount.x)
|
rotate_y(-amount.x)
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
[gd_scene load_steps=4 format=3 uid="uid://drmb4sitb74fx"]
|
[gd_scene load_steps=5 format=3 uid="uid://drmb4sitb74fx"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://control_scheme/controller.gd" id="1_h3pjb"]
|
[ext_resource type="Script" path="res://control_scheme/controller.gd" id="1_h3pjb"]
|
||||||
[ext_resource type="PackedScene" uid="uid://p2n48c8st55d" path="res://control_scheme/radial_ui.tscn" id="2_qidcb"]
|
[ext_resource type="PackedScene" uid="uid://p2n48c8st55d" path="res://control_scheme/radial_ui.tscn" id="2_qidcb"]
|
||||||
[ext_resource type="AudioStream" uid="uid://ckhf7ksthi053" path="res://audio/charge.wav" id="3_exgm6"]
|
[ext_resource type="AudioStream" uid="uid://ckhf7ksthi053" path="res://audio/charge.wav" id="3_exgm6"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://c5v6c6x05lqg3" path="res://audio/billiard-clack.wav" id="4_12r5s"]
|
||||||
|
|
||||||
[node name="controller" type="Node3D"]
|
[node name="controller" type="Node3D"]
|
||||||
top_level = true
|
top_level = true
|
||||||
|
@ -18,5 +19,10 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0)
|
||||||
[node name="radial_ui" parent="." instance=ExtResource("2_qidcb")]
|
[node name="radial_ui" parent="." instance=ExtResource("2_qidcb")]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
|
[node name="ChargeSound" type="AudioStreamPlayer" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
stream = ExtResource("3_exgm6")
|
stream = ExtResource("3_exgm6")
|
||||||
|
|
||||||
|
[node name="ChargeReleaseSound" type="AudioStreamPlayer" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
stream = ExtResource("4_12r5s")
|
||||||
|
|
|
@ -6,6 +6,9 @@ class_name Targetable
|
||||||
static func is_targetable(node: Node3D) -> Targetable:
|
static func is_targetable(node: Node3D) -> Targetable:
|
||||||
return node.get_node_or_null("is_targetable")
|
return node.get_node_or_null("is_targetable")
|
||||||
|
|
||||||
|
func get_billiard() -> Billiard:
|
||||||
|
return get_parent()
|
||||||
|
|
||||||
func make_target():
|
func make_target():
|
||||||
walk_meshes_post_order(self.get_parent(), change_all_materials)
|
walk_meshes_post_order(self.get_parent(), change_all_materials)
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,6 @@ uniform float grow;
|
||||||
uniform sampler2D colors : source_color, repeat_disable;
|
uniform sampler2D colors : source_color, repeat_disable;
|
||||||
uniform float charge = 1.0;
|
uniform float charge = 1.0;
|
||||||
|
|
||||||
#include "res://shaders/noise.gdshaderinc"
|
|
||||||
|
|
||||||
void vertex() {
|
void vertex() {
|
||||||
// Billboarding
|
// Billboarding
|
||||||
MODELVIEW_MATRIX = VIEW_MATRIX * mat4(INV_VIEW_MATRIX[0], INV_VIEW_MATRIX[1], INV_VIEW_MATRIX[2], MODEL_MATRIX[3]);
|
MODELVIEW_MATRIX = VIEW_MATRIX * mat4(INV_VIEW_MATRIX[0], INV_VIEW_MATRIX[1], INV_VIEW_MATRIX[2], MODEL_MATRIX[3]);
|
||||||
|
@ -21,6 +19,7 @@ void vertex() {
|
||||||
VERTEX.y += dy;
|
VERTEX.y += dy;
|
||||||
VERTEX.x += dx;
|
VERTEX.x += dx;
|
||||||
}
|
}
|
||||||
|
uniform sampler2D alpha_falloff : repeat_disable;
|
||||||
|
|
||||||
void fragment() {
|
void fragment() {
|
||||||
float where = distance(UV, vec2(0.5))*2.0;
|
float where = distance(UV, vec2(0.5))*2.0;
|
||||||
|
@ -31,9 +30,8 @@ void fragment() {
|
||||||
int bx = int(buv.x);
|
int bx = int(buv.x);
|
||||||
int by = int(buv.y);
|
int by = int(buv.y);
|
||||||
int amount = 2;
|
int amount = 2;
|
||||||
if ((bx % amount == 0) || (by % amount == 0)) {
|
|
||||||
discard;
|
ALPHA = texture(alpha_falloff, vec2(where/charge)).r;
|
||||||
}
|
|
||||||
|
|
||||||
ALBEDO = texture(colors, vec2(where)).rgb;
|
ALBEDO = texture(colors, vec2(where)).rgb;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,15 @@
|
||||||
[gd_resource type="ShaderMaterial" load_steps=4 format=3 uid="uid://cybyibjbyyok1"]
|
[gd_resource type="ShaderMaterial" load_steps=6 format=3 uid="uid://cybyibjbyyok1"]
|
||||||
|
|
||||||
[ext_resource type="Shader" path="res://control_scheme/radial_ui.gdshader" id="1_hmfvm"]
|
[ext_resource type="Shader" path="res://control_scheme/radial_ui.gdshader" id="1_hmfvm"]
|
||||||
|
|
||||||
|
[sub_resource type="Curve" id="Curve_p1ydf"]
|
||||||
|
_data = [Vector2(0, 0.831579), 0.0, 0.0, 0, 0, Vector2(0.830986, 0.757895), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||||
|
point_count = 3
|
||||||
|
|
||||||
|
[sub_resource type="CurveTexture" id="CurveTexture_6n3v0"]
|
||||||
|
texture_mode = 1
|
||||||
|
curve = SubResource("Curve_p1ydf")
|
||||||
|
|
||||||
[sub_resource type="Gradient" id="Gradient_l7u12"]
|
[sub_resource type="Gradient" id="Gradient_l7u12"]
|
||||||
interpolation_mode = 1
|
interpolation_mode = 1
|
||||||
offsets = PackedFloat32Array(0.00328947, 0.347039, 0.506579, 0.694079, 0.848684)
|
offsets = PackedFloat32Array(0.00328947, 0.347039, 0.506579, 0.694079, 0.848684)
|
||||||
|
@ -16,3 +24,4 @@ shader = ExtResource("1_hmfvm")
|
||||||
shader_parameter/grow = 0.01
|
shader_parameter/grow = 0.01
|
||||||
shader_parameter/charge = 0.0
|
shader_parameter/charge = 0.0
|
||||||
shader_parameter/colors = SubResource("GradientTexture1D_8vk7x")
|
shader_parameter/colors = SubResource("GradientTexture1D_8vk7x")
|
||||||
|
shader_parameter/alpha_falloff = SubResource("CurveTexture_6n3v0")
|
||||||
|
|
|
@ -33,7 +33,8 @@ _subresources={
|
||||||
"PATH:grape2": {
|
"PATH:grape2": {
|
||||||
"generate/physics": true,
|
"generate/physics": true,
|
||||||
"physics/body_type": 1,
|
"physics/body_type": 1,
|
||||||
"physics/shape_type": 1
|
"physics/shape_type": 4,
|
||||||
|
"primitive/radius": 0.03
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ func toggle_mouse_lock():
|
||||||
func mouse_is_locked():
|
func mouse_is_locked():
|
||||||
return Input.mouse_mode == Input.MOUSE_MODE_CAPTURED
|
return Input.mouse_mode == Input.MOUSE_MODE_CAPTURED
|
||||||
|
|
||||||
func _input(event):
|
func _unhandled_input(event):
|
||||||
if event.is_action("charge") and Input.mouse_mode != Input.MOUSE_MODE_CAPTURED:
|
if event.is_action("charge") and Input.mouse_mode != Input.MOUSE_MODE_CAPTURED:
|
||||||
lock_mouse()
|
lock_mouse()
|
||||||
get_viewport().set_input_as_handled()
|
get_viewport().set_input_as_handled()
|
||||||
|
|
|
@ -1 +1,10 @@
|
||||||
extends RigidBody3D
|
extends RigidBody3D
|
||||||
|
class_name Billiard
|
||||||
|
|
||||||
|
@export var power_min := 0.01
|
||||||
|
@export var power_max := 5.0
|
||||||
|
|
||||||
|
var can_hit = true
|
||||||
|
|
||||||
|
func hit(impulse: Vector3, power: float):
|
||||||
|
apply_central_impulse(impulse * lerp(power_min, power_max, power))
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
[gd_scene load_steps=3 format=3 uid="uid://cpj2gefpjwogk"]
|
[gd_scene load_steps=4 format=3 uid="uid://cpj2gefpjwogk"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://physics/billiard.gd" id="1_a0fke"]
|
[ext_resource type="Script" path="res://physics/billiard.gd" id="1_a0fke"]
|
||||||
[ext_resource type="PackedScene" uid="uid://cbp8c4kpmr0hk" path="res://control_scheme/is_targetable.tscn" id="2_yrk4o"]
|
[ext_resource type="PackedScene" uid="uid://cbp8c4kpmr0hk" path="res://control_scheme/is_targetable.tscn" id="2_yrk4o"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bjhii55pagkb5" path="res://TAS_system/is_TASable.tscn" id="3_oj26f"]
|
||||||
|
|
||||||
[node name="billiard" type="RigidBody3D"]
|
[node name="billiard" type="RigidBody3D"]
|
||||||
|
continuous_cd = true
|
||||||
script = ExtResource("1_a0fke")
|
script = ExtResource("1_a0fke")
|
||||||
|
|
||||||
[node name="is_targetable" parent="." instance=ExtResource("2_yrk4o")]
|
[node name="is_targetable" parent="." instance=ExtResource("2_yrk4o")]
|
||||||
|
|
||||||
|
[node name="is_TASable" parent="." node_paths=PackedStringArray("_assignedRigidBody3D") instance=ExtResource("3_oj26f")]
|
||||||
|
_assignedRigidBody3D = NodePath("..")
|
||||||
|
|
|
@ -32,7 +32,9 @@ _subresources={
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"PATH:room": {
|
"PATH:room": {
|
||||||
"generate/physics": true,
|
"generate/physics": true,
|
||||||
"physics/shape_type": 2
|
"physics/shape_type": 2,
|
||||||
|
"primitive/position": Vector3(0, 0.5, 0),
|
||||||
|
"primitive/size": Vector3(2, 1, 2)
|
||||||
},
|
},
|
||||||
"PATH:table": {
|
"PATH:table": {
|
||||||
"generate/physics": true,
|
"generate/physics": true,
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
[gd_scene load_steps=7 format=3 uid="uid://by3rnp88l4plx"]
|
[gd_scene load_steps=7 format=3 uid="uid://by3rnp88l4plx"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_bo0jp"]
|
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_bo0jp"]
|
||||||
[ext_resource type="PackedScene" uid="uid://cbp8c4kpmr0hk" path="res://control_scheme/is_targetable.tscn" id="2_d7v5s"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="3_0hshv"]
|
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="3_0hshv"]
|
||||||
[ext_resource type="PackedScene" uid="uid://bjhii55pagkb5" path="res://TAS_system/is_TASable.tscn" id="3_srlbt"]
|
[ext_resource type="PackedScene" uid="uid://bjhii55pagkb5" path="res://TAS_system/is_TASable.tscn" id="3_srlbt"]
|
||||||
[ext_resource type="Script" path="res://tests/TAS_system/TAS_test_001.cs" id="5_0ber1"]
|
[ext_resource type="Script" path="res://tests/TAS_system/TAS_test_001.cs" id="5_0ber1"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://b1uf31ed6h0ir" path="res://UI/TAS UI/TAS UI.tscn" id="6_au5mx"]
|
||||||
|
|
||||||
[sub_resource type="Environment" id="Environment_f0m14"]
|
[sub_resource type="Environment" id="Environment_f0m14"]
|
||||||
ambient_light_source = 2
|
ambient_light_source = 2
|
||||||
|
@ -13,24 +13,21 @@ ambient_light_energy = 0.5
|
||||||
|
|
||||||
[node name="small_room" instance=ExtResource("1_bo0jp")]
|
[node name="small_room" instance=ExtResource("1_bo0jp")]
|
||||||
|
|
||||||
[node name="is_TASable" parent="table" index="0" instance=ExtResource("3_srlbt")]
|
[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="1"]
|
||||||
|
|
||||||
[node name="is_targetable" parent="grape" index="0" node_paths=PackedStringArray("attached_to") instance=ExtResource("2_d7v5s")]
|
|
||||||
attached_to = NodePath("..")
|
|
||||||
|
|
||||||
[node name="is_TASable" parent="grape" index="1" instance=ExtResource("3_srlbt")]
|
|
||||||
|
|
||||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="3"]
|
|
||||||
environment = SubResource("Environment_f0m14")
|
environment = SubResource("Environment_f0m14")
|
||||||
|
|
||||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment" index="0"]
|
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment" index="0"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 0.933762, 0.357895, 0, -0.357895, 0.933762, 0, 1.43864, 1.81738)
|
transform = Transform3D(1, 0, 0, 0, 0.933762, 0.357895, 0, -0.357895, 0.933762, 0, 1.43864, 1.81738)
|
||||||
|
|
||||||
[node name="controller" parent="." index="4" node_paths=PackedStringArray("camera", "initial_target") instance=ExtResource("3_0hshv")]
|
[node name="controller" parent="." index="2" node_paths=PackedStringArray("camera", "initial_target") instance=ExtResource("3_0hshv")]
|
||||||
camera = NodePath("Camera3D")
|
camera = NodePath("Camera3D")
|
||||||
initial_target = NodePath("../grape")
|
initial_target = NodePath("../table")
|
||||||
|
|
||||||
[node name="Camera3D" type="Camera3D" parent="controller" index="1"]
|
[node name="Camera3D" type="Camera3D" parent="controller" index="1"]
|
||||||
|
|
||||||
[node name="TAS_test_001" type="Node" parent="." index="6"]
|
[node name="is_TASable" parent="table" index="0" instance=ExtResource("3_srlbt")]
|
||||||
|
|
||||||
|
[node name="TAS_test_001" type="Node" parent="." index="4"]
|
||||||
script = ExtResource("5_0ber1")
|
script = ExtResource("5_0ber1")
|
||||||
|
|
||||||
|
[node name="TAS UI" parent="." index="5" instance=ExtResource("6_au5mx")]
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
[gd_scene load_steps=6 format=3 uid="uid://1wrwvnt1xuwr"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_m1abe"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="2_1yuny"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://c43pr474qofhl" path="res://physics/grape.tscn" id="3_kg8e8"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://b1uf31ed6h0ir" path="res://UI/TAS UI/TAS UI.tscn" id="4_jskxr"]
|
||||||
|
|
||||||
|
[sub_resource type="Environment" id="Environment_f0m14"]
|
||||||
|
ambient_light_source = 2
|
||||||
|
ambient_light_color = Color(1, 1, 1, 1)
|
||||||
|
ambient_light_energy = 0.5
|
||||||
|
|
||||||
|
[node name="small_room" instance=ExtResource("1_m1abe")]
|
||||||
|
|
||||||
|
[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="2"]
|
||||||
|
environment = SubResource("Environment_f0m14")
|
||||||
|
|
||||||
|
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment" index="0"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 0.933762, 0.357895, 0, -0.357895, 0.933762, 0, 1.43864, 1.81738)
|
||||||
|
|
||||||
|
[node name="controller" parent="." index="3" node_paths=PackedStringArray("camera", "initial_target") instance=ExtResource("2_1yuny")]
|
||||||
|
camera = NodePath("Camera3D")
|
||||||
|
initial_target = NodePath("../grape")
|
||||||
|
|
||||||
|
[node name="Camera3D" type="Camera3D" parent="controller" index="1"]
|
||||||
|
|
||||||
|
[node name="billiard" parent="." index="4" instance=ExtResource("3_kg8e8")]
|
||||||
|
|
||||||
|
[node name="grape" parent="." index="5" instance=ExtResource("3_kg8e8")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.98064, 0.385236)
|
||||||
|
|
||||||
|
[node name="grape2" parent="." index="6" instance=ExtResource("3_kg8e8")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.94627, 0)
|
||||||
|
continuous_cd = true
|
||||||
|
|
||||||
|
[node name="TAS UI" parent="." index="7" instance=ExtResource("4_jskxr")]
|
|
@ -1,8 +1,9 @@
|
||||||
[gd_scene load_steps=5 format=3 uid="uid://70bb2yncbl"]
|
[gd_scene load_steps=6 format=3 uid="uid://70bb2yncbl"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_2ticn"]
|
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_2ticn"]
|
||||||
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="2_dcvuq"]
|
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="2_dcvuq"]
|
||||||
[ext_resource type="PackedScene" uid="uid://c43pr474qofhl" path="res://physics/grape.tscn" id="3_gijly"]
|
[ext_resource type="PackedScene" uid="uid://c43pr474qofhl" path="res://physics/grape.tscn" id="3_gijly"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://b1uf31ed6h0ir" path="res://UI/TAS UI/TAS UI.tscn" id="4_8yatx"]
|
||||||
|
|
||||||
[sub_resource type="Environment" id="Environment_f0m14"]
|
[sub_resource type="Environment" id="Environment_f0m14"]
|
||||||
ambient_light_source = 2
|
ambient_light_source = 2
|
||||||
|
@ -22,11 +23,12 @@ camera = NodePath("Camera3D")
|
||||||
initial_target = NodePath("../grape")
|
initial_target = NodePath("../grape")
|
||||||
|
|
||||||
[node name="Camera3D" type="Camera3D" parent="controller" index="1"]
|
[node name="Camera3D" type="Camera3D" parent="controller" index="1"]
|
||||||
|
current = true
|
||||||
|
|
||||||
[node name="billiard" parent="." index="4" instance=ExtResource("3_gijly")]
|
[node name="grape" parent="." index="4" instance=ExtResource("3_gijly")]
|
||||||
|
|
||||||
[node name="grape" parent="." index="5" instance=ExtResource("3_gijly")]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.56762, 0.385236)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.56762, 0.385236)
|
||||||
|
|
||||||
[node name="grape2" parent="." index="6" instance=ExtResource("3_gijly")]
|
[node name="grape2" parent="." index="5" instance=ExtResource("3_gijly")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.60495, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.115958, 1.77839, -0.189013)
|
||||||
|
|
||||||
|
[node name="TAS UI" parent="." index="6" instance=ExtResource("4_8yatx")]
|
||||||
|
|
Loading…
Reference in New Issue