Example #1
0
        public override void Create(Gem.PropertyBag Properties)
        {
            base.Create(Properties);

            var branch = new Gem.Render.BranchNode();

            var Mesh = Gem.Geo.Gen.CreateQuad();
            //Gem.Geo.Gen.Transform(Mesh, Matrix.CreateRotationZ((float)Math.PI));
            Gem.Geo.Gen.Transform(Mesh, Matrix.CreateTranslation(0, 0.5f, 0));
            Gem.Geo.Gen.Transform(Mesh, Matrix.CreateScale(Properties.GetPropertyAs<float>("width"), Properties.GetPropertyAs<float>("height"), 1));
            Gem.Geo.Gen.Transform(Mesh, Matrix.CreateRotationX((float)(Math.PI / 8) * 3));
            Mesh = Gem.Geo.Gen.FacetCopy(Mesh);
            Gem.Geo.Gen.CalculateTangentsAndBiNormals(Mesh);

            var shadowMesh = Gem.Geo.Gen.CreateQuad();
            shadowMesh = Gem.Geo.Gen.FacetCopy(shadowMesh);
            Gem.Geo.Gen.CalculateTangentsAndBiNormals(shadowMesh);

            ShadowNode = new Gem.Render.MeshNode(shadowMesh, Properties.GetPropertyAs<Texture2D>("drop-shadow"), null, ShadowOrientation);
            ShadowNode.InteractWithMouse = false;
            MeshNode = new Gem.Render.MeshNode(Mesh, Properties.GetPropertyAs<Texture2D>("sprite"), Properties.GetPropertyAs<Texture2D>("normal-map"), Orientation);

            branch.Add(ShadowNode);
            branch.Add(MeshNode);

            Renderable = branch;

            MeshNode.AlphaMouse = true;
        }
        public static Gem.Render.SceneNode CreateStaticGeometryBuffers(World From, GraphicsDevice Device)
        {
            var tilePiles = new List<List<TileInstance>>();

            From.Grid.ForEachTile((cell, x, y, z) =>
                {
                    if (cell.Tile == null) return;
                    var existingPile = tilePiles.FirstOrDefault(pile => pile[0].Tile.Combinable(cell.Tile));
                    if (existingPile == null)
                    {
                        existingPile = new List<TileInstance>();
                        tilePiles.Add(existingPile);
                    }
                    existingPile.Add(new TileInstance(cell.Tile, x, y, z));
                });

            var r = new Gem.Render.BranchNode();

            foreach (var pile in tilePiles)
            {
                var mesh = Gem.Geo.Gen.InstanceMerge(
                    pile.Select(i => i.Tile.RenderMesh),
                    pile.Select(t => Matrix.CreateTranslation(t.X + 0.5f, t.Y + 0.5f, t.Z)));
                var compiledMesh = Gem.Geo.CompiledModel.CompileModel(mesh, Device);
                r.Add(new Gem.Render.CompiledMeshNode(compiledMesh, pile[0].Tile.Texture));
            }

            return r;
        }