Added FPS/UnrealEd-style right-mouse camera navigation to the camera view, with configurable movement keys, mouse look, modifier movement, Caps Lock speed scaling, and mouse-wheel zoom.

Added camera-view helper tools from the list, including reticle drawing, quick select during nav mode, teleport-to-looked-at-object, target lock/orbit mode, and entity/material info display.
Added nav-mode texture adjustment controls for position, scale, and rotation, and fixed the existing Alt texture-drag condition so Alt+Shift and Alt+Ctrl can actually trigger scale/rotate behavior.
Added widescreen support.
Changed up the menus and UI for build.
This commit is contained in:
Justin Marshall
2026-05-04 08:45:25 -07:00
parent 1a7a463c80
commit 6a21513a54
32 changed files with 1381 additions and 81 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

+11
View File
@@ -0,0 +1,11 @@
windowDef Desktop {
rect 0, 0, 1280, 720
backcolor 0, 0, 0, 1
windowDef Background {
rect 0, 0, 1280, 720
background "guis/assets/splash/launch"
matcolor 1 ,1, 1, 1
visible 1
}
}
+441
View File
@@ -0,0 +1,441 @@
windowDef Desktop {
rect 0, 0, 1280, 720
backcolor 0, 0, 0, 1
float Button "0"
float Menugui "1"
onESC {
set "cmd" "close" ;
}
windowDef Background {
rect 0, 0, 1280, 720
background "guis/assets/mainmenu/bg"
matcolor 1 ,1, 1, 1
visible 1
}
windowDef Doom {
rect 162, 0, 972, 426
background "guis/assets/schema/doom"
matcolor 1 ,1, 1, 1
visible 1
}
windowDef DoomGlow {
rect 162, 0, 972, 426
background "doomglow"
matcolor 1 ,1, 1, 1
visible 1
}
windowDef Button1o {
rect 380, 405, 512, 48
background "menu/button1"
matcolor 1 ,1, 1, 1
visible 0
}
windowDef Button2o {
rect 380, 465, 512, 48
background "menu/button2"
matcolor 1 ,1, 1, 1
visible 0
}
windowDef Button3o {
rect 500, 525, 278, 48
background "menu/button3"
matcolor 1 ,1, 1, 1
visible 0
}
windowDef Button4o {
rect 506, 585, 256, 48
background "menu/button4"
matcolor 1 ,1, 1, 1
visible 0
}
windowDef Button5o {
rect 506, 645, 256, 48
background "menu/button5"
matcolor 1 ,1, 1, 1
visible 0
}
windowDef PopUp {
rect 354, 660, 572, 60
background "guis/assets/mainmenu/callout"
matcolor 1 ,1, 1, 0
visible 1
}
windowDef Button1 {
rect 380, 405, 512, 48
background "guis/assets/mainmenu/1"
matcolor 1 ,1, 1, 0.9
visible 1
onMouseEnter {
set "Button1o::visible" "1" ;
}
onMouseExit {
set "Button1o::visible" "0" ;
}
onAction {
set "cmd" "play guisounds_click" ;
set "Desktop::Button" "1" ;
resetTime "Anim" "0" ;
resetTime "Click1" "0" ;
set "Button1o::visible" "0" ;
transition "Button2::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
transition "Button3::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
transition "Button4::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
transition "Button5::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ;
}
}
windowDef Button2 {
rect 380, 465, 512, 48
background "guis/assets/mainmenu/2"
matcolor 1 ,1, 1, 0.4
visible 1
/*
onMouseEnter {
set "Button2o::visible" "1" ;
}
onMouseExit {
set "Button2o::visible" "0" ;
}
onAction {
set "Desktop::Button" "2" ;
resetTime "Anim" "0" ;
set "Button2o::visible" "0" ;
transition "Button1::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ;
transition "Button3::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
transition "Button4::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
transition "Button5::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ;
}
*/
}
windowDef Button3 {
rect 500, 525, 278, 48
background "guis/assets/mainmenu/3"
matcolor 1 ,1, 1, 0.4
visible 1
}
windowDef Button4 {
rect 506, 585, 256, 48
background "guis/assets/mainmenu/4"
matcolor 1 ,1, 1, 0.4
visible 1
}
windowDef Button5 {
rect 506, 645, 256, 48
background "guis/assets/mainmenu/5"
matcolor 1 ,1, 1, 0.9
visible 1
onMouseEnter {
set "Button5o::visible" "1" ;
}
onMouseExit {
set "Button5o::visible" "0" ;
}
onAction {
set "cmd" "play guisounds_click" ;
set "Desktop::Button" "5" ;
resetTime "Anim" "0" ;
resetTime "Click5" "0" ;
set "Button5o::visible" "0" ;
transition "Button1::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ;
transition "Button2::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
transition "Button3::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
transition "Button4::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ;
}
}
windowDef Text1a {
rect 354, 426, -572, 60
text "New Game"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
noevents 1
onMouseEnter {
set "forecolor" "1 0.4 0 1" ;
}
onMouseExit {
set "forecolor" "1 0.1 0.1 1" ;
}
onAction {
set "cmd" "play guisounds_click" ;
set "cmd" "startgame" ;
resetTime "Main1" "0" ;
}
}
windowDef Text1b {
rect 354, 471, -572, 60
text "Load Game"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
}
windowDef Text1c {
rect 354, 516, -572, 60
text "Cinematics"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
}
windowDef Text1d {
rect 354, 561, -572, 60
text "Demos"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
}
windowDef Text1e {
rect 354, 606, -572, 60
text "Main Menu"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
noevents 1
onMouseEnter {
set "forecolor" "1 0.4 0 1" ;
}
onMouseExit {
set "forecolor" "1 0.1 0.1 1" ;
}
onAction {
set "cmd" "play guisounds_close" ;
resetTime "Main1" "0" ;
}
}
windowDef Text5a {
rect 352, 450, -572, 120
text "Are you sure you\nwant to exit?"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
}
windowDef Text5b {
rect 420, 577.5, -200, 120
text "Yes"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
noevents 1
onMouseEnter {
set "forecolor" "1 0.4 0 1" ;
}
onMouseExit {
set "forecolor" "1 0.1 0.1 1" ;
}
onAction {
set "cmd" "play guisounds_click" ;
set "cmd" "quit" ;
}
}
windowDef Text5c {
rect 660, 577.5, -200, 120
text "No"
font "fonts/chain"
textscale 0.75
textalign 1
forecolor 1, 0.1, 0.1, 0
noevents 1
onMouseEnter {
set "forecolor" "1 0.4 0 1" ;
}
onMouseExit {
set "forecolor" "1 0.1 0.1 1" ;
}
onAction {
set "cmd" "play guisounds_close" ;
resetTime "Main5" "0" ;
}
}
//////////////////////////
//Animation
/////////////////////////
windowDef Anim {
notime 1
onTime 0 {
set "Button1::noevents" "1" ;
set "Button2::noevents" "1" ;
set "Button3::noevents" "1" ;
set "Button4::noevents" "1" ;
set "Button5::noevents" "1" ;
transition "Button1::rect" "380 405 512 48" "380 675 512 48" "200" ;
transition "Button2::rect" "380 465 512 48" "380 675 512 48" "200" ;
transition "Button3::rect" "500 525 278 48" "500 675 278 48" "200" ;
transition "Button4::rect" "506 585 256 48" "506 675 256 48" "200" ;
transition "Button5::rect" "506 645 256 48" "506 675 256 48" "200" ;
}
onTime 0 {
transition "PopUp::matcolor" "1 1 1 0" "1 1 1 1" "100" ;
transition "PopUp::rect" "354 660 572 60" "354 406.5 572 313.5" "200" ;
}
}
windowDef Click1 {
notime 1
onTime 200 {
set "Text1a::rect" "354 426 572 60" ;
set "Text1a::noevents" "0" ;
transition "Text1a::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ;
}
onTime 250 {
set "Text1b::rect" "354 471 572 60" ;
transition "Text1b::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 0.5" "50" ;
}
onTime 300 {
set "Text1c::rect" "354 516 572 60" ;
transition "Text1c::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 0.5" "50" ;
}
onTime 350 {
set "Text1d::rect" "354 561 572 60" ;
transition "Text1d::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 0.5" "50" ;
}
onTime 400 {
set "Text1e::rect" "354 606 572 60" ;
set "Text1e::noevents" "0" ;
transition "Text1e::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ;
}
}
windowDef Main1 {
notime 1
onTime 0 {
set "Text1a::noevents" "1" ;
set "Text1e::noevents" "1" ;
transition "Text1a::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
transition "Text1b::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
transition "Text1c::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
transition "Text1d::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
transition "Text1e::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
}
onTime 0 {
transition "Button1::rect" "380 675 512 48" "380 405 512 48" "300" ;
transition "Button2::rect" "380 675 512 48" "380 465 512 48" "300" ;
transition "Button3::rect" "500 675 278 48" "500 525 278 48" "300" ;
transition "Button4::rect" "506 675 256 48" "506 585 256 48" "300" ;
transition "Button5::rect" "506 675 256 48" "506 645 256 48" "300" ;
transition "PopUp::matcolor" "1 1 1 1" "1 1 1 0" "100" ;
transition "PopUp::rect" "354 406.5 572 313.5" "354 660 572 60" "200" ;
}
onTime 50 {
set "Text1a::rect" "354 426 -572 60" ;
set "Text1b::rect" "354 471 -572 60" ;
set "Text1c::rect" "354 516 -572 60" ;
set "Text1d::rect" "354 561 -572 60" ;
set "Text1e::rect" "354 606 -572 60" ;
transition "Button2::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ;
}
onTime 125 {
transition "Button3::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ;
}
onTime 200 {
transition "Button4::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ;
}
onTime 275 {
transition "Button5::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ;
}
onTime 300 {
set "Button1::noevents" "0" ;
set "Button2::noevents" "0" ;
set "Button3::noevents" "0" ;
set "Button4::noevents" "0" ;
set "Button5::noevents" "0" ;
}
}
windowDef Click5 {
notime 1
onTime 200 {
set "Text5a::rect" "352 450 572 120" ;
transition "Text5a::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ;
}
onTime 250 {
set "Text5b::rect" "420 577.5 200 120" ;
set "Text5b::noevents" "0" ;
transition "Text5b::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ;
}
onTime 300 {
set "Text5c::rect" "660 577.5 200 120" ;
set "Text5c::noevents" "0" ;
transition "Text5c::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ;
}
}
windowDef Main5 {
notime 1
onTime 0 {
set "Text5b::noevents" "1" ;
set "Text5c::noevents" "1" ;
transition "Text5a::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
transition "Text5b::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
transition "Text5c::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ;
}
onTime 0 {
transition "Button1::rect" "380 675 512 48" "380 405 512 48" "300" ;
transition "Button2::rect" "380 675 512 48" "380 465 512 48" "300" ;
transition "Button3::rect" "500 675 278 48" "500 525 278 48" "300" ;
transition "Button4::rect" "506 675 256 48" "506 585 256 48" "300" ;
transition "Button5::rect" "506 675 256 48" "506 645 256 48" "300" ;
transition "PopUp::matcolor" "1 1 1 1" "1 1 1 0" "100" ;
transition "PopUp::rect" "354 406.5 572 313.5" "354 660 572 60" "200" ;
}
onTime 50 {
set "Text5a::rect" "352 450 -572 120" ;
set "Text5b::rect" "420 577.5 -200 120" ;
set "Text5c::rect" "660 577.5 -200 120" ;
transition "Button1::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ;
}
onTime 125 {
transition "Button2::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ;
}
onTime 200 {
transition "Button3::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ;
}
onTime 275 {
transition "Button4::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ;
}
onTime 300 {
set "Button1::noevents" "0" ;
set "Button2::noevents" "0" ;
set "Button3::noevents" "0" ;
set "Button4::noevents" "0" ;
set "Button5::noevents" "0" ;
}
}
}
+2 -2
View File
@@ -15,9 +15,9 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LocalDebuggerCommand>D:\projects\Doom3\Doom3.exe</LocalDebuggerCommand>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommandArguments>+set r_fullscreen 0 +set r_mode 6</LocalDebuggerCommandArguments>
<LocalDebuggerCommandArguments>+set r_fullscreen 0 +set r_mode 1</LocalDebuggerCommandArguments>
<LocalDebuggerWorkingDirectory>D:\projects\Doom3</LocalDebuggerWorkingDirectory>
<LocalDebuggerCommandArgumentsHistory>+set r_fullscreen 1 +set r_mode 6|+set r_fullscreen 0 +set r_mode 6|</LocalDebuggerCommandArgumentsHistory>
<LocalDebuggerCommandArgumentsHistory>+set r_fullscreen 0 +set r_mode 6|+set r_fullscreen 1 +set r_mode 6|+set r_fullscreen 1 +set r_mode 1|+set r_fullscreen 0 +set r_mode 1|</LocalDebuggerCommandArgumentsHistory>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dedicated Debug with inlines|x64'">
<LocalDebuggerCommand>D:\projects\Doom3\Doom3.exe</LocalDebuggerCommand>
+1 -1
View File
@@ -2430,7 +2430,7 @@ void idCommonLocal::PrintLoadingMessage( const char *msg ) {
renderSystem->BeginFrame( renderSystem->GetScreenWidth(), renderSystem->GetScreenHeight() );
renderSystem->DrawStretchPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 1, 1, declManager->FindMaterial( "splashScreen" ) );
int len = strlen( msg );
renderSystem->DrawSmallStringExt( ( 640 - len * SMALLCHAR_WIDTH ) / 2, 410, msg, idVec4( 0.0f, 0.81f, 0.94f, 1.0f ), true, declManager->FindMaterial( "textures/bigchars" ) );
// renderSystem->DrawSmallStringExt( ( SCREEN_WIDTH - len * SMALLCHAR_WIDTH ) / 2, SCREEN_HEIGHT - 70, msg, idVec4( 0.0f, 0.81f, 0.94f, 1.0f ), true, declManager->FindMaterial( "textures/bigchars" ) );
renderSystem->EndFrame( NULL, NULL );
}
+1 -1
View File
@@ -211,7 +211,7 @@ float SCR_DrawFPS( float y ) {
s = va( "%ifps", fps );
w = strlen( s ) * BIGCHAR_WIDTH;
renderSystem->DrawBigStringExt( 635 - w, idMath::FtoiFast( y ) + 2, s, colorWhite, true, localConsole.charSetShader);
renderSystem->DrawBigStringExt( (SCREEN_WIDTH - 5.0f) - w, idMath::FtoiFast(y) + 2, s, colorWhite, true, localConsole.charSetShader);
}
return y + BIGCHAR_HEIGHT + 4;
+4 -4
View File
@@ -464,7 +464,7 @@ void idSessionLocal::StartWipe( const char *_wipeMaterial, bool hold ) {
console->Close();
// render the current screen into a texture for the wipe model
renderSystem->CropRenderSize( 640, 480, true );
renderSystem->CropRenderSize( SCREEN_WIDTH, SCREEN_HEIGHT, true );
Draw();
@@ -2230,7 +2230,7 @@ void idSessionLocal::DrawWipeModel() {
float fade = ( float )( latchedTic - wipeStartTic ) / ( wipeStopTic - wipeStartTic );
renderSystem->SetColor4( 1, 1, 1, fade );
renderSystem->DrawStretchPic( 0, 0, 640, 480, 0, 0, 1, 1, wipeMaterial );
renderSystem->DrawStretchPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 1, 1, wipeMaterial );
}
/*
@@ -2383,7 +2383,7 @@ void idSessionLocal::Draw() {
// clear the background, in case the tested gui is transparent
// NOTE that you can't use this for aviGame recording, it will tick at real com_frameTime between screenshots..
renderSystem->SetColor( colorBlack );
renderSystem->DrawStretchPic( 0, 0, 640, 480, 0, 0, 1, 1, declManager->FindMaterial( "_white" ) );
renderSystem->DrawStretchPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 1, 1, declManager->FindMaterial( "_white" ) );
guiTest->Redraw( com_frameTime );
} else if ( guiActive && !guiActive->State().GetBool( "gameDraw" ) ) {
@@ -2413,7 +2413,7 @@ void idSessionLocal::Draw() {
}
if ( !gameDraw ) {
renderSystem->SetColor( colorBlack );
renderSystem->DrawStretchPic( 0, 0, 640, 480, 0, 0, 1, 1, declManager->FindMaterial( "_white" ) );
renderSystem->DrawStretchPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 1, 1, declManager->FindMaterial( "_white" ) );
}
// save off the 2D drawing from the game
+4 -8
View File
@@ -2399,18 +2399,12 @@ void idGameLocal::CalcFov( float base_fov, float &fov_x, float &fov_y ) const {
switch( r_aspectRatio.GetInteger() ) {
default :
case 0 :
// 4:3
fov_x = base_fov;
return;
break;
case 1 :
// 16:9
ratio_x = 16.0f;
ratio_y = 9.0f;
break;
case 2 :
case 1 :
// 16:10
ratio_x = 16.0f;
ratio_y = 10.0f;
@@ -4364,5 +4358,7 @@ void idGameLocal::SwitchTeam( int clientNum, int team ) {
idGameLocal::GetMapLoadingGUI
===============
*/
void idGameLocal::GetMapLoadingGUI( char gui[ MAX_STRING_CHARS ] ) { }
void idGameLocal::GetMapLoadingGUI( char gui[ MAX_STRING_CHARS ] ) {
sprintf(gui, "guis/loadscreenbeta.gui");
}
+7 -7
View File
@@ -479,7 +479,7 @@ void idPlayerView::SingleView( idUserInterface *hud, const renderView_t *view )
if ( armorPulse > 0.0f && armorPulse < 1.0f ) {
renderSystem->SetColor4( 1, 1, 1, 1.0 - armorPulse );
renderSystem->DrawStretchPic( 0, 0, 640, 480, 0, 0, 1, 1, armorMaterial );
renderSystem->DrawStretchPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 1, 1, armorMaterial );
}
@@ -500,7 +500,7 @@ void idPlayerView::SingleView( idUserInterface *hud, const renderView_t *view )
if ( alpha < 1.0f ) {
renderSystem->SetColor4( ( player->health <= 0.0f ) ? MS2SEC( gameLocal.time ) : lastDamageTime, 1.0f, 1.0f, ( player->health <= 0.0f ) ? 0.0f : alpha );
renderSystem->DrawStretchPic( 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f, 1.0f, tunnelMaterial );
renderSystem->DrawStretchPic( 0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f, 1.0f, tunnelMaterial );
}
if ( player->PowerUpActive(BERSERK) ) {
@@ -509,13 +509,13 @@ void idPlayerView::SingleView( idUserInterface *hud, const renderView_t *view )
// start fading if within 10 seconds of going away
alpha = (berserkTime < 10000) ? (float)berserkTime / 10000 : 1.0f;
renderSystem->SetColor4( 1.0f, 1.0f, 1.0f, alpha );
renderSystem->DrawStretchPic( 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f, 1.0f, berserkMaterial );
renderSystem->DrawStretchPic( 0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f, 1.0f, berserkMaterial );
}
}
if ( bfgVision ) {
renderSystem->SetColor4( 1.0f, 1.0f, 1.0f, 1.0f );
renderSystem->DrawStretchPic( 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f, 1.0f, bfgMaterial );
renderSystem->DrawStretchPic( 0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f, 1.0f, bfgMaterial );
}
}
@@ -528,7 +528,7 @@ void idPlayerView::SingleView( idUserInterface *hud, const renderView_t *view )
g_testPostProcess.SetString( "" );
} else {
renderSystem->SetColor4( 1.0f, 1.0f, 1.0f, 1.0f );
renderSystem->DrawStretchPic( 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f, 1.0f, mtr );
renderSystem->DrawStretchPic( 0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f, 1.0f, mtr );
}
}
}
@@ -657,7 +657,7 @@ void idPlayerView::ScreenFade() {
if ( fadeColor[ 3 ] != 0.0f ) {
renderSystem->SetColor4( fadeColor[ 0 ], fadeColor[ 1 ], fadeColor[ 2 ], fadeColor[ 3 ] );
renderSystem->DrawStretchPic( 0, 0, 640, 480, 0, 0, 1, 1, declManager->FindMaterial( "_white" ) );
renderSystem->DrawStretchPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 1, 1, declManager->FindMaterial( "_white" ) );
}
}
@@ -681,7 +681,7 @@ void idPlayerView::InfluenceVision( idUserInterface *hud, const renderView_t *vi
SingleView( hud, view );
renderSystem->CaptureRenderToImage( "_currentRender" );
renderSystem->SetColor4( 1.0f, 1.0f, 1.0f, pct );
renderSystem->DrawStretchPic( 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 1.0f, 1.0f, player->GetInfluenceMaterial() );
renderSystem->DrawStretchPic( 0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f, 1.0f, player->GetInfluenceMaterial() );
} else if ( player->GetInfluenceEntity() == NULL ) {
SingleView( hud, view );
return;
+2 -2
View File
@@ -32,8 +32,8 @@ If you have questions concerning this license or the applicable additional terms
// device context support for gui stuff
//
const int VIRTUAL_WIDTH = 640;
const int VIRTUAL_HEIGHT = 480;
const int VIRTUAL_WIDTH = SCREEN_WIDTH;
const int VIRTUAL_HEIGHT = SCREEN_HEIGHT;
const int BLINK_DIVISOR = 200;
class idDeviceContext {
+9 -9
View File
@@ -265,8 +265,8 @@ void idGuiModel::EmitFullScreen( void ) {
viewDef->floatTime = tr.frameShaderTime;
// glOrtho( 0, 640, 480, 0, 0, 1 ); // always assume 640x480 virtual coordinates
viewDef->projectionMatrix[0] = 2.0f / 640.0f;
viewDef->projectionMatrix[5] = -2.0f / 480.0f;
viewDef->projectionMatrix[0] = 2.0f / SCREEN_WIDTH;
viewDef->projectionMatrix[5] = -2.0f / SCREEN_HEIGHT;
viewDef->projectionMatrix[10] = -2.0f / 1.0f;
viewDef->projectionMatrix[12] = -1.0f;
viewDef->projectionMatrix[13] = 1.0f;
@@ -479,13 +479,13 @@ void idGuiModel::DrawStretchPic( float x, float y, float w, float h, float s1, f
h += y;
y = 0;
}
if ( x + w > 640 ) {
s2 -= ( s2 - s1 ) * ( x + w - 640 ) / w;
w = 640 - x;
if ( x + w > SCREEN_WIDTH ) {
s2 -= ( s2 - s1 ) * ( x + w - SCREEN_WIDTH) / w;
w = SCREEN_WIDTH - x;
}
if ( y + h > 480 ) {
t2 -= ( t2 - t1 ) * ( y + h - 480 ) / h;
h = 480 - y;
if ( y + h > SCREEN_HEIGHT) {
t2 -= ( t2 - t1 ) * ( y + h - SCREEN_HEIGHT ) / h;
h = SCREEN_HEIGHT - y;
}
if ( w <= 0 || h <= 0 ) {
@@ -555,7 +555,7 @@ void idGuiModel::DrawStretchPic( float x, float y, float w, float h, float s1, f
verts[3].tangents[1][1] = 1;
verts[3].tangents[1][2] = 0;
DrawStretchPic( &verts[0], &indexes[0], 4, 6, hShader, false, 0.0f, 0.0f, 640.0f, 480.0f );
DrawStretchPic( &verts[0], &indexes[0], 4, 6, hShader, false, 0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT);
}
/*
+1 -1
View File
@@ -51,7 +51,7 @@ public:
// these calls are forwarded from the renderer
void SetColor( float r, float g, float b, float a );
void DrawStretchPic( const idDrawVert *verts, const glIndex_t *indexes, int vertCount, int indexCount, const idMaterial *hShader,
bool clip = true, float min_x = 0.0f, float min_y = 0.0f, float max_x = 640.0f, float max_y = 480.0f );
bool clip = true, float min_x = 0.0f, float min_y = 0.0f, float max_x = SCREEN_WIDTH, float max_y = SCREEN_HEIGHT );
void DrawStretchPic( float x, float y, float w, float h,
float s1, float t1, float s2, float t2, const idMaterial *hShader);
void DrawStretchTri ( idVec2 p1, idVec2 p2, idVec2 p3, idVec2 t1, idVec2 t2, idVec2 t3, const idMaterial *material );
+2 -2
View File
@@ -480,8 +480,8 @@ void idImage::GenerateImage( const byte *pic, int width, int height,
}
// make sure it is a power of 2
scaled_width = MakePowerOfTwo( width );
scaled_height = MakePowerOfTwo( height );
scaled_width = width;
scaled_height = height;
if ( scaled_width != width || scaled_height != height ) {
common->Error( "R_CreateImage: not a power of 2 image" );
+3 -3
View File
@@ -161,8 +161,8 @@ const int BIGCHAR_HEIGHT = 16;
// all drawing is done to a 640 x 480 virtual screen size
// and will be automatically scaled to the real resolution
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const float SCREEN_WIDTH = 1280.0f;
const float SCREEN_HEIGHT = 720.0f;
class idRenderWorld;
@@ -208,7 +208,7 @@ public:
virtual void SetColor4( float r, float g, float b, float a ) = 0;
virtual void DrawStretchPic( const idDrawVert *verts, const glIndex_t *indexes, int vertCount, int indexCount, const idMaterial *material,
bool clip = true, float min_x = 0.0f, float min_y = 0.0f, float max_x = 640.0f, float max_y = 480.0f ) = 0;
bool clip = true, float min_x = 0.0f, float min_y = 0.0f, float max_x = SCREEN_WIDTH, float max_y = SCREEN_HEIGHT ) = 0;
virtual void DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, const idMaterial *material ) = 0;
virtual void DrawStretchTri ( idVec2 p1, idVec2 p2, idVec2 p3, idVec2 t1, idVec2 t2, idVec2 t3, const idMaterial *material ) = 0;
+3 -10
View File
@@ -371,15 +371,8 @@ typedef struct vidmode_s {
} vidmode_t;
vidmode_t r_vidModes[] = {
{ "Mode 0: 320x240", 320, 240 },
{ "Mode 1: 400x300", 400, 300 },
{ "Mode 2: 512x384", 512, 384 },
{ "Mode 3: 640x480", 640, 480 },
{ "Mode 4: 800x600", 800, 600 },
{ "Mode 5: 1024x768", 1024, 768 },
{ "Mode 6: 1152x864", 1152, 864 },
{ "Mode 7: 1280x1024", 1280, 1024 },
{ "Mode 8: 1600x1200", 1600, 1200 },
{ "Mode 0: 1280x720", 1280, 720 },
{ "Mode 1: 1920x1080", 1920, 1080 }
};
static int s_numVidModes = ( sizeof( r_vidModes ) / sizeof( r_vidModes[0] ) );
@@ -394,7 +387,7 @@ static bool R_GetModeInfo( int *width, int *height, int mode ) {
return false;
}
if ( mode >= s_numVidModes ) {
return false;
mode = 0;
}
if ( mode == -1 ) {
+1 -1
View File
@@ -428,7 +428,7 @@ void RB_SetGL2D( void ) {
}
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, 640, 480, 0, 0, 1 ); // always assume 640x480 virtual coordinates
glOrtho( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 1 ); // always assume 640x480 virtual coordinates
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
+6 -6
View File
@@ -146,18 +146,18 @@ void R_RenderGuiSurf( idUserInterface *gui, drawSurf_t *drawSurf ) {
float guiModelMatrix[16];
float modelMatrix[16];
guiModelMatrix[0] = axis[0][0] / 640.0;
guiModelMatrix[4] = axis[1][0] / 480.0;
guiModelMatrix[0] = axis[0][0] / SCREEN_WIDTH;
guiModelMatrix[4] = axis[1][0] / SCREEN_HEIGHT;
guiModelMatrix[8] = axis[2][0];
guiModelMatrix[12] = origin[0];
guiModelMatrix[1] = axis[0][1] / 640.0;
guiModelMatrix[5] = axis[1][1] / 480.0;
guiModelMatrix[1] = axis[0][1] / SCREEN_WIDTH;
guiModelMatrix[5] = axis[1][1] / SCREEN_HEIGHT;
guiModelMatrix[9] = axis[2][1];
guiModelMatrix[13] = origin[1];
guiModelMatrix[2] = axis[0][2] / 640.0;
guiModelMatrix[6] = axis[1][2] / 480.0;
guiModelMatrix[2] = axis[0][2] / SCREEN_WIDTH;
guiModelMatrix[6] = axis[1][2] / SCREEN_HEIGHT;
guiModelMatrix[10] = axis[2][2];
guiModelMatrix[14] = origin[2];
+1 -1
View File
@@ -704,7 +704,7 @@ public:
virtual void SetColor( const idVec4 &rgba );
virtual void SetColor4( float r, float g, float b, float a );
virtual void DrawStretchPic ( const idDrawVert *verts, const glIndex_t *indexes, int vertCount, int indexCount, const idMaterial *material,
bool clip = true, float x = 0.0f, float y = 0.0f, float w = 640.0f, float h = 0.0f );
bool clip = true, float x = 0.0f, float y = 0.0f, float w = SCREEN_WIDTH, float h = 0.0f );
virtual void DrawStretchPic ( float x, float y, float w, float h, float s1, float t1, float s2, float t2, const idMaterial *material );
virtual void DrawStretchTri ( idVec2 p1, idVec2 p2, idVec2 p3, idVec2 t1, idVec2 t2, idVec2 t3, const idMaterial *material );
+2 -2
View File
@@ -271,8 +271,8 @@ static void GLW_GetWGLExtensionsWithFakeWindow( void ) {
hWnd = CreateWindow(WIN32_FAKE_WINDOW_CLASS_NAME, GAME_NAME,
WS_OVERLAPPEDWINDOW,
40, 40,
640,
480,
SCREEN_WIDTH,
SCREEN_HEIGHT,
NULL, NULL, win32.hInstance, NULL );
if ( !hWnd ) {
common->FatalError( "GLW_GetWGLExtensionsWithFakeWindow: Couldn't create fake window" );
+4 -4
View File
@@ -1154,8 +1154,8 @@ bool rvGEApp::NewFile ( void )
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_HSCROLL|WS_VSCROLL|WS_MAXIMIZE,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
SCREEN_WIDTH,
SCREEN_HEIGHT,
mMDIClient,
mInstance,
(LONG)workspace );
@@ -1205,8 +1205,8 @@ bool rvGEApp::OpenFile ( const char* filename )
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_HSCROLL|WS_VSCROLL|WS_MAXIMIZE,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
SCREEN_WIDTH,
SCREEN_HEIGHT,
mMDIClient,
mInstance,
(LONG)workspace );
+1 -1
View File
@@ -258,7 +258,7 @@ bool rvGEWorkspace::NewFile ( void )
return false;
}
empty = "windowDef Desktop { rect 0,0,640,480 }";
empty = "windowDef Desktop { rect 0,0,1280,720 }";
file->Write ( empty, empty.Length() );
fileSystem->CloseFile ( file );
+840 -6
View File
@@ -46,6 +46,784 @@ static char THIS_FILE[] = __FILE__;
#endif
extern void DrawPathLines();
extern qertrace_t Test_Ray(const idVec3& origin, const idVec3& dir, int flags);
extern void Select_ShiftTexture(float x, float y);
extern void Select_ScaleTexture(float x, float y);
extern void Select_RotateTexture(float amt, bool absolute);
/*
========================
Camera navigation extension
All settings are read from radiant.ini, section [3d navigation]. The default
style is 1 so existing camera behavior is unchanged until style=2 is enabled.
========================
*/
enum {
CAMERA_NAV_TIMER_ID = 713,
CAMERA_NAV_INFO_NONE = 0,
CAMERA_NAV_INFO_ENTITY = 1,
CAMERA_NAV_INFO_MATERIAL = 2,
CAMERA_NAV_MAX_INFO_LINES = 32
};
struct cameraNavConfig_t {
bool loaded;
int style;
int forwardKey;
int backKey;
int upKey;
int downKey;
int leftKey;
int rightKey;
int modifier1Key;
int modifier2Key;
bool invertPitch;
bool invertZTrans;
float capsLockScale;
int reticleMode;
float reticleScale;
idVec3 reticleColor;
int teleportKey;
int infoDisplayKey;
int lockTargetKey;
bool invertLockPitch;
bool invertLockYaw;
int texPositionKey;
int texScaleKey;
int texRotateKey;
};
struct cameraNavState_t {
CCamWnd* cam;
bool active;
bool lockActive;
int infoMode;
CPoint cursorAnchor;
int lastTime;
idVec3 lockTarget;
float lockDistance;
float lockPitch;
float lockYaw;
};
static cameraNavConfig_t s_cameraNavConfig;
static cameraNavState_t s_cameraNavState;
static void CameraNav_GetIniPath(char* path, int pathSize) {
if (pathSize <= 0) {
return;
}
path[0] = '\0';
DWORD len = GetModuleFileName(NULL, path, pathSize);
if (len == 0 || len >= (DWORD)pathSize) {
strncpy(path, "radiant.ini", pathSize - 1);
path[pathSize - 1] = '\0';
return;
}
char* slash = strrchr(path, '\\');
char* slash2 = strrchr(path, '/');
if (slash2 && (!slash || slash2 > slash)) {
slash = slash2;
}
if (slash) {
strncpy(slash + 1, "radiant.ini", pathSize - (int)(slash + 1 - path) - 1);
path[pathSize - 1] = '\0';
}
else {
strncpy(path, "radiant.ini", pathSize - 1);
path[pathSize - 1] = '\0';
}
}
static void CameraNav_NormalizeKeyName(const char* in, char* out, int outSize) {
if (outSize <= 0) {
return;
}
out[0] = '\0';
if (!in) {
return;
}
int outPos = 0;
while (*in && outPos < outSize - 1) {
unsigned char c = (unsigned char)*in++;
if (c == ' ' || c == '\t' || c == '_' || c == '-') {
continue;
}
out[outPos++] = (char)tolower(c);
}
out[outPos] = '\0';
}
static int CameraNav_ParseKeyName(const char* text) {
char keyName[64];
CameraNav_NormalizeKeyName(text, keyName, sizeof(keyName));
if (keyName[0] == '\0' || !stricmp(keyName, "none") || !stricmp(keyName, "0")) {
return 0;
}
if (keyName[1] == '\0') {
char c = keyName[0];
if (c >= 'a' && c <= 'z') {
return c - 'a' + 'A';
}
if (c >= '0' && c <= '9') {
return c;
}
}
if (!stricmp(keyName, "space")) return VK_SPACE;
if (!stricmp(keyName, "backspace")) return VK_BACK;
if (!stricmp(keyName, "escape") || !stricmp(keyName, "esc")) return VK_ESCAPE;
if (!stricmp(keyName, "end")) return VK_END;
if (!stricmp(keyName, "insert") || !stricmp(keyName, "ins")) return VK_INSERT;
if (!stricmp(keyName, "delete") || !stricmp(keyName, "del")) return VK_DELETE;
if (!stricmp(keyName, "pageup") || !stricmp(keyName, "pgup")) return VK_PRIOR;
if (!stricmp(keyName, "pagedown") || !stricmp(keyName, "pgdn")) return VK_NEXT;
if (!stricmp(keyName, "up")) return VK_UP;
if (!stricmp(keyName, "down")) return VK_DOWN;
if (!stricmp(keyName, "left")) return VK_LEFT;
if (!stricmp(keyName, "right")) return VK_RIGHT;
if (!stricmp(keyName, "tab")) return VK_TAB;
if (!stricmp(keyName, "return") || !stricmp(keyName, "enter")) return VK_RETURN;
if (!stricmp(keyName, "comma")) return VK_OEM_COMMA;
if (!stricmp(keyName, "period")) return VK_OEM_PERIOD;
if (!stricmp(keyName, "plus")) return VK_ADD;
if (!stricmp(keyName, "multiply")) return VK_MULTIPLY;
if (!stricmp(keyName, "subtract") || !stricmp(keyName, "minus")) return VK_SUBTRACT;
if (!stricmp(keyName, "shift")) return VK_SHIFT;
if (!stricmp(keyName, "ctrl") || !stricmp(keyName, "control")) return VK_CONTROL;
if (!stricmp(keyName, "alt")) return VK_MENU;
if (!stricmp(keyName, "capslock")) return VK_CAPITAL;
if (keyName[0] == 'f') {
int n = atoi(keyName + 1);
if (n >= 1 && n <= 12) {
return VK_F1 + n - 1;
}
}
if (!strnicmp(keyName, "numpad", 6)) {
int n = atoi(keyName + 6);
if (n >= 0 && n <= 9) {
return VK_NUMPAD0 + n;
}
}
return 0;
}
static int CameraNav_ReadKey(const char* iniPath, const char* keyName, const char* defaultValue) {
char value[64];
GetPrivateProfileString("3d navigation", keyName, defaultValue ? defaultValue : "", value, sizeof(value), iniPath);
return CameraNav_ParseKeyName(value);
}
static float CameraNav_ReadFloat(const char* iniPath, const char* keyName, const char* defaultValue) {
char value[64];
GetPrivateProfileString("3d navigation", keyName, defaultValue, value, sizeof(value), iniPath);
return (float)atof(value);
}
static void CameraNav_ReadColor(const char* iniPath, const char* keyName, const char* defaultValue, idVec3& color) {
char value[128];
float r = 50.0f;
float g = 230.0f;
float b = 50.0f;
GetPrivateProfileString("3d navigation", keyName, defaultValue, value, sizeof(value), iniPath);
if (sscanf(value, "%f%*[ ,]%f%*[ ,]%f", &r, &g, &b) != 3) {
r = 50.0f;
g = 230.0f;
b = 50.0f;
}
color[0] = (r > 1.0f) ? r / 255.0f : r;
color[1] = (g > 1.0f) ? g / 255.0f : g;
color[2] = (b > 1.0f) ? b / 255.0f : b;
}
static cameraNavConfig_t& CameraNav_Config() {
cameraNavConfig_t& cfg = s_cameraNavConfig;
if (cfg.loaded) {
return cfg;
}
char iniPath[MAX_PATH];
CameraNav_GetIniPath(iniPath, sizeof(iniPath));
memset(&cfg, 0, sizeof(cfg));
cfg.loaded = true;
cfg.style = GetPrivateProfileInt("3d navigation", "style", 1, iniPath);
cfg.forwardKey = CameraNav_ReadKey(iniPath, "forward", "w");
cfg.backKey = CameraNav_ReadKey(iniPath, "back", "s");
cfg.upKey = CameraNav_ReadKey(iniPath, "up", "space");
cfg.downKey = CameraNav_ReadKey(iniPath, "down", "shift");
cfg.leftKey = CameraNav_ReadKey(iniPath, "left", "a");
cfg.rightKey = CameraNav_ReadKey(iniPath, "right", "d");
cfg.modifier1Key = CameraNav_ReadKey(iniPath, "modifier1", "q");
cfg.modifier2Key = CameraNav_ReadKey(iniPath, "modifier2", "e");
cfg.invertPitch = GetPrivateProfileInt("3d navigation", "invertpitch", 0, iniPath) != 0;
cfg.invertZTrans = GetPrivateProfileInt("3d navigation", "invertztrans", 0, iniPath) != 0;
cfg.capsLockScale = CameraNav_ReadFloat(iniPath, "capslockscale", "1");
if (cfg.capsLockScale <= 0.0f) {
cfg.capsLockScale = 1.0f;
}
cfg.reticleMode = GetPrivateProfileInt("3d navigation", "reticlemode", 0, iniPath);
cfg.reticleScale = CameraNav_ReadFloat(iniPath, "reticlescale", "1");
if (cfg.reticleScale <= 0.0f) {
cfg.reticleScale = 1.0f;
}
CameraNav_ReadColor(iniPath, "reticlecolor", "50 230 50", cfg.reticleColor);
// Extra navigation features are opt-in. They only bind when a key is present
// in radiant.ini, which avoids stealing existing editor shortcuts by default.
cfg.teleportKey = CameraNav_ReadKey(iniPath, "teleport", "");
cfg.infoDisplayKey = CameraNav_ReadKey(iniPath, "infodisplay", "");
cfg.lockTargetKey = CameraNav_ReadKey(iniPath, "locktarget", "");
cfg.invertLockPitch = GetPrivateProfileInt("3d navigation", "invertlockpitch", 0, iniPath) != 0;
cfg.invertLockYaw = GetPrivateProfileInt("3d navigation", "invertlockyaw", 0, iniPath) != 0;
cfg.texPositionKey = CameraNav_ReadKey(iniPath, "texposition", "");
cfg.texScaleKey = CameraNav_ReadKey(iniPath, "texscale", "");
cfg.texRotateKey = CameraNav_ReadKey(iniPath, "texrotate", "");
return cfg;
}
static bool CameraNav_KeyIsDown(int key) {
return key != 0 && (GetAsyncKeyState(key) & 0x8000) != 0;
}
static float CameraNav_CapsScale() {
cameraNavConfig_t& cfg = CameraNav_Config();
return (GetKeyState(VK_CAPITAL) & 1) ? cfg.capsLockScale : 1.0f;
}
static float CameraNav_MoveSpeed() {
float speed = (float)g_PrefsDlg.m_nMoveSpeed;
if (speed <= 0.0f) {
speed = 64.0f;
}
return speed * CameraNav_CapsScale();
}
static void CameraNav_GetAxes(const camera_t& camera, idVec3& forward, idVec3& right, idVec3& up) {
float yaw = camera.angles[YAW] * idMath::M_DEG2RAD;
float pitch = -camera.angles[PITCH] * idMath::M_DEG2RAD;
float sy = sin(yaw);
float cy = cos(yaw);
float sp = sin(pitch);
float cp = cos(pitch);
forward[0] = cp * cy;
forward[1] = cp * sy;
forward[2] = -sp;
forward.Normalize();
right[0] = sy;
right[1] = -cy;
right[2] = 0.0f;
right.Normalize();
up[0] = right[1] * forward[2] - right[2] * forward[1];
up[1] = right[2] * forward[0] - right[0] * forward[2];
up[2] = right[0] * forward[1] - right[1] * forward[0];
up.Normalize();
}
static idVec3 CameraNav_ForwardFromAngles(float pitchDegrees, float yawDegrees) {
camera_t temp;
memset(&temp, 0, sizeof(temp));
temp.angles[PITCH] = pitchDegrees;
temp.angles[YAW] = yawDegrees;
idVec3 forward, right, up;
CameraNav_GetAxes(temp, forward, right, up);
return forward;
}
static void CameraNav_UpdateViews() {
int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : W_CAMERA;
Sys_UpdateWindows(nUpdate);
if (g_pParentWnd) {
g_pParentWnd->PostMessage(WM_TIMER, 0, 0);
}
}
static bool CameraNav_IsActive(CCamWnd* cam) {
return s_cameraNavState.active && s_cameraNavState.cam == cam;
}
static bool CameraNav_TraceCenter(CCamWnd* cam, qertrace_t& trace, idVec3* hitPoint = NULL, idVec3* outDir = NULL) {
camera_t& camera = cam->Camera();
idVec3 forward, right, up;
CameraNav_GetAxes(camera, forward, right, up);
trace = Test_Ray(camera.origin, forward, 0);
if (outDir) {
*outDir = forward;
}
if (!trace.brush || trace.dist <= 0.0f || trace.dist >= HUGE_DISTANCE) {
return false;
}
if (hitPoint) {
*hitPoint = camera.origin + forward * trace.dist;
}
return true;
}
static void CameraNav_Stop(CCamWnd* cam) {
if (!CameraNav_IsActive(cam)) {
return;
}
cam->KillTimer(CAMERA_NAV_TIMER_ID);
if (::GetCapture() == cam->GetSafeHwnd()) {
::ReleaseCapture();
}
s_cameraNavState.active = false;
s_cameraNavState.lockActive = false;
Sys_UpdateWindows(W_CAMERA);
}
static bool CameraNav_Begin(CCamWnd* cam) {
cameraNavConfig_t& cfg = CameraNav_Config();
if (cfg.style != 2) {
return false;
}
if (s_cameraNavState.active && s_cameraNavState.cam != cam) {
CameraNav_Stop(s_cameraNavState.cam);
}
memset(&s_cameraNavState, 0, sizeof(s_cameraNavState));
s_cameraNavState.cam = cam;
s_cameraNavState.active = true;
s_cameraNavState.lastTime = Sys_Milliseconds();
GetCursorPos(&s_cameraNavState.cursorAnchor);
cam->SetFocus();
cam->SetCapture();
cam->SetTimer(CAMERA_NAV_TIMER_ID, 10, NULL);
Sys_UpdateWindows(W_CAMERA);
return true;
}
static void CameraNav_ClampPitch(float& pitch) {
if (pitch > 89.0f) {
pitch = 89.0f;
}
else if (pitch < -89.0f) {
pitch = -89.0f;
}
}
static bool CameraNav_StartLock(CCamWnd* cam) {
qertrace_t trace;
idVec3 hit;
if (!CameraNav_TraceCenter(cam, trace, &hit)) {
return false;
}
camera_t& camera = cam->Camera();
s_cameraNavState.lockActive = true;
s_cameraNavState.lockTarget = hit;
s_cameraNavState.lockDistance = trace.dist;
if (s_cameraNavState.lockDistance < 16.0f) {
s_cameraNavState.lockDistance = 16.0f;
}
s_cameraNavState.lockPitch = camera.angles[PITCH];
s_cameraNavState.lockYaw = camera.angles[YAW];
return true;
}
static void CameraNav_ApplyLock(CCamWnd* cam) {
camera_t& camera = cam->Camera();
CameraNav_ClampPitch(s_cameraNavState.lockPitch);
idVec3 forward = CameraNav_ForwardFromAngles(s_cameraNavState.lockPitch, s_cameraNavState.lockYaw);
camera.origin = s_cameraNavState.lockTarget - forward * s_cameraNavState.lockDistance;
camera.angles[PITCH] = s_cameraNavState.lockPitch;
camera.angles[YAW] = s_cameraNavState.lockYaw;
camera.angles[ROLL] = 0.0f;
}
static void CameraNav_Teleport(CCamWnd* cam) {
qertrace_t trace;
idVec3 hit;
idVec3 dir;
if (!CameraNav_TraceCenter(cam, trace, &hit, &dir)) {
return;
}
camera_t& camera = cam->Camera();
float moveDist = trace.dist - 64.0f;
if (moveDist < 0.0f) {
moveDist = trace.dist * 0.5f;
}
camera.origin += dir * moveDist;
CameraNav_UpdateViews();
}
static bool CameraNav_IsMovementOrModifierKey(int key) {
cameraNavConfig_t& cfg = CameraNav_Config();
return key == cfg.forwardKey || key == cfg.backKey || key == cfg.upKey || key == cfg.downKey ||
key == cfg.leftKey || key == cfg.rightKey || key == cfg.modifier1Key || key == cfg.modifier2Key ||
key == cfg.texPositionKey || key == cfg.texScaleKey || key == cfg.texRotateKey;
}
static bool CameraNav_HandleKeyDown(CCamWnd* cam, UINT key) {
cameraNavConfig_t& cfg = CameraNav_Config();
if (cfg.style != 2 || !CameraNav_IsActive(cam)) {
return false;
}
if (cfg.infoDisplayKey && key == (UINT)cfg.infoDisplayKey) {
s_cameraNavState.infoMode = (s_cameraNavState.infoMode + 1) % 3;
Sys_UpdateWindows(W_CAMERA);
return true;
}
if (cfg.teleportKey && key == (UINT)cfg.teleportKey) {
CameraNav_Teleport(cam);
return true;
}
if (cfg.lockTargetKey && key == (UINT)cfg.lockTargetKey) {
CameraNav_StartLock(cam);
return true;
}
if (CameraNav_IsMovementOrModifierKey((int)key)) {
return true;
}
return false;
}
static bool CameraNav_HandleKeyUp(CCamWnd* cam, UINT key) {
cameraNavConfig_t& cfg = CameraNav_Config();
if (cfg.style != 2 || !CameraNav_IsActive(cam)) {
return false;
}
if (cfg.lockTargetKey && key == (UINT)cfg.lockTargetKey) {
s_cameraNavState.lockActive = false;
return true;
}
if (CameraNav_IsMovementOrModifierKey((int)key)) {
return true;
}
return false;
}
static bool CameraNav_Update(CCamWnd* cam) {
if (!CameraNav_IsActive(cam)) {
return false;
}
cameraNavConfig_t& cfg = CameraNav_Config();
int now = Sys_Milliseconds();
float dtime = (now - s_cameraNavState.lastTime) * 0.001f;
if (dtime <= 0.0f) {
dtime = 0.01f;
}
else if (dtime > 0.1f) {
dtime = 0.1f;
}
s_cameraNavState.lastTime = now;
if (cfg.lockTargetKey) {
if (CameraNav_KeyIsDown(cfg.lockTargetKey)) {
if (!s_cameraNavState.lockActive) {
CameraNav_StartLock(cam);
}
}
else if (s_cameraNavState.lockActive) {
s_cameraNavState.lockActive = false;
}
}
camera_t& camera = cam->Camera();
idVec3 forward, right, up;
CameraNav_GetAxes(camera, forward, right, up);
if (s_cameraNavState.lockActive) {
float zoom = 0.0f;
if (CameraNav_KeyIsDown(cfg.forwardKey)) {
zoom -= CameraNav_MoveSpeed() * dtime;
}
if (CameraNav_KeyIsDown(cfg.backKey)) {
zoom += CameraNav_MoveSpeed() * dtime;
}
if (zoom != 0.0f) {
s_cameraNavState.lockDistance += zoom;
if (s_cameraNavState.lockDistance < 16.0f) {
s_cameraNavState.lockDistance = 16.0f;
}
CameraNav_ApplyLock(cam);
CameraNav_UpdateViews();
}
return true;
}
idVec3 move;
move[0] = move[1] = move[2] = 0.0f;
if (CameraNav_KeyIsDown(cfg.forwardKey)) {
move += forward;
}
if (CameraNav_KeyIsDown(cfg.backKey)) {
move -= forward;
}
if (CameraNav_KeyIsDown(cfg.leftKey)) {
move -= right;
}
if (CameraNav_KeyIsDown(cfg.rightKey)) {
move += right;
}
if (CameraNav_KeyIsDown(cfg.upKey)) {
move[2] += 1.0f;
}
if (CameraNav_KeyIsDown(cfg.downKey)) {
move[2] -= 1.0f;
}
if (move.LengthSqr() > 0.0f) {
move.Normalize();
camera.origin += move * (CameraNav_MoveSpeed() * dtime);
CameraNav_UpdateViews();
}
return true;
}
static bool CameraNav_MouseMove(CCamWnd* cam) {
if (!CameraNav_IsActive(cam)) {
return false;
}
CPoint current;
GetCursorPos(&current);
int dx = current.x - s_cameraNavState.cursorAnchor.x;
int dy = current.y - s_cameraNavState.cursorAnchor.y;
if (dx == 0 && dy == 0) {
return true;
}
cameraNavConfig_t& cfg = CameraNav_Config();
camera_t& camera = cam->Camera();
bool textureAdjusted = false;
if (cfg.texPositionKey && CameraNav_KeyIsDown(cfg.texPositionKey)) {
Select_ShiftTexture((float)dx, (float)-dy, false);
textureAdjusted = true;
}
else if (cfg.texScaleKey && CameraNav_KeyIsDown(cfg.texScaleKey)) {
Select_ScaleTexture((float)dx, (float)-dy, false);
textureAdjusted = true;
}
else if (cfg.texRotateKey && CameraNav_KeyIsDown(cfg.texRotateKey)) {
Select_RotateTexture((float)dy, false);
textureAdjusted = true;
}
if (textureAdjusted) {
SetCursorPos(s_cameraNavState.cursorAnchor.x, s_cameraNavState.cursorAnchor.y);
Sys_UpdateWindows(W_ALL);
return true;
}
if (s_cameraNavState.lockActive) {
float yawSign = cfg.invertLockYaw ? 1.0f : -1.0f;
float pitchSign = cfg.invertLockPitch ? 1.0f : -1.0f;
s_cameraNavState.lockYaw += dx * 0.25f * yawSign;
s_cameraNavState.lockPitch += dy * 0.25f * pitchSign;
CameraNav_ApplyLock(cam);
}
else if (CameraNav_KeyIsDown(cfg.modifier1Key)) {
idVec3 forward, right, up;
CameraNav_GetAxes(camera, forward, right, up);
float scale = CameraNav_CapsScale();
float zMove = cfg.invertZTrans ? (float)dy : (float)-dy;
camera.origin += right * ((float)dx * scale);
camera.origin[2] += zMove * scale;
}
else if (CameraNav_KeyIsDown(cfg.modifier2Key)) {
idVec3 forward, right, up;
CameraNav_GetAxes(camera, forward, right, up);
float scale = CameraNav_CapsScale();
camera.origin += forward * ((float)-dy * scale);
camera.angles[YAW] -= (float)dx * 0.25f;
}
else {
float pitchSign = cfg.invertPitch ? 1.0f : -1.0f;
camera.angles[PITCH] += (float)dy * 0.25f * pitchSign;
camera.angles[YAW] -= (float)dx * 0.25f;
CameraNav_ClampPitch(camera.angles[PITCH]);
}
SetCursorPos(s_cameraNavState.cursorAnchor.x, s_cameraNavState.cursorAnchor.y);
CameraNav_UpdateViews();
return true;
}
static bool CameraNav_HandleMouseWheel(HWND hWnd, WPARAM wParam) {
CWnd* wnd = CWnd::FromHandlePermanent(hWnd);
CCamWnd* cam = DYNAMIC_DOWNCAST(CCamWnd, wnd);
if (!cam) {
return false;
}
short wheelDelta = (short)HIWORD(wParam);
if (wheelDelta == 0) {
return false;
}
camera_t& camera = cam->Camera();
idVec3 forward, right, up;
CameraNav_GetAxes(camera, forward, right, up);
float notches = (float)wheelDelta / 120.0f;
camera.origin += forward * (notches * CameraNav_MoveSpeed());
CameraNav_UpdateViews();
return true;
}
static const char* CameraNav_SurfaceTypeName(surfTypes_t type) {
switch (type)
{
case SURFTYPE_METAL: return "metal";
case SURFTYPE_STONE: return "stone";
case SURFTYPE_FLESH: return "flesh";
case SURFTYPE_WOOD: return "wood";
case SURFTYPE_CARDBOARD: return "cardboard";
case SURFTYPE_LIQUID: return "liquid";
case SURFTYPE_GLASS: return "glass";
case SURFTYPE_PLASTIC: return "plastic";
case SURFTYPE_RICOCHET: return "ricochet";
default: return "none";
}
}
static void CameraNav_AddLine(idStr* lines, int& numLines, const char* text) {
if (numLines >= CAMERA_NAV_MAX_INFO_LINES) {
return;
}
lines[numLines++] = text;
}
static void CameraNav_BuildEntityInfo(CCamWnd* cam, idStr* lines, int& numLines) {
qertrace_t trace;
if (!CameraNav_TraceCenter(cam, trace)) {
CameraNav_AddLine(lines, numLines, "Entity: <none>");
return;
}
entity_t* ent = trace.brush->owner;
CameraNav_AddLine(lines, numLines, "Entity");
CameraNav_AddLine(lines, numLines, va("class: %s", ValueForKey(ent, "classname")));
CameraNav_AddLine(lines, numLines, va("name: %s", ValueForKey(ent, "name")));
for (int i = 0; i < ent->epairs.GetNumKeyVals() && numLines < CAMERA_NAV_MAX_INFO_LINES; i++) {
const idKeyValue* kv = ent->epairs.GetKeyVal(i);
if (!kv) {
continue;
}
CameraNav_AddLine(lines, numLines, va("%s = %s", kv->GetKey().c_str(), kv->GetValue().c_str()));
}
}
static void CameraNav_BuildMaterialInfo(CCamWnd* cam, idStr* lines, int& numLines) {
qertrace_t trace;
if (!CameraNav_TraceCenter(cam, trace) || !trace.face || !trace.face->d_texture) {
CameraNav_AddLine(lines, numLines, "Material: <none>");
return;
}
const idMaterial* material = trace.face->d_texture;
CameraNav_AddLine(lines, numLines, "Material");
CameraNav_AddLine(lines, numLines, material->GetName());
CameraNav_AddLine(lines, numLines, va("size: %d x %d", material->GetImageWidth(), material->GetImageHeight()));
CameraNav_AddLine(lines, numLines, va("surface: %s", CameraNav_SurfaceTypeName(material->GetSurfaceType())));
CameraNav_AddLine(lines, numLines, va("content flags: 0x%08x", material->GetContentFlags()));
CameraNav_AddLine(lines, numLines, va("surface flags: 0x%08x", material->GetSurfaceFlags()));
CameraNav_AddLine(lines, numLines, va("stages: %d", material->GetNumStages()));
CameraNav_AddLine(lines, numLines, va("decl: %s:%d", material->GetFileName(), material->GetLineNum()));
if (material->GetDescription() && material->GetDescription()[0]) {
CameraNav_AddLine(lines, numLines, va("desc: %s", material->GetDescription()));
}
}
static void CameraNav_DrawOverlay(CCamWnd* cam) {
cameraNavConfig_t& cfg = CameraNav_Config();
camera_t& camera = cam->Camera();
bool drawReticle = (cfg.reticleMode == 2) || (cfg.reticleMode == 1 && CameraNav_IsActive(cam));
bool drawInfo = (s_cameraNavState.infoMode != CAMERA_NAV_INFO_NONE);
if (!drawReticle && !drawInfo) {
return;
}
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, camera.width, 0, camera.height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_BLEND);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
globalImages->BindNull();
if (drawReticle) {
float cx = camera.width * 0.5f;
float cy = camera.height * 0.5f;
float size = 8.0f * cfg.reticleScale;
float gap = 3.0f * cfg.reticleScale;
glColor3fv(cfg.reticleColor.ToFloatPtr());
glBegin(GL_LINES);
glVertex2f(cx - size, cy);
glVertex2f(cx - gap, cy);
glVertex2f(cx + gap, cy);
glVertex2f(cx + size, cy);
glVertex2f(cx, cy - size);
glVertex2f(cx, cy - gap);
glVertex2f(cx, cy + gap);
glVertex2f(cx, cy + size);
glEnd();
}
if (drawInfo && g_qeglobals.d_font_list) {
idStr lines[CAMERA_NAV_MAX_INFO_LINES];
int numLines = 0;
if (s_cameraNavState.infoMode == CAMERA_NAV_INFO_ENTITY) {
CameraNav_BuildEntityInfo(cam, lines, numLines);
}
else if (s_cameraNavState.infoMode == CAMERA_NAV_INFO_MATERIAL) {
CameraNav_BuildMaterialInfo(cam, lines, numLines);
}
//glColor3f(1.0f, 1.0f, 1.0f);
//glListBase(g_qeglobals.d_font_list);
//int y = camera.height - 18;
//for (int i = 0; i < numLines && y > 8; i++, y -= 14) {
// const char* text = lines[i].c_str();
// glRasterPos2i(8, y);
// glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
//}
}
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
int g_axialAnchor = -1;
int g_axialDest = -1;
bool g_bAxialMode = false;
@@ -133,9 +911,25 @@ INT_PTR WINAPI CamWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg)
{
case WM_KILLFOCUS:
case WM_SETFOCUS:
SendMessage(hWnd, WM_NCACTIVATE, uMsg == WM_SETFOCUS, 0);
{
CWnd* wnd = CWnd::FromHandlePermanent(hWnd);
CCamWnd* cam = DYNAMIC_DOWNCAST(CCamWnd, wnd);
if (cam) {
CameraNav_Stop(cam);
}
SendMessage(hWnd, WM_NCACTIVATE, FALSE, 0);
return 0;
}
case WM_SETFOCUS:
SendMessage(hWnd, WM_NCACTIVATE, TRUE, 0);
return 0;
case WM_MOUSEWHEEL:
if (CameraNav_HandleMouseWheel(hWnd, wParam)) {
return 0;
}
break;
case WM_NCCALCSIZE: // don't let windows copy pixels
DefWindowProc(hWnd, uMsg, wParam, lParam);
@@ -187,6 +981,9 @@ BOOL CCamWnd::PreCreateWindow(CREATESTRUCT& cs) {
=======================================================================================================================
*/
void CCamWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
if (CameraNav_HandleKeyDown(this, nChar)) {
return;
}
g_pParentWnd->HandleKey(nChar, nRepCnt, nFlags);
}
@@ -247,15 +1044,24 @@ extern void Select_RotateTexture(float amt, bool absolute);
void CCamWnd::OnMouseMove(UINT nFlags, CPoint point) {
CRect r;
GetClientRect(r);
if (GetCapture() == this && (GetAsyncKeyState(VK_MENU) & 0x8000) && !((GetAsyncKeyState(VK_SHIFT) & 0x8000) || (GetAsyncKeyState(VK_CONTROL) & 0x8000))) {
if (CameraNav_MouseMove(this)) {
m_ptLastCursor = point;
return;
}
if (GetCapture() == this && (GetAsyncKeyState(VK_MENU) & 0x8000)) {
// Alt-drag texture manipulation. The old condition excluded shift/control
// before checking them, so alt+shift and alt+control never reached the
// scale/rotate paths and could interrupt normal shift-select drags.
if (GetAsyncKeyState(VK_CONTROL) & 0x8000) {
Select_RotateTexture((float)point.y - m_ptLastCursor.y);
}
else if (GetAsyncKeyState(VK_SHIFT) & 0x8000) {
Select_ScaleTexture((float)point.x - m_ptLastCursor.x, (float)m_ptLastCursor.y - point.y);
Select_ScaleTexture((float)point.x - m_ptLastCursor.x, (float)m_ptLastCursor.y - point.y, false);
}
else {
Select_ShiftTexture((float)point.x - m_ptLastCursor.x, (float)m_ptLastCursor.y - point.y);
Select_ShiftTexture((float)point.x - m_ptLastCursor.x, (float)m_ptLastCursor.y - point.y, false);
}
}
else {
@@ -271,6 +1077,16 @@ void CCamWnd::OnMouseMove(UINT nFlags, CPoint point) {
*/
void CCamWnd::OnLButtonDown(UINT nFlags, CPoint point) {
m_ptLastCursor = point;
if (CameraNav_IsActive(this)) {
CRect r;
GetClientRect(r);
int x = r.Width() / 2;
int y = r.Height() / 2;
Cam_MouseDown(x, y, MK_LBUTTON);
Cam_MouseUp(x, y, 0);
Sys_UpdateWindows(W_ALL);
return;
}
OriginalMouseDown(nFlags, point);
}
@@ -303,6 +1119,10 @@ void CCamWnd::OnMButtonUp(UINT nFlags, CPoint point) {
=======================================================================================================================
*/
void CCamWnd::OnRButtonDown(UINT nFlags, CPoint point) {
m_ptLastCursor = point;
if (!(nFlags & (MK_SHIFT | MK_CONTROL)) && CameraNav_Begin(this)) {
return;
}
OriginalMouseDown(nFlags, point);
}
@@ -311,6 +1131,10 @@ void CCamWnd::OnRButtonDown(UINT nFlags, CPoint point) {
=======================================================================================================================
*/
void CCamWnd::OnRButtonUp(UINT nFlags, CPoint point) {
if (CameraNav_IsActive(this)) {
CameraNav_Stop(this);
return;
}
OriginalMouseUp(nFlags, point);
}
@@ -1136,6 +1960,8 @@ void CCamWnd::Cam_Draw() {
//
globalImages->BindNull();
CameraNav_DrawOverlay(this);
glFinish();
QE_CheckOpenGLForErrors();
@@ -1165,6 +1991,9 @@ void CCamWnd::OnSize(UINT nType, int cx, int cy) {
=======================================================================================================================
*/
void CCamWnd::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) {
if (CameraNav_HandleKeyUp(this, nChar)) {
return;
}
g_pParentWnd->HandleKey(nChar, nRepCnt, nFlags, false);
}
@@ -2350,7 +3179,7 @@ void CCamWnd::FreeRendererState() {
ent->lightDef = -1;
}
}
for (int i = s_editorBModelStates.Num() - 1; i >= 0; i--) {
EditorFreeBModelState(i);
@@ -2630,6 +3459,11 @@ void CCamWnd::Cam_Render() {
void CCamWnd::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == CAMERA_NAV_TIMER_ID) {
CameraNav_Update(this);
return;
}
if (animationMode || nIDEvent == 1) {
Sys_UpdateWindows(W_CAMERA);
}
+2 -2
View File
@@ -172,8 +172,8 @@ void CMediaPreviewDlg::OnMouseMove(UINT nFlags, CPoint point)
sysEvent_t ev;
memset( &ev, 0, sizeof( ev ) );
ev.evType = SE_MOUSE;
ev.evValue = (point.x / rct.Width()) * 640.0f;
ev.evValue2 = (point.y / rct.Height()) * 480.0f;
ev.evValue = (point.x / rct.Width()) * SCREEN_WIDTH;
ev.evValue2 = (point.y / rct.Height()) * SCREEN_HEIGHT;
gui->HandleEvent(&ev, 0);
}
}
+2 -2
View File
@@ -47,7 +47,7 @@ idUserInterfaceManager * uiManager = &uiManagerLocal;
*/
void idUserInterfaceManagerLocal::Init() {
screenRect = idRectangle(0, 0, 640, 480);
screenRect = idRectangle(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
dc.Init();
}
@@ -312,7 +312,7 @@ bool idUserInterfaceLocal::InitFromFile( const char *qpath, bool rebuild, bool c
desktop->SetFlag( WIN_DESKTOP );
desktop->name = "Desktop";
desktop->text = va( "Invalid GUI: %s", qpath );
desktop->rect = idRectangle( 0.0f, 0.0f, 640.0f, 480.0f );
desktop->rect = idRectangle( 0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT);
desktop->drawRect = desktop->rect;
desktop->foreColor = idVec4( 1.0f, 1.0f, 1.0f, 1.0f );
desktop->backColor = idVec4( 0.0f, 0.0f, 0.0f, 1.0f );
+6 -6
View File
@@ -114,8 +114,8 @@ void idWindow::CommonInit() {
timeLine = -1;
xOffset = yOffset = 0.0;
cursor = 0;
forceAspectWidth = 640;
forceAspectHeight = 480;
forceAspectWidth = SCREEN_WIDTH;
forceAspectHeight = SCREEN_HEIGHT;
matScalex = 1;
matScaley = 1;
borderSize = 0;
@@ -2116,8 +2116,8 @@ void idWindow::SetInitialState(const char *_name) {
name = _name;
matScalex = 1.0;
matScaley = 1.0;
forceAspectWidth = 640.0;
forceAspectHeight = 480.0;
forceAspectWidth = SCREEN_WIDTH;
forceAspectHeight = SCREEN_HEIGHT;
noTime = false;
visible = true;
flags = 0;
@@ -4125,8 +4125,8 @@ default colors, etc..
================
*/
void idWindow::SetDefaults ( void ) {
forceAspectWidth = 640.0f;
forceAspectHeight = 480.0f;
forceAspectWidth = SCREEN_WIDTH;
forceAspectHeight = SCREEN_HEIGHT;
matScalex = 1;
matScaley = 1;
borderSize = 0;
+25
View File
@@ -0,0 +1,25 @@
[3d navigation]
style=2
forward=w
back=s
up=space
down=shift
left=a
right=d
modifier1=q
modifier2=e
invertpitch=0
invertztrans=0
capslockscale=5
reticlemode=1
reticlescale=1
reticlecolor=251, 199, 30
teleport=f
infodisplay=t
locktarget=r
invertlockpitch=0
invertlockyaw=0
texposition=z
texscale=x
texrotate=c