80 lines
3.5 KiB
C#
80 lines
3.5 KiB
C#
#if UNITY_EDITOR
|
|
using UnityEngine;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace O3DWB
|
|
{
|
|
public static class Object2ObjectBoxSnapDataFactory
|
|
{
|
|
public static Object2ObjectBoxSnapData Create(GameObject meshObject)
|
|
{
|
|
if (meshObject == null) return null;
|
|
|
|
Mesh objectMesh = meshObject.GetMeshFromFilterOrSkinnedMeshRenderer();
|
|
if (objectMesh == null) return null;
|
|
|
|
Renderer renderer = meshObject.GetRenderer();
|
|
if (renderer == null || !renderer.enabled) return null;
|
|
|
|
Octave3DMesh octaveMesh = Octave3DMeshDatabase.Get().GetOctave3DMesh(objectMesh);
|
|
if (octaveMesh == null) return null;
|
|
|
|
List<Box> modelVertOverlapBoxes = BuildModelVertOverlapBoxes(octaveMesh);
|
|
var snapBoxIDs = Object2ObjectBoxSnapData.GetAllSnapBoxIDs();
|
|
var modelSnapBoxes = new List<Box>(snapBoxIDs.Length);
|
|
Box modelMeshBox = octaveMesh.ModelAABB;
|
|
BoxFace[] meshBoxFaces = Object2ObjectBoxSnapData.GetBoxFaceToSnapBoxIDMap();
|
|
foreach (var snapBox in snapBoxIDs)
|
|
{
|
|
Box overlapBox = modelVertOverlapBoxes[(int)snapBox];
|
|
List<Vector3> overlappedVerts = octaveMesh.GetOverlappedModelVerts(overlapBox);
|
|
Plane meshFacePlane = modelMeshBox.GetBoxFacePlane(meshBoxFaces[(int)snapBox]);
|
|
overlappedVerts = meshFacePlane.ProjectAllPoints(overlappedVerts);
|
|
|
|
modelSnapBoxes.Add(Box.FromPoints(overlappedVerts));
|
|
}
|
|
|
|
return new Object2ObjectBoxSnapData(meshObject, modelSnapBoxes);
|
|
}
|
|
|
|
private static List<Box> BuildModelVertOverlapBoxes(Octave3DMesh octaveMesh)
|
|
{
|
|
const float overlapAmount = 0.2f;
|
|
float halfOverlapAmount = overlapAmount * 0.5f;
|
|
Box modelMeshBox = octaveMesh.ModelAABB;
|
|
Vector3 meshBoxSize = modelMeshBox.Size;
|
|
BoxFace[] meshBoxFaces = Object2ObjectBoxSnapData.GetBoxFaceToSnapBoxIDMap();
|
|
|
|
// Must have 1 to 1 mapping with Object2ObjectBoxSnapData.SnapBox enum
|
|
const float sizeEps = 0.001f;
|
|
Vector3[] overlapBoxSizes = new Vector3[]
|
|
{
|
|
// Left and right
|
|
new Vector3(overlapAmount, meshBoxSize.y + sizeEps, meshBoxSize.z + sizeEps),
|
|
new Vector3(overlapAmount, meshBoxSize.y + sizeEps, meshBoxSize.z + sizeEps),
|
|
|
|
// Bottom and top
|
|
new Vector3(meshBoxSize.x + sizeEps, overlapAmount, meshBoxSize.z + sizeEps),
|
|
new Vector3(meshBoxSize.x + sizeEps, overlapAmount, meshBoxSize.z + sizeEps),
|
|
|
|
// Back and front
|
|
new Vector3(meshBoxSize.x + sizeEps, meshBoxSize.y + sizeEps, overlapAmount),
|
|
new Vector3(meshBoxSize.x + sizeEps, meshBoxSize.y + sizeEps, overlapAmount),
|
|
};
|
|
|
|
var overlapBoxes = new List<Box>();
|
|
for (int boxFaceIndex = 0; boxFaceIndex < meshBoxFaces.Length; ++boxFaceIndex)
|
|
{
|
|
BoxFace meshBoxFace = meshBoxFaces[boxFaceIndex];
|
|
Vector3 faceCenter = modelMeshBox.GetBoxFaceCenter(meshBoxFace);
|
|
Vector3 faceNormal = modelMeshBox.GetBoxFacePlane(meshBoxFace).normal;
|
|
Vector3 overlapCenter = faceCenter - faceNormal * halfOverlapAmount;
|
|
overlapBoxes.Add(new Box(overlapCenter, overlapBoxSizes[boxFaceIndex]));
|
|
}
|
|
|
|
return overlapBoxes;
|
|
}
|
|
}
|
|
}
|
|
#endif |