public PartDescription(int indexStart, int indexCount, TagRef <ShaderTag> shader, MeshElementType elementType) { IndexStart = indexStart; IndexCount = indexCount; Shader = shader; ElementType = elementType; }
public static ActorSpawn?SpawnPointFromStartingLocation(H2vMap map, ScenarioTag.AiSquadDefinition.StartingLocation loc) { var entity = new ActorSpawn(); entity.FriendlyName = loc.Description; var charIndex = loc.CharacterIndex; if (charIndex == ushort.MaxValue) { charIndex = map.Scenario.AiSquadDefinitions[loc.SquadIndex].CharacterIndex; } TagRef <HaloModelTag> model = default; string modelDesc = entity.FriendlyName; if (charIndex != ushort.MaxValue) { var character = map.GetTag(map.Scenario.CharacterDefinitions[charIndex].CharacterReference); if (map.TryGetTag <BaseTag>(character.Unit, out var unit) == false) { return(null); } modelDesc = $"[{unit.Id}] {unit.Name}"; if (unit is BipedTag biped) { model = biped.Model; } else if (unit is VehicleTag vehicle) { model = vehicle.Hlmt; } } else { // Use some default model? return(null); } var comp = new RenderModelComponent(entity, new Model <BitmapTag> { Note = modelDesc, Flags = ModelFlags.Diffuse | ModelFlags.CastsShadows | ModelFlags.ReceivesShadows, Meshes = MeshFactory.GetRenderModel(map, model), RenderLayer = RenderLayers.Scripting }); var orientation = Quaternion.CreateFromAxisAngle(EngineGlobals.Up, loc.Rotation); var xform = new TransformComponent(entity, loc.Position, orientation); var originalTag = new OriginalTagComponent(entity, loc); entity.SetComponents(new Component[] { xform, comp, originalTag }); return(entity); }
public void RemoveTag(int i_HashCode) { for (int tagRefIndex = 0; tagRefIndex < m_Tags.Count; ++tagRefIndex) { TagRef tagRef = m_Tags[tagRefIndex]; if (tagRef.hashCode == i_HashCode) { tagRef.RemoveRef(); return; } } }
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 bool HasTag(int i_HashCode) { for (int tagRefIndex = 0; tagRefIndex < m_Tags.Count; ++tagRefIndex) { TagRef tagRef = m_Tags[tagRefIndex]; if (tagRef.hashCode == i_HashCode) { return(tagRef.IsValid()); } } return(false); }
public void AddTag(int i_HashCode) { for (int tagRefIndex = 0; tagRefIndex < m_Tags.Count; ++tagRefIndex) { TagRef tagRef = m_Tags[tagRefIndex]; if (tagRef.hashCode == i_HashCode) { tagRef.AddRef(); return; } } // TagRef not found, create a new one. TagRef newTagRef = new TagRef(i_HashCode); newTagRef.AddRef(); m_Tags.Add(newTagRef); }
static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("Must provide 2 arguments: map path, and output directory"); return; } var mapPath = args[0]; var outPath = args[1]; if (File.Exists(mapPath) == false) { Console.WriteLine($"Error: Could not find {mapPath}"); return; } var factory = new MapFactory(Path.GetDirectoryName(mapPath)); var h2map = factory.Load(Path.GetFileName(mapPath)); if (h2map is not H2vMap scene) { throw new NotSupportedException("Only Vista maps are supported"); } var writer = new WavefrontObjWriter(Path.GetFileNameWithoutExtension(mapPath)); var bsps = scene.GetLocalTagsOfType <BspTag>(); var bspMeshes = bsps .SelectMany(b => b.RenderChunks); foreach (var chunk in bspMeshes) { //writer.WriteModel(chunk.Model, default, "bsp"); } var instancedGeometries = bsps.SelectMany(b => b.InstancedGeometryInstances .Select(i => new { Bsp = b, Instance = i })); foreach (var geom in instancedGeometries) { var def = geom.Bsp.InstancedGeometryDefinitions[geom.Instance.Index]; var xform = Matrix4x4.CreateScale(new Vector3(geom.Instance.Scale)) * Matrix4x4.CreateFromQuaternion(QuatFrom3x3Mat4(geom.Instance.RotationMatrix)) * Matrix4x4.CreateTranslation(geom.Instance.Position); // writer.WriteModel(def.Model, xform, "instanced_" + geom.Instance.Index); } var scenario = scene.GetLocalTagsOfType <ScenarioTag>().First(); //foreach(var blocInstance in scenario.BlocInstances) //{ // var def = scenario.BlocDefinitions[blocInstance.BlocDefinitionIndex]; // var xform = Matrix4x4.CreateScale(new Vector3(1)) // * Matrix4x4.CreateFromQuaternion(Quaternion.CreateFromYawPitchRoll(blocInstance.Orientation.Y, blocInstance.Orientation.Z, blocInstance.Orientation.X)) // * Matrix4x4.CreateTranslation(blocInstance.Position); // if(!scene.TryGetTag(def.Bloc, out var bloc)) // { // continue; // } // if (!scene.TryGetTag(bloc.PhysicalModel, out var hlmt)) // { // continue; // } // if (scene.TryGetTag(hlmt.RenderModel, out var mode)) // { // var part = mode.Components[0].DamageLevels[0].HighestPieceIndex; // writer.WriteModel(mode.Parts[part].Model, xform, "bloc_" + blocInstance.BlocDefinitionIndex); // } // if (scene.TryGetTag(hlmt.ColliderId, out var coll)) // { // var meshes = new List<ModelMesh>(); // foreach (var comp in coll.ColliderComponents) // { // var level = comp.DamageLevels[0]; // //foreach(var level in comp.DamageLevels) // { // var triMesh = GetTriangulatedCollisionMesh(level.Parts); // meshes.Add(new ModelMesh() // { // Indices = triMesh.Item2.ToArray(), // Verticies = triMesh.Item1.Select(v => new VertexFormat(v, Vector2.Zero, Vector3.Zero)).ToArray(), // ElementType = Foundation.MeshElementType.TriangleList // }); // } // } // var model = new MeshCollection(meshes.ToArray()); // writer.WriteModel(model, xform, "bloc_" + blocInstance.BlocDefinitionIndex + "_coll"); // } //} //foreach (var scenInstance in scenario.SceneryInstances) //{ // var def = scenario.SceneryDefinitions[scenInstance.SceneryDefinitionIndex]; // var xform = Matrix4x4.CreateScale(new Vector3(1)) // * Matrix4x4.CreateFromQuaternion(Quaternion.CreateFromYawPitchRoll(scenInstance.Orientation.Y, scenInstance.Orientation.Z, scenInstance.Orientation.X)) // * Matrix4x4.CreateTranslation(scenInstance.Position); // if (!scene.TryGetTag(def.Scenery, out var scen)) // { // continue; // } // if (!scene.TryGetTag(scen.PhysicalModel, out var phmo)) // { // continue; // } // if (!scene.TryGetTag(phmo.RenderModel, out var mode)) // { // continue; // } // writer.WriteModel(mode.Parts[0].Model, xform, "scen_" + scenInstance.SceneryDefinitionIndex); //} foreach (var machInstance in scenario.MachineryInstances) { var def = scenario.MachineryDefinitions[machInstance.MachineryDefinitionIndex]; var xform = Matrix4x4.CreateScale(new Vector3(1)) * Matrix4x4.CreateFromQuaternion(Quaternion.CreateFromYawPitchRoll(machInstance.Orientation.Y, machInstance.Orientation.Z, machInstance.Orientation.X)) * Matrix4x4.CreateTranslation(machInstance.Position); if (!scene.TryGetTag(def.Machinery, out var mach)) { continue; } if (!scene.TryGetTag(mach.Model, out var hlmt)) { continue; } if (scene.TryGetTag(hlmt.RenderModel, out var mode)) { //writer.WriteModel(mode.Parts[0].Model, xform, "mach_" + machInstance.MachineryDefinitionIndex); } if (scene.TryGetTag(hlmt.ColliderId, out var coll)) { var meshes = new List <ModelMesh>(); foreach (var comp in coll.ColliderComponents) { var level = comp.DamageLevels[0]; //foreach(var level in comp.DamageLevels) { var triMesh = GetTriangulatedCollisionMesh(level.Parts); meshes.Add(new ModelMesh() { Indices = triMesh.Item2.ToArray(), Verticies = triMesh.Item1.Select(v => new VertexFormat(v, Vector2.Zero, Vector3.Zero)).ToArray(), ElementType = Foundation.MeshElementType.TriangleList }); } } var model = new MeshCollection(meshes.ToArray()); //writer.WriteModel(model, xform, "mach_" + machInstance.MachineryDefinitionIndex + "_coll"); } } foreach (var itemPlacement in scenario.ItemCollectionPlacements) { var xform = Matrix4x4.CreateScale(new Vector3(1)) * Matrix4x4.CreateFromQuaternion(Quaternion.CreateFromYawPitchRoll(itemPlacement.Orientation.Y, itemPlacement.Orientation.Z, itemPlacement.Orientation.X)) * Matrix4x4.CreateTranslation(itemPlacement.Position); if (!scene.TryGetTag <BaseTag>(itemPlacement.ItemCollectionReference, out var itemTag)) { continue; } TagRef <HaloModelTag> hlmtRef = default; if (itemTag is ItemCollectionTag itmc) { if (!scene.TryGetTag <BaseTag>(itmc.Items[0].ItemTag, out var item)) { continue; } if (item is WeaponTag weap) { hlmtRef = weap.Hlmt; } } if (hlmtRef == default) { continue; } if (!scene.TryGetTag(hlmtRef, out var hlmt)) { continue; } if (!scene.TryGetTag(hlmt.RenderModel, out var mode)) { continue; } var index = mode.Components[0].DamageLevels[0].HighestPieceIndex; //writer.WriteModel(mode.Parts[index].Model, xform, "itmc_" + itemPlacement.ItemCollectionReference); } var count = 0; foreach (var character in scenario.CharacterDefinitions) { var charTag = scene.GetTag(character.CharacterReference); Console.WriteLine("Dumping char " + character.CharacterReference.Id); var xform = Matrix4x4.CreateScale(new Vector3(1)) * Matrix4x4.CreateFromQuaternion(Quaternion.Identity) * Matrix4x4.CreateTranslation(new Vector3(1f * count++, 0, 0)); if (!scene.TryGetTag(charTag.Unit, out BaseTag unit)) { continue; } TagRef <HaloModelTag> hlmtRef; if (unit is BipedTag biped) { hlmtRef = biped.Model; } else if (unit is VehicleTag vehi) { hlmtRef = vehi.Hlmt; } else { continue; } if (!scene.TryGetTag(hlmtRef, out var hlmt)) { continue; } if (scene.TryGetTag(hlmt.RenderModel, out var mode)) { writer.WriteModel(mode.Parts[0].Model, xform, "char_" + character.CharacterReference.Id); } //if (scene.TryGetTag(hlmt.ColliderId, out var coll)) //{ // var meshes = new List<ModelMesh>(); // foreach (var comp in coll.ColliderComponents) // { // var level = comp.DamageLevels[0]; // //foreach(var level in comp.DamageLevels) // { // var triMesh = GetTriangulatedCollisionMesh(level.Parts); // meshes.Add(new ModelMesh() // { // Indices = triMesh.Item2.ToArray(), // Verticies = triMesh.Item1.Select(v => new VertexFormat(v, Vector2.Zero, Vector3.Zero)).ToArray(), // ElementType = Foundation.MeshElementType.TriangleList // }); // } // } // var model = new MeshCollection(meshes.ToArray()); // writer.WriteModel(model, xform, "mach_" + machInstance.MachineryDefinitionIndex + "_coll"); //} } File.WriteAllText(outPath, writer.ToString()); Console.WriteLine($"Processed {Path.GetFileName(mapPath)}"); Console.WriteLine("Press any key to exit"); Console.ReadLine(); }
public static StaticGeometryComponent CreateStaticRigidBody(Entity parent, TransformComponent transform, H2vMap map, TagRef <HaloModelTag> hlmtRef, int damageLevel = 0) { if (map.TryGetTag(hlmtRef, out var hlmt) == false) { return(null); } return(new StaticGeometryComponent(parent, transform) { Collider = ColliderFactory.GetTriangleColliderForHlmt(map, hlmt, damageLevel) }); }
public static RigidBodyComponent CreateKinematicRigidBody(Entity parent, TransformComponent transform, H2vMap map, TagRef <HaloModelTag> hlmtRef, int damageLevel = 0) { if (map.TryGetTag(hlmtRef, out var hlmt) == false) { throw new Exception($"Couldn't find HLMT[{hlmtRef.Id}]"); } RigidBodyComponent body; if (!map.TryGetTag(hlmt.PhysicsModel, out var phmo) || phmo.BodyParameters.Length == 0) { return(null); } var param = phmo.BodyParameters[0]; body = new RigidBodyComponent(parent, transform, param.InertiaTensor, param.Mass, param.CenterOfMass) { IsDynamic = false, Collider = ColliderFactory.GetTriangleColliderForHlmt(map, hlmt, damageLevel) }; return(body); }
public static RigidBodyComponent CreateDynamicRigidBody(Entity parent, TransformComponent transform, H2vMap map, TagRef <HaloModelTag> hlmtRef, int damageLevel = 0) { if (map.TryGetTag(hlmtRef, out var hlmt) == false) { throw new Exception($"Couldn't find HLMT[{hlmtRef.Id}]"); } RigidBodyComponent body; if (map.TryGetTag(hlmt.PhysicsModel, out var phmo) && phmo.BodyParameters.Length > 0) { var param = phmo.BodyParameters[0]; body = new RigidBodyComponent(parent, transform, param.InertiaTensor, param.Mass, param.CenterOfMass); body.Collider = ColliderFactory.GetAggregateColliderForPhmo(map, phmo, damageLevel); } else { body = new RigidBodyComponent(parent, transform); } return(body); }
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); }