Add orbit camera and hovering stuff
This commit is contained in:
parent
f6b7f9e319
commit
bf10022d3b
@ -126,6 +126,11 @@ interact={
|
|||||||
"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":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
|
"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":69,"key_label":0,"unicode":101,"location":0,"echo":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)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
[internationalization]
|
[internationalization]
|
||||||
|
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
[gd_scene load_steps=4 format=3 uid="uid://bmewhw3f0n2s8"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://scripts/BuildingBlock.cs" id="1_htnym"]
|
|
||||||
[ext_resource type="Shader" path="res://textures/building_block.gdshader" id="2_dc3y0"]
|
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_q3u5a"]
|
|
||||||
render_priority = 0
|
|
||||||
shader = ExtResource("2_dc3y0")
|
|
||||||
shader_parameter/albedo = Color(0.417896, 0.417896, 0.417896, 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
|
|
||||||
|
|
||||||
[node name="BuildingBlockScene" type="RigidBody3D"]
|
|
||||||
script = ExtResource("1_htnym")
|
|
||||||
|
|
||||||
[node name="MeshInstance" type="MeshInstance3D" parent="."]
|
|
||||||
material_override = SubResource("ShaderMaterial_q3u5a")
|
|
@ -1,8 +1,10 @@
|
|||||||
[gd_scene load_steps=8 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="PackedScene" uid="uid://diwlyi146eroa" path="res://models/table.fbx" id="1_1soa3"]
|
||||||
[ext_resource type="Script" path="res://scripts/Table.cs" id="1_cb7s1"]
|
[ext_resource type="Script" path="res://scripts/Table.cs" id="1_cb7s1"]
|
||||||
[ext_resource type="Material" uid="uid://bq5oqyuwekryv" path="res://textures/building_block.tres" id="2_1s35y"]
|
[ext_resource type="Material" uid="uid://bq5oqyuwekryv" path="res://textures/building_block.tres" id="2_1s35y"]
|
||||||
|
[ext_resource type="Material" uid="uid://pu02smf107o8" path="res://textures/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"]
|
[sub_resource type="BoxShape3D" id="BoxShape3D_iiew7"]
|
||||||
size = Vector3(1.26587, 1.10037, 2.3989)
|
size = Vector3(1.26587, 1.10037, 2.3989)
|
||||||
@ -16,13 +18,17 @@ size = Vector3(2.4, 5, 0.01)
|
|||||||
[sub_resource type="BoxShape3D" id="BoxShape3D_3kmm7"]
|
[sub_resource type="BoxShape3D" id="BoxShape3D_3kmm7"]
|
||||||
size = Vector3(1.3, 0.2, 2.4)
|
size = Vector3(1.3, 0.2, 2.4)
|
||||||
|
|
||||||
[node name="table" type="StaticBody3D" node_paths=PackedStringArray("SpawnPoint")]
|
[node name="table" type="RigidBody3D" node_paths=PackedStringArray("SpawnPoint", "Orbit")]
|
||||||
collision_layer = 7
|
collision_layer = 7
|
||||||
collision_mask = 7
|
collision_mask = 7
|
||||||
|
lock_rotation = true
|
||||||
|
freeze = true
|
||||||
script = ExtResource("1_cb7s1")
|
script = ExtResource("1_cb7s1")
|
||||||
BlockMaterial = ExtResource("2_1s35y")
|
BlockMaterial = ExtResource("2_1s35y")
|
||||||
|
BlockHoverMaterial = ExtResource("3_m64id")
|
||||||
SpawnPoint = NodePath("SpawnPoint")
|
SpawnPoint = NodePath("SpawnPoint")
|
||||||
BlockMask = 2
|
BlockMask = 10
|
||||||
|
Orbit = NodePath("Orbit")
|
||||||
InteractName = "build"
|
InteractName = "build"
|
||||||
|
|
||||||
[node name="table" parent="." instance=ExtResource("1_1soa3")]
|
[node name="table" parent="." instance=ExtResource("1_1soa3")]
|
||||||
@ -57,3 +63,13 @@ shape = SubResource("BoxShape3D_5k7xn")
|
|||||||
[node name="Roof" type="CollisionShape3D" parent="TableWalls"]
|
[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)
|
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 6, 0)
|
||||||
shape = SubResource("BoxShape3D_3kmm7")
|
shape = SubResource("BoxShape3D_3kmm7")
|
||||||
|
|
||||||
|
[node name="Orbit" type="Node3D" parent="." node_paths=PackedStringArray("Camera")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.12311, 0)
|
||||||
|
script = ExtResource("4_nyqjn")
|
||||||
|
Camera = NodePath("OrbitCamera")
|
||||||
|
|
||||||
|
[node name="OrbitCamera" type="Camera3D" parent="Orbit"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1)
|
||||||
|
|
||||||
|
[connection signal="Interacted" from="." to="." method="Interact"]
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
using Godot;
|
using Godot;
|
||||||
using Godot.Collections;
|
using Godot.Collections;
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Gmtk24 {
|
namespace Gmtk24 {
|
||||||
public partial class BuildingBlock : RigidBody3D {
|
public partial class BuildingBlock : Interactible {
|
||||||
public BaseBlock Base;
|
public BaseBlock Base;
|
||||||
public ShaderMaterial Material;
|
public ShaderMaterial Material;
|
||||||
|
public ShaderMaterial HoverMaterial;
|
||||||
public float RelativeScale;
|
public float RelativeScale;
|
||||||
|
|
||||||
|
private MeshInstance3D MeshInstance;
|
||||||
|
|
||||||
|
private ShaderMaterial[] NormalMaterialArr;
|
||||||
|
private ShaderMaterial[] HoverMaterialArr;
|
||||||
|
|
||||||
public BuildingBlock() {
|
public BuildingBlock() {
|
||||||
Name = "BuildingBlock";
|
Name = "BuildingBlock";
|
||||||
}
|
}
|
||||||
@ -15,22 +20,37 @@ namespace Gmtk24 {
|
|||||||
public override void _Ready() {
|
public override void _Ready() {
|
||||||
base._Ready();
|
base._Ready();
|
||||||
|
|
||||||
var meshInstance = new MeshInstance3D() {
|
HoverMaterial ??= Material;
|
||||||
|
|
||||||
|
Hovered += OnHover;
|
||||||
|
|
||||||
|
MeshInstance = new MeshInstance3D() {
|
||||||
Mesh = Base.Mesh,
|
Mesh = Base.Mesh,
|
||||||
Scale = Vector3.One * RelativeScale,
|
Scale = Vector3.One * RelativeScale,
|
||||||
};
|
};
|
||||||
AddChild(meshInstance);
|
AddChild(MeshInstance);
|
||||||
|
|
||||||
for (int i = 0; i < meshInstance.GetSurfaceOverrideMaterialCount(); i++) {
|
int count = MeshInstance.GetSurfaceOverrideMaterialCount();
|
||||||
var replacedMaterial = meshInstance.Mesh.SurfaceGetMaterial(i);
|
|
||||||
|
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");
|
var transparency = replacedMaterial.Get("transparency");
|
||||||
if (((int)transparency) != 0) {
|
if (((int)transparency) != 0) {
|
||||||
ShaderMaterial newMat = (ShaderMaterial)Material.Duplicate();
|
ShaderMaterial newMat = (ShaderMaterial)Material.Duplicate();
|
||||||
newMat.SetShaderParameter("texture_albedo_for_alpha", replacedMaterial.Get("albedo_texture"));
|
newMat.SetShaderParameter("texture_albedo_for_alpha", replacedMaterial.Get("albedo_texture"));
|
||||||
meshInstance.SetSurfaceOverrideMaterial(i, newMat);
|
|
||||||
|
ShaderMaterial newHoverMat = (ShaderMaterial)HoverMaterial.Duplicate();
|
||||||
|
newHoverMat.SetShaderParameter("texture_albedo_for_alpha", replacedMaterial.Get("albedo_texture"));
|
||||||
|
|
||||||
|
NormalMaterialArr[i] = newMat;
|
||||||
|
HoverMaterialArr[i] = newHoverMat;
|
||||||
} else {
|
} else {
|
||||||
meshInstance.SetSurfaceOverrideMaterial(i, Material);
|
NormalMaterialArr[i] = Material;
|
||||||
}
|
}
|
||||||
|
MeshInstance.SetSurfaceOverrideMaterial(i, NormalMaterialArr[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var shape in Base.Colliders) {
|
foreach (var shape in Base.Colliders) {
|
||||||
@ -47,6 +67,15 @@ namespace Gmtk24 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnHover(bool hovered) {
|
||||||
|
for (int i = 0; i < MeshInstance.GetSurfaceOverrideMaterialCount(); i++) {
|
||||||
|
if (hovered)
|
||||||
|
MeshInstance.SetSurfaceOverrideMaterial(i, HoverMaterialArr[i]);
|
||||||
|
else
|
||||||
|
MeshInstance.SetSurfaceOverrideMaterial(i, NormalMaterialArr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public struct BaseBlock {
|
public struct BaseBlock {
|
||||||
public Mesh Mesh;
|
public Mesh Mesh;
|
||||||
public Array<CollisionShape3D> Colliders;
|
public Array<CollisionShape3D> Colliders;
|
||||||
|
@ -14,19 +14,20 @@ namespace Gmtk24 {
|
|||||||
if (Player == null)
|
if (Player == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GodotObject collider;
|
GodotObject collider = null;
|
||||||
if (Input.MouseMode == Input.MouseModeEnum.Captured) {
|
if (Input.MouseMode == Input.MouseModeEnum.Captured) {
|
||||||
collider = Player.LookingAt.GetCollider();
|
if (Player.Eye.Current)
|
||||||
|
collider = Player.LookingAt.GetCollider();
|
||||||
} else {
|
} else {
|
||||||
var viewport = GetViewport();
|
var viewport = GetViewport();
|
||||||
var camera = GetViewport().GetCamera3D();
|
var camera = GetViewport().GetCamera3D();
|
||||||
var origin = camera.ProjectRayOrigin(viewport.GetMousePosition());
|
var origin = camera.ProjectRayOrigin(viewport.GetMousePosition());
|
||||||
var normal = camera.ProjectRayNormal(viewport.GetMousePosition());
|
var normal = camera.ProjectRayNormal(viewport.GetMousePosition()) * 10000;
|
||||||
var ray = new PhysicsRayQueryParameters3D {
|
var ray = new PhysicsRayQueryParameters3D {
|
||||||
From = origin,
|
From = origin,
|
||||||
To = normal,
|
To = normal,
|
||||||
CollideWithBodies = true,
|
CollideWithBodies = true,
|
||||||
CollisionMask = 0b100,
|
CollisionMask = 0b1000,
|
||||||
HitBackFaces = false,
|
HitBackFaces = false,
|
||||||
HitFromInside = false,
|
HitFromInside = false,
|
||||||
};
|
};
|
||||||
@ -34,13 +35,16 @@ namespace Gmtk24 {
|
|||||||
|
|
||||||
if (results.ContainsKey("collider")) {
|
if (results.ContainsKey("collider")) {
|
||||||
collider = (GodotObject)results["collider"];
|
collider = (GodotObject)results["collider"];
|
||||||
} else {
|
|
||||||
collider = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (collider is Interactible interactible) {
|
if (collider is Interactible interactible) {
|
||||||
|
if (interactible != Hovered) {
|
||||||
|
Hovered?.SetHovered(false);
|
||||||
|
interactible.SetHovered(true);
|
||||||
|
}
|
||||||
|
|
||||||
Hovered = interactible;
|
Hovered = interactible;
|
||||||
|
|
||||||
StringBuilder Builder = new StringBuilder();
|
StringBuilder Builder = new StringBuilder();
|
||||||
@ -50,6 +54,7 @@ namespace Gmtk24 {
|
|||||||
|
|
||||||
HoverText.Text = Builder.ToString();
|
HoverText.Text = Builder.ToString();
|
||||||
} else {
|
} else {
|
||||||
|
Hovered?.SetHovered(false);
|
||||||
Hovered = null;
|
Hovered = null;
|
||||||
HoverText.Text = "";
|
HoverText.Text = "";
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,21 @@
|
|||||||
using Godot;
|
using Godot;
|
||||||
|
|
||||||
namespace Gmtk24 {
|
namespace Gmtk24 {
|
||||||
public partial class Interactible : StaticBody3D {
|
public partial class Interactible : RigidBody3D {
|
||||||
[Signal]
|
[Signal]
|
||||||
public delegate void OnInteractedEventHandler(InputEvent e);
|
public delegate void InteractedEventHandler(InputEvent e);
|
||||||
|
[Signal]
|
||||||
|
public delegate void HoveredEventHandler(bool hovered);
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
public string InteractName;
|
public string InteractName;
|
||||||
|
|
||||||
public void HandleInput(InputEvent e) {
|
public void HandleInput(InputEvent e) {
|
||||||
EmitSignal(SignalName.OnInteracted, e);
|
EmitSignal(SignalName.Interacted, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHovered(bool hovered) {
|
||||||
|
EmitSignal(SignalName.Hovered, hovered);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
57
scripts/Orbit.cs
Normal file
57
scripts/Orbit.cs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
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 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -15,7 +15,7 @@ namespace Gmtk24 {
|
|||||||
public float Gravity = 20;
|
public float Gravity = 20;
|
||||||
[ExportCategory("Vision")]
|
[ExportCategory("Vision")]
|
||||||
[Export]
|
[Export]
|
||||||
public Node3D Eye;
|
public Camera3D Eye;
|
||||||
[Export]
|
[Export]
|
||||||
public RayCast3D LookingAt;
|
public RayCast3D LookingAt;
|
||||||
[ExportCategory("Noises")]
|
[ExportCategory("Noises")]
|
||||||
|
@ -10,10 +10,15 @@ namespace Gmtk24 {
|
|||||||
[Export]
|
[Export]
|
||||||
public ShaderMaterial BlockMaterial;
|
public ShaderMaterial BlockMaterial;
|
||||||
[Export]
|
[Export]
|
||||||
|
public ShaderMaterial BlockHoverMaterial;
|
||||||
|
[Export]
|
||||||
public Node3D SpawnPoint;
|
public Node3D SpawnPoint;
|
||||||
[Export(PropertyHint.LayersAvoidance)]
|
[Export(PropertyHint.LayersAvoidance)]
|
||||||
public uint BlockMask;
|
public uint BlockMask;
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public Orbit Orbit;
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
// Called when the node enters the scene tree for the first time.
|
||||||
public override void _Ready() {
|
public override void _Ready() {
|
||||||
Vector3 SpawnPos = Vector3.Zero;
|
Vector3 SpawnPos = Vector3.Zero;
|
||||||
@ -22,10 +27,6 @@ namespace Gmtk24 {
|
|||||||
SpawnPos = SpawnPoint.GlobalPosition - GlobalPosition;
|
SpawnPos = SpawnPoint.GlobalPosition - GlobalPosition;
|
||||||
|
|
||||||
SpawnBlocks(SpawnPos);
|
SpawnBlocks(SpawnPos);
|
||||||
|
|
||||||
OnInteracted += (e) => {
|
|
||||||
GD.Print("hello!");
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SpawnBlocks(Vector3 position) {
|
public void SpawnBlocks(Vector3 position) {
|
||||||
@ -39,6 +40,7 @@ namespace Gmtk24 {
|
|||||||
var block = new BuildingBlock() {
|
var block = new BuildingBlock() {
|
||||||
Base = baseBlock,
|
Base = baseBlock,
|
||||||
Material = BlockMaterial,
|
Material = BlockMaterial,
|
||||||
|
HoverMaterial = BlockHoverMaterial,
|
||||||
Position = position + Vector3.One * (rng.Randf() * 0.5f - 0.25f) + Vector3.Up * rng.Randf(),
|
Position = position + Vector3.One * (rng.Randf() * 0.5f - 0.25f) + Vector3.Up * rng.Randf(),
|
||||||
CollisionMask = BlockMask,
|
CollisionMask = BlockMask,
|
||||||
CollisionLayer = BlockMask,
|
CollisionLayer = BlockMask,
|
||||||
@ -49,5 +51,9 @@ namespace Gmtk24 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Interact(InputEvent _) {
|
||||||
|
Orbit.SetEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
13
textures/building_block_hover.tres
Normal file
13
textures/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://textures/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
|
Loading…
Reference in New Issue
Block a user