示例#1
0
        /// <summary>
        /// Update Collection
        /// </summary>
        /// <param name="time"></param>
        public void Update(double time)
        {
            float elapse = (float)(time - LastFrameTime);

            LastFrameTime = time;

            for (int i = 0; i < InstancePara.Length; i++)
            {
                Para.CollectionCenter  += Vector3.Multiply(Para.CollectionSpeed, elapse);
                InstancePara[i].center += Vector3.Multiply(InstancePara[i].speed3D, elapse);
                if (Vector3.Distance(Para.CollectionCenter, Para.BasePara.center) > Para.BasePara.space / 2)
                {
                    Para.CollectionSpeed = Vector3.Reflect(Para.CollectionSpeed, Vector3.Normalize(Para.BasePara.center - Para.CollectionCenter));
                }
                if (Vector3.Distance(InstancePara[i].center, Para.CollectionCenter) > PrimitiveInstance.BasePara.space / 2)
                {
                    var center = Random.RandomPosition(1);
                    var speed  = Random.RandomPosition(1);
                    center[0].X             = center[0].X * (PrimitiveInstance.BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                    center[0].Y             = center[0].Y * (PrimitiveInstance.BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                    center[0].Z             = 0;
                    speed[0].X              = speed[0].X * 0.5f;
                    speed[0].Y              = speed[0].Y * 0.5f;
                    speed[0].Z              = 0;
                    InstancePara[i].center  = center[0] + Para.CollectionCenter;
                    InstancePara[i].speed3D = speed[0] + Para.CollectionSpeed;
                }
                InstanceMatrix[i] = VisionStimulus.GetOri3DMatrix(InstancePara[i].orientation3D) * Matrix.CreateTranslation(InstancePara[i].center);
            }
        }
示例#2
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            Input.Update();
            frameinfo.Update();

            if (Input.IsKeyDown(Keys.Escape))
            {
                this.Exit();
            }
            if (Input.IsKeyDown(Keys.F2))
            {
                ToggleFullScreen();
            }

            if (Input.IsKeyDown(Keys.W))
            {
                model.Para.BasePara.center += Vector3.Forward * 0.02f;
                model.WorldMatrix           = Matrix.CreateTranslation(model.BasePara.center);
                audioemitter.Position       = model.BasePara.center;
            }
            if (Input.IsKeyDown(Keys.S))
            {
                model.Para.BasePara.center += Vector3.Backward * 0.02f;
                model.WorldMatrix           = Matrix.CreateTranslation(model.BasePara.center);
                audioemitter.Position       = model.BasePara.center;
            }
            if (Input.IsKeyDown(Keys.A))
            {
                model.Para.BasePara.center += Vector3.Left * 0.02f;
                model.WorldMatrix           = Matrix.CreateTranslation(model.BasePara.center);
                audioemitter.Position       = model.BasePara.center;
            }
            if (Input.IsKeyDown(Keys.D))
            {
                model.Para.BasePara.center += Vector3.Right * 0.02f;
                model.WorldMatrix           = Matrix.CreateTranslation(model.BasePara.center);
                audioemitter.Position       = model.BasePara.center;
            }

            model.Para.BasePara.orientation3D += model.BasePara.rotationspeed3D * (float)gameTime.ElapsedGameTime.TotalSeconds;
            model.Ori3DMatrix = VisionStimulus.GetOri3DMatrix(model.BasePara.orientation3D);

            if (audio.ActiveCue3Ds.Count > 0)
            {
                audio.ActiveCue3Ds[0].Emitter = audioemitter;
            }
            else
            {
                audio.Play("BgMusic", audioemitter);
            }
            audio.Update();

            base.Update(gameTime);
        }
示例#3
0
        /// <summary>
        /// Randomize Collection Using Indices
        /// </summary>
        /// <param name="indices"></param>
        public virtual void RandomCenterSpeed(List <int> indices)
        {
            var randomcenter = Random.RandomPosition(indices.Count);
            var randomspeed  = Random.RandomPosition(indices.Count);

            for (int i = 0; i < indices.Count; i++)
            {
                randomcenter[i].X = randomcenter[i].X * (Collection[indices[i]].BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                randomcenter[i].Y = randomcenter[i].Y * (Collection[indices[i]].BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                randomcenter[i].Z = randomcenter[i].Z * (Collection[indices[i]].BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);

                Collection[indices[i]].Center      = randomcenter[i] + Para.CollectionCenter;
                Collection[indices[i]].Speed3D     = randomspeed[i] + Para.CollectionSpeed;
                Collection[indices[i]].Ori3DMatrix = VisionStimulus.GetOri3DMatrix(Collection[indices[i]].BasePara.orientation3D);
                Collection[indices[i]].WorldMatrix = Matrix.CreateTranslation(Collection[indices[i]].Center);
            }
        }
示例#4
0
        /// <summary>
        /// Randomize Part of Collection Elements
        /// </summary>
        /// <param name="percentage">[0, 1]</param>
        public virtual void RandomCenterSpeed(float percentage)
        {
            int num          = (int)Math.Round(Collection.Count * percentage);
            var randomcenter = Random.RandomPosition(num);
            var randomspeed  = Random.RandomPosition(num);

            for (int i = 0; i < num; i++)
            {
                randomcenter[i].X = randomcenter[i].X * (Collection[i].BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                randomcenter[i].Y = randomcenter[i].Y * (Collection[i].BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                randomcenter[i].Z = randomcenter[i].Z * (Collection[i].BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);

                Collection[i].Center      = randomcenter[i] + Para.CollectionCenter;
                Collection[i].Speed3D     = randomspeed[i] + Para.CollectionSpeed;
                Collection[i].Ori3DMatrix = VisionStimulus.GetOri3DMatrix(Collection[i].BasePara.orientation3D);
                Collection[i].WorldMatrix = Matrix.CreateTranslation(Collection[i].Center);
            }
        }
示例#5
0
        /// <summary>
        /// Update each element of collection
        /// </summary>
        /// <param name="time"></param>
        public virtual void Update(double time)
        {
            float elapse = (float)(time - LastFrameTime);

            LastFrameTime = time;
            ResetList.Clear();
            UpdateList.Clear();

            for (int i = 0; i < Collection.Count; i++)
            {
                Para.CollectionCenter += Vector3.Multiply(Para.CollectionSpeed, elapse);
                Collection[i].Center  += Vector3.Multiply(Collection[i].Speed3D, elapse);

                if (Vector3.Distance(Para.CollectionCenter, Para.BasePara.center) > Para.BasePara.space / 2)
                {
                    Para.CollectionSpeed = Vector3.Reflect(Para.CollectionSpeed, Vector3.Normalize(Para.BasePara.center - Para.CollectionCenter));
                }

                if (Vector3.Distance(Collection[i].Center, Para.CollectionCenter) > Collection[i].BasePara.space / 2)
                {
                    ResetList.Add(i);
                }
                else
                {
                    UpdateList.Add(i);
                }
            }

            RandomCenterSpeed(ResetList);

            for (int i = 0; i < UpdateList.Count; i++)
            {
                Collection[UpdateList[i]].Ori3DMatrix = VisionStimulus.GetOri3DMatrix(Collection[UpdateList[i]].BasePara.orientation3D + Collection[UpdateList[i]].BasePara.rotationspeed3D * (float)time);
                Collection[UpdateList[i]].WorldMatrix = Matrix.CreateTranslation(Collection[UpdateList[i]].Center);
            }
        }
示例#6
0
        /// <summary>
        /// Init Primitive Collection
        /// </summary>
        /// <param name="count"></param>
        /// <param name="gd"></param>
        /// <param name="primitive"></param>
        /// <param name="service"></param>
        /// <param name="path"></param>
        public void Init(int count, GraphicsDevice gd, Primitive primitive, IServiceProvider service, string path)
        {
            // Check Shader Model 3.0 Support
            GraphicsDeviceCapabilities gdcap = gd.GraphicsDeviceCapabilities;

            if (gdcap.MaxPixelShaderProfile < ShaderProfile.PS_3_0 || gdcap.MaxVertexShaderProfile < ShaderProfile.VS_3_0)
            {
                isshadermodel3 = false;
                MessageBox.Show("This GraphicsDevice Does Not Support Shader Model 3.0.", "Warning !");
            }
            else
            {
                isshadermodel3 = true;
            }

            if (count <= 0)
            {
                MessageBox.Show("Collection Number <= 0, Automatically Set To One !");
                count = 1;
            }
            if (PrimitiveInstance == null)
            {
                PrimitiveInstance = primitive.Clone() as Primitive;
            }
            InstancePara   = new vsBasePara[count];
            InstanceMatrix = new Matrix[count];
            for (int i = 0; i < count; i++)
            {
                InstancePara[i] = PrimitiveInstance.BasePara;
            }

            // Randomize Center and Speed of Primitive Instances
            var center = Random.RandomPosition(InstancePara.Length);
            var speed  = Random.RandomPosition(InstancePara.Length);

            for (int i = 0; i < InstancePara.Length; i++)
            {
                center[i].X             = center[i].X * (PrimitiveInstance.BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                center[i].Y             = center[i].Y * (PrimitiveInstance.BasePara.space / 2) * (float)Math.Sin(Math.PI / 4);
                center[i].Z             = 0;
                speed[i].X              = speed[i].X * 0.5f;
                speed[i].Y              = speed[i].Y * 0.5f;
                speed[i].Z              = 0;
                InstancePara[i].center  = center[i] + Para.CollectionCenter;
                InstancePara[i].speed3D = speed[i] + Para.CollectionSpeed;
                InstanceMatrix[i]       = VisionStimulus.GetOri3DMatrix(InstancePara[i].orientation3D) * Matrix.CreateTranslation(InstancePara[i].center);
            }

            // Load Hardware Instancing Shader
            PrimitiveInstance.contentManager = new ContentManager(service, path);
            try
            {
                hiEffect = PrimitiveInstance.contentManager.Load <Effect>("HardwareInstancing");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Error !");
            }
            hiEffect.Parameters["View"].SetValue(PrimitiveInstance.ViewMatrix);
            hiEffect.Parameters["Projection"].SetValue(PrimitiveInstance.ProjectionMatrix);

            PrimitiveInstance.vertexDeclaration = InstancingVDec(gd);

            ptype  = PrimitiveInstance.BasePara.primitivetype;
            vexn   = PrimitiveInstance.VertexArray.Length;
            pcount = VisionStimulus.CheckPrimitiveCount(ptype, PrimitiveInstance.IndexArray.Length, PrimitiveInstance.IndexArray.Length);

            InstanceDataStream = new DynamicVertexBuffer(gd, SLConstant.SizeOfMatrix * InstanceMatrix.Length, BufferUsage.WriteOnly);
        }