File: testcastlescenemanager.pas

package info (click to toggle)
castle-game-engine 6.4%2Bdfsg1-7
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 195,044 kB
  • sloc: pascal: 364,622; ansic: 8,606; java: 2,851; objc: 2,601; cpp: 1,412; xml: 851; makefile: 723; sh: 563; php: 26
file content (136 lines) | stat: -rw-r--r-- 4,733 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
unit TestCastleSceneManager;

interface

uses
  Classes, SysUtils, fpcunit, testutils, testregistry, CastleBaseTestCase;

type
  TTestCastleSceneManager = class(TCastleBaseTestCase)
  published
    procedure TestCameraCreating;
    procedure TestLoadLevel;
  end;

implementation

uses CastleCameras, CastleSceneManager, CastleScene, CastleSceneCore,
  CastleFilesUtils, CastleVectors;

procedure TTestCastleSceneManager.TestCameraCreating;
var
  SceneManager: TCastleSceneManager;
  C: TCamera;
begin
  SceneManager := TCastleSceneManager.Create(nil);
  try
    AssertTrue(SceneManager.Camera = nil);
    AssertTrue(SceneManager.WalkCamera(false) = nil);
    AssertTrue(SceneManager.ExamineCamera(false) = nil);
    AssertTrue(SceneManager.Camera = nil);

    SceneManager.NavigationType := ntWalk;
    C := SceneManager.Camera;
    AssertTrue(C <> nil);
    AssertTrue(SceneManager.NavigationType = ntWalk);

    SceneManager.NavigationType := ntFly;
    AssertTrue(C = SceneManager.Camera); // ntWalk -> ntFly didn't change camera instance
    AssertTrue(C = SceneManager.WalkCamera);
    AssertTrue(C = SceneManager.WalkCamera(false));
    AssertTrue(SceneManager.NavigationType = ntFly);

    C.Radius := 100;
    AssertTrue(SceneManager.Camera.Radius = 100);

    SceneManager.NavigationType := ntExamine;
    AssertTrue(C <> SceneManager.Camera); // ntFly -> ntExamine did change camera instance
    AssertTrue(SceneManager.NavigationType = ntExamine);
    // but the Radius was preserved when copying
    AssertTrue(SceneManager.Camera.Radius = 100);
  finally FreeAndNil(SceneManager) end;

  SceneManager := TCastleSceneManager.Create(nil);
  try
    AssertTrue(SceneManager.Camera = nil);

    SceneManager.WalkCamera.Radius := 100;
    AssertTrue(SceneManager.Camera <> nil);
    AssertTrue(SceneManager.Camera = SceneManager.WalkCamera);
    AssertTrue(SceneManager.NavigationType = ntWalk);
    AssertTrue(SceneManager.WalkCamera.PreferGravityUpForRotations);
    AssertTrue(SceneManager.WalkCamera.PreferGravityUpForMoving);
    AssertTrue(SceneManager.WalkCamera.Gravity);

    C := SceneManager.WalkCamera;
    SceneManager.NavigationType := ntFly;
    AssertTrue(SceneManager.Camera = SceneManager.WalkCamera);
    AssertTrue(C = SceneManager.WalkCamera);
    AssertTrue(SceneManager.WalkCamera.PreferGravityUpForRotations);
    AssertFalse(SceneManager.WalkCamera.PreferGravityUpForMoving);
    AssertFalse(SceneManager.WalkCamera.Gravity);

    // changing to ExamineCamera and back to WalkCamera sets ntWalk again
    SceneManager.ExamineCamera;
    SceneManager.WalkCamera;
    AssertTrue(SceneManager.NavigationType = ntWalk);
    AssertTrue(SceneManager.WalkCamera.PreferGravityUpForRotations);
    AssertTrue(SceneManager.WalkCamera.PreferGravityUpForMoving);
    AssertTrue(SceneManager.WalkCamera.Gravity);
  finally FreeAndNil(SceneManager) end;
end;

procedure TTestCastleSceneManager.TestLoadLevel;
var
  Scene: TCastleScene;
  SceneManager: TCastleSceneManager;
  Pos, Dir, Up, Pos2, Dir2, Up2: TVector3;
begin
  SceneManager := TCastleSceneManager.Create(nil);
  try
    Scene := TCastleScene.Create(SceneManager);
    Scene.Load(ApplicationData('level1.x3d'));
    Scene.Spatial := [ssRendering, ssDynamicCollisions];
    Scene.ProcessEvents := true;

    SceneManager.Items.Add(Scene);
    SceneManager.MainScene := Scene;

    AssertTrue(SceneManager.NavigationType = ntNone);
    SceneManager.RequiredCamera;
    AssertTrue(SceneManager.NavigationType = ntExamine);
    SceneManager.Camera.GetView(Pos, Dir, Up);
  finally FreeAndNil(SceneManager) end;

  SceneManager := TCastleSceneManager.Create(nil);
  try
    Scene := TCastleScene.Create(SceneManager);
    Scene.Load(ApplicationData('level1.x3d'));
    Scene.Spatial := [ssRendering, ssDynamicCollisions];
    Scene.ProcessEvents := true;

    SceneManager.Items.Add(Scene);
    SceneManager.MainScene := Scene;
    // changes Examine into Walk, preserving the camera view
    SceneManager.NavigationType := ntWalk;
    SceneManager.WalkCamera.MoveSpeed := 10;
    SceneManager.Camera.GetView(Pos2, Dir2, Up2);
    AssertVectorEquals(Pos, Pos2);
    AssertVectorEquals(Pos, Vector3(3.249692, 2.000000, -5.416155));
    AssertVectorEquals(Dir, Dir2);
    AssertVectorEquals(Up, Up2);
    AssertTrue(SceneManager.NavigationType = ntWalk);

    AssertTrue(
      SceneManager.WalkCamera.PreferredHeight >
      SceneManager.WalkCamera.Radius);

    AssertSameValue(1.75, SceneManager.WalkCamera.PreferredHeight);
    AssertSameValue(0.25, SceneManager.WalkCamera.Radius);
    AssertSameValue(0.75, SceneManager.WalkCamera.ClimbHeight);
  finally FreeAndNil(SceneManager) end;
end;

initialization
  RegisterTest(TTestCastleSceneManager);
end.