예제 #1
0
        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));
        }
예제 #2
0
파일: Material.cs 프로젝트: ylyking/Myre
        public IEnumerable<EffectPass> Begin(NamedBoxCollection parameterValues)
        {
            for (int i = 0; i < _parameters.Length; i++)
                _parameters[i].Apply(parameterValues);

            return _effect.CurrentTechnique.Passes;
        }
예제 #3
0
        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));
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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());
        }
예제 #7
0
        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)));
        }
예제 #8
0
        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));
        }
예제 #9
0
        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]),
            });
        }
예제 #10
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);
                }
            }
        }
예제 #11
0
        protected override void BeginTransitionOn()
        {
            _material = _content.Load<Material>("Red");
            _quad = new Quad(_device);
            _metadata = new NamedBoxCollection();

            base.OnShown();
        }
예제 #12
0
파일: Material.cs 프로젝트: xoxota99/Myre
        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;
        }
예제 #13
0
        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();
        }
예제 #14
0
        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));
        }
예제 #15
0
        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));
        }
예제 #16
0
        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")));
        }
예제 #17
0
        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));
        }
예제 #18
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));
        }
예제 #19
0
        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);
            }
        }
예제 #20
0
        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"));
        }
예제 #22
0
        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));
        }
예제 #23
0
        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());
        }
예제 #24
0
        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);
        }
예제 #25
0
        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));
        }
예제 #26
0
        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);
        }
예제 #27
0
        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();
        }
예제 #28
0
 public void Apply(NamedBoxCollection data)
 {
     if (_setter != null)
         _setter.Apply(data);
 }
예제 #29
0
        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);
        }
예제 #30
0
        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);
        }
예제 #31
0
        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();
        }
예제 #32
0
 internal void Draw(string phase, NamedBoxCollection metadata)
 {
     if (phase == "translucent")
         foreach (var particleEmitter in _particleSystems.Values)
             particleEmitter.Draw(metadata);
 }
예제 #33
0
파일: Camera.cs 프로젝트: martindevans/Myre
        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);
        }
예제 #34
0
        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));
        }
예제 #35
0
파일: Demo.cs 프로젝트: martindevans/Myre
        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;
        }
예제 #36
0
파일: Quad.cs 프로젝트: ylyking/Myre
 public void Draw(Material material, NamedBoxCollection parameters)
 {
     foreach (var pass in material.Begin(parameters))
     {
         pass.Apply();
         Draw();
     }
 }
예제 #37
0
파일: Animated.cs 프로젝트: ylyking/Myre
 public void SetRenderData(NamedBoxCollection metadata)
 {
     metadata.Set<Matrix[]>("bones", _skinTransforms);
 }
예제 #38
0
파일: TextTest.cs 프로젝트: xoxota99/Myre
        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);
        }
예제 #39
0
        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++;
        }
예제 #40
0
 void ModelInstance.IRenderDataSupplier.SetRenderData(NamedBoxCollection metadata)
 {
     metadata.Set<Matrix4x4[]>(Names.Animation.Bones, _skinTransforms);
 }
예제 #41
0
 IEntity EpimetheusPlugins.Services.EntityCreation.IEntityCreator.Create(EpimetheusPlugins.Scripts.ScriptReference script, NamedBoxCollection data)
 {
     return(default(IEntity));
 }
예제 #42
0
        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);
            }
        }
예제 #43
0
파일: Camera.cs 프로젝트: ylyking/Myre
        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);
        }