protected override void OnCheckSelectionByRay(CheckSelectionByRayContext context) { base.OnCheckSelectionByRay(context); if (rigidBody != null) { context.thisObjectWasChecked = true; var worldData = GetPhysicsWorldData(false); if (worldData != null) { if (context.viewport.CameraSettings.Projection == ProjectionType.Orthographic) { var point = Physics2DUtility.Convert(context.ray.Origin.ToVector2()); foreach (var fixture in rigidBody.FixtureList) { if (fixture.TestPoint(ref point)) { context.thisObjectResultRayScale = 0; break; } } } else { var bounds = SpaceBounds.CalculatedBoundingBox; if (bounds.Intersects(ref context.ray, out double scale)) { context.thisObjectResultRayScale = scale; } } } } }
protected override void OnCheckSelectionByRay(CheckSelectionByRayContext context) { base.OnCheckSelectionByRay(context); context.thisObjectWasChecked = true; if (SpaceBounds.CalculatedBoundingSphere.Intersects(context.ray, out var scale1, out var scale2)) { var m = GetBillboardMesh(); if (m.Result.ExtractedIndices.Length != 0) { Quaternion meshFaceRotation = Quaternion.Identity; switch (m.Result.MeshData.BillboardMode) { case 1: meshFaceRotation = Quaternion.FromDirectionZAxisUp(Vector3.Zero - new Vector3(0, -1, 0)); break; case 2: meshFaceRotation = Quaternion.FromDirectionZAxisUp(Vector3.Zero - new Vector3(0, 1, 0)); break; case 3: meshFaceRotation = Quaternion.FromDirectionZAxisUp(Vector3.Zero - new Vector3(1, 0, 0)); break; case 4: meshFaceRotation = Quaternion.FromDirectionZAxisUp(Vector3.Zero - new Vector3(-1, 0, 0)); break; } var rotation = context.viewport.CameraSettings.Rotation * meshFaceRotation.GetInverse(); var tr = TransformV; var size2 = new Vector2(Size.Value.X * Math.Max(tr.Scale.X, tr.Scale.Y), Size.Value.Y * tr.Scale.Z); var tranform = new Matrix4(rotation.ToMatrix3() * Matrix3.FromScale(new Vector3(size2.X, size2.X, size2.Y)), tr.Position); var vertices = m.Result.ExtractedVerticesPositions; var indices = m.Result.ExtractedIndices; for (int nTriangle = 0; nTriangle < indices.Length / 3; nTriangle++) { var vertex0 = vertices[indices[nTriangle * 3 + 0]]; var vertex1 = vertices[indices[nTriangle * 3 + 1]]; var vertex2 = vertices[indices[nTriangle * 3 + 2]]; var v0 = tranform * vertex0; var v1 = tranform * vertex1; var v2 = tranform * vertex2; if (MathAlgorithms.IntersectTriangleRay(ref v0, ref v1, ref v2, ref context.ray, out var rayScale)) { context.thisObjectResultRayScale = rayScale; break; } } } else { double scale = Math.Min(scale1, scale2); context.thisObjectResultRayScale = scale; } } }