//if running on a fixed timestep, this might be called //more often with a smaller delta time than RenderUpdate() internal void Update(UpdateTimer time, List <Input.InputAction> actions, PlayerSteering ps) { //Thread.Sleep(30); float secDelta = time.GetUpdateDeltaSeconds(); // mZone.UpdateModels(secDelta); float yawAmount = 0f; float pitchAmount = 0f; bool bGravity = false; float friction = GroundFriction; if (!mbOnGround) { //gravity if (!mbFly) { bGravity = true; } if (mbBadFooting) { friction = GroundFriction; } else { friction = AirFriction; } } else { if (!mbFly) { friction = GroundFriction; } else { friction = AirFriction; } } bool bCamJumped = false; foreach (Input.InputAction act in actions) { if (act.mAction.Equals(Program.MyActions.Jump)) { if (mbOnGround && !mbFly) { friction = AirFriction; bCamJumped = true; } } else if (act.mAction.Equals(Program.MyActions.ToggleFly)) { mbFly = !mbFly; ps.Method = (mbFly)? PlayerSteering.SteeringMethod.Fly : PlayerSteering.SteeringMethod.FirstPerson; } else if (act.mAction.Equals(Program.MyActions.Turn)) { yawAmount = act.mMultiplier; } else if (act.mAction.Equals(Program.MyActions.Pitch)) { pitchAmount = act.mMultiplier; } else if (act.mAction.Equals(Program.MyActions.RayStart)) { mRayStart = GetModelPos(); } else if (act.mAction.Equals(Program.MyActions.RayEnd)) { mRayEnd = GetModelPos(); mbRayHit = mTModel.Trace(mRayStart, mRayEnd, out mRayHit); mColRays.Add(mRayStart); mColRays.Add(mRayEnd); if (mbRayHit) { //scale up to view space Vector3 viewHit = mRayHit; viewHit.X *= 16f; viewHit.Z *= 16f; mColHits.Add(viewHit); } mDrawRays.BuildRayDrawInfo(mColRays, mColHits, 16f); } else if (act.mAction.Equals(Program.MyActions.RayCrazy)) { Stopwatch sw = new Stopwatch(); sw.Start(); mColRays.Clear(); mColHits.Clear(); Vector3 randSpace = Vector3.One * 1000f; randSpace.Y *= 5f; for (int i = 0; i < 1000; i++) { Vector3 start = Mathery.RandomPosition(mRand, randSpace); Vector3 end = Mathery.RandomPosition(mRand, randSpace); //wrap xz if (start.X < 0) { start.X += 1000f; } if (start.Z < 0) { start.Z += 1000f; } if (end.X < 0) { end.X += 1000f; } if (end.Z < 0) { end.Z += 1000f; } Vector3 hit; if (mTModel.Trace(start, end, out hit)) { //scale up to view space Vector3 viewHit = hit; viewHit.X *= 16f; viewHit.Z *= 16f; mColHits.Add(viewHit); } mColRays.Add(start); mColRays.Add(end); } sw.Stop(); mDrawRays.BuildRayDrawInfo(mColRays, mColHits, 16f); } } // UpdateDynamicLights(actions); Vector3 startPos = mGroundPos; Vector3 moveVec = ps.Update(startPos, mGD.GCam.Forward, mGD.GCam.Left, mGD.GCam.Up, actions); if (mbOnGround || mbFly) { moveVec *= JogMoveForce; } else if (mbBadFooting) { moveVec *= StumbleForce; } else { moveVec *= MidAirMoveForce; } mVelocity += moveVec * 0.5f; mVelocity -= (friction * mVelocity * secDelta * 0.5f); Vector3 pos = startPos; if (bGravity) { mVelocity += Vector3.Down * GravityForce * (secDelta * 0.5f); } if (bCamJumped) { mVelocity += Vector3.Up * JumpForce * 0.5f; pos += mVelocity * (1f / 60f); } else { pos += mVelocity * secDelta; } mVelocity += moveVec * 0.5f; mVelocity -= (friction * mVelocity * secDelta * 0.5f); if (bGravity) { mVelocity += Vector3.Down * GravityForce * (secDelta * 0.5f); } if (bCamJumped) { mVelocity += Vector3.Up * JumpForce * 0.5f; } Vector3 camPos = Vector3.Zero; Vector3 endPos = pos; // Move(endPos, time.GetUpdateDeltaMilliSeconds(), false, // mbFly, !bCamJumped, true, true, out endPos, out camPos); mGroundPos += moveVec; bool bWrapped = WrapPosition(ref mGroundPos); WrapGridCoordinates(); if (bWrapped && mTerrain != null) { mTerrain.BuildGrid(mGD, mChunkRange, mNumStreamThreads); } if (mTerrain != null) { mTerrain.SetCellCoord(mGridCoordinate); mTerrain.UpdatePosition(mGroundPos, mTerMats); } mGD.GCam.Update(-mGroundPos, ps.Pitch, ps.Yaw, ps.Roll); mOtherCam.Update(-GetViewPos(), ps.Pitch, ps.Yaw, ps.Roll); if (!mbFly) { if (mbOnGround) { //kill downward velocity so previous //falling momentum doesn't contribute to //a new jump if (mVelocity.Y < 0f) { mVelocity.Y = 0f; } } if (mbBadFooting) { //reduce downward velocity to avoid //getting stuck in V shaped floors if (mVelocity.Y < 0f) { mVelocity.Y -= (StumbleFriction * mVelocity.Y * secDelta); } } } //get ground pos at current location float groundHeight = mTModel.GetHeight(GetModelPos()); mAudio.Update(mGD.GCam); mST.ModifyStringText(mFonts[0], "Grid: " + mGridCoordinate.ToString() + ", LocalPos: " + mGroundPos.IntStr() + ", ModelPos: " + GetModelPos(), "PosStatus"); mST.ModifyStringText(mFonts[0], "Height: " + groundHeight + ", Hit: " + mbRayHit + ", HitPos: " + mRayHit, "ColStatus"); if (mTerrain != null) { mST.ModifyStringText(mFonts[0], "Threads Active: " + mTerrain.GetThreadsActive() + ", Thread Counter: " + mTerrain.GetThreadCounter(), "ThreadStatus"); } mST.Update(mGD.DC); }
internal void TBuild(int gridSize, int chunkSize, float medianHeight, float variance, int polySize, int tilingIterations, float borderSize, int smoothPasses, int seed, int erosionIterations, float rainFall, float solubility, float evaporation, int threads) { mFracFact = new FractalFactory(variance, medianHeight, gridSize + 1, gridSize + 1); mNumStreamThreads = threads; float [,] fract = mFracFact.CreateFractal(seed); for (int i = 0; i < smoothPasses; i++) { FractalFactory.SmoothPass(fract); } for (int i = 0; i < tilingIterations; i++) { float borderSlice = borderSize / tilingIterations; FractalFactory.MakeTiled(fract, borderSlice * (i + 1)); } if (erosionIterations > 0) { int realIterations = FractalFactory.Erode(fract, mRand, erosionIterations, rainFall, solubility, evaporation); //redo tiling if eroded for (int i = 0; i < tilingIterations; i++) { float borderSlice = borderSize / tilingIterations; FractalFactory.MakeTiled(fract, borderSlice * (i + 1)); } } Vector3 [,] norms = mFracFact.BuildNormals(fract, polySize); if (mTModel != null) { mTModel.FreeAll(); } mTModel = new TerrainModel(fract, polySize, gridSize); mCellGridMax = gridSize / chunkSize; List <HeightMap.TexData> tdata = new List <HeightMap.TexData>(); float transHeight = 0f; if (mTerrain != null) { //grab a copy of the old texture data if any List <HeightMap.TexData> texOld = mTerrain.GetTextureData(out transHeight); //clone it because it is about to all get nuked foreach (HeightMap.TexData td in texOld) { HeightMap.TexData td2 = new HeightMap.TexData(td); tdata.Add(td2); } mTerrain.FreeAll(); } mTerrain = new Terrain(fract, norms, polySize, chunkSize, mCellGridMax); mTerrain.SetTextureData(tdata, transHeight); mBoundary = chunkSize * polySize; WrapGridCoordinates(); mTerrain.SetCellCoord(mGridCoordinate); mTerrain.BuildGrid(mGD, mChunkRange, mNumStreamThreads); mPos.Y = mTModel.GetHeight(mPos) + 200f; mTerrain.UpdatePosition(mPos, mTerMats); //clamp box heights mTModel.FixBoxHeights(); //clear existing if (mQTreeBoxes != null) { mQTreeBoxes.Free(); } //turn on to debug quadtree //careful about big map sizes // List<BoundingBox> boxes =mTModel.GetAllBoxes(); // mQTreeBoxes =PrimFactory.CreateCubes(mGD.GD, boxes); }