Newer
Older
Marco Zimmer
committed
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
Marco Zimmer
committed
using UnityEngine;
using static StageStatic;
/// <summary>
/// Attached to prefab Def_Stage
/// </summary>
Marco Zimmer
committed
public class StageBehaviour : MonoBehaviour
{
/// <summary>
/// Re-loads <see cref="StageStatic.stage"/> to display all <see cref="Fact">Facts</see>.
/// </summary>
Marco Zimmer
committed
{
StageStatic.LoadInitStage(true /*StageStatic.stage.player_record.solved*/, gameObject);
Marco Zimmer
committed
}
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
private List<TriangleFact> GenerateMMTCollider()
{
bool debug = false;
var t0 = System.DateTime.Now;
List<TriangleFact> tris = new();
foreach (MeshCollider coll in FindObjectsOfType<MeshCollider>())
{
if (!coll.sharedMesh.isReadable)
continue;
for (int i = 0; i < coll.sharedMesh.triangles.Length; i += 3)
{
tris.Add(new(
new[] {
_Transform(coll.sharedMesh.vertices[coll.sharedMesh.triangles[i + 0]], coll.transform.localToWorldMatrix),
_Transform(coll.sharedMesh.vertices[coll.sharedMesh.triangles[i + 1]], coll.transform.localToWorldMatrix),
_Transform(coll.sharedMesh.vertices[coll.sharedMesh.triangles[i + 2]], coll.transform.localToWorldMatrix),
},
null,
StageStatic.stage.factState)
);
}
}
if (debug)
{
var t1 = System.DateTime.Now - t0;
Debug.Log($"{tris.Count} Tris in {t1.Milliseconds}");
Mesh mesh = new()
{
indexFormat = UnityEngine.Rendering.IndexFormat.UInt32,
vertices = tris.SelectMany(t => t.Verticies).ToArray(),
triangles = Enumerable.Range(0, tris.Count * 3).ToArray(),
};
mesh.Optimize();
mesh.RecalculateNormals();
MeshFilter filter = gameObject.GetComponent<MeshFilter>();
filter.sharedMesh = mesh;
}
return tris;
Vector3 _Transform(Vector3 vert, Matrix4x4 toworld)
{
Vector4 h = toworld * new Vector4(vert.x, vert.y, vert.z, 1f);
return new Vector3(h.x, h.y, h.z);
}
}
/// <summary>
/// Resets changes made by <see cref="StageStatic.stage"/> and frees ressources.
/// </summary>
Marco Zimmer
committed
private void OnDestroy()
{
// StageStatic.stage.solution.hardreset(invoke_event: false); NO! keep in memory!
// StageStatic.stage?.factState.hardreset(invoke_event: false); also keep?
Marco Zimmer
committed
}
/// <summary>
/// Wrapps <see cref="SetMode(Mode, GameObject)"/>. Needed as endpoint for unity buttons.
/// </summary>
/// <param name="create"><c>SetMode(create ? Mode.Create : Mode.Play);</c></param>
Marco Zimmer
committed
public void SetMode(bool create)
{
SetMode(create ? Mode.Create : Mode.Play);
}
/// <summary>
/// Wrapps <see cref="StageStatic.SetMode(Mode, GameObject)"/>. Defaulting <paramref name="obj"/> to <see cref="this.gameObject"/>.
/// </summary>
/// \copydetails StageStatic.SetMode(Mode, GameObject)
Marco Zimmer
committed
public void SetMode(Mode mode, GameObject obj = null)
{
obj ??= gameObject;
StageStatic.SetMode(mode, obj);
}
}