public ChemEntity TrySelectAtPoint(int x, int y) { Vector3 pickRay, pickRayDir, pickRayOrigin; // Compute the vector of the pick ray in screen space pickRay.X = (((2.0f * x) / width) - 1) / view3D.Projection.M11; pickRay.Y = -(((2.0f * y) / height) - 1) / view3D.Projection.M22; pickRay.Z = 1.0f; Matrix matInverseView = Matrix.Invert(view3D.ViewMatrix); // Transform the screen space pick ray into 3D space pickRayDir.X = pickRay.X * matInverseView.M11 + pickRay.Y * matInverseView.M21 + pickRay.Z * matInverseView.M31; pickRayDir.Y = pickRay.X * matInverseView.M12 + pickRay.Y * matInverseView.M22 + pickRay.Z * matInverseView.M32; pickRayDir.Z = pickRay.X * matInverseView.M13 + pickRay.Y * matInverseView.M23 + pickRay.Z * matInverseView.M33; pickRayDir.Normalize(); pickRayOrigin.X = matInverseView.M41; pickRayOrigin.Y = matInverseView.M42; pickRayOrigin.Z = matInverseView.M43; pickRayOrigin.Add(Vector3.Multiply(pickRayDir, 1.0f)); // near plane // transform trough world space Matrix inverseWorld = Matrix.Invert(view3D.WorldMatrix * rotation); // scene-world == object-world Vector3 localOrigin = Vector3.TransformCoordinate(pickRayOrigin, inverseWorld); Vector3 localDir = Vector3.TransformNormal(pickRayDir, inverseWorld); // trace through scene via manager ChemEntity entity = sceneManager.TraceRayInScene(localOrigin, localDir); return(entity); }
public ChemEntity TraceRayInScene(Vector3 rayOrigin, Vector3 rayDir) { ChemEntity entity = (ChemEntity)sceneGraph.RayIntersectFirst(rayOrigin, rayDir); /*if (entity != null) * { * AtomSelectionEntity selEntity = new AtomSelectionEntity((AtomEntity)entity); * selEntity.Init(device); * postSceneViewEntities.Add(selEntity); * }*/ /*Ray3D ray = new Ray3D(rayOrigin, rayDir, 20f); * postSceneWorldEntities.Add(ray); * ray.Init(device);*/ return(entity); }
void control_OnEntitySelected(ChemEntity entity) { object obj = null; if (entity.CdkObject is IAtom) { AtomWrapper atom = new AtomWrapper((IAtom)entity.CdkObject); obj = atom; ListViewItem[] connectedItems = atom.GetConnectedItemsForListView(currentSelected.ChemControl, uiConnectedList.Groups[0], uiConnectedList.Groups[1]); uiConnectedList.Items.Clear(); if (connectedItems != null) { uiConnectedList.Items.AddRange(connectedItems); } } propertyGrid1.SelectedObject = obj; }
public ChemEntity TrySelectAtPoint(int x, int y) { selected.Clear(); if (renderContext != null) { ChemEntity entity = renderContext.TrySelectAtPoint(x, y); if (entity != null) { selected.Add(entity); } // update view renderContext.UpdateSelectedItems(selected); Render(); return(entity); } return(null); }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (renderContext != null && renderSource != null) { // pass to layers first if (renderContext.OnLayerMouseDown(e)) { Render(); return; } if (controlMode == ControlMode.ViewMovement) { if (e.Button == MouseButtons.Left && e.Clicks == 2) { ChemEntity obj = TrySelectAtPoint(e.X, e.Y); if (obj != null && OnEntitySelected != null) { OnEntitySelected(obj); } } else if (controlHandler != null && controlHandler.OnMouseDown(e)) { Render(); } } else if (controlMode == ControlMode.Selection) { // Start selection area renderContext.StartSelectionArea(e.X, e.Y); } else if (controlMode == ControlMode.SelectionMovement) { // start movement of the selected items } } }
public ChemEntity[] QueryConnectedEntities(ChemEntity entity) { throw new Exception("The method or operation is not implemented."); }
public ChemEntity GetNearestTo(ChemEntity entity) { throw new Exception("The method or operation is not implemented."); }
public ChemEntity[] GetAllNearby(ChemEntity entity, float radius) { throw new Exception("The method or operation is not implemented."); }