Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

149 lines
4.1 KiB

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class MeshData : MonoBehaviour
{
[SerializeField, HideInInspector]
private int m_currentSubdivisions = 1;
[SerializeField, HideInInspector]
private List<SubData> m_data = new List<SubData>();
[SerializeField, HideInInspector]
private List<ColliderData> m_colliderData = new List<ColliderData>();
[System.Serializable]
public class SubData
{
public Mesh originalMesh;
public Mesh currentMesh;
public Vector3[] subdividedVertices;
public MeshFilter meshFilter;
public SubData(MeshFilter meshFilter)
{
this.meshFilter = meshFilter;
originalMesh = this.meshFilter.sharedMesh;
}
}
[System.Serializable]
public class ColliderData
{
public Collider originalCollider;
public MeshCollider currentCollider;
public SubData attachedData;
public ColliderData(Collider collider, SubData data)
{
originalCollider = collider;
originalCollider.enabled = false;
currentCollider = originalCollider.gameObject.AddComponent<MeshCollider>();
attachedData = data;
Update();
}
public void Update()
{
currentCollider.sharedMesh = attachedData.currentMesh;
}
}
public static MeshData Add(GameObject gameObject)
{
MeshData _meshData = gameObject.AddComponent<MeshData>();
foreach (MeshFilter meshFilter in gameObject.GetComponentsInChildren<MeshFilter>())
{
SubData _data = new SubData(meshFilter);
_meshData.m_data.Add(_data);
_meshData.SubdivideData(_data);
}
foreach(Collider collider in gameObject.GetComponentsInChildren<Collider>())
{
MeshFilter meshFilter = collider.gameObject.GetComponentInChildren<MeshFilter>();
SubData data = _meshData.m_data.FirstOrDefault(p => p.meshFilter == meshFilter);
if (data != null)
_meshData.m_colliderData.Add(new ColliderData(collider, data));
}
return _meshData;
}
public void Remove()
{
foreach (SubData data in m_data)
{
data.meshFilter.sharedMesh = data.originalMesh;
DestroyImmediate(data.currentMesh);
}
foreach(ColliderData data in m_colliderData)
{
data.originalCollider.enabled = true;
DestroyImmediate(data.currentCollider);
}
DestroyImmediate(this);
}
public void SubdivideMesh(int subdivisionAmount)
{
if (m_currentSubdivisions == subdivisionAmount)
return;
m_currentSubdivisions = subdivisionAmount;
foreach (SubData data in m_data)
SubdivideData(data);
foreach (ColliderData collisionData in m_colliderData)
collisionData.Update();
}
public void CurveMesh(Vector3 Centre, Vector3 Axis)
{
foreach (SubData data in m_data)
CurveData(data, Centre, Axis);
foreach (ColliderData collisionData in m_colliderData)
collisionData.Update();
}
private void CurveData(SubData data, Vector3 Centre, Vector3 Axis)
{
data.currentMesh.vertices = Utility.Meshes.Curve.CurveVertices(data.subdividedVertices, Centre, Axis, data.meshFilter.transform,transform.position);
}
private void SubdivideData(SubData data)
{
if (data.currentMesh != null)
DestroyImmediate(data.currentMesh);
data.currentMesh = null;
data.currentMesh = Utility.Meshes.Subdivion.DuplicateMesh(data.originalMesh);
Debug.Log($"Subdividing by: {m_currentSubdivisions}");
Utility.Meshes.Subdivion.Subdivide(data.currentMesh, m_currentSubdivisions);
data.currentMesh.RecalculateBounds();
data.currentMesh.RecalculateNormals();
data.currentMesh.RecalculateTangents();
data.subdividedVertices = data.currentMesh.vertices;
data.meshFilter.sharedMesh = data.currentMesh;
}
}