/* greebo: This is called by the ManipulateObserver class on the mouseDown event. It checks, if a manipulator * can be selected where the mouse is pointing to. */ bool RadiantSelectionSystem::SelectManipulator(const View& view, const Vector2& device_point, const Vector2& device_epsilon) { if (!nothingSelected() || (ManipulatorMode() == eDrag && Mode() == eComponent)) { // Unselect any currently selected manipulators to be sure _manipulator->setSelected(false); // Test, if the current manipulator can be selected if (!nothingSelected() || (ManipulatorMode() == eDrag && Mode() == eComponent)) { View scissored(view); ConstructSelectionTest(scissored, Rectangle::ConstructFromPoint(device_point, device_epsilon)); // The manipulator class checks on its own, if any of its components can be selected _manipulator->testSelect(scissored, GetPivot2World()); } // Save the pivot2world matrix startMove(); // This is true, if a manipulator could be selected _pivotMoving = _manipulator->isSelected(); // is a manipulator selected / the pivot moving? if (_pivotMoving) { Pivot2World pivot; pivot.update(GetPivot2World(), view.GetModelview(), view.GetProjection(), view.GetViewport()); _manip2pivotStart = _pivot2worldStart.getFullInverse().getMultipliedBy(pivot._worldSpace); Matrix4 device2manip; ConstructDevice2Manip(device2manip, _pivot2worldStart, view.GetModelview(), view.GetProjection(), view.GetViewport()); _manipulator->getActiveComponent()->Construct(device2manip, device_point[0], device_point[1]); _deviceStart = Vector2(device_point[0], device_point[1]); _undoBegun = false; } SceneChangeNotify(); } return _pivotMoving; }
/* greebo: This is called by the ManipulateObserver class on the mouseDown event. It checks, if a manipulator * can be selected where the mouse is pointing to. */ bool RadiantSelectionSystem::SelectManipulator(const View& view, const float device_point[2], const float device_epsilon[2]) { if (!nothingSelected() || (ManipulatorMode() == eDrag && Mode() == eComponent)) { #if defined (DEBUG_SELECTION) g_render_clipped.destroy(); #endif // Unselect any currently selected manipulators to be sure _manipulator->setSelected(false); // Test, if the current manipulator can be selected if (!nothingSelected() || (ManipulatorMode() == eDrag && Mode() == eComponent)) { View scissored(view); ConstructSelectionTest(scissored, SelectionBoxForPoint(device_point, device_epsilon)); // The manipulator class checks on its own, if any of its components can be selected _manipulator->testSelect(scissored, GetPivot2World()); } // Save the pivot2world matrix startMove(); // This is true, if a manipulator could be selected _pivotMoving = _manipulator->isSelected(); // is a manipulator selected / the pivot moving? if (_pivotMoving) { Pivot2World pivot; pivot.update(GetPivot2World(), view.GetModelview(), view.GetProjection(), view.GetViewport()); _manip2pivotStart = matrix4_multiplied_by_matrix4(matrix4_full_inverse(_pivot2worldStart), pivot.m_worldSpace); Matrix4 device2manip; ConstructDevice2Manip(device2manip, _pivot2worldStart, view.GetModelview(), view.GetProjection(), view.GetViewport()); _manipulator->GetManipulatable()->Construct(device2manip, device_point[0], device_point[1]); _undoBegun = false; } SceneChangeNotify(); } return _pivotMoving; }
/* greebo: Renders the currently active manipulator by setting the render state and * calling the manipulator's render method */ void RadiantSelectionSystem::renderSolid(RenderableCollector& collector, const VolumeTest& volume) const { if (!nothingSelected()) { collector.highlightFaces(false); collector.highlightPrimitives(false); collector.SetState(_state, RenderableCollector::eWireframeOnly); collector.SetState(_state, RenderableCollector::eFullMaterials); _manipulator->render(collector, volume, GetPivot2World()); } }
/* greebo: Renders the currently active manipulator by setting the render state and * calling the manipulator's render method */ void RadiantSelectionSystem::renderSolid(Renderer& renderer, const VolumeTest& volume) const { if (!nothingSelected()) { // TODO: Don't render transparent faces textures invisible renderer.Highlight(Renderer::ePrimitive, false); renderer.Highlight(Renderer::eFace, false); renderer.SetState(_state, Renderer::eWireframeOnly); renderer.SetState(_state, Renderer::eFullMaterials); _manipulator->render(renderer, volume, GetPivot2World()); } #if defined(DEBUG_SELECTION) renderer.SetState(g_state_clipped, Renderer::eWireframeOnly); renderer.SetState(g_state_clipped, Renderer::eFullMaterials); renderer.addRenderable(g_render_clipped, g_render_clipped.m_world); #endif }
// Start a move, the current pivot point is saved as a start point void RadiantSelectionSystem::startMove() { _pivot2worldStart = GetPivot2World(); }