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);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|     }
 | |
| }
 |