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;
 }
Esempio n. 2
0
        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;
 }
Esempio n. 6
0
        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);
 }
Esempio n. 10
0
        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;
        }
Esempio n. 11
0
        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;
        }
Esempio n. 12
0
        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))));
        }
Esempio n. 13
0
 public void RemoveFromSelection(BillboardInstance inst)
 {
     if (_selectedBillboards == null || !_selectedBillboards.Contains(inst))
     return;
       _selectedBillboards.Remove(inst);
       OnSelectionChanged();
 }
Esempio n. 14
0
 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);
 }
Esempio n. 15
0
 bool SelectionContains(BillboardInstance inst)
 {
     foreach (BillboardInstance b in _sel)
     if (object.ReferenceEquals(b, inst))
       return true;
       return false;
 }
Esempio n. 16
0
 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;
 }
Esempio n. 17
0
        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);
        }
Esempio n. 18
0
        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;
        }
Esempio n. 19
0
        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();
              }
        }
Esempio n. 20
0
        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();
        }
Esempio n. 21
0
 int IndexInInstances(BillboardInstance inst)
 {
     for (int i = 0; i < _shape.Instances.Length; i++)
     if (_shape.Instances[i] == inst)
       return i;
       return -1;
 }
Esempio n. 22
0
        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);
        }
Esempio n. 23
0
        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();
        }