156 lines
5.3 KiB
C#
156 lines
5.3 KiB
C#
using System.Collections.Generic;
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
namespace AmazingAssets.CurvedWorld
|
|
{
|
|
[ExecuteInEditMode]
|
|
public class CurvedWorldBoundingBox : MonoBehaviour
|
|
{
|
|
public float scale = 1;
|
|
float currentScale;
|
|
Vector3 boundingBoxSize;
|
|
Bounds originalBounds;
|
|
|
|
SkinnedMeshRenderer skinnedMeshRenderer;
|
|
MeshFilter meshFilter;
|
|
|
|
static Dictionary<int, Bounds> boundsDictionary;
|
|
|
|
public bool visualizeInEditor;
|
|
|
|
|
|
|
|
void OnEnable()
|
|
{
|
|
currentScale = -1;
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
if (skinnedMeshRenderer != null && skinnedMeshRenderer.sharedMesh != null)
|
|
skinnedMeshRenderer.sharedMesh.bounds = originalBounds;
|
|
|
|
else if (meshFilter != null && meshFilter.sharedMesh != null)
|
|
meshFilter.sharedMesh.bounds = originalBounds;
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
if (boundsDictionary == null)
|
|
boundsDictionary = new Dictionary<int, Bounds>();
|
|
|
|
meshFilter = GetComponent<MeshFilter>();
|
|
skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
|
|
|
|
if (meshFilter != null && meshFilter.sharedMesh != null)
|
|
{
|
|
if (boundsDictionary.ContainsKey(meshFilter.sharedMesh.GetInstanceID()))
|
|
originalBounds = boundsDictionary[meshFilter.sharedMesh.GetInstanceID()];
|
|
else
|
|
{
|
|
originalBounds = meshFilter.sharedMesh.bounds;
|
|
boundsDictionary.Add(meshFilter.sharedMesh.GetInstanceID(), originalBounds);
|
|
}
|
|
|
|
boundingBoxSize = originalBounds.size;
|
|
|
|
float size = 1.0f;
|
|
if (boundingBoxSize.x > size) size = boundingBoxSize.x;
|
|
if (boundingBoxSize.y > size) size = boundingBoxSize.y;
|
|
if (boundingBoxSize.z > size) size = boundingBoxSize.z;
|
|
|
|
boundingBoxSize.x = boundingBoxSize.y = boundingBoxSize.z = size;
|
|
}
|
|
else if (skinnedMeshRenderer != null && skinnedMeshRenderer.sharedMesh != null)
|
|
{
|
|
if (boundsDictionary.ContainsKey(skinnedMeshRenderer.sharedMesh.GetInstanceID()))
|
|
originalBounds = boundsDictionary[skinnedMeshRenderer.sharedMesh.GetInstanceID()];
|
|
else
|
|
{
|
|
originalBounds = skinnedMeshRenderer.sharedMesh.bounds;
|
|
boundsDictionary.Add(skinnedMeshRenderer.sharedMesh.GetInstanceID(), originalBounds);
|
|
}
|
|
|
|
boundingBoxSize = originalBounds.size;
|
|
|
|
float size = 1.0f;
|
|
if (boundingBoxSize.x > size) size = boundingBoxSize.x;
|
|
if (boundingBoxSize.y > size) size = boundingBoxSize.y;
|
|
if (boundingBoxSize.z > size) size = boundingBoxSize.z;
|
|
|
|
boundingBoxSize.x = boundingBoxSize.y = boundingBoxSize.z = size;
|
|
}
|
|
|
|
currentScale = 0;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (currentScale != scale)
|
|
{
|
|
if (scale < 0)
|
|
scale = 0;
|
|
|
|
currentScale = scale;
|
|
|
|
|
|
if (skinnedMeshRenderer != null)
|
|
skinnedMeshRenderer.localBounds = new Bounds(skinnedMeshRenderer.localBounds.center, boundingBoxSize * scale);
|
|
|
|
else if (meshFilter != null && meshFilter.sharedMesh != null)
|
|
meshFilter.sharedMesh.bounds = new Bounds(meshFilter.sharedMesh.bounds.center, boundingBoxSize * scale);
|
|
}
|
|
}
|
|
|
|
void OnDrawGizmos()
|
|
{
|
|
if (visualizeInEditor)
|
|
{
|
|
Gizmos.color = Color.yellow;
|
|
|
|
if (skinnedMeshRenderer != null && skinnedMeshRenderer.sharedMesh != null)
|
|
Gizmos.DrawWireCube(transform.TransformPoint(skinnedMeshRenderer.localBounds.center), boundingBoxSize * scale);
|
|
|
|
else if (meshFilter != null && meshFilter.sharedMesh != null)
|
|
Gizmos.DrawWireCube(transform.TransformPoint(meshFilter.sharedMesh.bounds.center), boundingBoxSize * scale);
|
|
}
|
|
}
|
|
|
|
void Reset()
|
|
{
|
|
scale = 1;
|
|
|
|
RecalculateBounds();
|
|
Update();
|
|
}
|
|
|
|
public void RecalculateBounds()
|
|
{
|
|
if (skinnedMeshRenderer != null && skinnedMeshRenderer.sharedMesh != null)
|
|
{
|
|
skinnedMeshRenderer.sharedMesh.RecalculateBounds();
|
|
|
|
originalBounds = skinnedMeshRenderer.sharedMesh.bounds;
|
|
|
|
if (boundsDictionary != null && boundsDictionary.ContainsKey(skinnedMeshRenderer.sharedMesh.GetInstanceID()))
|
|
{
|
|
boundsDictionary[skinnedMeshRenderer.sharedMesh.GetInstanceID()] = originalBounds;
|
|
}
|
|
}
|
|
|
|
else if (meshFilter != null && meshFilter.sharedMesh != null)
|
|
{
|
|
meshFilter.sharedMesh.RecalculateBounds();
|
|
|
|
originalBounds = meshFilter.sharedMesh.bounds;
|
|
|
|
if (boundsDictionary != null && boundsDictionary.ContainsKey(meshFilter.sharedMesh.GetInstanceID()))
|
|
{
|
|
boundsDictionary[meshFilter.sharedMesh.GetInstanceID()] = originalBounds;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |