* view->show: toggle crosshair, size, grid are check menu items
	* view->show: +Show Light Radiuses toggle
	* view->show->show stats makes effect immediately
	* view->show fix: check menu items are sensitive to changing options via shortcuts

misc...
	* option to disable main toolbar
	* removed bobtoolz caulk selection button; filterbar one does the job better
	* filterbar: + region set selected button; rightclick = region off
	* filterbar: + hide selected button; rightclick = show hidden
	* SelectionSystem option: prefer point entities in 2D views (def = yes)
	* filterbar: indicate region, hide states by buttons states
	* fix: region compiles (run build with region enabled = compile regioned part only)
	* solid selection boxes by default (m_bNoStipple)
	* always use stipple for stuff behind stuff in 3d (was dependent on m_bNoStipple)
	* del unused ChooseSmallGridMajorColor ChooseSmallGridMinorColor preferences pipeline
	* fix: Active View Name and Outline... Clipper... colors saving
	* fix: ChooseCameraSelectedBrushColor changes the color (requires restart)
	* fix: ChooseSelectedBrushColor preference saving (requires restart)
	* fix rubberband selector appearence in 2D with 'show window outline' option enabled
	* multiple projections layouts: activate a projection on zoom
	* multiple projections layouts: added wnds updates to correctly indicate active projection (via wnd outline and projection name)
	* draw projection name is independent from show coordinates option
	* multiple projections layouts: greyscale axes in inactive views
	* 'show coordinates' is disabled by default
	* quick (hacky) method to render things, indicating viewport being active or not (axes, view name, wnd outline)
This commit is contained in:
Garux
2017-08-02 09:07:44 +03:00
parent cac514541c
commit 5a8c27d93c
17 changed files with 636 additions and 327 deletions

View File

@@ -2575,6 +2575,7 @@ Rotation m_rotation;
Scale m_scale;
public:
static Shader* m_state;
bool m_bPreferPointEntsIn2D;
private:
EManipulatorMode m_manipulator_mode;
Manipulator* m_manipulator;
@@ -2628,6 +2629,7 @@ enum EModifier
};
RadiantSelectionSystem() :
m_bPreferPointEntsIn2D( true ),
m_undo_begun( false ),
m_mode( ePrimitive ),
m_componentmode( eDefault ),
@@ -2852,73 +2854,32 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
SelectionVolume volume( scissored );
SelectionPool selector;
if ( face ) {
Scene_TestSelect_Component( selector, volume, scissored, eFace );
}
else
{
Scene_TestSelect( selector, volume, scissored, Mode(), ComponentMode() );
}
SelectionPool selector_point_ents;
const bool prefer_point_ents = m_bPreferPointEntsIn2D && Mode() == ePrimitive && !view.fill() && !face
&& ( modifier == RadiantSelectionSystem::eReplace || modifier == RadiantSelectionSystem::eSelect || modifier == RadiantSelectionSystem::eDeselect );
if ( !selector.failed() ) {
if( prefer_point_ents ){
Scene_TestSelect( selector_point_ents, volume, scissored, eEntity, ComponentMode() );
}
if( prefer_point_ents && !selector_point_ents.failed() ){
switch ( modifier )
{
case RadiantSelectionSystem::eToggle:
{
SelectableSortedSet::iterator best = selector.begin();
// toggle selection of the object with least depth
if ( ( *best ).second->isSelected() ) {
( *best ).second->setSelected( false );
}
else{
( *best ).second->setSelected( true );
}
}
break;
// if cycle mode not enabled, enable it
case RadiantSelectionSystem::eReplace:
{
// select closest
( *selector.begin() ).second->setSelected( true );
}
break;
// select the next object in the list from the one already selected
case RadiantSelectionSystem::eCycle:
{
bool CycleSelectionOccured = false;
SelectionPool::iterator i = selector.begin();
while ( i != selector.end() )
{
if ( ( *i ).second->isSelected() ) {
deselectComponentsOrAll( face );
++i;
if ( i != selector.end() ) {
i->second->setSelected( true );
}
else
{
selector.begin()->second->setSelected( true );
}
CycleSelectionOccured = true;
break;
}
++i;
}
if( !CycleSelectionOccured ){
deselectComponentsOrAll( face );
( *selector.begin() ).second->setSelected( true );
}
( *selector_point_ents.begin() ).second->setSelected( true );
}
break;
case RadiantSelectionSystem::eSelect:
{
SelectionPool::iterator best = selector.begin();
SelectionPool::iterator best = selector_point_ents.begin();
if( !( *best ).second->isSelected() ){
( *best ).second->setSelected( true );
}
SelectionPool::iterator i = best;
++i;
while ( i != selector.end() )
while ( i != selector_point_ents.end() )
{
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){
if( !( *i ).second->isSelected() ){
@@ -2934,13 +2895,13 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
break;
case RadiantSelectionSystem::eDeselect:
{
SelectionPool::iterator best = selector.begin();
SelectionPool::iterator best = selector_point_ents.begin();
if( ( *best ).second->isSelected() ){
( *best ).second->setSelected( false );
}
SelectionPool::iterator i = best;
++i;
while ( i != selector.end() )
while ( i != selector_point_ents.end() )
{
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){
if( ( *i ).second->isSelected() ){
@@ -2958,8 +2919,115 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
break;
}
}
else if( modifier == eCycle ){
deselectComponentsOrAll( face );
else{
if ( face ){
Scene_TestSelect_Component( selector, volume, scissored, eFace );
}
else{
Scene_TestSelect( selector, volume, scissored, Mode(), ComponentMode() );
}
if ( !selector.failed() ) {
switch ( modifier )
{
case RadiantSelectionSystem::eToggle:
{
SelectableSortedSet::iterator best = selector.begin();
// toggle selection of the object with least depth
if ( ( *best ).second->isSelected() ) {
( *best ).second->setSelected( false );
}
else{
( *best ).second->setSelected( true );
}
}
break;
// if cycle mode not enabled, enable it
case RadiantSelectionSystem::eReplace:
{
// select closest
( *selector.begin() ).second->setSelected( true );
}
break;
// select the next object in the list from the one already selected
case RadiantSelectionSystem::eCycle:
{
bool CycleSelectionOccured = false;
SelectionPool::iterator i = selector.begin();
while ( i != selector.end() )
{
if ( ( *i ).second->isSelected() ) {
deselectComponentsOrAll( face );
++i;
if ( i != selector.end() ) {
i->second->setSelected( true );
}
else
{
selector.begin()->second->setSelected( true );
}
CycleSelectionOccured = true;
break;
}
++i;
}
if( !CycleSelectionOccured ){
deselectComponentsOrAll( face );
( *selector.begin() ).second->setSelected( true );
}
}
break;
case RadiantSelectionSystem::eSelect:
{
SelectionPool::iterator best = selector.begin();
if( !( *best ).second->isSelected() ){
( *best ).second->setSelected( true );
}
SelectionPool::iterator i = best;
++i;
while ( i != selector.end() )
{
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){
if( !( *i ).second->isSelected() ){
( *i ).second->setSelected( true );
}
}
else{
break;
}
++i;
}
}
break;
case RadiantSelectionSystem::eDeselect:
{
SelectionPool::iterator best = selector.begin();
if( ( *best ).second->isSelected() ){
( *best ).second->setSelected( false );
}
SelectionPool::iterator i = best;
++i;
while ( i != selector.end() )
{
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){
if( ( *i ).second->isSelected() ){
( *i ).second->setSelected( false );
}
}
else{
break;
}
++i;
}
}
break;
default:
break;
}
}
else if( modifier == eCycle ){
deselectComponentsOrAll( face );
}
}
}
}
@@ -2976,21 +3044,19 @@ bool SelectPoint_InitPaint( const View& view, const float device_point[2], const
SelectionVolume volume( scissored );
SelectionPool selector;
if ( face ) {
Scene_TestSelect_Component( selector, volume, scissored, eFace );
}
else
{
Scene_TestSelect( selector, volume, scissored, Mode(), ComponentMode() );
}
SelectionPool selector_point_ents;
const bool prefer_point_ents = m_bPreferPointEntsIn2D && Mode() == ePrimitive && !view.fill() && !face;
if ( !selector.failed() ) {
SelectableSortedSet::iterator best = selector.begin();
if( prefer_point_ents ){
Scene_TestSelect( selector_point_ents, volume, scissored, eEntity, ComponentMode() );
}
if( prefer_point_ents && !selector_point_ents.failed() ){
SelectableSortedSet::iterator best = selector_point_ents.begin();
const bool wasSelected = ( *best ).second->isSelected();
( *best ).second->setSelected( !wasSelected );
SelectableSortedSet::iterator i = best;
++i;
while ( i != selector.end() )
while ( i != selector_point_ents.end() )
{
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){
( *i ).second->setSelected( !wasSelected );
@@ -3002,8 +3068,34 @@ bool SelectPoint_InitPaint( const View& view, const float device_point[2], const
}
return !wasSelected;
}
else{
return true;
else{//do primitives, if ents failed
if ( face ){
Scene_TestSelect_Component( selector, volume, scissored, eFace );
}
else{
Scene_TestSelect( selector, volume, scissored, Mode(), ComponentMode() );
}
if ( !selector.failed() ){
SelectableSortedSet::iterator best = selector.begin();
const bool wasSelected = ( *best ).second->isSelected();
( *best ).second->setSelected( !wasSelected );
SelectableSortedSet::iterator i = best;
++i;
while ( i != selector.end() )
{
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){
( *i ).second->setSelected( !wasSelected );
}
else{
break;
}
++i;
}
return !wasSelected;
}
else{
return true;
}
}
}
}
@@ -3187,7 +3279,7 @@ inline RadiantSelectionSystem& getSelectionSystem(){
}
}
#include "map.h"
class testselect_entity_visible : public scene::Graph::Walker
{
@@ -3198,6 +3290,10 @@ testselect_entity_visible( Selector& selector, SelectionTest& test )
: m_selector( selector ), m_test( test ){
}
bool pre( const scene::Path& path, scene::Instance& instance ) const {
if( path.top().get_pointer() == Map_GetWorldspawn( g_map ) ||
node_is_group( path.top().get() ) ){
return false;
}
Selectable* selectable = Instance_getSelectable( instance );
if ( selectable != 0
&& Node_isEntity( path.top() ) ) {
@@ -3636,12 +3732,26 @@ void RadiantSelectionSystem::renderSolid( Renderer& renderer, const VolumeTest&
#endif
}
#include "preferencesystem.h"
#include "preferences.h"
void SelectionSystem_constructPreferences( PreferencesPage& page ){
page.appendCheckBox( "", "Prefer point entities in 2D", getSelectionSystem().m_bPreferPointEntsIn2D );
}
void SelectionSystem_constructPage( PreferenceGroup& group ){
PreferencesPage page( group.createPage( "Selection", "Selection System Settings" ) );
SelectionSystem_constructPreferences( page );
}
void SelectionSystem_registerPreferencesPage(){
PreferencesDialog_addSettingsPage( FreeCaller1<PreferenceGroup&, SelectionSystem_constructPage>() );
}
void SelectionSystem_OnBoundsChanged(){
getSelectionSystem().pivotChanged();
}
SignalHandlerId SelectionSystem_boundsChanged;
void SelectionSystem_Construct(){
@@ -3652,6 +3762,9 @@ void SelectionSystem_Construct(){
SelectionSystem_boundsChanged = GlobalSceneGraph().addBoundsChangedCallback( FreeCaller<SelectionSystem_OnBoundsChanged>() );
GlobalShaderCache().attachRenderable( getSelectionSystem() );
GlobalPreferenceSystem().registerPreference( "PreferPointEntsIn2D", BoolImportStringCaller( getSelectionSystem().m_bPreferPointEntsIn2D ), BoolExportStringCaller( getSelectionSystem().m_bPreferPointEntsIn2D ) );
SelectionSystem_registerPreferencesPage();
}
void SelectionSystem_Destroy(){