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); } }
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 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); }
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); }
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); }
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); }