public void AssertThat_FacadeSelector_DoesNotOutputFacadeAcrossFootprintBreak() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Facades: - Tags: { 1: { a: b } } Bottom: !Id { Id: F } Top: !Id { Id: F, Search: Up, Filter: Longest, NonOverlapping: true } Floors: - !Floor { Id: F, Tags: { 1: { a: b } }, Height: 1 } - !Floor { Id: F, Tags: { 1: { a: b } }, Height: 1 } - !Footprint [] - !Floor { Id: F, Tags: { 1: { a: c } }, Height: 1 } - !Floor { Id: F, Tags: { 1: { a: d } }, Height: 1 } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(2); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder).Externals(r.NextDouble, d, Finder, _noNeighbours); var facades = selection.Walls.SelectMany(a => a.Facades); //2 facades for all 4 walls Assert.AreEqual(2 * 4, facades.Count()); //1 facade at this height for all 4 walls Assert.AreEqual(1 * 4, facades.Count(f => f.Bottom == 0 && f.Top == 1)); Assert.AreEqual(1 * 4, facades.Count(f => f.Bottom == 2 && f.Top == 3)); }
public IEnumerable<EffectPass> Begin(NamedBoxCollection parameterValues) { for (int i = 0; i < _parameters.Length; i++) _parameters[i].Apply(parameterValues); return _effect.CurrentTechnique.Passes; }
public void AssertThat_FacadeSelector_OutputsFacade() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Facades: - Tags: { 1: { a: b } } Bottom: !Num { N: 0 } Top: !Id { Id: Top, Search: Up, Filter: Longest, NonOverlapping: true } Floors: - !Floor { Id: Top, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: Bot, Tags: { 1: { a: b } } } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(2); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder).Externals(r.NextDouble, d, Finder, _noNeighbours); //One facade for each wall (4 walls) Assert.AreEqual(4, selection.Walls.SelectMany(a => a.Facades).Count()); //Every wall has just one facade up it's entire height Assert.IsTrue(selection.Walls.All(a => a.Facades.Count() == 1)); Assert.IsTrue(selection.Walls.SelectMany(a => a.Facades).All(a => a.Bottom == 0 && a.Top == 4)); }
public void AssertThat_FacadeSelector_Throws_WhenNotAllFloorsAreCovered() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Facades: - Tags: { 1: { a: b } } Bottom: !Num { N: 0 } Top: !Id { Id: F, Search: Up, Filter: Shortest, NonOverlapping: true } #Matching to the *first* F does not cover all floors! Floors: - !Floor { Id: Top, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: Bot, Tags: { 1: { a: b } } } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(2); var d = new NamedBoxCollection(); b.Internals(r.NextDouble, d, Finder).Externals(r.NextDouble, d, Finder, _noNeighbours); }
public void AssertThat_SingleFloorBuilding_OutputsSingleFloor() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Floors: - !Floor Height: !UniformValue Min: 1 Max: 2 Tags: 1: { a: b } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder); Assert.AreEqual(1, selection.AboveGroundFloors.Count()); Assert.AreEqual(0, selection.BelowGroundFloors.Count()); var h = selection.AboveGroundFloors.Single().Height; Assert.IsTrue(h >= 1 && h <= 2); }
public void AssertThat_MultiFloorSelector_OutputsMultipleFloors() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Floors: - !Range Includes: - Count: !UniformValue Min: 1 Max: 5 Vary: true Tags: 1: { a: a } 1: { a: b } 0: null - !Ground [] ")); Assert.IsNotNull(b); var r = new Random(); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder); Assert.IsTrue(selection.AboveGroundFloors.Any() && selection.AboveGroundFloors.Count() <= 5); Assert.AreEqual(0, selection.BelowGroundFloors.Count()); }
public void AssertThat_FloorSelector_SelectsGroundMarkerAsFootprint() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Facades: - Tags: { 1: { a: b } } Bottom: !Num { N: 0 } Top: !Id { Id: Top, Search: Up, Filter: Longest, NonOverlapping: true } Floors: - !Floor { Id: Top, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: Bot, Tags: { 1: { a: b } } } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(2); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder).Externals(r.NextDouble, d, Finder, _noNeighbours); //4 sides, 4 walls Assert.AreEqual(4, selection.Walls.Count()); Assert.IsTrue(selection.Walls.All(a => a.BottomIndex == 0)); //Does one of the walls contain one of the seed points Assert.AreEqual(1, selection.Walls.Count(a => a.Start == new Vector2(-10, -10))); }
public void AssertThat_FloorSelector_SelectsNextMarkerDownAsFootprint() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Floors: - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Footprint [] - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(2); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder); Assert.AreEqual(2, selection.Footprints.Count()); Assert.IsTrue(selection.Footprints.Any(a => a.Index == 0)); Assert.IsTrue(selection.Footprints.Any(a => a.Index == 2)); Assert.IsTrue(selection.Footprints.Any(a => a.Marker is GroundMarker)); Assert.IsTrue(selection.Footprints.Any(a => a.Marker is FootprintMarker)); }
public void AssertThat_SingleFloorBuilding_WithNullFloor_OutputsNoFloors() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Floors: - !Floor Tags: 1: null - !Ground [] ")); Assert.IsNotNull(b); var r = new Random(); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder); Assert.AreEqual(0, selection.AboveGroundFloors.Count()); Assert.AreEqual(0, selection.BelowGroundFloors.Count()); var lot = new Vector2[] { new Vector2(-30, -30), new Vector2(-30, 30f), new Vector2(30, 30f), new Vector2(30, -30f) }; selection.Externals(r.NextDouble, d, Finder, new BuildingSideInfo[] { new BuildingSideInfo(lot[0], lot[1], new BuildingSideInfo.NeighbourInfo[0]), new BuildingSideInfo(lot[1], lot[2], new BuildingSideInfo.NeighbourInfo[0]), new BuildingSideInfo(lot[2], lot[3], new BuildingSideInfo.NeighbourInfo[0]), new BuildingSideInfo(lot[3], lot[0], new BuildingSideInfo.NeighbourInfo[0]), }); }
public void ConvertFromHyperstreamlineToHalfEdgeMesh() { var r = new Random(); Func <double> random = r.NextDouble; var m = new NamedBoxCollection(); //Deserialize config var config = NetworkDescriptor.Deserialize(new StringReader(SCRIPT)); //Build main roads var builder = new NetworkBuilder(); builder.Build(config.Major(random, m), random, m, new Vector2(0, 0), new Vector2(100, 100)); builder.Reduce(); //extract regions var regions = builder.Regions(); //Build minor roads foreach (var region in regions) { builder.Build(config.Minor(random, m), random, m, region); } builder.Reduce(); //Build graph Mesh <IVertexBuilder, IHalfEdgeBuilder, IFaceBuilder> mesh = new Mesh <IVertexBuilder, IHalfEdgeBuilder, IFaceBuilder>(); //Extract vertices var result = builder.Result; Dictionary <Vector2, Vertex> vertices = result.Vertices.ToDictionary(v => v.Position, v => v); //Useful data var road = 3; //HierarchicalParameters.RoadLaneWidth(Random); var path = 1; //HierarchicalParameters.RoadSidewalkWidth(Random); //Create blocks var blocks = builder.Regions(); foreach (var block in blocks) { var face = mesh.GetOrConstructFace(block.Vertices.Select(mesh.GetOrConstructVertex).ToArray()); //Tags edges of face with road width foreach (var primaryEdge in face.Edges.Select(e => e.IsPrimaryEdge ? e : e.Pair)) { if (primaryEdge.Tag != null) { continue; } var start = vertices[primaryEdge.Pair.EndVertex.Position]; var end = vertices[primaryEdge.EndVertex.Position]; var edge = start.Edges.FirstOrDefault(a => Equals(a.B, end)); primaryEdge.Tag = new HalfEdgeRoadBuilder(primaryEdge, road, path, edge == null ? 1u : edge.Streamline.Width); } } }
protected override void BeginTransitionOn() { _material = _content.Load<Material>("Red"); _quad = new Quad(_device); _metadata = new NamedBoxCollection(); base.OnShown(); }
public IEnumerable<EffectPass> Begin(NamedBoxCollection parameterValues) { if (_isDisposed) throw new InvalidOperationException("Cannot Begin a disposed Material"); for (int i = 0; i < _parameters.Length; i++) _parameters[i].Apply(parameterValues); return _effect.CurrentTechnique.Passes; }
protected override void BeginTransitionOn() { _material = new Material(_content.Load<Effect>("Basic"), null); _quad = new Quad(_device); _metadata = new NamedBoxCollection(); _metadata.Set(new TypedName<Vector4>("colour"), Color.White.ToVector4().FromXNA()); base.OnShown(); }
public void NetworkBuilder_GeneratesMinorRoads() { var c = NetworkDescriptor.Deserialize(new StringReader(@" !Network Aliases: - &base-field !AddTensors Tensors: - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0 }, Decay: 2.5, Center: { X: 0, Y: 0 } } - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45 }, Decay: 2.5, Center: { X: 1, Y: 0 } } - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45 }, Decay: 2.5, Center: { X: 0, Y: 1 } } - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0 }, Decay: 2.5, Center: { X: 1, Y: 1 } } Major: MergeSearchAngle: 22.5 MergeDistance: 25 SegmentLength: 10 RoadWidth: !NormalValue { Min: 2, Max: 4, Vary: true } PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 50 } TensorField: *base-field Minor: MergeSearchAngle: 12.5 MergeDistance: 2.5 SegmentLength: 2 RoadWidth: !NormalValue { Min: 1, Max: 2, Vary: true } PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 25 } TensorField: !WeightedAverage Tensors: 0.1: *base-field 0.9: !Grid { Angle: !UniformValue { Min: 1, Max: 360, Vary: true } } ")); Random r = new Random(12); NetworkBuilder b = new NetworkBuilder(); var m = new NamedBoxCollection(); b.Build(c.Major(r.NextDouble, m), r.NextDouble, m, new Vector2(0, 0), new Vector2(100, 100)); b.Reduce(); var regions = b.Regions(); foreach (var region in regions) { b.Build(c.Minor(r.NextDouble, m), r.NextDouble, m, region); } Console.WriteLine(b.Result.ToSvg()); Assert.IsFalse(b.Result.Vertices.GroupBy(a => a.Position).Any(a => a.Count() > 1)); }
public void Demo() { var c = NetworkDescriptor.Deserialize(new StringReader(@" !Network Aliases: - &base-field !AddTensors Tensors: - !PointDistanceDecayTensors { Tensors: !Radial { Center: { X: 1, Y: 1 } }, Decay: 1.6, Center: { X: 0.45, Y: 0.45 } } - !Polyline Decay: 5 Points: [ { X: 0.3, Y: 0 }, { X: 0.1, Y: 0.33 }, { X: 0.5, Y: 0.66 }, { X: 0.2, Y: 1 } ] Major: MergeSearchAngle: 22.5 MergeDistance: 25 SegmentLength: 10 RoadWidth: !NormalValue { Min: 2, Max: 3, Vary: false } PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 50 } TensorField: *base-field Minor: MergeSearchAngle: 12.5 MergeDistance: 2.5 SegmentLength: 2 RoadWidth: 1 PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 15 } TensorField: !WeightedAverage Tensors: 0.9: *base-field 0.1: !Grid { Angle: !UniformValue { Min: 1, Max: 360, Vary: true } } ")); NetworkBuilder b = new NetworkBuilder(); Random r = new Random(24); var m = new NamedBoxCollection(); b.Build(c.Major(r.NextDouble, m), r.NextDouble, m, new Vector2(0, 0), new Vector2(350, 350)); b.Reduce(); var regions = b.Regions(); foreach (var region in regions) { b.Build(c.Minor(r.NextDouble, m), r.NextDouble, m, region); } Console.WriteLine(b.Result.ToSvg(regions)); }
public void CollectionInitializer() { NamedBoxCollection store = new NamedBoxCollection { { new TypedName<int>("a"), 1 }, { new TypedName<float>("b"), 2f }, { new TypedName<string>("c"), "3" }, }; Assert2.AreEqual(1, store.GetValue(new TypedName<int>("a"))); Assert2.AreEqual(2, store.GetValue(new TypedName<float>("b"))); Assert2.AreEqual("3", store.GetValue(new TypedName<string>("c"))); }
public void AssertThat_FacadeSelector_OutputsFacades_OnlyForNonObscuredFloors() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Facades: - Tags: { 1: { a: a } } Bottom: !Id { Id: F } Top: !Id { Id: F, Search: Up, Filter: Longest, NonOverlapping: true } Constraints: [ !Clearance { Distance: 20 } ] - Tags: { 1: { a: b } } Bottom: !Id { Id: '*' } Top: !Id { Id: '*', Inclusive: true, Filter: First } Floors: - !Floor { Id: F, Tags: { 1: { a: c } }, Height: 1 } - !Floor { Id: F, Tags: { 1: { a: d } }, Height: 1 } - !Floor { Id: F, Tags: { 1: { a: e } }, Height: 1 } - !Floor { Id: F, Tags: { 1: { a: f } }, Height: 1 } - !Ground [] ")); Assert.IsNotNull(b); //Entire length obscured to 1m var n1 = new BuildingSideInfo.NeighbourInfo[] { new BuildingSideInfo.NeighbourInfo(0, 1, 1, new BuildingSideInfo.NeighbourInfo.Resource[0]) }; //Entire length of the first side is obscured up to height 1m (floor 1) var neighbours = new[] { new BuildingSideInfo(new Vector2(-10, -10), new Vector2(10, -10), n1), new BuildingSideInfo(new Vector2(10, -10), new Vector2(10, 10), n1), new BuildingSideInfo(new Vector2(10, 10), new Vector2(-10, 10), n1), new BuildingSideInfo(new Vector2(-10, 10), new Vector2(-10, -10), n1), }; Random r = new Random(2); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder).Externals(r.NextDouble, d, Finder, neighbours); var wall = selection.Walls.First(); //Without an obstacle we would get 1 facade, floor 0->3 (FFFF) //However, the ground floor is obscured, so we get 2 facades: // F (blank) 0 // FFF (a) 1->3 Assert.AreEqual(2, wall.Facades.Count()); Assert.AreEqual(1, wall.Facades.Count(f => f.Bottom == 1 && f.Top == 3)); Assert.AreEqual(1, wall.Facades.Count(f => f.Bottom == 0 && f.Top == 0)); }
public void AssertThat_MetaSet_SetsValue() { var input = new Vector2[] { new Vector2(10, 10), new Vector2(10, -10), new Vector2(-10, -10), new Vector2(-10, 10) }; var meta = new NamedBoxCollection(); var set = new MetaSet <bool>("test value", true); Test(set, input, meta); Assert.IsTrue(meta.GetValue(new TypedName <bool>("test value"), false)); }
internal void Query(string phase, NamedBoxCollection metadata, ICollection<IGeometry> result) { //Early exit if (phase != "translucent") return; //Get the view matrix from the renderer var view = metadata.GetOrCreate(Names.Matrix.View).Value; //Add all particle systems to the output buffer foreach (var particleSystem in _particleSystems.Values) { //Calculate the world view of this system for depth sorting particleSystem.CalculateWorldView(ref view); result.Add(particleSystem); } }
public void NetworkBuilder_GeneratesRegions() { var c = NetworkDescriptor.Deserialize(new StringReader(@" !Network Major: MergeSearchAngle: 22.5 MergeDistance: 25 SegmentLength: 10 RoadWidth: !NormalValue { Min: 1, Max: 10, Vary: true } PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 50 } TensorField: !AddTensors Tensors: - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0, Length: 1 }, Decay: 2.5, Center: { X: 0, Y: 0 } } - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45, Length: 1 }, Decay: 2.5, Center: { X: 1, Y: 0 } } - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 45, Length: 1 }, Decay: 2.5, Center: { X: 0, Y: 1 } } - !PointDistanceDecayTensors { Tensors: !Grid { Angle: 0, Length: 1 }, Decay: 2.5, Center: { X: 1, Y: 1 } } Minor: MergeSearchAngle: 12.5 MergeDistance: 2.5 SegmentLength: 2 RoadWidth: 1 PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 15 } TensorField: !Grid { Angle: 0, Length: 1 } ")); NetworkBuilder b = new NetworkBuilder(); Random r = new Random(10); var m = new NamedBoxCollection(); b.Build(c.Major(r.NextDouble, m), r.NextDouble, m, new Vector2(0, 0), new Vector2(500, 500)); b.Reduce(); var regions = b.Regions(); Console.WriteLine(b.Result.ToSvg(regions)); }
public void AssertThat_RangeWithContinuousInclude_IsNotInterrupted() { var range = new FloorRangeSpec(new[] { new FloorRangeIncludeSpec("id", new NormallyDistributedValue(20, 20, 20, 10), false, true, new[] { new KeyValuePair <float, KeyValuePair <string, string>[]>(1, new [] { new KeyValuePair <string, string>("key", "continuous") }) }, new ConstantValue(1)), new FloorRangeIncludeSpec("id", new NormallyDistributedValue(20, 30, 40, 10), false, false, new[] { new KeyValuePair <float, KeyValuePair <string, string>[]>(1, new [] { new KeyValuePair <string, string>("key", "interrupt") }) }, new ConstantValue(1)) }); var r = new Random(); var d = new NamedBoxCollection(); var selected = range.Select(r.NextDouble, d, (a, b) => ScriptReferenceFactory.Create(typeof(TestScript), Guid.NewGuid(), string.Join(",", a))).ToArray(); //Flatten runs into floors var floors = selected.SelectMany(a => a.Selection); //Find the first continuous floor, then check that the next 20 floors are all "continuous" Assert.IsTrue(floors.SkipWhile(a => a.Script.Name != "continuous").Take(20).All(a => a.Script.Name == "continuous")); }
public void AssertThat_MetaSet_UnwrapsAndSetsValue() { var input = new Vector2[] { new Vector2(10, 10), new Vector2(10, -10), new Vector2(-10, -10), new Vector2(-10, 10) }; var meta = new NamedBoxCollection(); var container = new MetaSet.Container { Key = "test value", Type = "System.Boolean", Value = "true" }; var set = container.Unwrap(); Test(set, input, meta); Assert.IsTrue(meta.GetValue(new TypedName <bool>("test value"), false)); }
public void Playground() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: - Tags: { 1: { tag: lift } } Bottom: !Id { Id: GroundFloor } Top: !Id { Id: TopFloor } Floors: - !Floor { Id: TopFloor, Tags: { 1: { a: b } } } - !Floor { Tags: { 1: { a: b} } } - !Floor { Id: GroundFloor, Tags: { 1: { a: b } } } - !Ground [] ")); Random r = new Random(); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder); Assert.AreEqual(3, selection.AboveGroundFloors.Count()); Assert.AreEqual(1, selection.Verticals.Count()); }
public void AssertThat_TwoFloors_WithHeightGroup_InheritsHeightFromRootGroup() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Aliases: - &groupname !NormalValue Vary: false Min: 5 Max: 10 Verticals: [] Floors: - !Floor Height: *groupname Tags: 1: { a: b } - !Floor Height: *groupname Tags: 1: { a: b } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder); Assert.AreEqual(2, selection.AboveGroundFloors.Count()); Assert.AreEqual(0, selection.BelowGroundFloors.Count()); var h = selection.AboveGroundFloors.First().Height; Assert.IsTrue(h >= 5f && h <= 10f); var h2 = selection.AboveGroundFloors.Skip(1).First().Height; Assert.AreEqual(h, h2); }
public void AssertThat_FacadeSelector_OutputsFacades() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Verticals: [] Facades: - Tags: { 1: { a: b } } Bottom: !Id { Id: F } Top: !Id { Id: F, Inclusive: true, Search: Up, Filter: Longest, NonOverlapping: true } - Tags: { 1: { a: b } } Bottom: !Num { N: 0 } Top: !Num { N: 0, Inclusive: true } - Tags: { 1: { a: b } } Bottom: !Id { Id: Top } Top: !Id { Id: Top, Inclusive: true } Floors: - !Floor { Id: Top, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: F, Tags: { 1: { a: b } } } - !Floor { Id: Bot, Tags: { 1: { a: b } } } - !Ground [] ")); Assert.IsNotNull(b); Random r = new Random(2); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, Finder).Externals(r.NextDouble, d, Finder, _noNeighbours); var wall = selection.Walls.First(); Assert.AreEqual(3, wall.Facades.Count()); Assert.AreEqual(1, wall.Facades.Count(f => f.Bottom == 0 && f.Top == 0)); Assert.AreEqual(1, wall.Facades.Count(f => f.Bottom == 1 && f.Top == 3)); Assert.AreEqual(1, wall.Facades.Count(f => f.Bottom == 4 && f.Top == 4)); }
public void NetworkBuilder_CanHaveRngEverywhere() { var c = NetworkDescriptor.Deserialize(new StringReader(@" !Network Aliases: - &base-field !AddTensors Tensors: - !PointDistanceDecayTensors { Tensors: !Grid { Angle: !ConstantValue { Value: 0 } }, Decay: !ConstantValue { Value: 2.5 }, Center: { X: !ConstantValue { Value: 0 }, Y: !ConstantValue { Value: 0 } } } Major: MergeSearchAngle: !ConstantValue { Value: 22.5 } MergeDistance: !ConstantValue { Value: 25 } SegmentLength: !ConstantValue { Value: 10 } RoadWidth: !NormalValue { Min: 2, Max: 4, Vary: true } PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 50 } TensorField: *base-field Minor: MergeSearchAngle: 12.5 MergeDistance: 2.5 SegmentLength: 2 RoadWidth: 1 PriorityField: !ConstantScalars { Value: 1 } SeparationField: !ConstantScalars { Value: 15 } TensorField: *base-field ")); Random r = new Random(10); NetworkBuilder b = new NetworkBuilder(); var m = new NamedBoxCollection(); var maj = c.Major(r.NextDouble, m); }
protected override void BeginTransitionOn() { if (_scene != null) return; _scene = _kernel.Get<Scene>(); var renderer = _scene.GetService<Renderer>(); renderer.StartPlan() .Then(new CreateTargetComponent(new RenderTargetInfo(0, 0, SurfaceFormat.Color, DepthFormat.Depth24Stencil8, 1, false, default(RenderTargetUsage)))) .Then<TranslucentComponent>() .Apply(); var cameraPosition = new Vector3(0, 25, -200); _camera = new Camera { NearClip = 1, FarClip = 3000, View = Matrix4x4.CreateLookAt(cameraPosition, new Vector3(0, 0, 0), Vector3.UnitY) }; _camera.Projection = Matrix4x4.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60), 16f / 9f, _camera.NearClip, _camera.FarClip); var cameraDescription = _kernel.Get<EntityDescription>(); cameraDescription.AddProperty(new TypedName<Viewport>("viewport")); cameraDescription.AddBehaviour<View>(); var cameraEntity = cameraDescription.Create(); cameraEntity.GetProperty(new TypedName<Camera>("camera")).Value = _camera; cameraEntity.GetProperty(new TypedName<Viewport>("viewport")).Value = new Viewport() { Width = _device.PresentationParameters.BackBufferWidth, Height = _device.PresentationParameters.BackBufferHeight }; _scene.Add(cameraEntity); var particleEntityDesc = _kernel.Get<EntityDescription>(); particleEntityDesc.AddProperty(new TypedName<Vector3>("position")); particleEntityDesc.AddBehaviour<ParticleEmitter>(); var entity = particleEntityDesc.Create(); entity.GetProperty(new TypedName<Vector3>("position")).Value = Vector3.Zero; NamedBoxCollection initData = new NamedBoxCollection(); initData.Set(new TypedName<ParticleEmitterDescription>("particlesystem"), _content.Load<ParticleEmitterDescription>("Particles/TestEmitter1")); _scene.Add(entity, initData); base.OnShown(); }
public void Apply(NamedBoxCollection data) { if (_setter != null) _setter.Apply(data); }
private void AddCamera(string show, Viewport v) { var cameraDesc = _kernel.Get<EntityDescription>(); cameraDesc.AddProperty(new TypedName<Camera>("camera")); cameraDesc.AddProperty(new TypedName<Viewport>("viewport")); cameraDesc.AddBehaviour<OutputPlanView>(); var cameraEntity = cameraDesc.Create(); cameraEntity.GetProperty(new TypedName<Camera>("camera")).Value = _scene.Camera; cameraEntity.GetProperty(new TypedName<Viewport>("viewport")).Value = v; NamedBoxCollection init = new NamedBoxCollection(); init.Set<string>("output", show); _scene.Scene.Add(cameraEntity, init); }
public void TrainCarriageTest() { // ReSharper disable InconsistentNaming var HierarchicalParameters = new NamedBoxCollection(); var r = new Random(); Func <double> Random = r.NextDouble; const float Length = 60; const float Width = 20; Func <Vector2, float, float, Vector2> Offset = (start, length, width) => start + new Vector2(Length * length, -Width * width); Func <IFloorPlanBuilder, bool, float, IEnumerable <IRoomPlan> > CreateBalcony = (pl, start, bl) => { var p = pl.ExternalFootprint.First(); var wt = HierarchicalParameters.InternalWallThickness(Random); if (start) { return(pl.Add(new Vector2[] { Offset(p, 0, 0.01f), Offset(p, bl / Length, 0.01f), Offset(p, bl / Length, 0.99f), Offset(p, 0, 0.99f), }, wt)); } else { return(pl.Add(new Vector2[] { Offset(p, 1 - (bl / Length), 0.01f), Offset(p, 1, 0.01f), Offset(p, 1, 0.99f), Offset(p, 1 - bl / Length, 0.99f), }, wt)); } }; var plan = new GeometricFloorplan(new ReadOnlyCollection <Vector2>(new Vector2[] { new Vector2(-Length / 2f, Width / 2f), new Vector2(Length / 2f, Width / 2f), new Vector2(Length / 2f, -Width / 2f), new Vector2(-Length / 2f, -Width / 2f), })); // ReSharper restore InconsistentNaming //Get some style values var wallThickness = HierarchicalParameters.InternalWallThickness(Random); var doorWidth = HierarchicalParameters.StandardDoorWidth(Random); //Create balconies on either end float balconyLength = Math.Min(3, Length / 10f); var balcony1 = CreateBalcony(plan, true, balconyLength).Single(); var balcony2 = CreateBalcony(plan, false, balconyLength).Single(); //Reference point to create rooms relative to var point = plan.ExternalFootprint.First(); //Add toilets at one end of the carriage float toiletLength = balconyLength; //Left of the corridor var toiletLeft = plan.Add(new Vector2[] { Offset(point, balconyLength / Length, 0), Offset(point, (balconyLength + toiletLength) / Length, 0), Offset(point, (balconyLength + toiletLength) / Length, (Width / 2 - doorWidth / 2) / Width), Offset(point, balconyLength / Length, (Width / 2 - doorWidth / 2) / Width), }, wallThickness).Single(); //Right of the corridor var toiletRight = plan.Add(new Vector2[] { Offset(point, balconyLength / Length, (Width / 2 + doorWidth / 2) / Width), Offset(point, (balconyLength + toiletLength) / Length, (Width / 2 + doorWidth / 2) / Width), Offset(point, (balconyLength + toiletLength) / Length, 1), Offset(point, balconyLength / Length, 1), }, wallThickness).Single(); //Corridor var corridorL = (Width / 2 - doorWidth / 2 + 0.01f) / Width; var corridorR = (Width / 2 + doorWidth / 2 - 0.01f) / Width; var corridor = plan.Add(new Vector2[] { Offset(point, balconyLength / Length, corridorL), Offset(point, (balconyLength + toiletLength) / Length, corridorL), Offset(point, (balconyLength + toiletLength) / Length, corridorR), Offset(point, balconyLength / Length, corridorR), }, wallThickness).Single(); //Add dining room var diningRoom = plan.Add(new Vector2[] { Offset(point, (balconyLength + toiletLength + 0.05f) / Length, 0), Offset(point, (Length - balconyLength - 0.05f) / Length, 0), Offset(point, (Length - balconyLength - 0.05f) / Length, 1), Offset(point, (balconyLength + toiletLength + 0.05f) / Length, 1), }, wallThickness).Single(); plan.Freeze(); DrawPlan(plan); Assert.IsFalse(balcony2.Neighbours.Any(a => a.Other(balcony2) != diningRoom)); Assert.IsNotNull(balcony1); Assert.IsNotNull(balcony2); Assert.IsNotNull(toiletLeft); Assert.IsNotNull(toiletRight); Assert.IsNotNull(corridor); Assert.IsNotNull(diningRoom); }
protected override void BeginTransitionOn() { _scene = _kernel.Get<Scene>(); //Camera _cameraPosition = new Vector3(5, 0, -50); _camera = new Camera { NearClip = 1, FarClip = 700, View = Matrix4x4.CreateLookAt(_cameraPosition, new Vector3(0, 0, 0), Vector3.UnitY) }; _camera.Projection = Matrix4x4.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60), 16f / 9f, _camera.NearClip, _camera.FarClip); _cameraRotation = new Vector3(0, MathHelper.Pi, 0); //Camera entity var cameraDesc = _kernel.Get<EntityDescription>(); cameraDesc.AddProperty(new TypedName<Camera>("camera")); cameraDesc.AddProperty(new TypedName<Viewport>("viewport")); cameraDesc.AddBehaviour<View>(); var cameraEntity = cameraDesc.Create(); cameraEntity.GetProperty(new TypedName<Camera>("camera")).Value = _camera; cameraEntity.GetProperty(new TypedName<Viewport>("viewport")).Value = new Viewport() { Width = _device.PresentationParameters.BackBufferWidth, Height = _device.PresentationParameters.BackBufferHeight }; _scene.Add(cameraEntity); _view = cameraEntity.GetBehaviour<View>(); //Skybox var skyboxDesc = _kernel.Get<EntityDescription>(); skyboxDesc.AddBehaviour<Skybox>(); var skybox = skyboxDesc.Create(); skybox.GetProperty(new TypedName<TextureCube>("texture")).Value = _content.Load<TextureCube>("StormCubeMap"); skybox.GetProperty(new TypedName<float>("brightness")).Value = 0.5f; skybox.GetProperty(new TypedName<bool>("gamma_correct")).Value = false; _scene.Add(skybox); //Sphere for (int i = 1; i < 7; i++) { var sphereModel = _content.Load<ModelData>(@"Models\sphere"); var sphere = _kernel.Get<EntityDescription>(); sphere.AddProperty(new TypedName<ModelData>("model")); sphere.AddProperty(new TypedName<Matrix4x4>("transform")); sphere.AddProperty(new TypedName<bool>("is_static")); sphere.AddBehaviour<ModelInstance>(); var sphereEntity = sphere.Create(); sphereEntity.GetProperty(new TypedName<ModelData>("model")).Value = sphereModel; sphereEntity.GetProperty(new TypedName<Matrix4x4>("transform")).Value = Matrix4x4.CreateScale(4 / sphereModel.Meshes.First().BoundingSphere.Radius) * Matrix4x4.CreateRotationY(MathHelper.PiOver2) * Matrix4x4.CreateTranslation(0, 0, i * 20); sphereEntity.GetProperty(new TypedName<bool>("is_static")).Value = true; _scene.Add(sphereEntity); var smodel = sphereEntity.GetBehaviour<ModelInstance>(); smodel.Opacity = 0.15f; smodel.SubSurfaceScattering = 0.5f; smodel.Attenuation = 0.2f; } //Particles var particleEntityDesc = _scene.Kernel.Get<EntityDescription>(); particleEntityDesc.AddProperty(new TypedName<Vector3>("position")); particleEntityDesc.AddBehaviour<ParticleEmitter>(); var entity = particleEntityDesc.Create(); NamedBoxCollection initData = new NamedBoxCollection(); initData.Set(new TypedName<ParticleEmitterDescription>("particlesystem"), _content.Load<ParticleEmitterDescription>("Particles/TestEmitter1")); _scene.Add(entity, initData); _scene.GetService<Renderer>() .StartPlan() .Then<GeometryBufferComponent>() .Then<EdgeDetectComponent>() .Then<Ssao>() .Then<LightingComponent>() .Then<DeferredTransparency>() .Then<ToneMapComponent>() .Then<AntiAliasComponent>() .Show("antialiased") .Apply(); _game.DisplayUI = true; base.BeginTransitionOn(); }
internal void Draw(string phase, NamedBoxCollection metadata) { if (phase == "translucent") foreach (var particleEmitter in _particleSystems.Values) particleEmitter.Draw(metadata); }
public void SetMetadata(NamedBoxCollection metadata) { metadata.Set(Names.View.Camera, this); metadata.Set(Names.Matrix.View, View); metadata.Set(Names.Matrix.Projection, Projection); metadata.Set(Names.Matrix.ViewProjection, ViewProjection); metadata.Set(Names.Matrix.InverseView, _inverseView); metadata.Set(Names.Matrix.InverseProjection, _inverseProjection); metadata.Set(Names.Matrix.InverseViewProjection, _inverseViewProjection); metadata.Set(Names.View.ViewFrustum, Bounds); metadata.Set(Names.View.NearClip, NearClip); metadata.Set(Names.View.FarClip, FarClip); metadata.Set(Names.View.CameraPosition, Position); _bounds.GetCorners(_frustumCorners); for (int i = 0; i < 4; i++) _farFrustumCorners[i] = _frustumCorners[i + 4]; for (int i = 0; i < _farFrustumCorners.Length; i++) _farFrustumCorners[i] = Vector3.Transform(_farFrustumCorners[i], _view); metadata.Set(Names.View.FarFrustumCorners, _farFrustumCorners); }
public void TestMethod1() { var rnd = new Random(3); var random = (Func <double>)rnd.NextDouble; var metadata = new NamedBoxCollection(); var designer = FloorDesigner.Deserialize(new StringReader(@" # root node !Floorplan # tags for this floorplan Tags: Type: Residential Style: None # Aliases block is just a list of items, not used by the system. Handy place to define objects which will be used later in the markup Aliases: # A single room, with a set of constraints - &office !Room Id: Office Walkthrough: false Tags: 1: { Office } # Constraints: [] # - { Strength: 1, Req: !ExteriorWindow { } } # - { Strength: 0.5, Req: !ExteriorDoor { Deny: true } } # - { Strength: 0.5, Req: !Area { Min: 11 } } # A group of rooms - &office_group !Group Id: Offices Children: - *office - *office GrowthParameters: SeedSpacing: !NormalValue { Min: 2.5, Mean: 5, Max: 6.5, Vary: true } SeedChance: 0.75 IntersectionContinuationChance: 0.3 ParallelCheck: Length: 1 Width: 3.5 Angle: 15 MergeParameters: AngularDeviation: Weight: 0.4 Threshold: 0.5 Convexity: Weight: 0.3 Threshold: 0.5 Area: Weight: 0.3 Threshold: 45 Cutoff: 5 CorridorParameters: Width: 1 Spaces: - !Repeat Count: !NormalValue { Min: 1, Max: 100 } Space: *office_group ")); Func <IEnumerable <KeyValuePair <string, string> >, Type[], ScriptReference> finder = (tags, types) => { var tagsClean = from tag in tags let k = string.IsNullOrEmpty(tag.Key) let v = string.IsNullOrEmpty(tag.Value) where !k || !v select(!k && !v) ? (tag.Key + ":" + tag.Value) : (k ? tag.Value : tag.Key); return(ScriptReferenceFactory.Create(typeof(TestScript), Guid.NewGuid(), string.Join(",", tagsClean))); }; ////Corner shape //var shape = new[] { // new Vector2(9, 5), new Vector2(9, -6), new Vector2(0, -6), new Vector2(0, 0), new Vector2(-4, 0), new Vector2(-4, 5) //}; //var sections = new[] { // new Subsection[] { new Subsection(0, 1, Subsection.Types.Window) }, // new Subsection[0], // new Subsection[0], // new Subsection[0], // new Subsection[] { new Subsection(0, 1, Subsection.Types.Window) }, // new Subsection[0] //}; //Diagonal bend shape var shape = new[] { new Vector2(10, 10), new Vector2(20, 0), new Vector2(23, 0), new Vector2(33, 10), new Vector2(43, 0), new Vector2(28, -15), new Vector2(15, -15), new Vector2(0, 0) }; var sections = new[] { new Subsection[0], new Subsection[0], new Subsection[0], new Subsection[0], new Subsection[0], new Subsection[0], new Subsection[0], new Subsection[0] }; var verticals = new Vector2[][] { }; ////Actual office floorplan //var shape = new[] { // new Vector2(-25, 17), // new Vector2(0, 17), // new Vector2(3, 15), // new Vector2(33, 15), // new Vector2(38, 0), // new Vector2(-25, -25) //}; //var sections = new[] { // new Subsection[0], // new Subsection[0], // new Subsection[0], // new Subsection[0], // new Subsection[0], // new Subsection[0] //}; //var verticals = new[] { // new[] { // new Vector2(0, 0), // new Vector2(7, 0), // new Vector2(7, -7), // new Vector2(0, -7), // } //}; ////rectangle //var shape = new[] { // new Vector2(9, 0), // new Vector2(9, -6), // new Vector2(0, -6), // new Vector2(0, 0) //}; //var sections = new[] { // new Subsection[0], // new Subsection[0], // new Subsection[0], // new Subsection[0], //}; var plan = new GeometricFloorplan(shape); designer.Design(random, metadata, finder, plan, sections, 0.175f, verticals, new List <ConstrainedVerticalSelection>()); Console.WriteLine(SvgRoomVisualiser.FloorplanToSvg(plan, 55, basic: false)); }
protected override void BeginTransitionOn() { _scene = _kernel.Get<TestScene>(); var particleEntityDesc = _scene.Scene.Kernel.Get<EntityDescription>(); particleEntityDesc.AddProperty(new TypedName<Vector3>("position")); particleEntityDesc.AddBehaviour<ParticleEmitter>(); var entity = particleEntityDesc.Create(); entity.GetProperty(new TypedName<Vector3>("position")).Value = Vector3.Zero; NamedBoxCollection initData = new NamedBoxCollection(); initData.Set(new TypedName<ParticleEmitterDescription>("particlesystem"), _content.Load<ParticleEmitterDescription>("Particles/TestEmitter1")); _scene.Scene.Add(entity, initData); var renderer = _scene.Scene.GetService<Renderer>(); _ssaoIntensity = renderer.Data.GetOrCreate(new TypedName<float>("ssao_intensity")); _fullPlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<EdgeDetectComponent>() .Then<Ssao>() .Then<LightingComponent>() .Then<DeferredTransparency>() //.Then<RestoreDepthPhase>() //.Then<TranslucentComponent>() .Then<ToneMapComponent>() .Then<AntiAliasComponent>(); _ssaoPlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<EdgeDetectComponent>() .Then<Ssao>() .Show("ssao"); _lightingPlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<Ssao>() .Then<LightingComponent>() .Show("directlighting"); _edgeDetectPlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<EdgeDetectComponent>() .Show("edges"); _normalPlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<LightingComponent>() .Then<DeferredTransparency>() .Then(new AntiAliasComponent("gbuffer_normals")) .Show("antialiased"); _depthPlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<LightingComponent>() .Then<DeferredTransparency>() .Show("gbuffer_depth"); _diffusePlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<LightingComponent>() .Then<DeferredTransparency>() .Show("gbuffer_diffuse"); _noAaPlan = renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<EdgeDetectComponent>() .Then<Ssao>() .Then<LightingComponent>() .Then<ToneMapComponent>() .Show("tonemapped"); _fullPlan.Apply(); base.BeginTransitionOn(); //var game = kernel.Get<TestGame>(); _game.DisplayUI = true; //game.IsFixedTimeStep = true; }
public void Draw(Material material, NamedBoxCollection parameters) { foreach (var pass in material.Begin(parameters)) { pass.Apply(); Draw(); } }
public void SetRenderData(NamedBoxCollection metadata) { metadata.Set<Matrix[]>("bones", _skinTransforms); }
protected override void BeginTransitionOn() { base.BeginTransitionOn(); _scene = _kernel.Get<Scene>(); //Start renderer var renderer = _scene.GetService<Renderer>(); renderer.StartPlan() .Then<GeometryBufferComponent>() .Then<EdgeDetectComponent>() .Then<Ssao>() .Then<LightingComponent>() .Then<RestoreDepthPhase>() .Then<ToneMapComponent>() .Then<AntiAliasComponent>() .Show("antialiased") .Apply(); _resolution = renderer.Data.Get<Vector2>("resolution"); //Create camera _camera = new Camera { NearClip = 1, FarClip = 7000, View = Matrix4x4.CreateLookAt(new Vector3(-100, 300, 10), new Vector3(300, 0, 0), -Vector3.UnitZ) }; _camera.Projection = Matrix4x4.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60), 16f / 9f, _camera.NearClip, _camera.FarClip); var cameraDesc = _kernel.Get<EntityDescription>(); cameraDesc.AddProperty(new TypedName<Camera>("camera")); cameraDesc.AddProperty(new TypedName<Viewport>("viewport")); cameraDesc.AddBehaviour<View>(); var cameraEntity = cameraDesc.Create(); cameraEntity.GetProperty(new TypedName<Camera>("camera")).Value = _camera; cameraEntity.GetProperty(new TypedName<Viewport>("viewport")).Value = new Viewport() { Width = _device.PresentationParameters.BackBufferWidth, Height = _device.PresentationParameters.BackBufferHeight }; _scene.Add(cameraEntity); //create ambient light var ambientLight = _kernel.Get<EntityDescription>(); ambientLight.AddProperty(new TypedName<Vector3>("sky_colour")); ambientLight.AddProperty(new TypedName<Vector3>("ground_colour")); ambientLight.AddProperty(new TypedName<Vector3>("up")); ambientLight.AddBehaviour<AmbientLight>(); var ambientLightEntity = ambientLight.Create(); ambientLightEntity.GetProperty(new TypedName<Vector3>("sky_colour")).Value = new Vector3(0.08f); ambientLightEntity.GetProperty(new TypedName<Vector3>("ground_colour")).Value = new Vector3(0.04f, 0.05f, 0.04f); ambientLightEntity.GetProperty(new TypedName<Vector3>("up")).Value = Vector3.UnitY; _scene.Add(ambientLightEntity); //Create text var textDesc = _kernel.Get<EntityDescription>(); textDesc.AddBehaviour<ModelInstance>(); textDesc.AddProperty(ModelInstance.TransformName, Matrix4x4.Identity); textDesc.AddBehaviour<StringModelData>(); var textEnt = textDesc.Create(); var init = new NamedBoxCollection { { StringModelData.FontName, _content.Load<VertexFont>("Fonts/Cousine-Regular-Latin") }, { StringModelData.StringName, "Hello, World" }, { StringModelData.ThicknessName, 25 }, }; _scene.Add(textEnt, init); }
public void Draw(NamedBoxCollection data) { Debug.Assert(Description.Texture != null, "Particle systems must be initialised before they can be drawn."); //Debug.WriteLine(string.Format("retired: {0}, active: {1}, new: {2}, free: {3}", finished, active, newlyCreated, free)); if (_dirty) InitialiseBuffer(); if (_newlyCreated != _free) AddNewParticlesToVertexBuffer(); if (_vertices.IsContentLost) _vertices.SetData(_particles); // If there are any active particles, draw them now! if (_active != _free) { _device.BlendState = Description.BlendState; _device.DepthStencilState = DepthStencilState.DepthRead; // Set an effect parameter describing the viewport size. This is // needed to convert particle sizes into screen space point sizes. _viewportScaleParameter.SetValue(new Vector2(0.5f / data.GetValue(new TypedName<Viewport>("viewport")).AspectRatio, -0.5f)); // Set an effect parameter describing the current time. All the vertex // shader particle animation is keyed off this value. _currentTimeParameter.SetValue(_time); data.Set<Matrix4x4>(Names.Matrix.World, Transform); // Set the particle vertex and index buffer. _device.SetVertexBuffer(_vertices); _device.Indices = _indices; SelectParticleType(); // Activate the particle effect. foreach (EffectPass pass in _material.Begin(data)) { pass.Apply(); // work around for an xna 4.0 bug _device.SamplerStates[0] = SamplerState.PointClamp; _device.SamplerStates[1] = SamplerState.PointClamp; _device.SamplerStates[2] = SamplerState.PointClamp; if (_active < _free) { // If the active particles are all in one consecutive range, // we can draw them all in a single call. _device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, _active * 4, (_free - _active) * 4, _active * 6, (_free - _active) * 2); } else { // If the active particle range wraps past the end of the queue // back to the start, we must split them over two draw calls. _device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, _active * 4, (Description.Capacity - _active) * 4, _active * 6, (Description.Capacity - _active) * 2); if (_free > 0) { _device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, _free * 4, 0, _free * 2); } } } // Reset some of the renderstates that we changed, // so as not to mess up any other subsequent drawing. _device.DepthStencilState = DepthStencilState.Default; _device.BlendState = BlendState.AlphaBlend; } _frameCounter++; }
void ModelInstance.IRenderDataSupplier.SetRenderData(NamedBoxCollection metadata) { metadata.Set<Matrix4x4[]>(Names.Animation.Bones, _skinTransforms); }
IEntity EpimetheusPlugins.Services.EntityCreation.IEntityCreator.Create(EpimetheusPlugins.Scripts.ScriptReference script, NamedBoxCollection data) { return(default(IEntity)); }
public void TestMethod1() { var b = BuildingDesigner.Deserialize(new StringReader(@" !Building Aliases: - &residential_floor_count !NormalValue Min: 5 Max: 10 - &FloorHeight !UniformValue Min: 2 Max: 5 Vary: true Facades: # Penthouse facade - Tags: { 1: { tag: BlankFacade } } Bottom: !Id { Id: Penthouse } Top: !Id { Id: Penthouse, Inclusive: true } # Skylobby facades - Tags: { 1: { tag: BlankFacade } } Bottom: !Id { Id: Skylobby } Top: !Id { Id: Skylobby, Inclusive: true, Search: Up, Filter: First } # Residential facades - Tags: { 1: { tag: BlankFacade } } Bottom: !Id { Id: Residential } Top: !Id { Id: Residential, Inclusive: true, Search: Up, Filter: Longest, NonOverlapping: true } # Ground entrances - Tags: { 1: { tag: BlankFacade } } Bottom: !Num { N: 0 } Top: !Num { N: 0, Inclusive: true } #Constraints: [ !Access { Type: Road } ] - Tags: { 1: { tag: BlankFacade } } Bottom: !Num { N: 0 } Top: !Num { N: 0 } Verticals: # First lift from ground->lowest skylobby - Tags: { 1: { tag: HollowVertical } } Bottom: !Num { N: 0 } Top: !Num { N: 5 } Floors: - !Floor Id: Penthouse Tags: { 50: { tag: SolidFloor }, 50: null } - !Footprint - !Shrink { Distance: 5 } - !Twist { Angle: 15 } - !Clip {} - !Repeat Count: !NormalValue Min: 1 Max: 5 Items: - !Footprint - !Shrink { Distance: 5 } - !Twist { Angle: 15 } - !Clip {} - !Floor Id: Skylobby Tags: { 1: { tag: SolidFloor } } - !Repeat Count: *residential_floor_count Vary: true Items: - !Floor Tags: { 1: { tag: SolidFloor } } Id: Residential - !Footprint - !Shrink { Distance: 1 } - !Twist { Angle: 15 } - !Clip {} - !Floor Tags: { 1: { tag: SolidFloor } } Height: *FloorHeight - !Ground [] ")); Assert.IsNotNull(b); Func <IEnumerable <KeyValuePair <string, string> >, Type[], ScriptReference> finder = (tags, types) => ScriptReferenceFactory.Create(typeof(TestScript), Guid.NewGuid(), string.Join(",", tags)); var lot = new Vector2[] { new Vector2(-30, -30), new Vector2(-30, 30f), new Vector2(30, 30f), new Vector2(30, -30f) }; Random r = new Random(10); var d = new NamedBoxCollection(); var selection = b.Internals(r.NextDouble, d, finder).Externals(r.NextDouble, d, finder, new BuildingSideInfo[] { new BuildingSideInfo(lot[0], lot[1], new BuildingSideInfo.NeighbourInfo[0]), new BuildingSideInfo(lot[1], lot[2], new BuildingSideInfo.NeighbourInfo[0]), new BuildingSideInfo(lot[2], lot[3], new BuildingSideInfo.NeighbourInfo[0]), new BuildingSideInfo(lot[3], lot[0], new BuildingSideInfo.NeighbourInfo[0]), }); Assert.AreEqual(selection.Floors.Count(), selection.Floors.GroupBy(a => a.Index).Count()); var v = selection.Verticals; Func <int, string> prefix = (floor) => new string(v.Select(a => a.Bottom <= floor && a.Top >= floor ? '|' : ' ').ToArray()); foreach (var item in selection.Floors.OrderByDescending(a => a.Index)) { var pre = prefix(item.Index); Console.WriteLine("{0} {1} {2:##.##}m", pre, item.Script.Name, item.Height); } }
public void SetMetadata(NamedBoxCollection metadata) { metadata.Set("camera", this); metadata.Set("view", View); metadata.Set("projection", Projection); metadata.Set("viewprojection", ViewProjection); metadata.Set("inverseview", _inverseView); metadata.Set("inverseprojection", _inverseProjection); metadata.Set("inverseviewprojection", _inverseViewProjection); metadata.Set("viewfrustum", Bounds); metadata.Set("nearclip", NearClip); metadata.Set("farclip", FarClip); metadata.Set("cameraposition", Position); _bounds.GetCorners(_frustumCorners); for (int i = 0; i < 4; i++) _farFrustumCorners[i] = _frustumCorners[i + 4]; Vector3.Transform(_farFrustumCorners, ref _view, _farFrustumCorners); metadata.Set("farfrustumcorners", _farFrustumCorners); }