private bool CreateRelativeScreenModeRay(RenderContext context, ref Matrix totalModelMatrix, ref Ray ray, out Ray newRay)
            {
                var   p = Vector3.TransformCoordinate(ray.Position, context.ScreenViewProjectionMatrix);
                var   screenSpaceCore = RenderCore as ScreenSpacedMeshRenderCore;
                float viewportSize    = screenSpaceCore.Size * screenSpaceCore.SizeScale * context.DpiScale;

                float offx = (float)(context.ActualWidth / 2 * (1 + screenSpaceCore.RelativeScreenLocationX) - viewportSize / 2);
                float offy = (float)(context.ActualHeight / 2 * (1 - screenSpaceCore.RelativeScreenLocationY) - viewportSize / 2);

                offx = Math.Max(0, Math.Min(offx, (int)(context.ActualWidth - viewportSize)));
                offy = Math.Max(0, Math.Min(offy, (int)(context.ActualHeight - viewportSize)));

                var px = p.X - offx;
                var py = p.Y - offy;

                if (px < 0 || py < 0 || px > viewportSize || py > viewportSize)
                {
                    newRay = new Ray();
                    return(false);
                }

                var viewMatrix = screenSpaceCore.GlobalTransform.View;
                var projMatrix = screenSpaceCore.GlobalTransform.Projection;

                newRay = RayExtensions.UnProject(new Vector2(px, py), ref viewMatrix, ref projMatrix,
                                                 0.01f, viewportSize, viewportSize, screenSpaceCore.IsPerspective);
                return(true);
            }
            private bool CreateRelativeScreenModeRay(HitTestContext context, out Ray newRay, out Vector2 hitSP)
            {
                var p = context.HitPointSP * context.RenderMatrices.DpiScale; //Vector3.TransformCoordinate(context.RayWS.Position, context.RenderMatrices.ScreenViewProjectionMatrix);
                var screenSpaceCore = RenderCore as ScreenSpacedMeshRenderCore;

                screenSpacedContext.IsPerspective = screenSpaceCore.IsPerspective;
                var viewportSize = screenSpaceCore.Size * screenSpaceCore.SizeScale * context.RenderMatrices.DpiScale;

                var offx = (float)(context.RenderMatrices.ActualWidth / 2 * (1 + screenSpaceCore.RelativeScreenLocationX) - viewportSize / 2);
                var offy = (float)(context.RenderMatrices.ActualHeight / 2 * (1 - screenSpaceCore.RelativeScreenLocationY) - viewportSize / 2);

                offx = Math.Max(0, Math.Min(offx, (int)(context.RenderMatrices.ActualWidth - viewportSize)));
                offy = Math.Max(0, Math.Min(offy, (int)(context.RenderMatrices.ActualHeight - viewportSize)));

                var px = p.X - offx;
                var py = p.Y - offy;

                if (px < 0 || py < 0 || px > viewportSize || py > viewportSize)
                {
                    newRay = new Ray();
                    hitSP  = Vector2.Zero;
                    return(false);
                }
                hitSP = new Vector2(px, py) / context.RenderMatrices.DpiScale;
                var viewMatrix = screenSpaceCore.GlobalTransform.View;
                var projMatrix = screenSpaceCore.GlobalTransform.Projection;

                newRay = RayExtensions.UnProject(new Vector2(px, py), ref viewMatrix, ref projMatrix,
                                                 screenSpaceCore.NearPlane, viewportSize, viewportSize, screenSpaceCore.IsPerspective);
                screenSpacedContext.ViewMatrix       = viewMatrix;
                screenSpacedContext.ViewMatrixInv    = viewMatrix.PsudoInvert();
                screenSpacedContext.ProjectionMatrix = projMatrix;
                screenSpacedContext.ActualWidth      = screenSpacedContext.ActualHeight = viewportSize;
                return(true);
            }
            private bool CreateAbsoluteModeRay(HitTestContext context, out Ray newRay, out Vector2 hitSP)
            {
                var screenSpaceCore = RenderCore as ScreenSpacedMeshRenderCore;

                screenSpacedContext.IsPerspective = screenSpaceCore.IsPerspective;
                var viewMatrix = screenSpaceCore.GlobalTransform.View;
                var projMatrix = screenSpaceCore.GlobalTransform.Projection;

                screenSpacedContext.ViewMatrix       = viewMatrix;
                screenSpacedContext.ViewMatrixInv    = viewMatrix.PsudoInvert();
                screenSpacedContext.ProjectionMatrix = projMatrix;
                if (context.RenderMatrices.IsPerspective)
                {
                    hitSP  = context.HitPointSP;
                    newRay = RayExtensions.UnProject(hitSP * context.RenderMatrices.DpiScale, ref viewMatrix, ref projMatrix,
                                                     screenSpaceCore.NearPlane,
                                                     context.RenderMatrices.ActualWidth, context.RenderMatrices.ActualHeight, screenSpaceCore.IsPerspective);
                    screenSpacedContext.ActualWidth  = context.RenderMatrices.ActualWidth;
                    screenSpacedContext.ActualHeight = context.RenderMatrices.ActualHeight;
                    return(true);
                }
                else
                {
                    var p            = context.HitPointSP * context.RenderMatrices.DpiScale;
                    var viewportSize = screenSpaceCore.Size * screenSpaceCore.SizeScale * context.RenderMatrices.DpiScale;

                    var abs  = Vector3.TransformCoordinate(AbsolutePosition3D, context.RenderMatrices.ScreenViewProjectionMatrix);
                    var offx = (float)(abs.X - viewportSize / 2);
                    var offy = (float)(abs.Y - viewportSize / 2);

                    var px = p.X - offx;
                    var py = p.Y - offy;

                    if (px < 0 || py < 0 || px > viewportSize || py > viewportSize)
                    {
                        newRay = new Ray();
                        hitSP  = Vector2.Zero;
                        return(false);
                    }
                    hitSP  = new Vector2(px, py) / context.RenderMatrices.DpiScale;
                    newRay = RayExtensions.UnProject(new Vector2(px, py), ref viewMatrix, ref projMatrix,
                                                     screenSpaceCore.NearPlane, viewportSize, viewportSize, screenSpaceCore.IsPerspective);
                    screenSpacedContext.ActualWidth      = viewportSize;
                    screenSpacedContext.ActualHeight     = viewportSize;
                    screenSpacedContext.ViewMatrix       = viewMatrix;
                    screenSpacedContext.ViewMatrixInv    = viewMatrix.PsudoInvert();
                    screenSpacedContext.ProjectionMatrix = projMatrix;
                    return(true);
                }
            }
            private bool CreateAbsoluteModeRay(IRenderMatrices context, ref Ray ray, out Ray newRay)
            {
                var screenSpaceCore = RenderCore as ScreenSpacedMeshRenderCore;

                screenSpacedContext.IsPerspective = screenSpaceCore.IsPerspective;
                var viewMatrix = screenSpaceCore.GlobalTransform.View;
                var projMatrix = screenSpaceCore.GlobalTransform.Projection;

                screenSpacedContext.ViewMatrix       = viewMatrix;
                screenSpacedContext.ProjectionMatrix = projMatrix;
                if (context.IsPerspective)
                {
                    var point2d = Vector3.TransformCoordinate(ray.Position, context.ScreenViewProjectionMatrix);
                    newRay = RayExtensions.UnProject(new Vector2(point2d.X, point2d.Y), ref viewMatrix, ref projMatrix,
                                                     screenSpaceCore.NearPlane,
                                                     context.ActualWidth, context.ActualHeight, screenSpaceCore.IsPerspective);
                    screenSpacedContext.ActualWidth  = context.ActualWidth;
                    screenSpacedContext.ActualHeight = context.ActualHeight;
                    screenSpacedContext.UpdateScreenViewProjectionMatrix();
                    return(true);
                }
                else
                {
                    var   p            = Vector3.TransformCoordinate(ray.Position, context.ScreenViewProjectionMatrix);
                    float viewportSize = screenSpaceCore.Size * screenSpaceCore.SizeScale * context.DpiScale;

                    var   abs  = Vector3.TransformCoordinate(AbsolutePosition3D, context.ScreenViewProjectionMatrix);
                    float offx = (float)(abs.X - viewportSize / 2);
                    float offy = (float)(abs.Y - viewportSize / 2);

                    var px = p.X - offx;
                    var py = p.Y - offy;

                    if (px < 0 || py < 0 || px > viewportSize || py > viewportSize)
                    {
                        newRay = new Ray();
                        return(false);
                    }

                    newRay = RayExtensions.UnProject(new Vector2(px, py), ref viewMatrix, ref projMatrix,
                                                     screenSpaceCore.NearPlane, viewportSize, viewportSize, screenSpaceCore.IsPerspective);
                    screenSpacedContext.ActualWidth      = viewportSize;
                    screenSpacedContext.ActualHeight     = viewportSize;
                    screenSpacedContext.ViewMatrix       = viewMatrix;
                    screenSpacedContext.ProjectionMatrix = projMatrix;
                    screenSpacedContext.UpdateScreenViewProjectionMatrix();
                    return(true);
                }
            }
