Example #1
0
        public void OnTerrainClicked(IntersectionParams parameters, MouseEventArgs args)
        {
            if (EditManager.Instance.CurrentMode == EditMode.Chunk)
            {
                return;
            }

            if (args.Button != MouseButtons.Left)
            {
                if (args.Button == MouseButtons.Right)
                {
                    var state = new byte[256];
                    UnsafeNativeMethods.GetKeyboardState(state);
                    if (KeyHelper.IsKeyDown(state, Keys.ControlKey))
                    {
                        WorldFrame.Instance.M2Manager.RemoveInstance(mSelectedModel, M2InstanceUuid);
                        mHoveredInstance = null;
                        mSelectedModel   = null;
                        WorldFrame.Instance.OnWorldClicked -= OnTerrainClicked;
                    }
                }

                ModelEditManager.Instance.IsCopying = false;
                return;
            }

            if (parameters.TerrainHit == false)
            {
                return;
            }

            if (mHoveredInstance == null)
            {
                return;
            }

            SpawnModel(parameters.TerrainPosition);

            ModelEditManager.Instance.IsCopying = !EditorWindowController.Instance.SpawnModel.DeselectModelOnClick;

            if (!ModelEditManager.Instance.IsCopying)
            {
                WorldFrame.Instance.M2Manager.RemoveInstance(mSelectedModel, M2InstanceUuid);
                mHoveredInstance = null;
                mSelectedModel   = null;
                WorldFrame.Instance.OnWorldClicked -= OnTerrainClicked;
            }
        }
Example #2
0
        public void SelectModel(string model)
        {
            if (mHoveredInstance != null)
            {
                WorldFrame.Instance.M2Manager.RemoveInstance(mSelectedModel, M2InstanceUuid);
                mHoveredInstance = null;
            }

            var position = Vector3.Zero;

            if (WorldFrame.Instance.LastMouseIntersection != null &&
                WorldFrame.Instance.LastMouseIntersection.TerrainHit)
            {
                position = WorldFrame.Instance.LastMouseIntersection.TerrainPosition;
            }

            mSelectedModel   = model;
            mHoveredInstance = WorldFrame.Instance.M2Manager.AddInstance(model, M2InstanceUuid, position, Vector3.Zero, Vector3.One);

            if (mHoveredInstance == null)
            {
                mSelectedModel = null;
                return;
            }

            mInstanceRef = new[]
            {
                new M2Instance
                {
                    BoundingBox    = mHoveredInstance.BoundingBox,
                    Hash           = mSelectedModel.ToUpperInvariant().GetHashCode(),
                    MddfIndex      = -1,
                    RenderInstance = mHoveredInstance,
                    Uuid           = M2InstanceUuid
                }
            };

            WorldFrame.Instance.OnWorldClicked += OnTerrainClicked;
        }
Example #3
0
        public void Intersect(IntersectionParams parameters)
        {
            if (mVisibleInstances == null || mNonBatchedInstances == null || mSortedInstances == null)
            {
                return;
            }

            var globalRay = Picking.Build(ref parameters.ScreenPosition, ref parameters.InverseView,
                                          ref parameters.InverseProjection);

            var minDistance = float.MaxValue;
            M2RenderInstance selectedInstance = null;

            lock (mVisibleInstances)
            {
                foreach (var pair in mVisibleInstances)
                {
                    if (pair.Value.Uuid == Editing.ModelSpawnManager.M2InstanceUuid)
                    {
                        continue;
                    }

                    float dist;
                    if (pair.Value.Intersects(parameters, ref globalRay, out dist) && dist < minDistance)
                    {
                        minDistance      = dist;
                        selectedInstance = pair.Value;
                    }
                }
            }

            lock (mNonBatchedInstances)
            {
                foreach (var pair in mNonBatchedInstances)
                {
                    float dist;
                    if (pair.Value.Intersects(parameters, ref globalRay, out dist) && dist < minDistance)
                    {
                        minDistance      = dist;
                        selectedInstance = pair.Value;
                    }
                }
            }

            lock (mSortedInstances)
            {
                foreach (var pair in mSortedInstances)
                {
                    float dist;
                    if (pair.Value.Intersects(parameters, ref globalRay, out dist) && dist < minDistance)
                    {
                        minDistance      = dist;
                        selectedInstance = pair.Value;
                    }
                }
            }

            if (selectedInstance != null)
            {
                parameters.M2Instance = selectedInstance;
                parameters.M2Model    = selectedInstance.Model;
                parameters.M2Position = globalRay.Position + minDistance * globalRay.Direction;
                parameters.M2Distance = minDistance;
            }

            parameters.M2Hit = selectedInstance != null;
        }