void UpdateDynamicLights(List <Input.InputAction> actions) { if (mDynLights == null) { return; } foreach (Input.InputAction act in actions) { if (act.mAction.Equals(Program.MyActions.PlaceDynamicLight)) { int id; mDynLights.CreateDynamicLight(mGD.GCam.Position, Mathery.RandomColorVector(mRand), 300, out id); mActiveLights.Add(id); mST.ModifyStringText(mFonts[0], "(G), (H) to clear: Dynamic Lights: " + mActiveLights.Count, "DynStatus"); } else if (act.mAction.Equals(Program.MyActions.ClearDynamicLights)) { foreach (int id in mActiveLights) { mDynLights.Destroy(id); } mActiveLights.Clear(); mST.ModifyStringText(mFonts[0], "(G), (H) to clear: Dynamic Lights: 0", "DynStatus"); } } mDynLights.Update(mGD); }
internal DrawPathing(GraphicsDevice gd, MaterialLib.StuffKeeper sk) { mGD = gd; mMatLib = new MatLib(gd, sk); mLightDir = Mathery.RandomDirection(mRand); Vector4 lightColor2 = Vector4.One * 0.8f; Vector4 lightColor3 = Vector4.One * 0.6f; lightColor2.W = lightColor3.W = 1f; mMatLib.CreateMaterial("LevelGeometry"); mMatLib.SetMaterialEffect("LevelGeometry", "Static.fx"); mMatLib.SetMaterialTechnique("LevelGeometry", "TriVColorSolidSpec"); mMatLib.SetMaterialParameter("LevelGeometry", "mLightColor0", Vector4.One); mMatLib.SetMaterialParameter("LevelGeometry", "mLightColor1", lightColor2); mMatLib.SetMaterialParameter("LevelGeometry", "mLightColor2", lightColor3); mMatLib.SetMaterialParameter("LevelGeometry", "mSolidColour", Vector4.One); mMatLib.SetMaterialParameter("LevelGeometry", "mSpecPower", 1); mMatLib.SetMaterialParameter("LevelGeometry", "mSpecColor", Vector4.One); mMatLib.SetMaterialParameter("LevelGeometry", "mWorld", Matrix.Identity); }
internal void Texture(TexAtlas texAtlas, List <HeightMap.TexData> texInfo, float transHeight) { mSK.AddMap("TerrainAtlas", texAtlas.GetAtlasSRV()); mTerMats.SetMaterialTexture("Terrain", "mTexture0", "TerrainAtlas"); Vector4 [] scaleofs = new Vector4[16]; float [] scale = new float[16]; for (int i = 0; i < texInfo.Count; i++) { if (i > 15) { break; } scaleofs[i] = new Vector4( (float)texInfo[i].mScaleU, (float)texInfo[i].mScaleV, (float)texInfo[i].mUOffs, (float)texInfo[i].mVOffs); //basically a divisor scale[i] = 1.0f / texInfo[i].ScaleFactor; } mTerMats.SetMaterialParameter("Terrain", "mAtlasUVData", scaleofs); mTerMats.SetMaterialParameter("Terrain", "mAtlasTexScale", scale); if (mTerrain != null) { mTerrain.SetTextureData(texInfo, transHeight); } Vector3 lightDir = Mathery.RandomDirection(mRand); mTerMats.SetMaterialParameter("Terrain", "mLightDirection", lightDir); }
const float InvertIncrement = 0.01f; //10ms internal Game(GraphicsDevice gd, string gameRootDir) { mGD = gd; mGameRootDir = gameRootDir; mResX = gd.RendForm.ClientRectangle.Width; mResY = gd.RendForm.ClientRectangle.Height; mSKeeper = new StuffKeeper(); mSKeeper.eCompileNeeded += SharedForms.ShaderCompileHelper.CompileNeededHandler; mSKeeper.eCompileDone += SharedForms.ShaderCompileHelper.CompileDoneHandler; mSKeeper.Init(mGD, gameRootDir); mFontMats = new MatLib(gd, mSKeeper); mCPrims = new CommonPrims(gd, mSKeeper); mFonts = mSKeeper.GetFontList(); mFontMats.CreateMaterial("Text"); mFontMats.SetMaterialEffect("Text", "2D.fx"); mFontMats.SetMaterialTechnique("Text", "Text"); mST = new ScreenText(gd.GD, mFontMats, mFonts[0], 1000); mSUI = new ScreenUI(gd.GD, mFontMats, 100); mTextProj = Matrix.OrthoOffCenterLH(0, mResX, mResY, 0, 0.1f, 5f); //load avail static stuff if (Directory.Exists(mGameRootDir + "/Statics")) { DirectoryInfo di = new DirectoryInfo(mGameRootDir + "/Statics"); FileInfo[] fi = di.GetFiles("*.MatLib", SearchOption.TopDirectoryOnly); if (fi.Length > 0) { mStaticMats = new MatLib(gd, mSKeeper); mStaticMats.ReadFromFile(fi[0].DirectoryName + "\\" + fi[0].Name); mStaticMats.InitCelShading(1); mStaticMats.GenerateCelTexturePreset(gd.GD, (gd.GD.FeatureLevel == FeatureLevel.Level_9_3), false, 0); mStaticMats.SetCelTexture(0); mKeeper.AddLib(mStaticMats); } mStatics = Mesh.LoadAllStaticMeshes(mGameRootDir + "\\Statics", gd.GD); foreach (KeyValuePair <string, IArch> arch in mStatics) { arch.Value.UpdateBounds(); } fi = di.GetFiles("*.StaticInstance", SearchOption.TopDirectoryOnly); foreach (FileInfo f in fi) { string archName = FileUtil.StripExtension(f.Name); if (archName.Contains('_')) { archName = archName.Substring(0, f.Name.IndexOf('_')); } archName += ".Static"; if (!mStatics.ContainsKey(archName)) { continue; } StaticMesh sm = new StaticMesh(mStatics[archName]); sm.ReadFromFile(f.DirectoryName + "\\" + f.Name); mMeshes.Add(sm); sm.UpdateBounds(); sm.SetMatLib(mStaticMats); Vector3 randPos = Mathery.RandomPosition(mRand, Vector3.UnitX * 100f + Vector3.UnitZ * 100f); mMeshPositions.Add(randPos); mMeshRotations.Add(Vector3.Zero); mMeshScales.Add(Vector3.One); UpdateStaticTransform(mMeshes.Count - 1); } AddStaticCollision(); } //skip hair stuff when computing bone bounds //hits to hair usually wouldn't activate much List <string> skipMats = new List <string>(); skipMats.Add("Hair"); //load character stuff if any around if (Directory.Exists(mGameRootDir + "/Characters")) { DirectoryInfo di = new DirectoryInfo(mGameRootDir + "/Characters"); FileInfo[] fi = di.GetFiles("*.AnimLib", SearchOption.TopDirectoryOnly); if (fi.Length > 0) { mCharAnims = new AnimLib(); mCharAnims.ReadFromFile(fi[0].DirectoryName + "\\" + fi[0].Name); List <Anim> anims = mCharAnims.GetAnims(); foreach (Anim a in anims) { mAnims.Add(a.Name); } } fi = di.GetFiles("*.MatLib", SearchOption.TopDirectoryOnly); if (fi.Length > 0) { mCharMats = new MatLib(mGD, mSKeeper); mCharMats.ReadFromFile(fi[0].DirectoryName + "\\" + fi[0].Name); mCharMats.InitCelShading(1); mCharMats.GenerateCelTexturePreset(gd.GD, gd.GD.FeatureLevel == FeatureLevel.Level_9_3, false, 0); mCharMats.SetCelTexture(0); mKeeper.AddLib(mCharMats); } fi = di.GetFiles("*.Character", SearchOption.TopDirectoryOnly); foreach (FileInfo f in fi) { IArch arch = new CharacterArch(); arch.ReadFromFile(f.DirectoryName + "\\" + f.Name, mGD.GD, true); mCharArchs.Add(FileUtil.StripExtension(f.Name), arch); } fi = di.GetFiles("*.CharacterInstance", SearchOption.TopDirectoryOnly); foreach (FileInfo f in fi) { string archName = f.Name; if (archName.Contains('_')) { archName = f.Name.Substring(0, f.Name.IndexOf('_')); } if (!mCharArchs.ContainsKey(archName)) { continue; } Character c = new Character(mCharArchs[archName], mCharAnims); //map this to an arch mCharToArch.Add(c, mCharArchs[archName]); c.ReadFromFile(f.DirectoryName + "\\" + f.Name); c.SetMatLib(mCharMats); c.SetTransform(Matrix.Translation( Mathery.RandomPosition(mRand, Vector3.UnitX * 100f + Vector3.UnitZ * 100f))); c.ComputeBoneBounds(skipMats); c.AutoInvert(true, mInvertInterval); mCharacters.Add(c); } if (mCharacters.Count > 0) { mAnimTimes = new float[mCharacters.Count]; mCurAnims = new int[mCharacters.Count]; mCBone = new int[mCharacters.Count]; mCBones = new Dictionary <int, Matrix> [mCharacters.Count]; } foreach (KeyValuePair <string, IArch> arch in mCharArchs) { //build draw data for bone bounds (arch.Value as CharacterArch).BuildDebugBoundDrawData(mGD.GD, mCPrims); } } //typical material group for characters //or at least it works with the ones //I have right now //TODO: way to define these in the asset? List <string> skinMats = new List <string>(); skinMats.Add("Face"); skinMats.Add("Skin"); skinMats.Add("EyeWhite"); skinMats.Add("EyeLiner"); skinMats.Add("IrisLeft"); skinMats.Add("PupilLeft"); skinMats.Add("IrisRight"); skinMats.Add("PupilRight"); skinMats.Add("Nails"); mKeeper.AddMaterialGroup("SkinGroup", skinMats); mTextColor = Vector4.UnitY + (Vector4.UnitW * 0.15f); mHitColor = Vector4.One * 0.9f; mHitColor.Y = mHitColor.Z = 0f; mSUI.AddGump("UI\\CrossHair", "CrossHair", Vector4.One, Vector2.UnitX * ((mResX / 2) - 16) + Vector2.UnitY * ((mResY / 2) - 16), Vector2.One); //string indicators for various statusy things mST.AddString(mFonts[0], "", "StaticStatus", mTextColor, Vector2.UnitX * 20f + Vector2.UnitY * 460f, Vector2.One); mST.AddString(mFonts[0], "", "InvertStatus", mTextColor, Vector2.UnitX * 20f + Vector2.UnitY * 480f, Vector2.One); mST.AddString(mFonts[0], "", "AnimStatus", mTextColor, Vector2.UnitX * 20f + Vector2.UnitY * 500f, Vector2.One); mST.AddString(mFonts[0], "", "CharStatus", mTextColor, Vector2.UnitX * 20f + Vector2.UnitY * 520f, Vector2.One); mST.AddString(mFonts[0], "", "PosStatus", mTextColor, Vector2.UnitX * 20f + Vector2.UnitY * 540f, Vector2.One); mST.AddString(mFonts[0], "", "HitStatus", mTextColor, Vector2.UnitX * 20f + Vector2.UnitY * 560f, Vector2.One); mST.AddString(mFonts[0], "", "ThreadStatus", mTextColor, Vector2.UnitX * 20f + Vector2.UnitY * 580f, Vector2.One); UpdateCAStatus(); UpdateInvertStatus(); UpdateStaticStatus(); }
internal void Update(UpdateTimer time, List <Input.InputAction> actions) { mFrameCheck++; Vector3 startPos = mGD.GCam.Position; Vector3 endPos = startPos + mGD.GCam.Forward * -2000f; float deltaMS = time.GetUpdateDeltaMilliSeconds(); float deltaSec = time.GetUpdateDeltaSeconds(); //animate characters for (int i = 0; i < mCharacters.Count; i++) { Character c = mCharacters[i]; c.Update(deltaSec); float totTime = mCharAnims.GetAnimTime(mAnims[mCurAnims[i]]); float strTime = mCharAnims.GetAnimStartTime(mAnims[mCurAnims[i]]); float endTime = totTime + strTime; mAnimTimes[i] += deltaSec; if (mAnimTimes[i] > endTime) { mAnimTimes[i] = strTime + (mAnimTimes[i] - endTime); } c.Animate(mAnims[mCurAnims[i]], mAnimTimes[i]); mCBones[i] = (mCharToArch[c] as CharacterArch).GetBoneTransforms(mCharAnims.GetSkeleton()); } //check for keys foreach (Input.InputAction act in actions) { if (act.mAction.Equals(Program.MyActions.NextCharacter)) { mCurChar++; if (mCurChar >= mCharacters.Count) { mCurChar = 0; } UpdateCAStatus(); } else if (act.mAction.Equals(Program.MyActions.NextStatic)) { mCurStatic++; if (mCurStatic >= mMeshes.Count) { mCurStatic = 0; } UpdateStaticStatus(); } else if (act.mAction.Equals(Program.MyActions.NextAnim)) { if (mCharacters.Count > 0) { mCurAnims[mCurChar]++; if (mCurAnims[mCurChar] >= mAnims.Count) { mCurAnims[mCurChar] = 0; } UpdateCAStatus(); } } else if (act.mAction.Equals(Program.MyActions.IncreaseInvertInterval)) { mInvertInterval += InvertIncrement; foreach (Character c in mCharacters) { c.AutoInvert(true, mInvertInterval); } UpdateInvertStatus(); } else if (act.mAction.Equals(Program.MyActions.DecreaseInvertInterval)) { mInvertInterval -= InvertIncrement; if (mInvertInterval < InvertIncrement) { mInvertInterval = InvertIncrement; } foreach (Character c in mCharacters) { c.AutoInvert(true, mInvertInterval); } UpdateInvertStatus(); } else if (act.mAction.Equals(Program.MyActions.RandRotateStatic)) { if (mMeshes.Count > 0) { //make a random rotation mMeshRotations[mCurStatic] = new Vector3( Mathery.RandomFloatNext(mRand, 0, MathUtil.TwoPi), Mathery.RandomFloatNext(mRand, 0, MathUtil.TwoPi), Mathery.RandomFloatNext(mRand, 0, MathUtil.TwoPi)); UpdateStaticTransform(mCurStatic); } } else if (act.mAction.Equals(Program.MyActions.RandScaleStatic)) { if (mMeshes.Count > 0) { //make a random scale mMeshScales[mCurStatic] = new Vector3( Mathery.RandomFloatNext(mRand, 0.25f, 5f), Mathery.RandomFloatNext(mRand, 0.25f, 5f), Mathery.RandomFloatNext(mRand, 0.25f, 5f)); UpdateStaticTransform(mCurStatic); } } } mPartHit = null; mMeshHit = null; float bestDist = float.MaxValue; for (int i = 0; i < mMeshes.Count; i++) { StaticMesh sm = mMeshes[i]; float?bHit = sm.RayIntersect(startPos, endPos, true); if (bHit != null) { Mesh partHit = null; bHit = sm.RayIntersect(startPos, endPos, true, out partHit); if (bHit != null) { if (bHit.Value < bestDist) { bestDist = bHit.Value; mPartHit = partHit; mMeshHit = sm; } } } } if (mStaticMats != null) { mStaticMats.UpdateWVP(Matrix.Identity, mGD.GCam.View, mGD.GCam.Projection, mGD.GCam.Position); } if (mCharMats != null) { mCharMats.UpdateWVP(Matrix.Identity, mGD.GCam.View, mGD.GCam.Projection, mGD.GCam.Position); } mCPrims.Update(mGD.GCam, Vector3.Down); for (int i = 0; i < mCharacters.Count; i++) { Character c = mCharacters[i]; float? bHit = c.RayIntersect(startPos, endPos); if (bHit != null) { c.RayIntersectBones(startPos, endPos, false, out mCBone[i]); } else { mCBone[i] = 0; } } if (mFrameCheck == 10) { mFrameCheck = 0; UpdateThreadStatus(); } UpdatePosStatus(); UpdateHitStatus(); //this has to behind any text changes //otherwise the offsets will be messed up mST.Update(mGD.DC); mSUI.Update(mGD.DC); }
internal TerrainLoop(GraphicsDevice gd, StuffKeeper sk, string gameRootDir) { mGD = gd; mSK = sk; mResX = gd.RendForm.ClientRectangle.Width; mResY = gd.RendForm.ClientRectangle.Height; mFontMats = new MatLib(gd, sk); mFontMats.CreateMaterial("Text"); mFontMats.SetMaterialEffect("Text", "2D.fx"); mFontMats.SetMaterialTechnique("Text", "Text"); mFonts = sk.GetFontList(); mST = new ScreenText(gd.GD, mFontMats, mFonts[0], 1000); mTextProj = Matrix.OrthoOffCenterLH(0, mResX, mResY, 0, 0.1f, 5f); string path = gameRootDir + "\\Levels\\Testa.Terrain"; mTerrain = new Terrain(path); //build model for raycasts/collisions mTModel = mTerrain.ConstructModel(); mTModel.FixBoxHeights(); // Vector4 color =Vector4.UnitY + (Vector4.UnitW * 0.15f); Vector4 color = Vector4.UnitX * 0.25f + Vector4.UnitZ * 0.25f + (Vector4.UnitW * 0.55f); //string indicators for various statusy things mST.AddString(mFonts[0], "Stuffs", "PosStatus", color, Vector2.UnitX * 20f + Vector2.UnitY * 610f, Vector2.One); mST.AddString(mFonts[0], "Stuffs", "ColStatus", color, Vector2.UnitX * 20f + Vector2.UnitY * 630f, Vector2.One); mST.AddString(mFonts[0], "Thread Status...", "ThreadStatus", color, Vector2.UnitX * 20f + Vector2.UnitY * 650f, Vector2.One); mTerMats = new MatLib(mGD, sk); Vector3 lightDir = Mathery.RandomDirection(mRand); Vector4 lightColor2 = Vector4.One * 0.4f; Vector4 lightColor3 = Vector4.One * 0.1f; lightColor2.W = lightColor3.W = 1f; mTerMats.CreateMaterial("Terrain"); mTerMats.SetMaterialEffect("Terrain", "Terrain.fx"); mTerMats.SetMaterialTechnique("Terrain", "TriTerrain"); mTerMats.SetMaterialParameter("Terrain", "mLightColor0", Vector4.One); mTerMats.SetMaterialParameter("Terrain", "mLightColor1", lightColor2); mTerMats.SetMaterialParameter("Terrain", "mLightColor2", lightColor3); mTerMats.SetMaterialParameter("Terrain", "mLightDirection", lightDir); mTerMats.SetMaterialParameter("Terrain", "mSolidColour", Vector4.One); mTerMats.SetMaterialParameter("Terrain", "mSpecPower", 1); mTerMats.SetMaterialParameter("Terrain", "mSpecColor", Vector4.One); mTerMats.SetMaterialParameter("Terrain", "mWorld", Matrix.Identity); mTerMats.CreateMaterial("Sky"); mTerMats.SetMaterialEffect("Sky", "Terrain.fx"); mTerMats.SetMaterialTechnique("Sky", "SkyGradient"); LoadShading(path); mTerMats.InitCelShading(1); mTerMats.GenerateCelTexturePreset(mGD.GD, mGD.GD.FeatureLevel == FeatureLevel.Level_9_3, false, 0); mTerMats.SetCelTexture(0); mSkyCube = PrimFactory.CreateCube(gd.GD, -5f); LoadTerrainTextureStuff(path); //debug draw mDebugMats = new MatLib(gd, sk); Vector4 redColor = Vector4.One; Vector4 greenColor = Vector4.One; Vector4 blueColor = Vector4.One; redColor.Y = redColor.Z = greenColor.X = greenColor.Z = blueColor.X = blueColor.Y = 0f; mDebugMats.CreateMaterial("DebugBoxes"); mDebugMats.SetMaterialEffect("DebugBoxes", "Static.fx"); mDebugMats.SetMaterialTechnique("DebugBoxes", "TriSolidSpec"); mDebugMats.SetMaterialParameter("DebugBoxes", "mLightColor0", Vector4.One); mDebugMats.SetMaterialParameter("DebugBoxes", "mLightColor1", lightColor2); mDebugMats.SetMaterialParameter("DebugBoxes", "mLightColor2", lightColor3); mDebugMats.SetMaterialParameter("DebugBoxes", "mSolidColour", blueColor); mDebugMats.SetMaterialParameter("DebugBoxes", "mSpecPower", 1); mDebugMats.SetMaterialParameter("DebugBoxes", "mSpecColor", Vector4.One); mNumStreamThreads = 2; mGroundPos.Y = 3000f; //start above mCellGridMax = mTerrain.GetCellGridMax(); mBoundary = mTerrain.GetBoundary(); Viewport vp = mGD.GetScreenViewPort(); mGD.GCam.Projection = Matrix.PerspectiveFovLH( MathUtil.DegreesToRadians(45f), vp.Width / (float)vp.Height, 0.1f, FogEnd); mGD.SetClip(0.1f, FogEnd); mDrawRays = new DrawRays(mGD, mSK); mOtherCam = new GameCamera(vp.Width, vp.Height, vp.Width / (float)vp.Height, 0.1f, FogEnd); }
//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 BuildDrawInfo(PathGraph graph) { FreeVBs(); List <Vector3> verts = new List <Vector3>(); List <Vector3> norms = new List <Vector3>(); List <UInt32> indexes = new List <UInt32>(); List <int> vertCounts = new List <int>(); graph.GetNodePolys(verts, indexes, norms, vertCounts); if (verts.Count == 0) { return; } VPosNormCol0 [] nodeVerts = new VPosNormCol0[verts.Count]; for (int i = 0; i < nodeVerts.Length; i++) { nodeVerts[i].Position = verts[i] + Vector3.UnitY; //boost up 1 nodeVerts[i].Normal.X = norms[i].X; nodeVerts[i].Normal.Y = norms[i].Y; nodeVerts[i].Normal.Z = norms[i].Z; nodeVerts[i].Normal.W = 1f; } int idx = 0; for (int i = 0; i < vertCounts.Count; i++) { Color col = Mathery.RandomColor(mRand); for (int j = 0; j < vertCounts[i]; j++) { nodeVerts[idx + j].Color0 = col; } idx += vertCounts[i]; } mVBNodes = VertexTypes.BuildABuffer(mGD.GD, nodeVerts, VertexTypes.GetIndex(nodeVerts[0].GetType())); mIBNodes = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBNodes = VertexTypes.BuildAVBB(VertexTypes.GetIndex(nodeVerts[0].GetType()), mVBNodes); mNodeIndexCount = indexes.Count; //connexions List <PathGraph.LineSeg> segz = graph.GetNodeConnections(); if (segz.Count <= 0) { return; } VPosNormCol0 [] segVerts = new VPosNormCol0[segz.Count * 3]; UInt32 index = 0; indexes.Clear(); foreach (PathGraph.LineSeg seg in segz) { Color col = Mathery.RandomColor(mRand); //endpoint segVerts[index].Position = seg.mB; Vector3 lineVec = seg.mB - seg.mA; //get a perpindicular axis to the a to b axis //so the back side of the connection can flare out a bit Vector3 crossVec = Vector3.Cross(lineVec, Vector3.UnitY); crossVec.Normalize(); Vector3 normVec = Vector3.Cross(crossVec, lineVec); normVec.Normalize(); crossVec *= 2f; segVerts[index + 1].Position = seg.mA - crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index + 2].Position = seg.mA + crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index].Color0 = col; segVerts[index + 1].Color0 = col; segVerts[index + 2].Color0 = col; //adjust up segVerts[index].Position += Vector3.UnitY * 2f; segVerts[index + 1].Position += Vector3.UnitY * 1.7f; segVerts[index + 2].Position += Vector3.UnitY * 1.7f; Half4 norm; norm.X = normVec.X; norm.Y = normVec.Y; norm.Z = normVec.Z; norm.W = 1f; segVerts[index].Normal = norm; segVerts[index + 1].Normal = norm; segVerts[index + 2].Normal = norm; indexes.Add(index); indexes.Add(index + 1); indexes.Add(index + 2); index += 3; } mVBCons = VertexTypes.BuildABuffer(mGD.GD, segVerts, VertexTypes.GetIndex(segVerts[0].GetType())); mIBCons = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBCons = VertexTypes.BuildAVBB(VertexTypes.GetIndex(segVerts[0].GetType()), mVBCons); mConIndexCount = indexes.Count; }
internal void BuildPathDrawInfo(List <Vector3> path, Vector3 boxMiddleOffset) { if (mVBPath != null) { mVBPath.Dispose(); } if (mIBPath != null) { mIBPath.Dispose(); } if (path.Count < 2) { return; } VPosNormCol0 [] segVerts = new VPosNormCol0[(path.Count - 1) * 3]; UInt32 index = 0; List <UInt32> indexes = new List <UInt32>(); for (int i = 0; i < (path.Count - 1); i++) { Color col = Mathery.RandomColor(mRand); col = Color.Red; //endpoint segVerts[index].Position = path[i + 1]; Vector3 lineVec = path[i + 1] - path[i]; //get a perpindicular axis to the a to b axis //so the back side of the connection can flare out a bit Vector3 crossVec = Vector3.Cross(lineVec, Vector3.UnitY); crossVec.Normalize(); Vector3 normVec = Vector3.Cross(crossVec, lineVec); normVec.Normalize(); crossVec *= 2f; segVerts[index + 1].Position = path[i] - crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index + 2].Position = path[i] + crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index].Color0 = col; segVerts[index + 1].Color0 = col; segVerts[index + 2].Color0 = col; //adjust up segVerts[index].Position += boxMiddleOffset; segVerts[index + 1].Position += boxMiddleOffset; segVerts[index + 2].Position += boxMiddleOffset; Half4 norm; norm.X = normVec.X; norm.Y = normVec.Y; norm.Z = normVec.Z; norm.W = 1f; segVerts[index].Normal = norm; segVerts[index + 1].Normal = norm; segVerts[index + 2].Normal = norm; indexes.Add(index); indexes.Add(index + 1); indexes.Add(index + 2); index += 3; } mVBPath = VertexTypes.BuildABuffer(mGD.GD, segVerts, VertexTypes.GetIndex(segVerts[0].GetType())); mIBPath = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBPath = VertexTypes.BuildAVBB(VertexTypes.GetIndex(segVerts[0].GetType()), mVBPath); mPathIndexCount = indexes.Count; }
internal GameLoop(GraphicsDevice gd, StuffKeeper sk, string gameRootDir) { mGD = gd; mSK = sk; mResX = gd.RendForm.ClientRectangle.Width; mResY = gd.RendForm.ClientRectangle.Height; mFontMats = new MatLib(gd, sk); mFontMats.CreateMaterial("Text"); mFontMats.SetMaterialEffect("Text", "2D.fx"); mFontMats.SetMaterialTechnique("Text", "Text"); mFonts = sk.GetFontList(); mST = new ScreenText(gd.GD, mFontMats, mFonts[0], 1000); mTextProj = Matrix.OrthoOffCenterLH(0, mResX, mResY, 0, 0.1f, 5f); Vector4 color = Vector4.UnitY + (Vector4.UnitW * 0.15f); //string indicators for various statusy things mST.AddString(mFonts[0], "Stuffs", "PosStatus", color, Vector2.UnitX * 20f + Vector2.UnitY * 580f, Vector2.One); mST.AddString(mFonts[0], "Thread Status...", "ThreadStatus", color, Vector2.UnitX * 20f + Vector2.UnitY * 560f, Vector2.One); mTerMats = new MatLib(mGD, sk); Vector3 lightDir = Mathery.RandomDirection(mRand); Vector4 lightColor2 = Vector4.One * 0.4f; Vector4 lightColor3 = Vector4.One * 0.1f; lightColor2.W = lightColor3.W = 1f; mTerMats.CreateMaterial("Terrain"); mTerMats.SetMaterialEffect("Terrain", "Terrain.fx"); mTerMats.SetMaterialTechnique("Terrain", "TriTerrain"); mTerMats.SetMaterialParameter("Terrain", "mLightColor0", Vector4.One); mTerMats.SetMaterialParameter("Terrain", "mLightColor1", lightColor2); mTerMats.SetMaterialParameter("Terrain", "mLightColor2", lightColor3); mTerMats.SetMaterialParameter("Terrain", "mLightDirection", lightDir); mTerMats.SetMaterialParameter("Terrain", "mSolidColour", Vector4.One); mTerMats.SetMaterialParameter("Terrain", "mSpecPower", 1); mTerMats.SetMaterialParameter("Terrain", "mSpecColor", Vector4.One); mTerMats.SetMaterialParameter("Terrain", "mWorld", Matrix.Identity); mTerMats.CreateMaterial("Sky"); mTerMats.SetMaterialEffect("Sky", "Terrain.fx"); mTerMats.SetMaterialTechnique("Sky", "SkyGradient"); mTerMats.InitCelShading(1); mTerMats.GenerateCelTexturePreset(mGD.GD, mGD.GD.FeatureLevel == FeatureLevel.Level_9_3, false, 0); mTerMats.SetCelTexture(0); mSkyCube = PrimFactory.CreateCube(gd.GD, -5f); //debug draw mDebugMats = new MatLib(gd, sk); Vector4 redColor = Vector4.One; Vector4 greenColor = Vector4.One; Vector4 blueColor = Vector4.One; redColor.Y = redColor.Z = greenColor.X = greenColor.Z = blueColor.X = blueColor.Y = 0f; mDebugMats.CreateMaterial("DebugBoxes"); mDebugMats.SetMaterialEffect("DebugBoxes", "Static.fx"); mDebugMats.SetMaterialTechnique("DebugBoxes", "TriSolidSpec"); mDebugMats.SetMaterialParameter("DebugBoxes", "mLightColor0", Vector4.One); mDebugMats.SetMaterialParameter("DebugBoxes", "mLightColor1", lightColor2); mDebugMats.SetMaterialParameter("DebugBoxes", "mLightColor2", lightColor3); mDebugMats.SetMaterialParameter("DebugBoxes", "mSolidColour", blueColor); mDebugMats.SetMaterialParameter("DebugBoxes", "mSpecPower", 1); mDebugMats.SetMaterialParameter("DebugBoxes", "mSpecColor", Vector4.One); }
public DrawStuff(GraphicsDevice gd, MaterialLib.StuffKeeper sk) { mMatLib = new MatLib(gd, sk); mLightDir = Mathery.RandomDirection(mRand); Vector4 lightColor2 = Vector4.One * 0.8f; Vector4 lightColor3 = Vector4.One * 0.6f; lightColor2.W = lightColor3.W = 1f; mMatLib.CreateMaterial("FacePoints"); mMatLib.SetMaterialEffect("FacePoints", "Static.fx"); mMatLib.SetMaterialTechnique("FacePoints", "TriVColorSolidSpec"); mMatLib.SetMaterialParameter("FacePoints", "mLightColor0", Vector4.One); mMatLib.SetMaterialParameter("FacePoints", "mLightColor1", lightColor2); mMatLib.SetMaterialParameter("FacePoints", "mLightColor2", lightColor3); mMatLib.SetMaterialParameter("FacePoints", "mSolidColour", Vector4.One); mMatLib.SetMaterialParameter("FacePoints", "mSpecPower", 1); mMatLib.SetMaterialParameter("FacePoints", "mSpecColor", Vector4.One); mMatLib.SetMaterialParameter("FacePoints", "mWorld", Matrix.Identity); mMatLib.CreateMaterial("LMPlane"); mMatLib.SetMaterialEffect("LMPlane", "Static.fx"); mMatLib.SetMaterialTechnique("LMPlane", "TriTex0"); mMatLib.SetMaterialParameter("LMPlane", "mLightColor0", Vector4.One); mMatLib.SetMaterialParameter("LMPlane", "mLightColor1", lightColor2); mMatLib.SetMaterialParameter("LMPlane", "mLightColor2", lightColor3); mPlaneProj = Matrix.OrthoOffCenterLH(0, gd.RendForm.Width, gd.RendForm.Height, 0, 0.1f, 5f); mPlaneWorld = Matrix.RotationY(MathF.PI); mPlaneWorld *= Matrix.Translation(Vector3.ForwardLH + Vector3.UnitX * 105f + Vector3.UnitY * 530f); mLMPlane = PrimFactory.CreatePlane(gd.GD, 200f); //axis boxes BoundingBox xBox = Misc.MakeBox(AxisSize, 1f, 1f); BoundingBox yBox = Misc.MakeBox(1f, AxisSize, 1f); BoundingBox zBox = Misc.MakeBox(1f, 1f, AxisSize); xBox.Minimum.X = 0; yBox.Minimum.Y = 0; mTexU = PrimFactory.CreateCube(gd.GD, xBox); mTexV = PrimFactory.CreateCube(gd.GD, yBox); Vector4 redColor = Vector4.One; Vector4 greenColor = Vector4.One; Vector4 blueColor = Vector4.One; redColor.Y = redColor.Z = greenColor.X = greenColor.Z = blueColor.X = blueColor.Y = 0f; //materials for axis mMatLib.CreateMaterial("RedAxis"); mMatLib.SetMaterialEffect("RedAxis", "Static.fx"); mMatLib.SetMaterialTechnique("RedAxis", "TriSolidSpec"); mMatLib.SetMaterialParameter("RedAxis", "mLightColor0", Vector4.One); mMatLib.SetMaterialParameter("RedAxis", "mLightColor1", lightColor2); mMatLib.SetMaterialParameter("RedAxis", "mLightColor2", lightColor3); mMatLib.SetMaterialParameter("RedAxis", "mSolidColour", redColor); mMatLib.SetMaterialParameter("RedAxis", "mSpecPower", 1); mMatLib.SetMaterialParameter("RedAxis", "mSpecColor", Vector4.One); mMatLib.CloneMaterial("RedAxis", "GreenAxis"); mMatLib.CloneMaterial("RedAxis", "BlueAxis"); mMatLib.SetMaterialParameter("GreenAxis", "mSolidColour", blueColor); mMatLib.SetMaterialParameter("BlueAxis", "mSolidColour", greenColor); }
internal void BuildRayDrawInfo(List <Vector3> rays, List <Vector3> hits, float polySize) { if (mVBRays != null) { mVBRays.Dispose(); } if (mIBRays != null) { mIBRays.Dispose(); } if (mHits != null) { mHits.Free(); } if (rays.Count < 2) { return; } VPosNormCol0 [] segVerts = new VPosNormCol0[rays.Count * 3]; VPosNormCol0 [] hitVerts = new VPosNormCol0[hits.Count * 8]; UInt32 index = 0; List <UInt32> indexes = new List <UInt32>(); for (int i = 0; i < rays.Count; i += 2) { Color col = Mathery.RandomColor(mRand); //endpoint segVerts[index].Position = rays[i + 1]; Vector3 lineVec = rays[i + 1] - rays[i]; //get a perpindicular axis to the a to b axis //so the back side of the connection can flare out a bit Vector3 crossVec = Vector3.Cross(lineVec, Vector3.UnitY); crossVec.Normalize(); Vector3 normVec = Vector3.Cross(crossVec, lineVec); normVec.Normalize(); //crossVec *=.2f; segVerts[index + 1].Position = rays[i] - crossVec; segVerts[index + 2].Position = rays[i] + crossVec; //scale up to visible segVerts[index].Position.X *= polySize; segVerts[index].Position.Z *= polySize; segVerts[index + 1].Position.X *= polySize; segVerts[index + 1].Position.Z *= polySize; segVerts[index + 2].Position.X *= polySize; segVerts[index + 2].Position.Z *= polySize; //upside down tri segVerts[index + 3].Position = segVerts[index + 2].Position; segVerts[index + 4].Position = segVerts[index + 1].Position; segVerts[index + 5].Position = segVerts[index].Position; segVerts[index].Color0 = col; segVerts[index + 1].Color0 = col; segVerts[index + 2].Color0 = col; segVerts[index + 3].Color0 = col; segVerts[index + 4].Color0 = col; segVerts[index + 5].Color0 = col; Half4 norm; norm.X = normVec.X; norm.Y = normVec.Y; norm.Z = normVec.Z; norm.W = 1f; segVerts[index].Normal = norm; segVerts[index + 1].Normal = norm; segVerts[index + 2].Normal = norm; norm.X = -normVec.X; norm.Y = -normVec.Y; norm.Z = -normVec.Z; segVerts[index + 3].Normal = norm; segVerts[index + 4].Normal = norm; segVerts[index + 5].Normal = norm; indexes.Add(index); indexes.Add(index + 1); indexes.Add(index + 2); indexes.Add(index + 3); indexes.Add(index + 4); indexes.Add(index + 5); index += 6; } mVBRays = VertexTypes.BuildABuffer(mGD.GD, segVerts, VertexTypes.GetIndex(segVerts[0].GetType())); mIBRays = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBRays = VertexTypes.BuildAVBB(VertexTypes.GetIndex(segVerts[0].GetType()), mVBRays); mRaysIndexCount = indexes.Count; indexes.Clear(); mHits = PrimFactory.CreateCubes(mGD.GD, hits, 5f); }