Beispiel #5
0
            private bool CreateAbsoluteModeRay(RenderContext context, ref Matrix totalModelMatrix, ref Ray ray, out Ray newRay)
            {
                if (context.IsPerspective)
                {
                    var screenSpaceCore = RenderCore as ScreenSpacedMeshRenderCore;
                    var point2d         = Vector3.TransformCoordinate(ray.Position, context.ScreenViewProjectionMatrix);
                    var viewMatrix      = screenSpaceCore.GlobalTransform.View;
                    var projMatrix      = screenSpaceCore.GlobalTransform.Projection;
                    newRay = RayExtensions.UnProject(new Vector2(point2d.X, point2d.Y), ref viewMatrix, ref projMatrix, screenSpaceCore.GlobalTransform.Frustum.Z,
                                                     context.ActualWidth, context.ActualHeight, context.IsPerspective);
                    return(true);
                }
                else
                {
                    var   p = Vector3.TransformCoordinate(ray.Position, context.ScreenViewProjectionMatrix);
                    var   screenSpaceCore = RenderCore as ScreenSpacedMeshRenderCore;
                    float viewportSize    = screenSpaceCore.Size * screenSpaceCore.SizeScale;

                    var   abs  = Vector3.TransformCoordinate(AbsolutePosition3D, context.ScreenViewProjectionMatrix);
                    float offx = (float)(abs.X - viewportSize / 2);
                    float offy = (float)(abs.Y - viewportSize / 2);

                    var px = p.X - offx;
                    var py = p.Y - offy;

                    if (px < 0 || py < 0 || px > viewportSize || py > viewportSize)
                    {
                        newRay = new Ray();
                        return(false);
                    }

                    var viewMatrix = screenSpaceCore.GlobalTransform.View;
                    var projMatrix = screenSpaceCore.GlobalTransform.Projection;
                    newRay = RayExtensions.UnProject(new Vector2(px, py), ref viewMatrix, ref projMatrix,
                                                     0.01f, viewportSize, viewportSize, screenSpaceCore.IsPerspective);
                    return(true);
                }
            }