public PartDescription(int indexStart, int indexCount, TagRef <ShaderTag> shader, MeshElementType elementType)
 {
     IndexStart  = indexStart;
     IndexCount  = indexCount;
     Shader      = shader;
     ElementType = elementType;
 }
Пример #2
0
        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;
            }
        }
    }
Пример #4
0
        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);
    }
Пример #7
0
        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();
        }
Пример #8
0
        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)
            });
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }