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