public static Machine FromTag(H2vMap map, ScenarioTag scenario, ScenarioTag.MachineryInstance instance) { var scenery = new Machine(); scenery.FriendlyName = "Machine_" + instance.MachineryDefinitionIndex; if (instance.MachineryDefinitionIndex == ushort.MaxValue) { Console.WriteLine($"MACH index out of range"); return(scenery); } var id = scenario.MachineryDefinitions[instance.MachineryDefinitionIndex].Machinery; var tag = map.GetTag(id); scenery.FriendlyName = tag.Name; var orientation = QuaternionExtensions.FromH2vOrientation(instance.Orientation); var xform = new TransformComponent(scenery, instance.Position, orientation); var components = new List <Component>(); if (tag.Model != uint.MaxValue) { components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{tag.Id}] {tag.Name}", Meshes = MeshFactory.GetRenderModel(map, tag.Model), Flags = ModelFlags.Diffuse | ModelFlags.CastsShadows | ModelFlags.ReceivesShadows })); components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{tag.Id}] {tag.Name} bones", Meshes = MeshFactory.GetBonesModel(map, tag.Model), Flags = ModelFlags.Wireframe, RenderLayer = RenderLayers.Debug })); var body = PhysicsComponentFactory.CreateKinematicRigidBody(scenery, xform, map, tag.Model); if (body != null) { components.Add(body); components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Meshes = MeshFactory.GetRenderModel(body.Collider, new Vector4(1f, 0f, 1f, 1f)), Flags = ModelFlags.Wireframe | ModelFlags.IsStatic, RenderLayer = RenderLayers.Collision })); } } scenery.SetComponents(xform, components.ToArray()); return(scenery); }
public static Bloc FromTag(H2vMap map, ScenarioTag scenario, ScenarioTag.BlocInstance instance) { var scenery = new Bloc(); var components = new List <Component>(); var bloc = scenario.BlocDefinitions[instance.BlocDefinitionIndex].Bloc; var tag = map.GetTag(bloc); scenery.FriendlyName = tag.Name; components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{tag.Id}] {tag.Name}", Flags = ModelFlags.Diffuse | ModelFlags.CastsShadows | ModelFlags.ReceivesShadows, Meshes = MeshFactory.GetRenderModel(map, tag.PhysicalModel), ColorChangeData = PackColorChange(instance) })); var orientation = QuaternionExtensions.FromH2vOrientation(instance.Orientation); var xform = new TransformComponent(scenery, instance.Position, orientation); var body = PhysicsComponentFactory.CreateDynamicRigidBody(scenery, xform, map, tag.PhysicalModel); if (body != null) { components.Add(body); components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"bloc//{scenery.FriendlyName}-collision", Meshes = MeshFactory.GetRenderModel(body.Collider, new Vector4(0.19f, 0.47f, 0.15f, 1f)), Flags = ModelFlags.Wireframe | ModelFlags.IsStatic, RenderLayer = RenderLayers.Collision })); } var comOffset = Vector3.Zero; if (map.TryGetTag(tag.PhysicalModel, out var hlmt) && map.TryGetTag(hlmt.PhysicsModel, out var phmo) && phmo.BodyParameters.Length > 0) { comOffset = phmo.BodyParameters[0].CenterOfMass; } components.Add(new BoundsComponent(scenery, comOffset - new Vector3(0.02f), comOffset + new Vector3(0.02f), new Vector4(1f, 1f, 0, 1f))); components.Add(new BoundsComponent(scenery, new Vector3(-0.02f), new Vector3(0.02f), new Vector4(0, 1f, 0, 1f))); components.Add(new OriginalTagComponent(scenery, instance)); scenery.SetComponents(xform, components.ToArray()); return(scenery); }
private static void PopulateVehicle(Vehicle item, H2vMap map, TransformComponent xform, VehicleTag vehi) { item.FriendlyName = vehi.Name; item.SetComponents(xform, PhysicsComponentFactory.CreateDynamicRigidBody(item, xform, map, vehi.Hlmt), new RenderModelComponent(item, new Model <BitmapTag> { Note = $"[{vehi.Id}] {vehi.Name}", Flags = ModelFlags.Diffuse | ModelFlags.CastsShadows | ModelFlags.ReceivesShadows, Meshes = MeshFactory.GetRenderModel(map, vehi.Hlmt) })); }
private static List <Entity> CreateFromItemCollection(H2vMap map, ItemCollectionTag itmc, ScenarioTag.ItemCollectionPlacement instance) { var entities = new List <Entity>(); // I've only seen 1 item collections though foreach (var item in itmc.Items) { if (map.TryGetTag <BaseTag>(item.ItemTag, out var tag) == false) { throw new Exception("No tag found for weap/equip"); } TagRef <HaloModelTag> itemHlmt = default; if (tag is WeaponTag weap) { itemHlmt = weap.Hlmt; } if (tag is EquipmentTag eqip) { itemHlmt = eqip.Hlmt; } if (itemHlmt == default) { continue; } var entity = new Item(); entity.FriendlyName = tag.Name; var renderModel = new RenderModelComponent(entity, new Model <BitmapTag> { Note = $"[{itmc.Id}] {itmc.Name}", //Position = instance.Position, //Orientation = baseRotation, //Scale = new Vector3(1.3f), Flags = ModelFlags.Diffuse | ModelFlags.CastsShadows | ModelFlags.ReceivesShadows, Meshes = MeshFactory.GetRenderModel(map, itemHlmt) }); var xform = new TransformComponent(entity, instance.Position, QuaternionExtensions.FromH2vOrientation(instance.Orientation)); var body = PhysicsComponentFactory.CreateDynamicRigidBody(entity, xform, map, itemHlmt); entity.SetComponents(xform, renderModel, body); entities.Add(entity); } return(entities); }
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 Scenery FromTag(H2vMap map, ScenarioTag scenario, ScenarioTag.SceneryInstance instance) { var scenery = new Scenery(); scenery.FriendlyName = "Scenery_" + instance.SceneryDefinitionIndex; var id = scenario.SceneryDefinitions[instance.SceneryDefinitionIndex].Scenery; var tag = map.GetTag(id); scenery.FriendlyName = tag.Name; var meshes = MeshFactory.GetRenderModel(map, tag.Model); var transparentMeshes = new List <Mesh <BitmapTag> >(meshes.Length); var renderModelMeshes = new List <Mesh <BitmapTag> >(meshes.Length); foreach (var mesh in meshes) { var mat = mesh.Material; if (mat.AlphaMap == null) { renderModelMeshes.Add(mesh); } else { transparentMeshes.Add(mesh); } } var components = new List <Component>(); components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{tag.Id}] {tag.Name}", Meshes = renderModelMeshes.ToArray(), Flags = ModelFlags.Diffuse | ModelFlags.CastsShadows | ModelFlags.ReceivesShadows })); foreach (var transparentMesh in transparentMeshes) { components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"[{tag.Id}] {tag.Name}", Meshes = new[] { transparentMesh }, Flags = ModelFlags.IsTransparent })); } var orientation = QuaternionExtensions.FromH2vOrientation(instance.Orientation); var xform = new TransformComponent(scenery, instance.Position, orientation); var body = PhysicsComponentFactory.CreateStaticRigidBody(scenery, xform, map, tag.Model); if (body != null) { components.Add(body); components.Add(new RenderModelComponent(scenery, new Model <BitmapTag> { Note = $"scenery//{scenery.FriendlyName}-collision", Meshes = MeshFactory.GetRenderModel(body.Collider, new Vector4(0.9f, 0.5f, .24f, 1f)), Flags = ModelFlags.Wireframe | ModelFlags.IsStatic, RenderLayer = RenderLayers.Collision })); } scenery.SetComponents(xform, components.ToArray()); 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); }
public static Actor FromStartingLocation(H2vMap map, ScenarioTag.AiSquadDefinition.StartingLocation loc) { var entity = new Actor(); entity.FriendlyName = loc.Description; var charIndex = loc.CharacterIndex; if (charIndex == ushort.MaxValue) { charIndex = map.Scenario.AiSquadDefinitions[loc.SquadIndex].CharacterIndex; } if (charIndex == ushort.MaxValue) { throw new Exception("Couldn't determine character to create"); } var character = map.GetTag(map.Scenario.CharacterDefinitions[charIndex].CharacterReference); if (map.TryGetTag <BaseTag>(character.Unit, out var unit) == false) { return(entity); } TagRef <HaloModelTag> model = default; if (unit is BipedTag biped) { model = biped.Model; } else if (unit is VehicleTag vehicle) { model = vehicle.Hlmt; } var comp = new RenderModelComponent(entity, new Model <BitmapTag> { Note = $"[{unit.Id}] {unit.Name}", Flags = ModelFlags.Diffuse | ModelFlags.CastsShadows | ModelFlags.ReceivesShadows, Meshes = MeshFactory.GetRenderModel(map, model) }); var boneComp = new RenderModelComponent(entity, new Model <BitmapTag> { Note = $"[{unit.Id}] {unit.Name} Bones", Flags = ModelFlags.Wireframe, Meshes = MeshFactory.GetBonesModel(map, model), RenderLayer = RenderLayers.Debug }); var orientation = Quaternion.CreateFromAxisAngle(EngineGlobals.Up, loc.Rotation); var xform = new TransformComponent(entity, loc.Position, orientation); // TODO: add back var body = PhysicsComponentFactory.CreateDynamicRigidBody(entity, xform, map, model); var comOffset = Vector3.Zero; if (map.TryGetTag(model, out var hlmt) && map.TryGetTag(hlmt.PhysicsModel, out var phmo) && phmo.BodyParameters.Length > 0) { comOffset = phmo.BodyParameters[0].CenterOfMass; } var centerOfMass = new BoundsComponent(entity, comOffset - new Vector3(0.02f), comOffset + new Vector3(0.02f), new Vector4(1f, 1f, 0, 1f)); var origin = new BoundsComponent(entity, new Vector3(-0.02f), new Vector3(0.02f), new Vector4(0, 1f, 0, 1f)); var originalTag = new OriginalTagComponent(entity, loc); entity.SetComponents(xform, comp, boneComp, centerOfMass, origin, originalTag); return(entity); }