From ccc5815ffe1d30807a5f534ab6229e3113537791 Mon Sep 17 00:00:00 2001 From: Marco Klein Date: Tue, 23 May 2023 00:41:38 +0200 Subject: [PATCH] feat: :sparkles: Introduce AABB Rotation logic to create non-axis aligned bounding box Special Thanks to @Donnerknalli ! --- .../Extensions/VisualInstance3DExtensions.cs | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/Source/Visuals/Extensions/VisualInstance3DExtensions.cs b/Source/Visuals/Extensions/VisualInstance3DExtensions.cs index 905c24b..5cdeb65 100644 --- a/Source/Visuals/Extensions/VisualInstance3DExtensions.cs +++ b/Source/Visuals/Extensions/VisualInstance3DExtensions.cs @@ -2,8 +2,54 @@ namespace GoDough.Visuals.Extensions { public static class VisualInstance3DExtensions { - public static Aabb GetGlobalAabb(this VisualInstance3D visualInstance3D) { + public static Aabb GetGlobalAabb(this MeshInstance3D visualInstance3D) { + // From PR: + // + // https://github.com/godotengine/godot/pull/66940 + // + // get_global_transform().xform(get_aabb()); + return visualInstance3D.GlobalTransform * visualInstance3D.GetAabb(); } + + public static Aabb GetRotatedAndTransformedAabb(this MeshInstance3D visualInstance3D) { + var source = visualInstance3D.GetAabb(); + + var vertices = new Vector3[]{ + source.Position, //bottomLeftFront, + new Vector3(source.End.X, source.Position.Y, source.Position.Z), //bottomRightFront, + new Vector3(source.End.X, source.End.Y, source.Position.Z), //topRightFront, + new Vector3(source.Position.X, source.End.Y, source.Position.Z), //topLeftFront, + new Vector3(source.Position.X, source.End.Y, source.End.Z), //topLeftBack, + new Vector3(source.End.X, source.End.Y, source.End.Z), //topRightBack, + new Vector3(source.End.X, source.Position.Y, source.End.Z), //bottomRightBack, + new Vector3(source.Position.X, source.Position.Y, source.End.Z), //bottomLeftBack, + }; + + var min = Vector3.Inf; + var max = -Vector3.Inf; + + var scale = visualInstance3D.GlobalTransform.Basis.Scale; + var rotation = visualInstance3D.GlobalRotation; + + for (var vertexIndex = 0; vertexIndex < vertices.Length; vertexIndex++) { + var vertex = vertices[vertexIndex]; + + var transformedVertex = scale * vertex; + vertices[vertexIndex] = transformedVertex; + + if (transformedVertex < min) { + min = transformedVertex; + } + + if (transformedVertex > max) { + max = transformedVertex; + } + } + + var size = -(max - min); + + return new Aabb(min, size); + } } } \ No newline at end of file