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;
                        }
                    }
                }
            }
        }
示例#2
0
        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;
                }
            }
        }