Spelunx Cavern SDK
 
Loading...
Searching...
No Matches
WorldSpaceMeshCanvas.cs
Go to the documentation of this file.
1using UnityEngine;
2
3namespace Spelunx
4{
5 [ExecuteInEditMode]
6 [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
7 public class WorldSpaceMeshCanvas : MonoBehaviour
8 {
9 [SerializeField, Tooltip("A reference to the Cavern Camera")]
10 private CavernRenderer cavernRenderer;
11
12 [SerializeField, Tooltip("Distance from the screen to render. 0 is purely at the center, 1 is at the boundry"), Min(0)]
13 private float distance = 1.0f;
14
15 [SerializeField, Tooltip("Should the round canvas be automatically positioned around the CAVERN?")]
16 private bool autoposition = true;
17
18 private bool shouldUpdateMesh = false;
19 private Mesh mesh;
20
21 // Start is called once before the first execution of Update after the MonoBehaviour is created
22 void Start()
23 {
24 UpdateMesh();
25 cavernRenderer.settingsChanged.AddListener(() => shouldUpdateMesh = true);
26 }
27
28 void Update()
29 {
30 if (shouldUpdateMesh)
31 {
32 UpdateMesh();
33 shouldUpdateMesh = false;
34 }
35 if (autoposition)
36 {
37 // center the mesh on the cavern's center by moving the y position down based on the difference in cavern height vs mesh height
38 float yOffset = -cavernRenderer.GetCavernHeight() * (distance - 1) / 2;
39 transform.localPosition = new(transform.localPosition.x, yOffset, transform.localPosition.z);
40 }
41 }
42
43 // Create the mesh based on CAVERN size
44 void UpdateMesh()
45 {
46 mesh = cavernRenderer.GenerateMesh();
47 mesh.name = "Round Canvas Mesh";
48 GetComponent<MeshFilter>().mesh = mesh;
49 transform.localScale = new(distance, distance, distance);
50 }
51
52 void OnValidate()
53 {
54 shouldUpdateMesh = true;
55 }
56
57 public void setCavernRenderer(CavernRenderer renderer) {
58 cavernRenderer = renderer;
59 }
60 }
61}
void setCavernRenderer(CavernRenderer renderer)