), please add some keyboard shortcuts as well -- or just copy and paste the code below.
Code: Select all
;
; ------------------------------------------------------------
;
;   PureBasic - Common 3D functions
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
#OgreAntialiasingBug=1
#WINDOW_Screen3DRequester=0
Enumeration
	#GADGET_FullScreen
	#GADGET_Windowed
	#GADGET_ScreenModesLabel
	#GADGET_WindowedModes
	#GADGET_Launch
	#GADGET_Cancel
	#GADGET_Logo
	#GADGET_Frame
	#GADGET_ScreenModes
	#GADGET_Antialiasing
	#GADGET_AntialiasingModes
EndEnumeration
Global Screen3DRequester_FullScreen, Screen3DRequester_ShowStats
UsePNGImageDecoder()
Procedure Screen3DRequester()
	OpenPreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
	FullScreen          = ReadPreferenceLong  ("FullScreen"        , 0)
	FullScreenMode$     = ReadPreferenceString("FullScreenMode"    , "800x600")
	WindowedScreenMode$ = ReadPreferenceString("WindowedScreenMode", "800x600")
	AAMode              = ReadPreferenceLong  ("Antialiasing"      , 0)
	If ExamineDesktops()
		ScreenX = DesktopWidth(0)
		ScreenY = DesktopHeight(0)
		ScreenD = DesktopDepth(0)
		ScreenF = DesktopFrequency(0)
	EndIf
	If OpenWindow(#WINDOW_Screen3DRequester, 0, 0, 396, 230, "PureBasic - 3D Demos", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_Invisible)
		Top = 6
		ImageGadget  (#GADGET_Logo, 6, Top, 0, 0, LoadImage(0,"Data/PureBasic3DLogo.png"), #PB_Image_Border) : Top+76
		Frame3DGadget(#GADGET_Frame, 6, Top, 384, 105, "", 0) : Top+20
		OptionGadget(#GADGET_FullScreen, 70, Top, 100, 20, "&Fullscreen")        : Top+25
		OptionGadget(#GADGET_Windowed  , 70, Top, 100, 20, "&Windowed")          : Top+25
		TextGadget(#GADGET_Antialiasing, 70, Top+5, 100, 20, "&Antialiasing mode",#SS_NOTIFY) : Top - 50
		ComboBoxGadget (#GADGET_ScreenModes  , 190, Top, 150, 21)     : Top+25
		ComboBoxGadget (#GADGET_WindowedModes, 190, Top, 150, 21)     : Top+25
		ComboBoxGadget (#GADGET_AntialiasingModes, 190, Top, 150, 21) : Top+45
		ButtonGadget (#GADGET_Launch,   6, Top, 180, 25, "&Launch", #PB_Button_Default)
		ButtonGadget (#GADGET_Cancel, 200, Top, 190, 25, "&Cancel")
		AddGadgetItem(#GADGET_AntialiasingModes,-1,"None")
		AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x2")
		AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x4")
		AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x6")
		SetGadgetState(#GADGET_AntialiasingModes,AAMode)
		AddKeyboardShortcut(#WINDOW_Screen3DRequester,#PB_Shortcut_L,#GADGET_Launch)
		AddKeyboardShortcut(#WINDOW_Screen3DRequester,#PB_Shortcut_Return,#GADGET_Launch)
		AddKeyboardShortcut(#WINDOW_Screen3DRequester,#PB_Shortcut_C,#GADGET_Cancel)
		AddKeyboardShortcut(#WINDOW_Screen3DRequester,#PB_Shortcut_Escape,#GADGET_Cancel)
		AddKeyboardShortcut(#WINDOW_Screen3DRequester,#PB_Shortcut_F,#GADGET_FullScreen)
		AddKeyboardShortcut(#WINDOW_Screen3DRequester,#PB_Shortcut_W,#GADGET_Windowed)
		AddKeyboardShortcut(#WINDOW_Screen3DRequester,#PB_Shortcut_A,#GADGET_Antialiasing)
		If ExamineScreenModes()
			Position = 0
			While NextScreenMode()
				Position + 1
				Width       = ScreenModeWidth()
				Height      = ScreenModeHeight()
				Depth       = ScreenModeDepth()
				RefreshRate = ScreenModeRefreshRate()
				If Depth > 8
					AddGadgetItem(#GADGET_ScreenModes, -1, Str(Width)+"x"+Str(Height)+"x"+Str(Depth)+"@"+Str(RefreshRate))
					If ScreenX = Width And ScreenY = Height And ScreenD = Depth And ScreenF = RefreshRate
						SetGadgetState(#GADGET_ScreenModes, Position)
						FullScreenMode$ = Str(Width)+"x"+Str(Height)+"x"+Str(Depth)+"@"+Str(RefreshRate)
					EndIf
				EndIf
			Wend
		EndIf
		ExamineDesktops()
		NbScreenModes = 7
		Restore WindowedScreenDimensions
		Repeat
			Read.l CurrentWidth
			Read.l CurrentHeight
			If CurrentWidth < DesktopWidth(0) And CurrentHeight < DesktopHeight(0)
				AddGadgetItem(#GADGET_WindowedModes, -1, Str(CurrentWidth)+ "x"+Str(CurrentHeight))
				NbScreenModes - 1
			Else
				NbScreenModes = 0
			EndIf
		Until NbScreenModes = 0
		SetGadgetState(#GADGET_FullScreen, FullScreen)
		SetGadgetState(#GADGET_Windowed  , 1-FullScreen)
		SetGadgetText (#GADGET_ScreenModes  , FullScreenMode$)
		SetGadgetText (#GADGET_WindowedModes, WindowedScreenMode$)
		DisableGadget (#GADGET_ScreenModes  , 1-FullScreen)
		DisableGadget (#GADGET_WindowedModes, FullScreen)
		HideWindow(#WINDOW_Screen3DRequester, 0)
		Repeat
			Event = WaitWindowEvent()
			Select Event
			Case #PB_Event_Gadget,#PB_Event_Menu
				Select EventGadget()
				Case #GADGET_Launch
					Quit = 2
				Case #GADGET_Cancel
					Quit = 1
				Case #GADGET_FullScreen
					DisableGadget(#GADGET_ScreenModes  , 0)
					DisableGadget(#GADGET_WindowedModes, 1)
					SetGadgetState(#GADGET_FullScreen,1)
					SetActiveGadget(#GADGET_ScreenModes)
				Case #GADGET_Windowed
					DisableGadget(#GADGET_ScreenModes  , 1)
					DisableGadget(#GADGET_WindowedModes, 0)
					SetGadgetState(#GADGET_Windowed,1)
					SetActiveGadget(#GADGET_WindowedModes)
				Case #GADGET_Antialiasing
					SetActiveGadget(#GADGET_AntialiasingModes)
				EndSelect
			Case #PB_Event_CloseWindow
				Quit = 1
			EndSelect
		Until Quit > 0
		FullScreen          = GetGadgetState(#GADGET_FullScreen)
		FullScreenMode$     = GetGadgetText (#GADGET_ScreenModes)
		WindowedScreenMode$ = GetGadgetText (#GADGET_WindowedModes)
		AAMode              = GetGadgetState(#GADGET_AntialiasingModes)
		CloseWindow(#WINDOW_Screen3DRequester)
	EndIf
	If Quit = 2 ; Launch button has been pressed
		CreatePreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
		WritePreferenceLong  ("FullScreen"        , FullScreen)
		WritePreferenceString("FullScreenMode"    , FullScreenMode$)
		WritePreferenceString("WindowedScreenMode", WindowedScreenMode$)
		WritePreferenceLong  ("Antialiasing"      , AAMode)
		If FullScreen
			ScreenMode$ = FullScreenMode$
		Else
			ScreenMode$ = WindowedScreenMode$
		EndIf
		RefreshRate = Val(StringField(ScreenMode$, 2, "@"))
		ScreenMode$ = StringField(ScreenMode$, 1, "@") ; Remove the refresh rate info, so we can parse it easily
		ScreenWidth  = Val(StringField(ScreenMode$, 1, "x"))
		ScreenHeight = Val(StringField(ScreenMode$, 2, "x"))
		ScreenDepth  = Val(StringField(ScreenMode$, 3, "x"))
		Screen3DRequester_FullScreen = FullScreen ; Global variable, for the Screen3DEvents
		Select AAMode
		Case 0:
			CompilerIf Defined(OgreAntialiasingBug,#PB_Constant)=#False
				AntialiasingMode(#PB_AntialiasingMode_None)
			CompilerEndIf
		Case 1:
			AntialiasingMode(#PB_AntialiasingMode_x2)
		Case 2:
			AntialiasingMode(#PB_AntialiasingMode_x4)
		Case 3:
			AntialiasingMode(#PB_AntialiasingMode_x6)
		EndSelect
		If FullScreen
			Result = OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "3D Demos", #PB_Screen_WaitSynchronization, RefreshRate)
		Else
			If OpenWindow(0, 0, 0, ScreenWidth, ScreenHeight+MenuHeight(), "PureBasic - 3D Demos", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
				CreateMenu(0, WindowID(#WINDOW_Screen3DRequester))
				MenuTitle("Project")
				MenuItem(0, "Quit")
				MenuTitle("About")
				MenuItem(1, "About...")
				Result = OpenWindowedScreen(WindowID(#WINDOW_Screen3DRequester), 0, 0, ScreenWidth, ScreenHeight, 0, 0, 0)
			EndIf
		EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure Screen3DEvents()
	If Screen3DRequester_FullScreen = 0 ; Handle all the events relatives to the window..
		Repeat
			Event = WindowEvent()
			Select Event
			Case #PB_Event_Menu
				Select EventMenu()
				Case 0
					Quit = 1
				Case 2
					MessageRequester("Info", "Windowed 3D in PureBasic !", 0)
				EndSelect
			Case #PB_Event_CloseWindow
				Quit = 1
			EndSelect
			If Quit = 1 : End : EndIf  ; Quit the app immediately
		Until Event = 0
	EndIf
	If ExamineKeyboard()
		If KeyboardReleased(#PB_Key_F1)
			Screen3DRequester_ShowStats = 1-Screen3DRequester_ShowStats ; Switch the ShowStats on/off
		EndIf
	EndIf
EndProcedure
Procedure Screen3DStats()
	If Screen3DRequester_ShowStats
		; Nothing printed for now
	EndIf
EndProcedure
DataSection
	WindowedScreenDimensions:
	Data.l  320, 240
	Data.l  512, 384
	Data.l  640, 480
	Data.l  800, 600
	Data.l 1024, 768
	Data.l 1280, 1024
	Data.l 1600, 1200
EndDataSection