Esempio n. 1
0
        public static ICollider GetConvexColliderForHlmt(H2vMap map, HaloModelTag hlmt, int damageLevel = 0)
        {
            if (map.TryGetTag(hlmt.ColliderId, out var coll) == false)
            {
                // TODO: determine why collider can be invalid, if it's expected
                return(DefaultCollider);
            }

            if (coll.ColliderComponents.Length == 0 ||
                coll.ColliderComponents[0].DamageLevels.Length <= damageLevel ||
                coll.ColliderComponents[0].DamageLevels[damageLevel].Parts.Length == 0)
            {
                Console.WriteLine($"No colliders defined in coll[{hlmt.ColliderId}] for damage level {damageLevel}");
                return(DefaultCollider);
            }

            var colliderMeshes = new List <Vector3[]>();

            foreach (var component in coll.ColliderComponents)
            {
                var container = component.DamageLevels[damageLevel];

                foreach (var info in container.Parts)
                {
                    colliderMeshes.Add(info.Vertices.Select(v => new Vector3(v.x, v.y, v.z)).ToArray());
                }
            }

            var collider = new ConvexModelCollider(colliderMeshes);

            return(collider);
        }
Esempio n. 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);
        }
Esempio n. 3
0
        public static void AddLocators(H2vMap map, Scene destination)
        {
            var scenario = map.GetLocalTagsOfType <ScenarioTag>().First();

            //foreach (var obj in scenario.Obj96s)
            //{
            //    AddAtLocation(96, obj.Position, colors[0], destination);
            //}
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 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)
     }));
 }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
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);
        }
Esempio n. 9
0
        public TagTranslator(H2vMap scene)
        {
            this.scene = scene;
            this.cache = new TagDataCache();

            foreach (var entry in scene.TagIndex)
            {
                // TODO: Tag can be null here because we don't process all tags yet
                if (scene.TryGetTag <BaseTag>(entry.ID, out var tag) && tag != null)
                {
                    this.AddTag(tag);
                }
            }
        }
Esempio n. 10
0
        public static Vehicle CreateFromVehicleInstance(H2vMap map, ScenarioTag scenario, ScenarioTag.VehicleInstance instance)
        {
            var item = new Vehicle();

            item.FriendlyName = "Vehicle_" + instance.Index;

            var def = scenario.VehicleDefinitions[instance.Index];

            if (map.TryGetTag(def.Vehicle, out var vehi) == false)
            {
                throw new Exception("No tag found for vehi reference");
            }

            var xform = new TransformComponent(item, instance.Position, QuaternionExtensions.FromH2vOrientation(instance.Orientation));

            PopulateVehicle(item, map, xform, vehi);

            return(item);
        }
Esempio n. 11
0
        public Material <BitmapTag> CreateMaterial(H2vMap map, ModelMesh mesh)
        {
            if (createdMaterials.TryGetValue(mesh.Shader.Id, out var mat))
            {
                return(mat);
            }

            mat = new Material <BitmapTag>
            {
                DiffuseColor = VectorExtensions.RandomColor()
            };

            if (map.TryGetTag(mesh.Shader, out var shader) == false)
            {
                return(mat);
            }

            var args        = shader.Arguments[0];
            var templateTag = map.GetTag(args.ShaderTemplate);
            var templateKey = templateTag.Name;

            if (mappingConfig.Aliases.TryGetValue(templateKey, out var alias))
            {
                templateKey = alias.Alias;
            }

            if (mappingConfig.Mappings.TryGetValue(templateKey, out var mapping))
            {
                PopulateFromMapping(map, mat, args, mapping);
                return(mat);
            }

            if (stemsWarned.Contains(shader.ShaderTemplate.Id) == false)
            {
                Console.WriteLine($"Using heuristic for shader '{shader.Name}' stem[{shader.ShaderTemplate.Id}]");
                stemsWarned.Add(shader.ShaderTemplate.Id);
            }

            PopulateFromHeuristic(map, mat, shader);

            return(mat);
        }
Esempio n. 12
0
        private static List <Entity> CreateFromVehicleCollection(H2vMap map, VehicleCollectionTag vehc, ScenarioTag.ItemCollectionPlacement instance)
        {
            var entities = new List <Entity>();

            // I've only seen 1 item collections though
            foreach (var vehicle in vehc.VehicleReferences)
            {
                if (map.TryGetTag(vehicle.Vehicle, out var vehi) == false)
                {
                    throw new Exception("No tag found for vehc reference");
                }

                var entity = new Vehicle();
                entity.FriendlyName = vehi.Name;
                var xform = new TransformComponent(entity, instance.Position, QuaternionExtensions.FromH2vOrientation(instance.Orientation));
                PopulateVehicle(entity, map, xform, vehi);
                entities.Add(entity);
            }

            return(entities);
        }
Esempio n. 13
0
        public static ICollider GetTriangleColliderForHlmt(H2vMap map, HaloModelTag hlmt, int damageLevel = 0)
        {
            if (hlmt.ColliderId.IsInvalid)
            {
                return(DefaultCollider);
            }

            if (map.TryGetTag(hlmt.ColliderId, out var coll) == false)
            {
                Console.WriteLine($"Couldn't find COLL[{hlmt.ColliderId.Id}]");
                return(DefaultCollider);
            }

            if (coll.ColliderComponents.Length == 0 ||
                coll.ColliderComponents[0].DamageLevels.Length <= damageLevel ||
                coll.ColliderComponents[0].DamageLevels[damageLevel].Parts.Length == 0)
            {
                Console.WriteLine($"No colliders defined in coll[{hlmt.ColliderId}] for damage level {damageLevel}");
                return(DefaultCollider);
            }

            var colliderMeshes = new List <TriangleMeshCollider>();

            foreach (var component in coll.ColliderComponents)
            {
                var container = component.DamageLevels[damageLevel];

                // TODO material lookup
                colliderMeshes.Add(TriangleMeshCollider.Create(container.Parts, i => - 1));
            }

            // TODO: relative transforms?
            var collider = new TriangleModelCollider()
            {
                MeshColliders = colliderMeshes.ToArray()
            };

            return(collider);
        }
Esempio n. 14
0
        private void PopulateFromMapping(
            H2vMap map,
            Material <BitmapTag> mat,
            ShaderTag.ShaderTemplateArguments args,
            MaterialMapping mapping)
        {
            mat.NormalMap      = args.GetBitmap(map, mapping.NormalMapIndex);
            mat.NormalMapScale = args.GetInput(mapping.NormalScaleIndex);

            mat.DiffuseMap = args.GetBitmap(map, mapping.DiffuseMapIndex);

            if (mapping.DiffuseColor.Length == 4)
            {
                mat.DiffuseColor = new Vector4(mapping.DiffuseColor[0], mapping.DiffuseColor[1], mapping.DiffuseColor[2], mapping.DiffuseColor[3]);
            }
            else if (mapping.DiffuseColor.Length == 1)
            {
                mat.DiffuseColor = new Vector4(mapping.DiffuseColor[0]);
            }

            mat.DetailMap1   = args.GetBitmap(map, mapping.Detail1MapIndex);
            mat.Detail1Scale = args.GetInput(mapping.Detail1ScaleIndex);

            mat.DetailMap2   = args.GetBitmap(map, mapping.Detail2MapIndex);
            mat.Detail2Scale = args.GetInput(mapping.Detail2ScaleIndex);

            mat.EmissiveMap       = args.GetBitmap(map, mapping.EmissiveMapIndex);
            mat.EmissiveArguments = args.GetInput(mapping.EmissiveArgumentsIndex);
            mat.EmissiveType      = mapping.EmissiveType;

            mat.AlphaMap     = args.GetBitmap(map, mapping.AlphaMapIndex);
            mat.AlphaFromRed = mapping.AlphaFromRed;

            mat.ColorChangeMask = args.GetBitmap(map, mapping.ColorChangeMaskMapIndex);

            mat.SpecularMap = args.GetBitmap(map, mapping.SpecularMapIndex);
        }
Esempio n. 15
0
        public static Entity FromTag(H2vMap map, ScenarioTag scenario, ScenarioTag.ItemCollectionPlacement instance)
        {
            if (instance.ItemCollectionReference.IsInvalid)
            {
                return(new Scenery());
            }

            if (map.TryGetTag <BaseTag>(instance.ItemCollectionReference, out var itemTag) == false)
            {
                throw new Exception("Unable to load itmc");
            }

            if (itemTag is ItemCollectionTag itmc)
            {
                return(CreateFromItemCollection(map, itmc, instance)[0]);
            }

            if (itemTag is VehicleCollectionTag vehc)
            {
                return(CreateFromVehicleCollection(map, vehc, instance)[0]);
            }

            return(new Scenery());
        }
Esempio n. 16
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);
        }
Esempio n. 17
0
        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);
        }
Esempio n. 18
0
        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);
        }
Esempio n. 19
0
        public static ICollider GetAggregateColliderForPhmo(H2vMap map, PhysicsModelTag phmo, int damageLevel = 0)
        {
            var collider = new AggregateCollider();

            var colliderMeshes      = new List <Vector3[]>();
            var convexModelMaterial = -1;

            foreach (var mesh in phmo.PolyhedraDefinitions)
            {
                var meshVerts = new List <Vector3>();

                for (var i = 0; i < mesh.CountA; i++)
                {
                    var x1 = mesh.FloatsC[i * 12 + 0];
                    var x2 = mesh.FloatsC[i * 12 + 1];
                    var x3 = mesh.FloatsC[i * 12 + 2];
                    var x4 = mesh.FloatsC[i * 12 + 3];

                    // TODO: figure out inidcator on how many polyhedra to read
                    if (x1 + x2 + x3 + x4 == 0)
                    {
                        break;
                    }

                    var y1 = mesh.FloatsC[i * 12 + 4];
                    var y2 = mesh.FloatsC[i * 12 + 5];
                    var y3 = mesh.FloatsC[i * 12 + 6];
                    var y4 = mesh.FloatsC[i * 12 + 7];

                    var z1 = mesh.FloatsC[i * 12 + 8];
                    var z2 = mesh.FloatsC[i * 12 + 9];
                    var z3 = mesh.FloatsC[i * 12 + 10];
                    var z4 = mesh.FloatsC[i * 12 + 11];

                    meshVerts.Add(new Vector3(x1, y1, z1));
                    meshVerts.Add(new Vector3(x2, y2, z2));
                    meshVerts.Add(new Vector3(x3, y3, z3));
                    meshVerts.Add(new Vector3(x4, y4, z4));
                }

                if (meshVerts.Count > 0)
                {
                    colliderMeshes.Add(meshVerts.ToArray());
                    convexModelMaterial = mesh.MaterialIndexMaybe;
                }
            }

            foreach (var p in phmo.PolyhedraAlternativeDefinitions)
            {
                var meshVerts = new List <Vector3>();

                var x1 = p.Floats[0];
                var x2 = p.Floats[1];
                var x3 = p.Floats[2];
                var x4 = p.Floats[3];

                var y1 = p.Floats[4];
                var y2 = p.Floats[5];
                var y3 = p.Floats[6];
                var y4 = p.Floats[7];

                var z1 = p.Floats[8];
                var z2 = p.Floats[9];
                var z3 = p.Floats[10];
                var z4 = p.Floats[11];

                meshVerts.Add(new Vector3(x1, y1, z1));
                meshVerts.Add(new Vector3(x2, y2, z2));
                meshVerts.Add(new Vector3(x3, y3, z3));
                meshVerts.Add(new Vector3(x4, y4, z4));

                //colliderMeshes.Add(meshVerts.ToArray());
            }

            if (colliderMeshes.Count > 0)
            {
                var convexModel = new ConvexModelCollider(colliderMeshes);
                convexModel.PhysicsMaterial = convexModelMaterial;

                collider.AddCollider(convexModel);
            }



            foreach (var box in phmo.BoxDefinitions)
            {
                var xform = new Transform();
                xform.UseTransformationMatrix(box.Transform);
                var boxCollider = new BoxCollider(xform, box.HalfWidthsMaybe);
                boxCollider.PhysicsMaterial = box.MaterialIndexMaybe;
                collider.AddCollider(boxCollider);
            }

            return(collider);
        }
Esempio n. 20
0
        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);
        }
Esempio n. 21
0
        public static BitmapTag GetBitmap(this ShaderTag.ShaderTemplateArguments args, H2vMap map, int?index)
        {
            if (index.HasValue == false)
            {
                return(null);
            }

            if (map.TryGetTag(args.BitmapArguments[index.Value].Bitmap, out var bitm))
            {
                return(bitm);
            }

            return(null);
        }
Esempio n. 22
0
 public Material <BitmapTag> CreateMaterial(H2vMap map, ModelMesh mesh) => new Material <BitmapTag>();
Esempio n. 23
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);
        }
Esempio n. 24
0
        private static void PopulateFromHeuristic(H2vMap map, Material <BitmapTag> mat, ShaderTag shader)
        {
            foreach (var info in shader.BitmapInfos)
            {
                if (info.AlphaBitmap.IsInvalid == false && mat.AlphaMap == default)
                {
                    map.TryGetTag(info.AlphaBitmap, out var alpha);
                    mat.AlphaMap = alpha;
                }

                if (info.DiffuseBitmap.IsInvalid == false && mat.DiffuseMap == default)
                {
                    map.TryGetTag(info.DiffuseBitmap, out var diff);
                    mat.DiffuseMap = diff;
                }
            }

            var args     = shader.Arguments[0];
            var bitmRefs = args.BitmapArguments;

            for (int i = 0; i < bitmRefs.Length; i++)
            {
                var bitmRef = bitmRefs[i];

                if (map.TryGetTag(bitmRef.Bitmap, out var bitm) == false)
                {
                    continue;
                }

                if (bitm == mat.DiffuseMap || bitm == mat.AlphaMap)
                {
                    continue;
                }

                if (bitm.TextureUsage == TextureUsage.Bump || bitm.Name.Contains("bump"))
                {
                    mat.NormalMap      = bitm;
                    mat.NormalMapScale = args.GetInput(0, new Vector4(1, 1, 0, 0));
                    continue;
                }

                if (bitm.TextureUsage == TextureUsage.Diffuse)
                {
                    if (mat.DiffuseMap == default)
                    {
                        mat.DiffuseMap = bitm;
                        continue;
                    }
                }

                if (bitm.TextureUsage == TextureUsage.Diffuse || bitm.TextureUsage == TextureUsage.Detail || bitm.Name.Contains("detail"))
                {
                    // HACK: if texture is small, it's likely not a detail map
                    if (bitm.TextureInfos[0].Width <= 16 || bitm.TextureInfos[0].Height <= 16)
                    {
                        continue;
                    }

                    int     inputOffset = i;
                    Vector4 detailScale = Vector4.Zero;

                    while ((detailScale.X < 1 || detailScale.Y < 1 || detailScale.Z != 0 || detailScale.W != 0) &&
                           inputOffset < args.ShaderInputs.Length)
                    {
                        detailScale = args.ShaderInputs[inputOffset];
                        inputOffset++;
                    }

                    if (mat.DetailMap1 == null)
                    {
                        mat.DetailMap1   = bitm;
                        mat.Detail1Scale = detailScale;
                        continue;
                    }
                    else if (mat.DetailMap2 == null)
                    {
                        mat.DetailMap2   = bitm;
                        mat.Detail2Scale = detailScale;
                        continue;
                    }
                }
            }
        }
Esempio n. 25
0
        private static void WriteInfo <TProp>(H2vMap map, Expression <Func <ScenarioTag.AiSquadDefinition, TProp> > accessor)
        {
            var vals = map.Scenario.AiSquadDefinitions;

            WriteInfo(vals, accessor);
        }
Esempio n. 26
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);
        }
Esempio n. 27
0
 public EntityCreator(H2vMap map)
 {
     this.Map = map;
 }
Esempio n. 28
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)
            });
        }