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.
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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" ;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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" );
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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" );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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(¤t);
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||