Add 'additive selection' toggle, so that users coming from Hammer can
make it so WorldSpawn unselects things before making a new selection.
This commit is contained in:
parent
11b15aec3d
commit
eb4580ccbe
3 changed files with 26 additions and 85 deletions
|
@ -1960,6 +1960,7 @@ ui::MenuItem create_edit_menu()
|
|||
create_menu_item_with_mnemonic(menu, "Select _touching", "SelectTouching");
|
||||
|
||||
create_check_menu_item_with_mnemonic(menu, "Auto-Expand Selection", "ToggleExpansion");
|
||||
create_check_menu_item_with_mnemonic(menu, "Additive Selection", "ToggleAddSelect");
|
||||
|
||||
auto convert_menu = create_sub_menu_with_mnemonic(menu, "E_xpand Selection");
|
||||
/*if (g_Layout_enableOpenStepUX.m_value) {
|
||||
|
@ -3124,6 +3125,20 @@ void Texdef_ToggleExpansion()
|
|||
g_expansion_status_changed();
|
||||
}
|
||||
|
||||
/* eukara: requested by Xylemon */
|
||||
bool g_addselect_enabled = true;
|
||||
Callback<void()> g_addselect_status_changed;
|
||||
ConstReferenceCaller<bool, void(const Callback<void(bool)> &), PropertyImpl<bool>::Export> g_addselect_caller(
|
||||
g_addselect_enabled);
|
||||
ToggleItem g_addselect_item(g_addselect_caller);
|
||||
|
||||
void Texdef_ToggleAddSelect()
|
||||
{
|
||||
g_addselect_enabled = !g_addselect_enabled;
|
||||
g_addselect_item.update();
|
||||
g_addselect_status_changed();
|
||||
}
|
||||
|
||||
#include "preferencesystem.h"
|
||||
#include "stringio.h"
|
||||
|
||||
|
@ -3195,6 +3210,9 @@ void MainFrame_Construct()
|
|||
GlobalToggles_insert("ToggleExpansion", makeCallbackF(Texdef_ToggleExpansion),
|
||||
ToggleItem::AddCallbackCaller(g_expansion_item));
|
||||
|
||||
GlobalToggles_insert("ToggleAddSelect", makeCallbackF(Texdef_ToggleAddSelect),
|
||||
ToggleItem::AddCallbackCaller(g_addselect_item));
|
||||
|
||||
GlobalToggles_insert("ToggleClipper", makeCallbackF(ClipperMode), ToggleItem::AddCallbackCaller(g_clipper_button),
|
||||
Accelerator('X'));
|
||||
|
||||
|
|
|
@ -53,6 +53,8 @@
|
|||
|
||||
#include "grid.h"
|
||||
|
||||
void Selection_Deselect(void);
|
||||
|
||||
TextOutputStream &ostream_write(TextOutputStream &t, const Vector4 &v)
|
||||
{
|
||||
return t << "[ " << v.x() << " " << v.y() << " " << v.z() << " " << v.w() << " ]";
|
||||
|
@ -2761,6 +2763,7 @@ void Scene_SelectAll_Component(bool select, SelectionSystem::EComponentMode comp
|
|||
GlobalSceneGraph().traverse(select_all_component(select, componentMode));
|
||||
}
|
||||
extern bool g_expansion_enabled;
|
||||
extern bool g_addselect_enabled;
|
||||
|
||||
void Scene_ExpandSelectionToEntities();
|
||||
|
||||
|
@ -3095,6 +3098,9 @@ void SelectPoint(const View &view, const float device_point[2], const float devi
|
|||
if (!selector.failed()) {
|
||||
switch (modifier) {
|
||||
case RadiantSelectionSystem::eToggle: {
|
||||
if (g_addselect_enabled == false)
|
||||
Selection_Deselect();
|
||||
|
||||
SelectableSortedSet::iterator best = selector.begin();
|
||||
// toggle selection of the object with least depth
|
||||
if ((*best).second->isSelected()) {
|
||||
|
|
|
@ -1078,6 +1078,7 @@ shaderInfo_t *ShaderInfoForShader( const char *shaderName ){
|
|||
GetMatTokenAppend( shaderText, qfalse ); /* don't do anything with health */
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* ydnar: enemy territory implicit shaders */
|
||||
else if ( !Q_stricmp( mattoken, "implicitMap" ) ) {
|
||||
si->implicitMap = IM_OPAQUE;
|
||||
|
@ -1111,7 +1112,7 @@ shaderInfo_t *ShaderInfoForShader( const char *shaderName ){
|
|||
strcpy( si->implicitImagePath, mattoken );
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
image directives
|
||||
|
@ -1160,90 +1161,6 @@ shaderInfo_t *ShaderInfoForShader( const char *shaderName ){
|
|||
GetMatTokenAppend( shaderText, qfalse );
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
q3map_* directives
|
||||
----------------------------------------------------------------- */
|
||||
|
||||
/* q3map_sun <red> <green> <blue> <intensity> <degrees> <elevation>
|
||||
color will be normalized, so it doesn't matter what range you use
|
||||
intensity falls off with angle but not distance 100 is a fairly bright sun
|
||||
degree of 0 = from the east, 90 = north, etc. altitude of 0 = sunrise/set, 90 = noon */
|
||||
#if 0
|
||||
else if ( !Q_stricmp( mattoken, "vmap_sun" ) || !Q_stricmp( mattoken, "q3map_sun" ) || !Q_stricmp( mattoken, "q3map_sunExt" ) ) {
|
||||
float a, b;
|
||||
sun_t *sun;
|
||||
qboolean ext = qfalse;
|
||||
|
||||
/* ydnar: extended sun directive? */
|
||||
if ( !Q_stricmp( mattoken, "q3map_sunext" ) || !Q_stricmp( mattoken, "vmap_sun" ) ) {
|
||||
ext = qtrue;
|
||||
}
|
||||
|
||||
/* allocate sun */
|
||||
sun = safe_malloc( sizeof( *sun ) );
|
||||
memset( sun, 0, sizeof( *sun ) );
|
||||
|
||||
/* set style */
|
||||
sun->style = si->lightStyle;
|
||||
|
||||
/* get color */
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
sun->color[ 0 ] = atof( mattoken );
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
sun->color[ 1 ] = atof( mattoken );
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
sun->color[ 2 ] = atof( mattoken );
|
||||
|
||||
if ( colorsRGB ) {
|
||||
sun->color[0] = Image_LinearFloatFromsRGBFloat( sun->color[0] );
|
||||
sun->color[1] = Image_LinearFloatFromsRGBFloat( sun->color[1] );
|
||||
sun->color[2] = Image_LinearFloatFromsRGBFloat( sun->color[2] );
|
||||
}
|
||||
|
||||
/* normalize it */
|
||||
ColorNormalize( sun->color, sun->color );
|
||||
|
||||
/* scale color by brightness */
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
sun->photons = atof( mattoken );
|
||||
|
||||
/* get sun angle/elevation */
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
a = atof( mattoken );
|
||||
a = a / 180.0f * Q_PI;
|
||||
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
b = atof( mattoken );
|
||||
b = b / 180.0f * Q_PI;
|
||||
|
||||
sun->direction[ 0 ] = cos( a ) * cos( b );
|
||||
sun->direction[ 1 ] = sin( a ) * cos( b );
|
||||
sun->direction[ 2 ] = sin( b );
|
||||
|
||||
/* get filter radius from shader */
|
||||
sun->filterRadius = si->lightFilterRadius;
|
||||
|
||||
/* ydnar: get sun angular deviance/samples */
|
||||
if ( ext && TokenAvailable() ) {
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
sun->deviance = atof( mattoken );
|
||||
sun->deviance = sun->deviance / 180.0f * Q_PI;
|
||||
|
||||
GetTokenAppend( shaderText, qfalse );
|
||||
sun->numSamples = atoi( mattoken );
|
||||
}
|
||||
|
||||
/* store sun */
|
||||
sun->next = si->sun;
|
||||
si->sun = sun;
|
||||
|
||||
/* apply sky surfaceparm */
|
||||
ApplySurfaceParm( "sky", &si->contentFlags, &si->surfaceFlags, &si->compileFlags );
|
||||
|
||||
/* don't process any more mattokens on this line */
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
/* match q3map_ */
|
||||
else if ( !Q_strncasecmp( mattoken, "q3map_", 6 ) || !Q_strncasecmp( mattoken, "vmap_", 5 ) ) {
|
||||
/* ydnar: vmap_baseMaterial <shader> (inherit this shader's parameters) */
|
||||
|
|
Loading…
Reference in a new issue