Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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();
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        //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);
        }
Example #8
0
        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;
        }
Example #9
0
        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;
        }
Example #10
0
        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);
        }
Example #11
0
        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);
        }
Example #12
0
        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);
        }