Exemplo n.º 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);
            }
        }
Exemplo n.º 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);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Init Each Element of Collection According to Custom Vision Stimulus Instance
        /// </summary>
        /// <param name="count"></param>
        /// <param name="gd"></param>
        /// <param name="visionstimulus"></param>
        public virtual void Init(int count, GraphicsDevice gd, VisionStimulus visionstimulus)
        {
            if (count <= 0)
            {
                MessageBox.Show("Collection Number <= 0, Automatically Set To One !");
                count = 1;
            }

            for (int i = 0; i < count; i++)
            {
                Collection.Add(visionstimulus.Clone() as vsType);
            }

            RandomCenterSpeed(1.0f);
        }
Exemplo n.º 4
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);
            }
        }
Exemplo n.º 5
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);
            }
        }
Exemplo n.º 6
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);
            }
        }
Exemplo n.º 7
0
 /// <summary>
 /// Init Each Element of Collection According to Custom Vision Stimulus Instance
 /// </summary>
 /// <param name="count"></param>
 /// <param name="gd"></param>
 /// <param name="visionstimulus"></param>
 public VSCollection(int count, GraphicsDevice gd, VisionStimulus visionstimulus)
     : this()
 {
     Init(count, gd, visionstimulus);
 }
Exemplo n.º 8
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);
        }
