public static Scenery FromTag(H2vMap map, ScenarioTag scenario, ScenarioTag.SkyboxInstance instance) { var scenery = new Scenery(); scenery.FriendlyName = "Skybox_" + instance.Skybox.Id; var tag = map.GetTag(instance.Skybox); if (map.TryGetTag(tag.Model, out var model) == false) { Console.WriteLine($"No MODE[{tag.Model}] found for SKY[{instance.Skybox}]"); return(scenery); } var meshes = new List <ModelMesh>(); var partIndex = model.Components.First().DamageLevels.First().HighestPieceIndex; meshes.AddRange(model.Parts[partIndex].Model.Meshes); var renderModelMeshes = new List <Mesh <BitmapTag> >(meshes.Count); foreach (var mesh in meshes) { var mat = map.CreateMaterial(mesh); renderModelMeshes.Add(new Mesh <BitmapTag>() { Compressed = mesh.Compressed, ElementType = mesh.ElementType, Indicies = mesh.Indices, Note = mesh.Note, RawData = mesh.RawData, Verticies = mesh.Verticies, Material = mat }); } var comp = new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{tag.Id}] {tag.Name}", Meshes = renderModelMeshes.ToArray(), Flags = ModelFlags.IsSkybox }); var components = new List <Component>(); components.Add(comp); scenery.SetComponents(components.ToArray()); return(scenery); }
public static Scenery FromInstancedGeometry(H2vMap map, BspTag bsp, BspTag.InstancedGeometryInstance instance) { var scenery = new Scenery(); scenery.FriendlyName = "Geom"; if (instance.Index >= bsp.InstancedGeometryDefinitions.Length) { return(scenery); } var def = bsp.InstancedGeometryDefinitions[instance.Index]; var transparentMeshes = new List <Mesh <BitmapTag> >(def.Model.Meshes.Length); var renderModelMeshes = new List <Mesh <BitmapTag> >(def.Model.Meshes.Length); foreach (var mesh in def.Model.Meshes) { var mat = map.CreateMaterial(mesh); var renderMesh = new Mesh <BitmapTag>() { Compressed = mesh.Compressed, ElementType = mesh.ElementType, Indicies = mesh.Indices, Note = mesh.Note, RawData = mesh.RawData, Verticies = mesh.Verticies, Material = mat }; if (mat.AlphaMap == null) { renderModelMeshes.Add(renderMesh); } else { transparentMeshes.Add(renderMesh); } } var comps = new List <Component>(); comps.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{bsp.Id}] {bsp.Name}//instanced//{instance.Index}", Meshes = renderModelMeshes.ToArray(), Flags = ModelFlags.Diffuse | ModelFlags.ReceivesShadows | ModelFlags.IsStatic })); foreach (var mesh in transparentMeshes) { comps.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{bsp.Id}] {bsp.Name}//instanced//{instance.Index}", Meshes = new[] { mesh }, Flags = ModelFlags.IsTransparent | ModelFlags.IsStatic })); } var xform = new TransformComponent(scenery, instance.Position, QuaternionExtensions.From3x3Mat(instance.RotationMatrix)) { Scale = new Vector3(instance.Scale), }; comps.Add(xform); if (def.Vertices.Length > 0) { var geom = PhysicsComponentFactory.CreateStaticGeometry(scenery, xform, def, bsp.Shaders); comps.Add(geom); comps.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{bsp.Id}] {bsp.Name}//instanced//{instance.Index}-collision", Meshes = MeshFactory.GetRenderModel(geom.Collider, new Vector4(0f, 1f, 1f, 1f)), Flags = ModelFlags.Wireframe | ModelFlags.IsStatic, RenderLayer = RenderLayers.Collision })); } xform.UpdateDerivedData(); scenery.SetComponents(comps); return(scenery); }
public static Terrain FromBspData(H2vMap map, BspTag tag) { var terrain = new Terrain(); terrain.FriendlyName = tag.Name; var meshes = new List <ModelMesh>(); foreach (var chunk in tag.RenderChunks) { meshes.AddRange(chunk.Model.Meshes); } var transparentMeshes = new List <Mesh <BitmapTag> >(meshes.Count); var renderModelMeshes = new List <Mesh <BitmapTag> >(meshes.Count); foreach (var mesh in meshes) { var mat = map.CreateMaterial(mesh); var renderMesh = new Mesh <BitmapTag>() { Compressed = mesh.Compressed, ElementType = mesh.ElementType, Indicies = mesh.Indices, Note = mesh.Note, RawData = mesh.RawData, Verticies = mesh.Verticies, Material = mat }; if (mat.AlphaMap == null) { renderModelMeshes.Add(renderMesh); } else { transparentMeshes.Add(renderMesh); } } var components = new List <Component>(); components.Add(new RenderModelComponent(terrain, new Model <BitmapTag> { Meshes = renderModelMeshes.ToArray(), Flags = ModelFlags.Diffuse | ModelFlags.ReceivesShadows | ModelFlags.IsStatic })); foreach (var mesh in transparentMeshes) { components.Add(new RenderModelComponent(terrain, new Model <BitmapTag> { Meshes = new[] { mesh }, Flags = ModelFlags.IsTransparent | ModelFlags.IsStatic })); } var collisionTerrain = PhysicsComponentFactory.CreateTerrain(terrain, tag.CollisionInfos, tag.Shaders); components.Add(collisionTerrain); components.Add(new RenderModelComponent(terrain, new Model <BitmapTag> { Meshes = MeshFactory.GetRenderModel(collisionTerrain.Collider), Flags = ModelFlags.Wireframe | ModelFlags.IsStatic, RenderLayer = RenderLayers.Collision })); components.Add(new TransformComponent(terrain, Vector3.Zero)); terrain.SetComponents(components); return(terrain); }