Skip to content

Instantly share code, notes, and snippets.

@michaliskambi
Created June 17, 2021 20:37
Show Gist options
  • Save michaliskambi/2b8faee73df9f3a12351736cabcad1ee to your computer and use it in GitHub Desktop.
Save michaliskambi/2b8faee73df9f3a12351736cabcad1ee to your computer and use it in GitHub Desktop.
// -*- compile-command: "castle-engine simple-compile position_on_viewport_early.lpr && ./position_on_viewport_early" -*-
{ Reproduction for https://github.com/castle-engine/castle-engine/issues/295 . }
uses SysUtils,
CastleWindow, CastleViewport, CastleVectors, CastleFilesUtils, CastleTransform,
CastleLog, CastleKeysMouse, CastleScene;
var
Viewport: TCastleViewport;
procedure TestQueryPosition(const ScreenPos: TVector2);
var
CameraPlaneResult, RayOrigin, RayDirection, WorldPlaneResult: TVector3;
Pos2D: TVector2;
begin
WritelnLog('Testing on ', ScreenPos.ToString);
Viewport.PositionToRay(ScreenPos, true, RayOrigin, RayDirection);
WritelnLog(' PositionToRay test: %s %s', [RayOrigin.ToString, RayDirection.ToString]);
if Viewport.PositionToCameraPlane(ScreenPos, true, 2, CameraPlaneResult) then
WritelnLog(' PositionToCameraPlane test: %s', [CameraPlaneResult.ToString])
else
WritelnLog(' PositionToCameraPlane test: none');
if Viewport.PositionToWorldPlane(ScreenPos, true, -10, WorldPlaneResult) then
WritelnLog(' PositionToWorldPlane test: %s', [WorldPlaneResult.ToString])
else
WritelnLog(' PositionToWorldPlane test: none');
Pos2D := Viewport.PositionTo2DWorld(ScreenPos, true);
WritelnLog(' PositionTo2DWorld test: ', Pos2D.ToString);
end;
procedure Press(Container: TUIContainer; const Event: TInputPressRelease);
begin
if Event.IsKey(keyS) then
begin
TestQueryPosition(Vector2(100, 100));
TestQueryPosition(Vector2(Container.Width / 2, Container.Height / 2));
end;
end;
var
Window: TCastleWindowBase;
Box: TCastleBox;
begin
InitializeLog;
Window := TCastleWindowBase.Create(Application);
Window.OnPress := @Press;
Window.Width := 300;
Window.Height := 300;
Window.Open;
Viewport := TCastleViewport.Create(Application);
Viewport.FullSize := true;
// too early to use
// TestQueryPosition(Vector2(100, 100));
// TestQueryPosition(Vector2(Window.Width / 2, Window.Height / 2));
Window.Controls.InsertFront(Viewport);
TestQueryPosition(Vector2(100, 100));
TestQueryPosition(Vector2(Window.Width / 2, Window.Height / 2));
Box := TCastleBox.Create(Application);
Viewport.Items.Add(Box);
Application.Run;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment