示例#1
0
        private void PlaceLights(Scene destination)
        {
            for (var i = 0; i < 9; i++)
            {
                var position = VectorExtensions.Random(3, 12);
                var color    = VectorExtensions.RandomColor(200);

                var item  = new Light();
                var model = new RenderModelComponent(item, ModelFactory.HalfTriangularThing(color));

                var xform = new TransformComponent(item, position);

                var light = new PointLightEmitterComponent(item)
                {
                    Light = new PointLight()
                    {
                        Color    = new Vector3(color.X, color.Y, color.Z),
                        Position = Vector3.Zero,
                        Radius   = 20f
                    }
                };

                item.SetComponents(new Component[] {
                    model,
                    xform,
                    light
                });

                destination.Entities.Add(Guid.NewGuid(), item);
            }
        }
示例#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);
        }
示例#3
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);
        }
示例#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);
        }
示例#5
0
        private static void AddAtLocation(uint id, Vector3 position, Vector4 color, Scene destination)
        {
            var item  = new Scenery();
            var model = new RenderModelComponent(item, ModelFactory.UnitPyramid(color));

            var xform = new TransformComponent(item, position);

            item.SetComponents(new Component[] {
                model,
                xform
            });

            destination.Entities.Add(Guid.NewGuid(), item);
        }
示例#6
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);
        }