3 class WalkAroundApp : GuiApplication
6 // driver = "Direct3D";
8 appName = "3D Walkaround Sample";
10 bool wasProcessingMoves;
14 bool processMoves = form && form.acquiredInput;
17 Time time = GetTime(), diffTime;
20 if(wasProcessingMoves != processMoves)
23 GetMouseState(&buttons, &xd, &yd);
25 diffTime = time - lastTime;
27 GetMouseState(&buttons, &xd, &yd);
28 if(form && form.active)
30 bool updateCamera = false;
32 float cameraSpeed = 0.5;
33 Vector3D movement { };
34 Euler orientation = camera.orientation;
35 Euler euler = orientation;
39 euler.yaw -= xd * cameraSpeed;
40 euler.pitch -= yd * cameraSpeed;
41 if(GetKeyState(right)) euler.yaw -= diffTime * cameraSpeed;
42 if(GetKeyState(left)) euler.yaw += diffTime * cameraSpeed;
43 if(GetKeyState(up)) euler.pitch -= diffTime * cameraSpeed;
44 if(GetKeyState(down)) euler.pitch += diffTime * cameraSpeed;
45 euler.pitch = Min(Max(euler.pitch, Degrees { -89.9 }), Degrees { 89.9 });
46 if(orientation.yaw != euler.yaw || orientation.pitch != euler.pitch || orientation.roll != euler.roll)
48 camera.orientation = euler;
52 if(GetKeyState(e)) movement.y -= diffTime * speed;
53 if(GetKeyState(c)) movement.y += diffTime * speed;
54 if(GetKeyState(s) || buttons.right) movement.z -= diffTime * speed;
55 if(GetKeyState(w) || buttons.left) movement.z += diffTime * speed;
56 if(GetKeyState(a)) movement.x -= diffTime * speed;
57 if(GetKeyState(d)) movement.x += diffTime * speed;
58 if(movement.x || movement.y || movement.z)
60 camera.Move(movement);
71 wasProcessingMoves = processMoves;
76 define app = (WalkAroundApp)__thisModule.application;
81 position = Vector3D { 0, -100, -200 },
82 orientation = Euler { 0, 0, 0 },
90 orientation = Euler { 0, 70 };
98 class WalkAroundForm : Window
100 caption = "3D Walkaround Sample";
103 borderStyle = sizable;
107 clientSize = { 632, 438 };
109 Array<Material> materials { };
110 Array<int> map { size = width * height };
111 Array<int> elv { size = width * height };
112 Array<Cube> cubes { };
114 BitmapResource spotTex { ":spot_tex.png", window = this };
115 Material sideMat { opacity = 0.5f, diffuse = teal, ambient = teal, flags = { doubleSided = true, translucent = true } };
116 Material cow1Mat { opacity = 1.0f, diffuse = white, ambient = white };
117 Material cow2Mat { opacity = 1.0f, power = 20, diffuse = goldenrod, ambient = goldenrod, specular = goldenrod };
118 Material cow3Mat { opacity = 1.0f, power = 20, diffuse = goldenrod, ambient = goldenrod, specular = goldenrod };
124 Array<Bitmap> textures { };
136 for(i = 0; i < map.count; i++)
138 int num = map[i] = GetRandom(0, 7);
139 elv[i] = GetRandom(1, 100);
143 bool OnLoadGraphics()
145 Bitmap textureFile { };
147 PrimitiveGroup group;
149 cowModel.Load(":cow.3DS", null, displaySystem);
150 cowModel.Merge(displaySystem);
151 cowModel.mesh.ApplyMaterial(null);
153 cow1.Duplicate(cowModel);
154 cow1.transform.position = { -20, -50, 10 };
155 cow1.transform.scaling = { 20, 20, 20 };
156 cow1.transform.orientation = Euler { yaw = 135 };
157 cow1.UpdateTransform();
158 cow1.material = cow1Mat;
159 cow1Mat.baseMap = spotTex.bitmap;
161 cow2.Duplicate(cowModel);
162 cow2.transform.position = { 60, -42, -5 };
163 cow2.transform.scaling = { 20, 20, 20 };
164 cow2.transform.orientation = Euler { yaw = 225 };
165 cow2.UpdateTransform();
166 cow2.material = cow2Mat;
168 cow3.Duplicate(cowModel);
169 cow3.transform.position = { 120, -89, 13 };
170 cow3.transform.scaling = { 20, 20, 20 };
171 cow3.transform.orientation = Euler { yaw = 185 };
172 cow3.UpdateTransform();
173 cow3.material = cow3Mat;
174 cow3Mat.baseMap = spotTex.bitmap;
177 if(textureFile.Load(":texture1.pcx", null, null))
180 int height = textureFile.height / count;
181 for(i = 0; i < count; i++)
184 tex.Allocate(null, textureFile.width, height, 0, pixelFormat888, false);
185 tex.Grab(textureFile, 0, i * height);
186 tex.MakeMipMaps(displaySystem);
200 for(y = 0; y < height; y++)
202 for(x = 0; x < width; x++)
204 int ix = y * width + x;
206 int xs = -((tileSize+gap) * width) / 2;
207 int ys = -((tileSize+gap) * height) / 2;
213 cube.Create(displaySystem);
214 cube.flags.translucent = true;
216 for(face = cube.mesh.groups.first; face; face = face.next)
217 face.material = face.prev ? sideMat : materials[num];
218 cube.mesh.ApplyTranslucency(cube);
219 cube.transform.position = { x * (tileSize + gap), -h/2, y * (tileSize + gap) };
220 cube.transform.scaling = { tileSize, h, tileSize };
221 cube.transform.orientation = Euler { 0, 0, 0 };
222 cube.UpdateTransform();
228 void OnUnloadGraphics()
234 c.Free(displaySystem);
235 cowModel.Free(displaySystem);
236 cow1.Free(displaySystem);
237 cow2.Free(displaySystem);
238 cow3.Free(displaySystem);
242 void OnResize(int w, int h)
244 camera.Setup(w, h, null);
248 void OnRedraw(Surface surface)
250 surface.Clear(depthBuffer);
251 display.SetCamera(surface, camera);
252 display.SetLight(0, light);
253 display.ambient = Color { 100, 100, 100 };
256 display.DrawObject(c);
258 display.DrawObject(cow1);
259 display.DrawObject(cow2);
260 display.DrawObject(cow3);
262 display.SetCamera(surface, null);
266 surface.foreground = white;
267 surface.WriteTextf(50, 50, "Press I to acquire mouse Input, F for Full screen.");
271 bool OnKeyHit(Key key, unichar ch)
275 case escape: Destroy(0); break;
277 camera.Move({ 0, -4, 0 });
282 camera.Move({ 0, 4, 0 });
288 acquiredInput ^= true;
289 AcquireInput(acquiredInput);
295 bool fullScreen = !app.fullScreen;
299 anchor = { 0, 0, 0, 0 };
304 borderStyle = sizable;
305 nativeDecorations = true;
311 clientSize = { 632, 438 };
313 app.fullScreen = fullScreen;
315 ; // app.resolution = res640x480;
319 AcquireInput(acquiredInput);
327 WalkAroundForm form {};