98 lines
3.2 KiB
C#
98 lines
3.2 KiB
C#
using System.Collections.Generic;
|
|
using Escape_Room_Engine.Engine.Scripts.Modules;
|
|
using UnityEngine;
|
|
|
|
namespace Escape_Room_Engine.Engine.Scripts
|
|
{
|
|
public class Space
|
|
{
|
|
/// <summary>
|
|
/// The room relative (<i>RR</i>) dimensions of this space.
|
|
/// </summary>
|
|
internal readonly Dimensions rrDimensions;
|
|
|
|
private GameObject _spaceObject;
|
|
private List<Module> _modules = new(2);
|
|
|
|
internal Space(Dimensions rrDimensions, Passage entrance)
|
|
{
|
|
this.rrDimensions = rrDimensions;
|
|
|
|
// connect the space to its passage
|
|
entrance.ConnectTo(new DoorModule(DoorType.Entrance, this));
|
|
AddModule(entrance.toIn);
|
|
}
|
|
|
|
internal void AddModule(Module module)
|
|
{
|
|
_modules.Add(module);
|
|
}
|
|
|
|
internal void InstantiateSpace(Transform parent, string name)
|
|
{
|
|
_spaceObject = new GameObject($"Space {name}", typeof(MeshFilter), typeof(MeshRenderer));
|
|
_spaceObject.transform.SetParent(parent, false);
|
|
_spaceObject.transform.localPosition = new Vector3(rrDimensions.x, 0, rrDimensions.z);
|
|
|
|
var meshFilter = _spaceObject.GetComponent<MeshFilter>();
|
|
meshFilter.mesh = GenerateMesh();
|
|
|
|
var meshRenderer = _spaceObject.GetComponent<MeshRenderer>();
|
|
meshRenderer.material = Engine.DefaultEngine.roomMaterial;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Convert a position relative to this space to one relative to the room.
|
|
/// </summary>
|
|
/// <param name="srPosition">The space relative (<i>SR</i>) position that should be converted to a room relative (<i>RR</i>) position.</param>
|
|
/// <returns></returns>
|
|
internal Vector2Int ToRoomRelative(Vector2Int srPosition) => srPosition + rrDimensions.Position;
|
|
/// <summary>
|
|
/// Convert a position relative to the room to one relative to this space.
|
|
/// </summary>
|
|
/// <param name="rrPosition">The room relative (<i>RR</i>) position that should be converted to a space relative (<i>SR</i>) position.</param>
|
|
/// <returns></returns>
|
|
internal Vector2Int ToSpaceRelative(Vector2Int rrPosition) => rrPosition - rrDimensions.Position;
|
|
|
|
private Mesh GenerateMesh()
|
|
{
|
|
var mesh = new Mesh();
|
|
|
|
mesh.vertices = new[]
|
|
{
|
|
new Vector3(0, 0, 0),
|
|
new Vector3(rrDimensions.width, 0, 0),
|
|
new Vector3(0, 0, rrDimensions.length),
|
|
new Vector3(rrDimensions.width, 0, rrDimensions.length)
|
|
};
|
|
|
|
mesh.triangles = new[]
|
|
{
|
|
0, 2, 1,
|
|
2, 3, 1
|
|
};
|
|
|
|
var normal = Vector3.up;
|
|
mesh.normals = new[]
|
|
{
|
|
normal, normal, normal, normal
|
|
};
|
|
|
|
mesh.uv = new[]
|
|
{
|
|
new Vector2(0, 0),
|
|
new Vector2(1, 0),
|
|
new Vector2(0, 1),
|
|
new Vector2(1, 1)
|
|
};
|
|
|
|
return mesh;
|
|
}
|
|
|
|
internal void Destroy()
|
|
{
|
|
Object.Destroy(_spaceObject);
|
|
}
|
|
}
|
|
}
|