Exemplo n.º 9
0
        /// <summary>
        /// Optimized Batch Draw
        /// </summary>
        /// <param name="gd"></param>
        public virtual void BatchDraw(GraphicsDevice gd)
        {
            switch (Collection[0].VSType)
            {
            case VSType.Bar:
            case VSType.Primitive:
                PrimitiveType ptype  = Collection[0].BasePara.primitivetype;
                int           vexn   = Collection[0].VertexArray.Length;
                int           pcount = VisionStimulus.CheckPrimitiveCount(ptype, Collection[0].IndexArray.Length, Collection[0].IndexArray.Length);

                gd.VertexDeclaration = Collection[0].vertexDeclaration;
                gd.Vertices[0].SetSource(Collection[0].vertexBuffer, 0, VertexPositionColor.SizeInBytes);
                gd.Indices = Collection[0].indexBuffer;
                gd.RenderState.CullMode = CullMode.None;

                // Begin Draw
                Collection[0].basicEffect.Begin();
                Collection[0].basicEffect.CurrentTechnique.Passes[0].Begin();
                for (int i = 0; i < Collection.Count; i++)
                {
                    if (Collection[i].Visible)
                    {
                        Collection[0].basicEffect.World = Collection[i].Ori3DMatrix * Collection[i].WorldMatrix;
                        Collection[0].basicEffect.CommitChanges();
                        gd.DrawIndexedPrimitives(ptype, 0, 0, vexn, 0, pcount);
                    }
                }
                Collection[0].basicEffect.CurrentTechnique.Passes[0].End();
                Collection[0].basicEffect.End();
                break;

            case VSType.Grating:
                ptype  = Collection[0].BasePara.primitivetype;
                vexn   = Collection[0].VertexArray.Length;
                pcount = VisionStimulus.CheckPrimitiveCount(ptype, Collection[0].IndexArray.Length, Collection[0].IndexArray.Length);

                gd.VertexDeclaration = Collection[0].vertexDeclaration;
                gd.Vertices[0].SetSource(Collection[0].vertexBuffer, 0, VertexPositionColor.SizeInBytes);
                gd.Indices = Collection[0].indexBuffer;
                gd.RenderState.CullMode = CullMode.None;

                Grating grating = Collection[0] as Grating;
                // Begin Draw
                grating.gratingeffect.Begin();
                grating.gratingeffect.CurrentTechnique.Passes[0].Begin();
                for (int i = 0; i < Collection.Count; i++)
                {
                    if (Collection[i].Visible)
                    {
                        grating.eWorld.SetValue(Collection[i].Ori3DMatrix * Collection[i].WorldMatrix);
                        grating.gratingeffect.CommitChanges();
                        gd.DrawIndexedPrimitives(ptype, 0, 0, vexn, 0, pcount);
                    }
                }
                grating.gratingeffect.CurrentTechnique.Passes[0].End();
                grating.gratingeffect.End();
                break;

            case VSType.Image:
                Vector3 Center;
                float   unitFactor = Collection[0].unitFactor;
                Image   image      = Collection[0] as Image;
                // Begin Draw
                image.spriteBatch.Begin();
                for (int i = 0; i < Collection.Count; i++)
                {
                    if (Collection[i].Visible)
                    {
                        Center = Collection[i].Center;
                        image.spriteBatch.Draw(image.texture, new Vector2(Center.X * unitFactor + gd.Viewport.Width / 2 - image.texture.Width / 2, gd.Viewport.Height / 2 - Center.Y * unitFactor - image.texture.Height / 2), Collection[i].BasePara.color);
                    }
                }
                image.spriteBatch.End();
                break;

            case VSType.SLModel:
                SLModel model = Collection[0] as SLModel;
                foreach (ModelMesh mesh in model.Model.Meshes)
                {
                    for (int i = 0; i < Collection.Count; i++)
                    {
                        if (Collection[i].Visible)
                        {
                            foreach (BasicEffect effect in mesh.Effects)
                            {
                                effect.EnableDefaultLighting();
                                effect.GraphicsDevice.RenderState.DepthBufferEnable = true;

                                effect.World      = Collection[i].Ori3DMatrix * model.BoneTransforms[mesh.ParentBone.Index] * Collection[i].WorldMatrix;
                                effect.View       = model.ViewMatrix;
                                effect.Projection = model.ProjectionMatrix;
                            }
                            mesh.Draw();
                        }
                    }
                }
                break;

            case VSType.SLQuad:
                SLQuad quad = Collection[0] as SLQuad;
                ptype  = Collection[0].BasePara.primitivetype;
                vexn   = quad.Para.vertices.Length;
                pcount = VisionStimulus.CheckPrimitiveCount(ptype, Collection[0].IndexArray.Length, Collection[0].IndexArray.Length);

                gd.VertexDeclaration = quad.vertexDeclaration;
                gd.Vertices[0].SetSource(quad.vertexBuffer, 0, VertexPositionNormalTexture.SizeInBytes);
                gd.Indices = quad.indexBuffer;
                gd.RenderState.CullMode         = CullMode.None;
                gd.RenderState.AlphaBlendEnable = true;
                gd.RenderState.AlphaTestEnable  = true;
                gd.RenderState.AlphaFunction    = CompareFunction.Greater;

                // Begin Draw
                quad.basicEffect.Begin();
                quad.basicEffect.CurrentTechnique.Passes[0].Begin();
                for (int i = 0; i < Collection.Count; i++)
                {
                    if (Collection[i].Visible)
                    {
                        quad.basicEffect.World = Collection[i].Ori3DMatrix * Collection[i].WorldMatrix;
                        quad.basicEffect.CommitChanges();
                        gd.DrawIndexedPrimitives(ptype, 0, 0, vexn, 0, pcount);
                    }
                }
                quad.basicEffect.CurrentTechnique.Passes[0].End();
                quad.basicEffect.End();
                break;

            case VSType.SLVideo:
                SLVideo video = Collection[0] as SLVideo;
                unitFactor = Collection[0].unitFactor;
                // Begin Draw
                video.spriteBatch.Begin();
                for (int i = 0; i < Collection.Count; i++)
                {
                    if (Collection[i].Visible)
                    {
                        Center = Collection[i].Center;
                        if (video.MediaState == MediaState.Stopped)
                        {
                            video.Play();
                        }
                        if (video.MediaState != MediaState.Stopped)
                        {
                            video.texture = video.Player.GetTexture();
                        }
                        if (video.texture != null)
                        {
                            video.spriteBatch.Draw(video.texture, new Vector2(Center.X * unitFactor + gd.Viewport.Width / 2 - video.texture.Width / 2, gd.Viewport.Height / 2 - Center.Y * unitFactor - video.texture.Height / 2), Collection[i].BasePara.color);
                        }
                    }
                }
                video.spriteBatch.End();
                break;

            case VSType.Text:
                Text    text = Collection[0] as Text;
                Vector2 size = text.spriteFont.MeasureString(SLConstant.Help);
                unitFactor = Collection[0].unitFactor;
                // Begin Draw
                text.spriteBatch.Begin();
                for (int i = 0; i < Collection.Count; i++)
                {
                    if (Collection[i].Visible)
                    {
                        Center = Collection[i].Center;
                        text.spriteBatch.DrawString(text.spriteFont, SLConstant.Help, new Vector2(Center.X * unitFactor + gd.Viewport.Width / 2 - size.X / 2, gd.Viewport.Height / 2 - Center.Y * unitFactor - size.Y / 2), Collection[i].BasePara.color);
                    }
                }
                text.spriteBatch.End();
                break;
            }
        }