protected override void OnFrameStarted(object source, FrameEventArgs e)
{
frameCount++;
int tick = Environment.TickCount;
time += e.TimeSinceLastFrame;
float moveTime = e.TimeSinceLastFrame;
if (moveTime > 1)
{
moveTime = 1;
}
Axiom.SceneManagers.Multiverse.WorldManager.Instance.Time = time;
if ((tick - lastTick) > 100)
{
Console.WriteLine("long frame: {0}", tick - lastTick);
LogManager.Instance.Write("long frame: {0}", tick - lastTick);
}
lastTick = tick;
// int hpg = gen.HeightPointsGenerated;
// if ( lastHeightPointsGenerated != hpg )
// {
// Console.WriteLine("HeightPointsGenerated: {0}", hpg - lastHeightPointsGenerated);
// lastHeightPointsGenerated = hpg;
// }
float scaleMove = 20 * oneMeter * moveTime;
// reset acceleration zero
camAccel = Vector3.Zero;
// set the scaling of camera motion
cameraScale = 100 * moveTime;
bool retry = true;
//System.Threading.Thread.Sleep(3000);
//while (retry)
//{
// // TODO: Move this into an event queueing mechanism that is processed every frame
// try
// {
// input.Capture();
// retry = false;
// }
// catch (Exception ex)
// {
// System.Threading.Thread.Sleep(1000);
// }
//}
// TODO: Move this into an event queueing mechanism that is processed every frame
bool realIsActive = window.IsActive;
try
{
// force a reset of axiom's internal input state so that it will call Acquire() on the
// input device again.
if (captureFailed)
{
window.IsActive = false;
input.Capture();
window.IsActive = realIsActive;
}
input.Capture();
captureFailed = false;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
captureFailed = true;
System.Threading.Thread.Sleep(1000);
}
finally
{
window.IsActive = realIsActive;
}
if (input.IsKeyPressed(KeyCodes.Escape))
{
Root.Instance.QueueEndRendering();
return;
}
if (input.IsKeyPressed(KeyCodes.A))
{
camAccel.x = -0.5f;
}
if (input.IsKeyPressed(KeyCodes.D))
{
camAccel.x = 0.5f;
}
if (input.IsKeyPressed(KeyCodes.W))
{
camAccel.z = -1.0f;
}
if (input.IsKeyPressed(KeyCodes.S))
{
camAccel.z = 1.0f;
}
if (!captureFailed)
{
camAccel.y += (float)(input.RelativeMouseZ * 0.1f);
}
if (input.IsKeyPressed(KeyCodes.Left))
{
camera.Yaw(cameraScale);
}
if (input.IsKeyPressed(KeyCodes.Right))
{
camera.Yaw(-cameraScale);
}
if (input.IsKeyPressed(KeyCodes.Up))
{
camera.Pitch(cameraScale);
}
if (input.IsKeyPressed(KeyCodes.Down))
{
camera.Pitch(-cameraScale);
}
// subtract the time since last frame to delay specific key presses
toggleDelay -= e.TimeSinceLastFrame;
// toggle rendering mode
if (input.IsKeyPressed(KeyCodes.R) && toggleDelay < 0)
{
if (camera.SceneDetail == SceneDetailLevel.Points)
{
camera.SceneDetail = SceneDetailLevel.Solid;
}
else if (camera.SceneDetail == SceneDetailLevel.Solid)
{
camera.SceneDetail = SceneDetailLevel.Wireframe;
}
else
{
camera.SceneDetail = SceneDetailLevel.Points;
}
Console.WriteLine("Rendering mode changed to '{0}'.", camera.SceneDetail);
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F) && toggleDelay < 0)
{
followTerrain = !followTerrain;
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.H) && toggleDelay < 0)
{
humanSpeed = !humanSpeed;
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.T) && toggleDelay < 0)
{
// toggle the texture settings
switch (filtering)
{
case TextureFiltering.Bilinear:
filtering = TextureFiltering.Trilinear;
aniso = 1;
break;
case TextureFiltering.Trilinear:
filtering = TextureFiltering.Anisotropic;
aniso = 8;
break;
case TextureFiltering.Anisotropic:
filtering = TextureFiltering.Bilinear;
aniso = 1;
break;
}
Console.WriteLine("Texture Filtering changed to '{0}'.", filtering);
// set the new default
MaterialManager.Instance.SetDefaultTextureFiltering(filtering);
MaterialManager.Instance.DefaultAnisotropy = aniso;
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.P))
{
string[] temp = Directory.GetFiles(Environment.CurrentDirectory, "screenshot*.jpg");
string fileName = string.Format("screenshot{0}.jpg", temp.Length + 1);
// show briefly on the screen
window.DebugText = string.Format("Wrote screenshot '{0}'.", fileName);
TakeScreenshot(fileName);
// show for 2 seconds
debugTextDelay = 2.0f;
}
if (input.IsKeyPressed(KeyCodes.B))
{
scene.ShowBoundingBoxes = !scene.ShowBoundingBoxes;
}
if (input.IsKeyPressed(KeyCodes.O))
{
// hide all overlays, includes ones besides the debug overlay
viewport.OverlaysEnabled = !viewport.OverlaysEnabled;
}
if (input.IsKeyPressed(KeyCodes.F1) && toggleDelay < 0)
{
Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawStitches =
!Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawStitches;
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F2) && toggleDelay < 0)
{
Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawTiles =
!Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawTiles;
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F3) && toggleDelay < 0)
{
Console.WriteLine("Camera Location: {0}, {1}, {2}", camera.Position.x.ToString("F3"),
camera.Position.y.ToString("F3"), camera.Position.z.ToString("F3"));
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F4) && toggleDelay < 0)
{
preview = !preview;
if (preview)
{
// when in preview mode, move the camera up high and look at the ground
camera.MoveRelative(new Vector3(0, 1000 * oneMeter, 0));
camera.LookAt(new Vector3(0, 0, 0));
followTerrain = false;
}
else
{
// when not in preview mode, hug the ground
followTerrain = true;
}
SetupScene();
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F5) && toggleDelay < 0)
{
if (WorldManager.Instance.OceanWaveHeight >= 500)
{
WorldManager.Instance.OceanWaveHeight -= 500;
}
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F6) && toggleDelay < 0)
{
WorldManager.Instance.OceanWaveHeight += 500;
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F7) && toggleDelay < 0)
{
NewRoad();
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F8) && toggleDelay < 0)
{
WorldManager.Instance.SeaLevel += 500;
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F9) && toggleDelay < 0)
{
StreamWriter s = new StreamWriter("boundaries.xml");
XmlTextWriter w = new XmlTextWriter(s);
//w.Formatting = Formatting.Indented;
//w.Indentation = 2;
//w.IndentChar = ' ';
mvScene.ExportBoundaries(w);
w.Close();
s.Close();
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F10) && toggleDelay < 0)
{
StreamReader s = new StreamReader("boundaries.xml");
XmlTextReader r = new XmlTextReader(s);
mvScene.ImportBoundaries(r);
r.Close();
s.Close();
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F11) && toggleDelay < 0)
{
StreamWriter s = new StreamWriter("terrain.xml");
gen.ToXML(s);
s.Close();
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.F12) && toggleDelay < 0)
{
StreamReader s = new StreamReader("terrain.xml");
gen.FromXML(s);
s.Close();
SetupScene();
toggleDelay = 1;
}
if (input.IsKeyPressed(KeyCodes.I))
{
//point camera north
camera.Direction = Vector3.NegativeUnitZ;
}
if (input.IsKeyPressed(KeyCodes.K))
{
//point camera south
camera.Direction = Vector3.UnitZ;
}
if (input.IsKeyPressed(KeyCodes.J))
{
//point camera west
camera.Direction = Vector3.NegativeUnitX;
}
if (input.IsKeyPressed(KeyCodes.L))
{
//point camera east
camera.Direction = Vector3.UnitX;
}
if (!captureFailed)
{
if (!input.IsMousePressed(MouseButtons.Left))
{
float cameraYaw = -input.RelativeMouseX * .13f;
float cameraPitch = -input.RelativeMouseY * .13f;
camera.Yaw(cameraYaw);
camera.Pitch(cameraPitch);
}
else
{
cameraVector.x += input.RelativeMouseX * 0.13f;
}
}
if (humanSpeed)
{ // in game running speed is 7m/sec
//camVelocity = camAccel * 7 * oneMeter;
camVelocity = camAccel * 32 * oneMeter;
}
else
{
camVelocity += (camAccel * scaleMove * camSpeed);
}
// Console.WriteLine("ScameMove: {0}", scaleMove.ToString("F3"));
// Console.WriteLine("Camera Accel: {0}, {1}, {2}", camAccel.x.ToString("F3"),
//camAccel.y.ToString("F3"), camAccel.z.ToString("F3"));
// Console.WriteLine("Camera Velocity: {0}, {1}, {2}", camVelocity.x.ToString("F3"),
//camVelocity.y.ToString("F3"), camVelocity.z.ToString("F3"));
// move the camera based on the accumulated movement vector
camera.MoveRelative(camVelocity * moveTime);
// Now dampen the Velocity - only if user is not accelerating
if (camAccel == Vector3.Zero)
{
float slowDown = 6 * moveTime;
if (slowDown > 1)
{
slowDown = 1;
}
camVelocity *= (1 - slowDown);
}
if (followTerrain)
{
// adjust new camera position to be a fixed distance above the ground
Axiom.Core.RaySceneQuery raySceneQuery = scene.CreateRayQuery(new Ray(camera.Position, Vector3.NegativeUnitY));
raySceneQuery.QueryMask = (ulong)Axiom.SceneManagers.Multiverse.RaySceneQueryType.Height;
ArrayList results = raySceneQuery.Execute();
RaySceneQueryResultEntry result = (RaySceneQueryResultEntry)results[0];
camera.Position = new Vector3(camera.Position.x, result.worldFragment.SingleIntersection.y + (2f * oneMeter), camera.Position.z);
}
// update performance stats once per second
if (statDelay < 0.0f && showDebugOverlay)
{
UpdateStats();
statDelay = 1.0f;
}
else
{
statDelay -= e.TimeSinceLastFrame;
}
// turn off debug text when delay ends
if (debugTextDelay < 0.0f)
{
debugTextDelay = 0.0f;
window.DebugText = "";
}
else if (debugTextDelay > 0.0f)
{
debugTextDelay -= e.TimeSinceLastFrame;
}
}