157 lines
5.6 KiB
C#
157 lines
5.6 KiB
C#
|
|
// Curved World <http://u3d.as/1W8h>
|
||
|
|
// Copyright (c) Amazing Assets <https://amazingassets.world>
|
||
|
|
|
||
|
|
using System.Collections.Generic;
|
||
|
|
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
|
||
|
|
namespace AmazingAssets.CurvedWorld
|
||
|
|
{
|
||
|
|
[AddComponentMenu("Amazing Assets/Curved World/Bounding Box")]
|
||
|
|
[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 drawGizmos;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
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 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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnDrawGizmos()
|
||
|
|
{
|
||
|
|
if (drawGizmos)
|
||
|
|
{
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|