Files
XRLib/Assets/Runtime Transform Gizmos/Scripts/Runtime Package Common/Utilities/ObjectVertexCollect.cs
2025-06-19 19:24:30 +09:00

84 lines
3.6 KiB
C#

using UnityEngine;
using System.Collections.Generic;
namespace RTG
{
public static class ObjectVertexCollect
{
private static List<Vector3> _hierarchyVertsCollectBuffer = new List<Vector3>();
public static List<Vector3> CollectModelSpriteVerts(Sprite sprite, AABB collectAABB)
{
var spriteModelVerts = sprite.vertices;
var collectedVerts = new List<Vector3>(7);
foreach(var vertPos in spriteModelVerts)
{
if(BoxMath.ContainsPoint(vertPos, collectAABB.Center, collectAABB.Size, Quaternion.identity))
collectedVerts.Add(vertPos);
}
return collectedVerts;
}
public static List<Vector3> CollectWorldSpriteVerts(Sprite sprite, Transform spriteTransform, OBB collectOBB)
{
var spriteWorldVerts = sprite.GetWorldVerts(spriteTransform);
var collectedVerts = new List<Vector3>(7);
foreach (var vertPos in spriteWorldVerts)
{
if (BoxMath.ContainsPoint(vertPos, collectOBB.Center, collectOBB.Size, collectOBB.Rotation))
collectedVerts.Add(vertPos);
}
return collectedVerts;
}
public static List<Vector3> CollectHierarchyVerts(GameObject root, BoxFace collectFace, float collectBoxScale, float collectEps)
{
var meshObjects = root.GetMeshObjectsInHierarchy();
var spriteObjects = root.GetSpriteObjectsInHierarchy();
if (meshObjects.Count == 0 && spriteObjects.Count == 0) return new List<Vector3>();
var boundsQConfig = new ObjectBounds.QueryConfig();
boundsQConfig.ObjectTypes = GameObjectType.Mesh | GameObjectType.Sprite;
OBB hierarchyOBB = ObjectBounds.CalcHierarchyWorldOBB(root, boundsQConfig);
if (!hierarchyOBB.IsValid) return new List<Vector3>();
int faceAxisIndex = BoxMath.GetFaceAxisIndex(collectFace);
Vector3 faceCenter = BoxMath.CalcBoxFaceCenter(hierarchyOBB.Center, hierarchyOBB.Size, hierarchyOBB.Rotation, collectFace);
Vector3 faceNormal = BoxMath.CalcBoxFaceNormal(hierarchyOBB.Center, hierarchyOBB.Size, hierarchyOBB.Rotation, collectFace);
float sizeEps = collectEps * 2.0f;
Vector3 collectAABBSize = hierarchyOBB.Size;
collectAABBSize[faceAxisIndex] = (hierarchyOBB.Size[faceAxisIndex] * collectBoxScale) + sizeEps;
collectAABBSize[(faceAxisIndex + 1) % 3] += sizeEps;
collectAABBSize[(faceAxisIndex + 2) % 3] += sizeEps;
OBB collectOBB = new OBB(faceCenter + faceNormal * (-collectAABBSize[faceAxisIndex] * 0.5f + collectEps), collectAABBSize);
collectOBB.Rotation = hierarchyOBB.Rotation;
var collectedVerts = new List<Vector3>(80);
foreach(var meshObject in meshObjects)
{
Mesh mesh = meshObject.GetMesh();
RTMesh rtMesh = RTMeshDb.Get.GetRTMesh(mesh);
if (rtMesh == null) continue;
rtMesh.OverlapVerts(collectOBB, meshObject.transform, _hierarchyVertsCollectBuffer);
if (_hierarchyVertsCollectBuffer.Count != 0) collectedVerts.AddRange(_hierarchyVertsCollectBuffer);
}
foreach (var spriteObject in spriteObjects)
{
var verts = CollectWorldSpriteVerts(spriteObject.GetSprite(), spriteObject.transform, collectOBB);
if (verts.Count != 0) collectedVerts.AddRange(verts);
}
return collectedVerts;
}
}
}