public AddBillboardAction(BillboardGroupShape shape, BillboardInstance newInst) : base(shape,"Instances",null) { BillboardInstance[] _newArr = new BillboardInstance[shape.Instances.Length + 1]; for (int i = 0; i < shape.Instances.Length; i++) _newArr[i] = shape.Instances[i]; _newArr[_newArr.Length - 1] = newInst; this._newValue = _newArr; }
public static Mesh CreateMeshFromBillboardInstance(BillboardInstance billboardInstance) { NativeArray <Vector3> verticeArray = billboardInstance.VerticeList; NativeArray <int> indexArray = billboardInstance.IndexList; NativeArray <Vector2> uvArray = billboardInstance.UvList; NativeArray <Vector2> uv2Array = billboardInstance.Uv2List; NativeArray <Vector2> uv3Array = billboardInstance.Uv3List; NativeArray <Vector3> normalArray = billboardInstance.NormalList; Vector3[] vertices = new Vector3[billboardInstance.VerticeList.Length]; int[] indices = new int[billboardInstance.IndexList.Length]; Vector2[] uvs = new Vector2[billboardInstance.UvList.Length]; Vector2[] uv2S = new Vector2[billboardInstance.Uv2List.Length]; Vector2[] uv3S = new Vector2[billboardInstance.Uv3List.Length]; Vector3[] normals = new Vector3[billboardInstance.NormalList.Length]; verticeArray.CopyToFast(vertices); indexArray.CopyToFast(indices); uvArray.CopyToFast(uvs); uv2Array.CopyToFast(uv2S); uv3Array.CopyToFast(uv3S); normalArray.CopyToFast(normals); var newMesh = new Mesh { hideFlags = HideFlags.DontSave, subMeshCount = 1, indexFormat = IndexFormat.UInt32, vertices = vertices }; newMesh.SetIndices(indices, MeshTopology.Triangles, 0, false); newMesh.uv = uvs; newMesh.uv2 = uv2S; newMesh.uv3 = uv3S; newMesh.normals = normals; //TODO add bounds manually from billboard cell bounds //TODO replace with nativearray direct when unity adds interface. newMesh.RecalculateBounds(); return(newMesh); }
public RemoveBillboardAction(BillboardGroupShape shape, BillboardInstance[] sel) : base(shape, "Instances", null) { _shape = shape; _sel = sel; BillboardInstance[] _newArr = new BillboardInstance[shape.Instances.Length - sel.Length]; int j = 0; for (int i = 0; i < shape.Instances.Length; i++) if (!SelectionContains(shape.Instances[i])) _newArr[j++] = shape.Instances[i]; this._newValue = _newArr; }
protected MoveBillboardAction(SerializationInfo info, StreamingContext context) : base(info, context) { _shape = (BillboardGroupShape)info.GetValue("_shape", typeof(BillboardGroupShape)); _inst = (BillboardInstance)info.GetValue("_inst", typeof(BillboardInstance)); _oldPos = (Vector3F)info.GetValue("_oldPos", typeof(Vector3F)); _newPos = (Vector3F)info.GetValue("_newPos", typeof(Vector3F)); }
public MoveBillboardAction(BillboardGroupShape shape, BillboardInstance inst, Vector3F oldPos, Vector3F newPos) { _oldPos = oldPos; _newPos = newPos; _inst = inst; _shape = shape; }
public sealed override void DoPostProcess() { base.DoPostProcess(); palettes = new ScenePalette[] { new ScenePalette(0, null, "Scenery", sceneryPalette, PaletteTarget.Campaign | PaletteTarget.Multiplayer | PaletteTarget.UI), new ScenePalette(1, null, "Bipeds", bipedPalette, PaletteTarget.Campaign), new ScenePalette(2, null, "Vehicles", vehiclePalette, PaletteTarget.Campaign | PaletteTarget.Multiplayer), new ScenePalette(3, null, "Equipment", equipmentPalette, PaletteTarget.Campaign), new ScenePalette(4, null, "Weapons", weaponPalette, PaletteTarget.Campaign), new ScenePalette(5, null, "Machines", machinePalette, PaletteTarget.Campaign | PaletteTarget.Multiplayer | PaletteTarget.UI), new ScenePalette(6, null, "Controls", controlPalette, PaletteTarget.Campaign), new ScenePalette(7, null, "Light Fixtures", lightFixturePalette, PaletteTarget.Campaign | PaletteTarget.Multiplayer | PaletteTarget.UI), new ScenePalette(8, null, "Sound Scenery", soundSceneryPalette, PaletteTarget.Campaign | PaletteTarget.Multiplayer | PaletteTarget.UI), new ScenePalette(9, null, "Decals", null, PaletteTarget.Campaign | PaletteTarget.UI), }; for (int i = 0; i < scenarioValues.Skies.Count; i++) { skyPalette.Add(Open <sky>(scenarioValues.Skies[i].Sky.Value)); } for (int i = 0; i < scenarioValues.SceneryPalette.Count; i++) { sceneryPalette.Add(Open <scenery>(scenarioValues.SceneryPalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.BipedPalette.Count; i++) { bipedPalette.Add(Open <biped>(scenarioValues.BipedPalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.VehiclePalette.Count; i++) { vehiclePalette.Add(Open <vehicle>(scenarioValues.VehiclePalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.EquipmentPalette.Count; i++) { equipmentPalette.Add(Open <equipment>(scenarioValues.EquipmentPalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.WeaponPalette.Count; i++) { weaponPalette.Add(Open <weapon>(scenarioValues.WeaponPalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.MachinePalette.Count; i++) { machinePalette.Add(Open <device_machine>(scenarioValues.MachinePalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.ControlPalette.Count; i++) { controlPalette.Add(Open <device_control>(scenarioValues.ControlPalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.LightFixturesPalette.Count; i++) { lightFixturePalette.Add(Open <device_light_fixture>(scenarioValues.LightFixturesPalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.SoundSceneryPalette.Count; i++) { soundSceneryPalette.Add(Open <sound_scenery>(scenarioValues.SoundSceneryPalette[i].Name.Value)); } for (int i = 0; i < scenarioValues.StructureBsps.Count; i++) { bspPalette.Add(Open <scenario_structure_bsp>(scenarioValues.StructureBsps[i].StructureBsp.Value)); } for (int i = 0; i < scenarioValues.NetgameEquipment.Count; i++) { itemCollections.Add(Open <item_collection>(scenarioValues.NetgameEquipment[i].ItemCollection.Value)); } if (bspPalette.Count > 0) { instances.Add(bspPalette[bspIndex].Instance); bspList.Add(bspPalette[bspIndex]); } foreach (ScenarioSceneryBlock scenery in scenarioValues.Scenery) { if (scenery.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)sceneryPalette[scenery.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(scenery.Rotation, scenery.Position)); instances.Add(instance); } for (int i = 0; i < itemCollections.Count; i++) { if (itemCollections[i] == null) { continue; } WorldInstance instance = (WorldInstance)itemCollections[i].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.NetgameEquipment; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform( scenarioValues.NetgameEquipment[i].Facing, scenarioValues.NetgameEquipment[i].Position)); instances.Add(instance); } foreach (ScenarioBipedBlock biped in scenarioValues.Bipeds) { if (biped.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)bipedPalette[biped.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(biped.Rotation, biped.Position)); instances.Add(instance); } foreach (ScenarioVehicleBlock vehicle in scenarioValues.Vehicles) { if (vehicle.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)vehiclePalette[vehicle.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(vehicle.Rotation, vehicle.Position)); instances.Add(instance); } foreach (ScenarioEquipmentBlock equipment in scenarioValues.Equipment) { if (equipment.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)equipmentPalette[equipment.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(equipment.Rotation, equipment.Position)); instances.Add(instance); } foreach (ScenarioWeaponBlock weapon in scenarioValues.Weapons) { if (weapon.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)weaponPalette[weapon.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(weapon.Rotation, weapon.Position)); instances.Add(instance); } foreach (ScenarioMachineBlock machine in scenarioValues.Machines) { if (machine.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)machinePalette[machine.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(machine.Rotation, machine.Position)); instances.Add(instance); } foreach (ScenarioControlBlock control in scenarioValues.Controls) { if (control.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)controlPalette[control.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(control.Rotation, control.Position)); instances.Add(instance); } foreach (ScenarioLightFixtureBlock lightFixture in scenarioValues.LightFixtures) { if (lightFixture.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)lightFixturePalette[lightFixture.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.OcclusionNode = true; instance.SetBindingTransform(new BindingTransform(lightFixture.Rotation, lightFixture.Position)); instances.Add(instance); } foreach (ScenarioSoundSceneryBlock soundScenery in scenarioValues.SoundScenery) { if (soundScenery.Type.Value < 0) { continue; } WorldInstance instance = (WorldInstance)soundSceneryPalette[soundScenery.Type.Value].Instance; if (instance is ObjectInstance) { (instance as ObjectInstance).EnvironmentProvider = this; } instance.TargetType = TargetType.Object; instance.SetBindingTransform(new BindingTransform(soundScenery.Rotation, soundScenery.Position)); instances.Add(instance); } foreach (ScenarioNetgameFlagsBlock flagBlock in scenarioValues.NetgameFlags) { Billboard bb = new Billboard((BillboardType)flagBlock.Type.Value); BoundingBox box = new BoundingBox(); box.min[0] = -1; box.min[1] = -1; box.min[2] = -1; box.max[0] = 1; box.max[1] = 1; box.max[2] = 1; BillboardInstance bi = new BillboardInstance(bb, new Vector3(), box); bi.TargetType = TargetType.NetgameFlag; bi.SetBindingTransform(new BindingTransform(flagBlock.Facing, flagBlock.Position)); instances.Add(bi); } bspPalette[0].WorldBounds = bspPalette[0].CalculateWorldBounds(AnglesToVector(skyPalette[0].SkyValues.Lights[0].Direction.P, skyPalette[0].SkyValues.Lights[0].Direction.Y, 0)); WorldBounds totalBounds = bspPalette[0].WorldBounds; foreach (IBsp bsp in bspPalette) { totalBounds &= bsp.WorldBounds; } RadiosityBounds = totalBounds; }
public void ApplyRandomAtlasFrame(BillboardInstance[] sel) { string name = string.Format("Apply random atlas frame"); ModifyBillboardsAction action = new ModifyBillboardsAction(this, sel, name); BillboardInstance[] inst = action.NewInstances; foreach (BillboardInstance b in inst) b._fAtlasValue = (float)Rnd.NextDouble(); EditorManager.Actions.Add(action); }
protected ScaleBillboardAction(SerializationInfo info, StreamingContext context) : base(info, context) { _shape = (BillboardGroupShape)info.GetValue("_shape", typeof(BillboardGroupShape)); _inst = (BillboardInstance)info.GetValue("_inst", typeof(BillboardInstance)); _oldSX = info.GetSingle("_oldSX"); _oldSY = info.GetSingle("_oldSY"); _newSX = info.GetSingle("_newSX"); _newSY = info.GetSingle("_newSY"); }
public HotSpotBillboardMove(BillboardGroupShape shape, BillboardInstance inst) : base(shape, shape.BaseSizeX * 0.25f) { _inst = inst; this.CurrentPosition = new Vector3F(_inst.X, _inst.Y, _inst.Z); }
public override bool OnMouseClick() { bool bUpdate = base.OnMouseClick(); if (_keyMod != KeyModifier.None) { BillboardInstance inst = BillboardGroupShape.PickBillboard(MouseX, MouseY); if (inst == null) return bUpdate; BillboardInstance[] list = new BillboardInstance[1]; list[0] = inst; EditorManager.Actions.Add(new RemoveBillboardAction(BillboardGroupShape.CurrentBillboard, list)); bUpdate = true; } return bUpdate; }
public override bool OnMouseClick() { bool bUpdate = base.OnMouseClick(); if (_keyMod != KeyModifier.None) { BillboardGroupShape shape = BillboardGroupShape.CurrentBillboard; if (shape == null) return bUpdate; Vector3F startRay, endRay; Vector3F hitPoint = new Vector3F(); EditorManager.EngineManager.GetRayAtScreenPos(out startRay, out endRay, MouseX, MouseY, EditorManager.Settings.MaxPickingDistance); if (!EditorManager.EngineManager.GetTraceHit(startRay, endRay, ref hitPoint)) return bUpdate; // bring into local space: hitPoint -= shape.Position; Matrix3F rot = shape.RotationMatrix; rot.Transpose(); hitPoint = rot * hitPoint; BillboardInstance _newInst = new BillboardInstance(); _newInst.X = hitPoint.X; _newInst.Y = hitPoint.Y; _newInst.Z = hitPoint.Z; // add variation from context: float fScale = UniformScaling * (1.0f + (float)rnd.NextDouble()*ScaleVariation*2.0f-ScaleVariation); _newInst.UniformScale = fScale; // sub-image: Any image from the atlas _newInst._fAtlasValue = (float)rnd.NextDouble(); EditorManager.Actions.Add(new AddBillboardAction(shape, _newInst)); bUpdate = true; } return bUpdate; }
public void RemoveOverlappingInstances(BillboardInstance[] sel) { if (sel == null) sel = this._instances; // build a list of overlapping: ArrayList removed = new ArrayList(100); float m = Math.Max(this.PivotCenterX, 1.0f - PivotCenterX); foreach (BillboardInstance a in sel) foreach (BillboardInstance b in sel) if (!removed.Contains(a) && !removed.Contains(b) && !object.ReferenceEquals(a, b)) { Vector3F dist = new Vector3F(a.X - b.X, a.Y - b.Y, a.Z - b.Z); float rA = m * a._fFinalScaleX; float rB = m * b._fFinalScaleY; if (dist.GetLength() > (rA + rB)) continue; removed.Add(b); } if (removed.Count < 1) return; EditorManager.Actions.Add(new RemoveBillboardAction(this, (BillboardInstance[])removed.ToArray(typeof(BillboardInstance)))); }
public void RemoveFromSelection(BillboardInstance inst) { if (_selectedBillboards == null || !_selectedBillboards.Contains(inst)) return; _selectedBillboards.Remove(inst); OnSelectionChanged(); }
public void RelaxPositions(BillboardInstance[] sel) { ModifyBillboardsAction action = new ModifyBillboardsAction(this,sel,"Relax billboard positions"); float m = Math.Max(this.PivotCenterX, 1.0f - PivotCenterX); m *= 2.0f; // wanted distance EngineMesh.RelaxPositions(action.NewInstances, m, 20); EditorManager.Actions.Add(action); }
bool SelectionContains(BillboardInstance inst) { foreach (BillboardInstance b in _sel) if (object.ReferenceEquals(b, inst)) return true; return false; }
public ScaleBillboardAction(BillboardGroupShape shape, BillboardInstance inst, float oldSX, float oldSY, float newSX, float newSY) { _inst = inst; _shape = shape; _oldSX = oldSX; _oldSY = oldSY; _newSX = newSX; _newSY = newSY; }
public HotSpotBillboardSize(BillboardGroupShape shape, BillboardInstance inst, bool bHoriz) : base(shape, @"textures\Hotspot_R.dds", VisionColors.Yellow, PickType.Square, 4.0f) { _inst = inst; _bHoriz = bHoriz; TextureAtlas.AtlasEntry atlas = shape.Atlas.GetRandomEntry(inst._fAtlasValue); if (_bHoriz) { StartDistance = inst.ScaleX; // so we can use it directly for scaling DisplayScaling = shape.BaseSizeX * 0.5f * atlas.ResultingScaleX; } else { StartDistance = inst.ScaleY; // so we can use it directly for scaling DisplayScaling = shape.BaseSizeY * 1.0f * atlas.ResultingScaleY; } this.CurrentPosition = new Vector3F(_inst.X, _inst.Y, _inst.Z); }
public BillboardDropToFloorAction(BillboardGroupShape shape, BillboardInstance[] instances, Shape3D.DropToFloorMode mode, Vector3F axis, ShapeCollection colliderShapes) { _instances = instances; if (_instances == null) _instances = shape.Instances; _shape = shape; _mode = mode; _oldHeights = new float[_instances.Length]; _newHeights = new float[_instances.Length]; for (int i = 0; i < _instances.Length; i++) _oldHeights[i] = _instances[i].Z; _shape.EngineMesh.GetDropToFloorHeights(_shape, _instances, _mode, axis, colliderShapes); for (int i = 0; i < _instances.Length; i++) _newHeights[i] = _instances[i].Z; }
public ModifyBillboardsAction(BillboardGroupShape shape, BillboardInstance[] sel, string name) { if (sel==null) sel = shape.Instances; _name = name; _shape = shape; oldInst = new BillboardInstance[sel.Length]; NewInstances = new BillboardInstance[sel.Length]; _remapping = new int[sel.Length]; // build a mapping table of indices where to replace the list of all instances for (int i = 0; i < sel.Length; i++) { _remapping[i] = IndexInInstances(sel[i]); oldInst[i] = sel[i]; NewInstances[i] = (BillboardInstance)oldInst[i].Clone(); } }
public void AddToSelection(BillboardInstance inst, bool bXOR) { if (_selectedBillboards == null) _selectedBillboards = new ArrayList(); if (_selectedBillboards.Contains(inst)) { if (bXOR) _selectedBillboards.Remove(inst); } else _selectedBillboards.Add(inst); OnSelectionChanged(); }
int IndexInInstances(BillboardInstance inst) { for (int i = 0; i < _shape.Instances.Length; i++) if (_shape.Instances[i] == inst) return i; return -1; }
public void ApplyRandomScale(BillboardInstance[] sel, float fPercentage) { string name = string.Format("Apply billboard scaling +/-{0}%", fPercentage); ModifyBillboardsAction action = new ModifyBillboardsAction(this, sel, name); BillboardInstance[] scaled = action.NewInstances; foreach (BillboardInstance b in scaled) { float f = 1.0f + (float)(Rnd.NextDouble()-0.5) * 0.02f * fPercentage; b.ScaleX *= f; b.ScaleY *= f; } EditorManager.Actions.Add(action); }
void ReplaceInstances(BillboardInstance[] list) { bool bNeedsSelUpdate = false; for (int i = 0; i < list.Length; i++) if (_remapping[i] >= 0) { // make sure it is also replaced in the list of selected instances BillboardInstance old = _shape.Instances[_remapping[i]]; if (_shape._selectedBillboards != null && _shape._selectedBillboards.Contains(old)) { int iPos = _shape._selectedBillboards.IndexOf(old); _shape._selectedBillboards[iPos] = list[i]; bNeedsSelUpdate = true; } // replace instance _shape.Instances[_remapping[i]] = list[i]; } if (bNeedsSelUpdate) _shape.OnSelectionChanged(); }