/// <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); } }
/// <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); }
/// <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); } }
/// <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); } }
/// <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); } }
/// <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); }