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