add vr template project

This commit is contained in:
Guillaume Vern
2025-10-08 11:10:13 +02:00
parent 2cda32f24c
commit 97f183e59f
613 changed files with 37826 additions and 1499 deletions
+86
View File
@@ -0,0 +1,86 @@
@tool
class_name Scatter
extends Node3D
## Scatter Meshes Script
##
## This code allows you to quickly place a number of instances of a mesh at
## random locations.
@export var extend : Vector3 = Vector3(1.0, 0.0, 1.0): set = set_extend
@export var instance_count : int = 10: set = set_instance_count
@export var min_scale : float = 1.0: set = set_min_scale
@export var max_scale : float = 1.0: set = set_max_scale
@export var mesh : Mesh: set = set_mesh
@export var material_override : Material: set = set_material_override
var dirty : bool = true
var multi_mesh : MultiMesh
var multi_mesh_instance : MultiMeshInstance3D
func set_extend(new_value):
extend = new_value
_set_dirty()
func set_instance_count(new_value):
instance_count = new_value
_set_dirty()
func set_min_scale(new_value):
min_scale = new_value
_set_dirty()
func set_max_scale(new_value):
max_scale = new_value
_set_dirty()
func set_mesh(new_mesh):
mesh = new_mesh
if multi_mesh:
multi_mesh.mesh = mesh
func set_material_override(new_material):
material_override = new_material
if multi_mesh_instance:
multi_mesh_instance.material_override = material_override
func _set_dirty():
if !dirty:
dirty = true
call_deferred("_update_multimesh")
func _update_multimesh():
if !dirty:
return
multi_mesh.instance_count = instance_count
for i in instance_count:
var t := Transform3D()
var s := randf_range(min_scale, max_scale)
t.basis = Basis() \
.rotated(Vector3.UP, randf_range(-PI, PI)) \
.scaled(Vector3(s, s, s))
t.origin = Vector3(
randf_range(-extend.x, extend.x),
randf_range(-extend.y, extend.y),
randf_range(-extend.z, extend.z))
multi_mesh.set_instance_transform(i, t)
dirty = false
# Called when the node enters the scene tree for the first time.
func _ready():
multi_mesh = MultiMesh.new()
multi_mesh.transform_format = MultiMesh.TRANSFORM_3D
multi_mesh.mesh = mesh
multi_mesh_instance = MultiMeshInstance3D.new()
multi_mesh_instance.multimesh = multi_mesh
multi_mesh_instance.material_override = material_override
add_child(multi_mesh_instance)
# First time creating our multimesh
_update_multimesh()
+1
View File
@@ -0,0 +1 @@
uid://dn6lkhk3gbq4n
+19
View File
@@ -0,0 +1,19 @@
extends Node3D
@export var saved_material : Material
# We only allow saving once after our scene loads
var is_saved = false
func _on_save_button_button_pressed(_button):
# Skip if already saved
if is_saved:
return
# Auto-save the game
if not GameState.auto_save_game():
return
# Change button to saved
$Pole/SaveButton/Button.set_surface_override_material(0, saved_material)
is_saved = true
@@ -0,0 +1 @@
uid://l4ifqkq17ax
+78
View File
@@ -0,0 +1,78 @@
[gd_scene load_steps=13 format=3 uid="uid://dm2e4qfiy0v0a"]
[ext_resource type="Script" path="res://components/helpers/zone_save_point.gd" id="1_hwwjp"]
[ext_resource type="Texture2D" uid="uid://b28f4me1ublg4" path="res://assets/prototype_materials/pattern.png" id="2_2gaip"]
[ext_resource type="Material" uid="uid://c386ygo86nqfc" path="res://assets/prototype_materials/wood_brown.tres" id="3_nemau"]
[ext_resource type="PackedScene" uid="uid://cme66uldrjl2i" path="res://addons/godot-xr-tools/interactables/interactable_area_button.tscn" id="4_8b5h5"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5lqxg"]
albedo_color = Color(0.00784314, 0.615686, 0, 1)
albedo_texture = ExtResource("2_2gaip")
[sub_resource type="CylinderMesh" id="CylinderMesh_7f0ok"]
top_radius = 0.05
bottom_radius = 0.05
height = 1.4
radial_segments = 8
rings = 1
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cxops"]
albedo_texture = ExtResource("2_2gaip")
metallic = 0.59
roughness = 0.41
uv1_scale = Vector3(1, 4, 1)
[sub_resource type="BoxMesh" id="BoxMesh_0273w"]
size = Vector3(0.4, 0.04, 0.3)
[sub_resource type="BoxShape3D" id="BoxShape3D_0tokh"]
size = Vector3(0.4, 0.04, 0.3)
[sub_resource type="SphereShape3D" id="SphereShape3D_62pep"]
radius = 0.15
[sub_resource type="CylinderMesh" id="CylinderMesh_wjqor"]
top_radius = 0.075
bottom_radius = 0.1
height = 0.05
radial_segments = 16
rings = 1
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lql4b"]
albedo_color = Color(0.760784, 0.164706, 0.0823529, 1)
albedo_texture = ExtResource("2_2gaip")
[node name="ZoneSavePoint" type="Node3D"]
script = ExtResource("1_hwwjp")
saved_material = SubResource("StandardMaterial3D_5lqxg")
[node name="Pole" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.7, -0.75)
mesh = SubResource("CylinderMesh_7f0ok")
surface_material_override/0 = SubResource("StandardMaterial3D_cxops")
[node name="Table" type="StaticBody3D" parent="Pole"]
transform = Transform3D(1, 0, 0, 0, 0.929358, -0.369179, 0, 0.369179, 0.929358, 0, 0.702817, 0)
[node name="Mesh" type="MeshInstance3D" parent="Pole/Table"]
mesh = SubResource("BoxMesh_0273w")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("3_nemau")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Pole/Table"]
shape = SubResource("BoxShape3D_0tokh")
[node name="SaveButton" parent="Pole" instance=ExtResource("4_8b5h5")]
transform = Transform3D(1, 0, 0, 0, 0.929358, -0.369179, 0, 0.369179, 0.929358, 0, 0.702817, 0)
button = NodePath("Button")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Pole/SaveButton"]
shape = SubResource("SphereShape3D_62pep")
[node name="Button" type="MeshInstance3D" parent="Pole/SaveButton"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0436053, -1.19209e-07)
mesh = SubResource("CylinderMesh_wjqor")
skeleton = NodePath("../../Table/Mesh")
surface_material_override/0 = SubResource("StandardMaterial3D_lql4b")
[connection signal="button_pressed" from="Pole/SaveButton" to="." method="_on_save_button_button_pressed"]
+39
View File
@@ -0,0 +1,39 @@
@tool
extends Area3D
## Zone scene file
@export_file('*.tscn') var zone_scene : String = ""
## If true the zone switcher is enabled
@export var enabled : bool = true
## Name of the spawn-point node name in the target scene
@export var spawn_node_name := ""
# Called when the node enters the scene tree for the first time.
func _ready():
connect("body_entered", Callable(self, "_on_body_entered"))
# Called when a body enters this area
func _on_body_entered(body : Node3D):
# Ignore if not enabled
if not enabled:
return
# Skip if it wasn't the player entering
if not body.is_in_group("player_body"):
return
# Find our scene base
var scene_base : XRToolsSceneBase = XRTools.find_xr_ancestor(self, "*", "XRToolsSceneBase")
if not scene_base:
return
# Fire the load_scene signal
if zone_scene == "":
scene_base.reset_scene(spawn_node_name)
else:
scene_base.load_scene(zone_scene, spawn_node_name)
@@ -0,0 +1 @@
uid://d28e8mu0f8dx4
+9
View File
@@ -0,0 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://vm423o6hdlya"]
[ext_resource type="Script" path="res://components/helpers/zone_switch_area.gd" id="1"]
[node name="ZoneSwitchArea" type="Area3D"]
collision_layer = 0
collision_mask = 524288
monitorable = false
script = ExtResource("1")