/// <summary> /// Initialization /// </summary> /// <param name="device"></param> /// <param name="physicsEngine"></param> public override void Initialize(xnagrfx.GraphicsDevice device, PhysicsEngine physicsEngine) { try { InitError = string.Empty; // set flag so rendering engine renders us last Flags |= VisualEntityProperties.UsesAlphaBlending; // creates effect, loads meshes, etc base.Initialize(device, physicsEngine); HeightFieldShapeProperties hf = new HeightFieldShapeProperties("height field", 2, 0.02f, 2, 0.02f, 0, 0, 1, 1); hf.HeightSamples = new HeightFieldSample[hf.RowCount * hf.ColumnCount]; for (int i = 0; i < hf.HeightSamples.Length; i++) { hf.HeightSamples[i] = new HeightFieldSample(); } _particlePlane = new Shape(hf); _particlePlane.State.Name = "sonar impact plane"; VisualEntityMesh sonarMesh = null; // we render on our own only the laser impact points. The laser Box is rendered as part of the parent. int index = Meshes.Count; Meshes.Add(SimulationEngine.ResourceCache.CreateMesh(device, _particlePlane.State)); Meshes[0].Textures[0] = SimulationEngine.ResourceCache.CreateTextureFromFile(device, "particle.bmp"); // we have a custom effect, with an additional global parameter. Get handle to it here if (Effect != null) { _timeAttenuationHandle = Effect.GetParameter("timeAttenuation"); } World = xna.Matrix.Identity; if (Meshes.Count > 1) { sonarMesh = Meshes[0]; } if (Parent == null) { throw new Exception("This entity must be a child of another entity."); } Parent.AddShapeToPhysicsEntity(_sonarBox, sonarMesh); } catch (Exception ex) { HasBeenInitialized = false; InitError = ex.ToString(); } }
void AddGround() { HeightFieldShapeProperties hf = new HeightFieldShapeProperties("height field", 64, // number of rows 100, // distance in meters, between rows 64, // number of columns 100, // distance in meters, between columns 1, // scale factor to multiple height values -1000); // vertical extent of the height field. Should be set to large negative values // create array with height samples hf.HeightSamples = new HeightFieldSample[hf.RowCount * hf.ColumnCount]; for (int i = 0; i < hf.RowCount * hf.ColumnCount; i++) { hf.HeightSamples[i] = new HeightFieldSample(); hf.HeightSamples[i].Height = (short)(Math.Sin(i * 0.01)); } // create a material for the entire field. We could also specify material per sample. hf.Material = new MaterialProperties("ground", 0.8f, 0.5f, 0.8f); // insert ground entity in simulation and specify a texture SimulationEngine.GlobalInstancePort.Insert(new HeightFieldEntity(hf, "03RamieSc.dds")); }
/// <summary> /// Initialization /// </summary> /// <param name="device"></param> /// <param name="physicsEngine"></param> public override void Initialize(xnagrfx.GraphicsDevice device, PhysicsEngine physicsEngine) { try { InitError = string.Empty; // set flag so rendering engine renders us last Flags |= VisualEntityProperties.UsesAlphaBlending; // creates effect, loads meshes, etc base.Initialize(device, physicsEngine); HeightFieldShapeProperties hf = new HeightFieldShapeProperties("height field", 2, 0.02f, 2, 0.02f, 0, 0, 1, 1); hf.HeightSamples = new HeightFieldSample[hf.RowCount * hf.ColumnCount]; for (int i = 0; i < hf.HeightSamples.Length; i++) hf.HeightSamples[i] = new HeightFieldSample(); _particlePlane = new Shape(hf); _particlePlane.State.Name = "sonar impact plane"; VisualEntityMesh sonarMesh = null; // we render on our own only the laser impact points. The laser Box is rendered as part of the parent. int index = Meshes.Count; Meshes.Add(SimulationEngine.ResourceCache.CreateMesh(device, _particlePlane.State)); Meshes[0].Textures[0] = SimulationEngine.ResourceCache.CreateTextureFromFile(device, "particle.bmp"); // we have a custom effect, with an additional global parameter. Get handle to it here if (Effect != null) _timeAttenuationHandle = Effect.GetParameter("timeAttenuation"); World = xna.Matrix.Identity; if (Meshes.Count > 1) sonarMesh = Meshes[0]; if (Parent == null) throw new Exception("This entity must be a child of another entity."); Parent.AddShapeToPhysicsEntity(_sonarBox, sonarMesh); } catch (Exception ex) { HasBeenInitialized = false; InitError = ex.ToString(); } }
public void AddGround(float WidthLength) { HeightFieldShapeProperties hf = new HeightFieldShapeProperties("height field", 100, // number of rows WidthLength, // distance in meters, between rows 100, // number of columns WidthLength, // distance in meters, between columns 1, // scale factor to multiple height values -1000); // vertical extent of the height field. Should be set to large negative values // create a material for the entire field. We could also specify material per sample. hf.Material = new MaterialProperties("ground", 0.2f, 0.5f, 0.5f); hf.Dimensions = new Vector3(5f, 5f, 5f); // insert ground entity in simulation and specify a texture HeightFieldEntity ground = new HeightFieldEntity(hf, "03RamieSc.dds"); this.Ground = ground; SimulationEngine.GlobalInstancePort.Insert(ground); }