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); } }
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); } }