Core2D Graphics Module [widescreen support]

BlitzMax Forums/BlitzMax Programming/Core2D Graphics Module [widescreen support]

Chroma(Posted 2010) [#1]
I wrote this while I was deployed. It's part of my Core2D framework. There's cursor, timing, and other neat modules but I'll let you guys check this one out first. If you see anything that can be improved please let me know.

' Core2D Graphics Module
' Cross-Platform Projection Matrix

Strict

Private

Global _width,_height,_depth,_hertz
Global _xOrigin#,_yOrigin#
Global _box1:TBox
Global _box2:TBox

Public

Function Grafx(width,height,depth=0,hertz=60)

	_width = width
	_height = height
	_depth = depth
	_hertz = hertz

	Select _depth
		Case 0
			Graphics _width,_height,_depth,_hertz

		Case 16,24,32
			
			Local deskRatio# = Float DesktopWidth()/DesktopHeight()
			Local gameRatio# = Float _width/_height
			Local scale#
			Local virtWidth#,virtHeight#

			Select True
			
				Case gameRatio < deskRatio		'Wide Screen
					scale 	= Float DesktopHeight() / _height
					virtWidth 	= Float DesktopWidth() / scale
					virtHeight 	= _height
					_xOrigin 	= (virtWidth - _width) / 2.0
					_yOrigin 	= 0
					_box1 	= TBox.Create(-_xOrigin,0,_xOrigin,_height)
					_box2 	= TBox.Create(_width,0,_xOrigin,_height)
				
				Case gameRatio > deskRatio		'Tall Screen
					scale 	= Float DesktopWidth() / _width
					virtWidth 	= _width
					virtHeight 	= Float DesktopHeight() / scale
					_xOrigin 	= 0
					_yOrigin 	= (virtHeight - _height) / 2.0
					_box1 	= TBox.Create(0,-_yOrigin,_width,_yOrigin)
					_box2 	= TBox.Create(0,_height,_width,_yOrigin)
				
				Default					'4:3 Screen
					virtWidth  	= _width
					virtHeight 	= _height
					_xOrigin 	= 0
					_yOrigin 	= 0

			End Select
			
			Graphics DesktopWidth(),DesktopHeight(),DesktopDepth(),DesktopHertz()		
			SetVirtualResolution virtWidth,virtHeight
			SetViewport 0,0,virtWidth,virtHeight
			SetOrigin _xOrigin,_yOrigin
		
		Default
			RuntimeError("Invalid Grafx Mode.")
	End Select

End Function

Function GrafxFlip(sync=-1)
	SetColor 5,5,10
	SetTransform(0,1,1)
	If _box1 Then DrawRect(_box1.x,_box1.y,_box1.w,_box1.h)
	If _box2 Then DrawRect(_box2.x,_box2.y,_box2.w,_box2.h)
	SetColor 255,255,255
	Flip sync
End Function

Function GrafxWidth()
	Return _width
End Function

Function GrafxHeight()
	Return _height
End Function

Function GrafxMouseX()
	Return VirtualMouseX() - _xOrigin
End Function

Function GrafxMouseY()
	Return VirtualMouseY() - _yOrigin
End Function

Type TBox
	Field x#,y#,w#,h#
	Function Create:TBox(x#,y#,w#,h#)
		Local box:TBox = New TBox
		box.x = x
		box.y = y
		box.w = w
		box.h = h
		Return box
	End Function
End Type


Last edited 2010


Chroma(Posted 2010) [#2]
Can someone test this out please.


wmaass(Posted 2010) [#3]
Looks good to me.

You in the service Chroma?


Chroma(Posted 2010) [#4]
Yep and just got back from Afghanistan a couple months ago. What about you?


Chroma(Posted 2010) [#5]
Basically this will take your casual game resolution say of 800x600 or 1024x768 and run it in widescreen or tall screen with the appropriate blacked out area. It's cross-platform. Props to sswift for originally inspiring everyone on this board with his version of it.

There are 3 modes for setting the graphics.

Mode 0 sets it to windowed.
Mode 1 sets it to fullscreen.
Mode 2 is where the magic happens. It gets the desktop resolution, does a ratio check on it and bumps it against your resolution ratio. Then sets the physical resolution to the desktop resolution and sets the virtual resolution based on what your game resolution is and keeps the perspective correct. If you've got a 1280x1024 monitor it will correct for that too. It does calculate a new Origin X and Y so the upper left corner where the black pillar and the visible part meet is the new 0,0.


BlitzSupport(Posted 2010) [#6]
Just had a quick go of the demo and it's looking good!

Probably not a bug as such (int rounding), but with real desktop at 1440 x 900 and game res set to 1680 x 1050, the lower-right corner is listed as 1678, 1048 rather than 1679, 1049.


wmaass(Posted 2010) [#7]
Welcome back Chroma! As for me, spent many years as an army brat, never served though. Glad you are safe.


Chroma(Posted 2010) [#8]
Thanks for testing it James. Yeah that's an issue when the game res is bigger than the desktop res. But the culprit might be the CursorX and CursorY functions. They just return an integer because I figured that much mouse accuracy wasn't needed. This is mainly for putting a 800x600 or 1024x768 game onto a widescreen monitor. Popcap is doing something like this for Plants vs Zombies I believe. Grey Alien might want to check this out, but he may have already coded something like this too.

Thanks wmaass. That means a lot to me.


Blitzplotter(Posted 2010) [#9]
Chroma, compiles fine here.

Welcome back - I've got just under a year myself until I draw my gratuity!

Right, scrolled to the bottom & changed the value passed to the function - the windowed mode allows you to see the task bar, however the top bit of the screen does not look very windowed. This was on the laptop, will try it in 1920 by 1200 for u later. Seeng the task bar is sweet though with the top bit being dedicated to the app.


Chroma(Posted 2010) [#10]
Hmm...are you using mode 2? 2 is fullscreen. 0 and 1 really are just windowed and fullscreen (stretched). Mode 2 is what I'm really wondering about how it works on lots of different laptops or machines with widescreen monitors.

Basically more and more people have widescreen monitors and I wanted a way for them to be able to play casual games without the stretched graphics.

Yep I'm really looking forward to retiring. I'm tired of um...working lol. Yeah that's it in a nutshell. No offense Mark! But when you're passion is programming and that's your job...it's not much of a job lol.

EDIT: If you make any changes please let me know as I'm curious if I got any of it wrong.


GaryV(Posted 2010) [#11]
Chroma: You mentioned PopCap. You might want to look here:

http://popcapframework.sourceforge.net

There might be some things you could use/port over to your project and the license is very fair.


Blitzplotter(Posted 2010) [#12]
Had a little mess around on widescreen, works well. Changed the code at the bottom a little, in windowed mode just needed to reduce the rez to lower than the rez of the display you are using to see the windows borders.

In mode 2, knocked down the rez a little from 1920x1200 to see if the 'letterbox' area would start to appear - just like on widescreen films, and it did.




Chroma(Posted 2010) [#13]
I just put this in the code archives. It's been dumbed down a bit. There is just windowed and fullscreen modes and the pillars are only available in fullscreen now. It's a bit more automatic.

http://blitzbasic.com/codearcs/codearcs.php?code=2796


TeaBoy(Posted 2010) [#14]
ah, another member of the services ;o) I thought it was only me Chroma, good stuff ;)


therevills(Posted 2010) [#15]
This looks good, the only thing I can see that might be an issue is what if the graphics card cant handle "graphics" at the selected desktop resolution?


Chroma(Posted 2010) [#16]
This is what I mean by "dumbed" down. It uses whatever the desktop resolution is currently set at.


orgos(Posted 2010) [#17]
This is very good, but have some issues when you use D3D7Max2DDriver

For D3D9Max2DDriver and GLMax2DDriver work perfect.


Chroma(Posted 2010) [#18]
Thanks for the heads up. I'll check out.

Glad you like it.