Code archives/Graphics/Projection Matrix
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Projection Matrix - Scaling your game on the fly "Yan to GfK to me to here :) | |||||
[code] Type TVirtualGraphics Global virtualWidth, virtualHeight Global xRatio!, yRatio! Function Set(width=640, height=480, scale#=1) TVirtualGraphics.virtualWidth = width TVirtualGraphics.virtualHeight = height TVirtualGraphics.xRatio! = width / Double(GraphicsWidth()) TVirtualGraphics.yRatio! = height / Double(GraphicsHeight()) ?Win32 Local dxVer:Byte Local D3D7Driver:TD3D7Max2DDriver = TD3D7Max2DDriver(_max2dDriver) Local D3D9Driver:TD3D9Max2DDriver = TD3D9Max2DDriver(_max2dDriver) If TD3D7Max2DDriver(_max2dDriver) <> Null dxVer = 7 EndIf If TD3D9Max2DDriver(_max2dDriver) <> Null dxVer = 9 EndIf If dxVer <> 0 'dx driver was set, otherwise its GL Local matrix#[] = [2.0 / (width / scale#), 0.0, 0.0, 0.0,.. 0.0, -2.0 / (height / scale#), 0.0, 0.0,.. 0.0, 0.0, 1.0, 0.0,.. -1 - (1.0 / width), 1 + (1.0 / height), 1.0, 1.0] ',scale#] Select dxVer Case 7 D3D7Driver.device.SetTransform(D3DTS_PROJECTION, matrix) Case 9 D3D9Driver._D3DDevice9.SetTransform(D3DTS_PROJECTION, matrix) End Select Else ? glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(0, width / scale:Float, height / scale:Float, 0, - 1, 1) glMatrixMode(GL_MODELVIEW) glLoadIdentity() ?Win32 EndIf ? End Function Function MouseX() Return (BRL.PolledInput.MouseX() * TVirtualGraphics.xRatio!) End Function Function MouseY() Return (BRL.PolledInput.MouseY() * TVirtualGraphics.yRatio!) End Function End Type [/code] |
Comments
| ||
| Any chance of a usage example? Does this method cause the same sort of performance hit that simply scaling the display up using the SetScale command does? For example, if I set my game to 2 times the scale my framerate drops by half using SetScale. Would this method do the same? [Edit - OK it does.] Also, I`m getting a driver not found for the DX9 one. I assume that you have to find this yourself? Maybe this should be mentioned for new users? Other than that what are the main reasons for using this method over a simple SetScale on all game objects? Jason. |
| ||
| http://code.google.com/p/max2ddx9/ |
| ||
Usage is simple enoughT:TVirtualGraphics=new TVirtualGraphics T.Set(800,600) done... |
| ||
| Compiler Error Identifier 'TD3DpMax2DDriver' not found Just downloaded and installed the above max2ddx9 link, yet get this error? |
| ||
| Did you compile it? You could always comment out the DX9 stuff to test it if thats what your looking to do. |
| ||
| Usage is simple enough Its not even THAT complex - you don't need to create a tVirtualGraphics object as it uses Global/Function rather than Field/Method:T:TVirtualGraphics=new TVirtualGraphics T.Set(800,600) Graphics 1024,768 'or any user-defined res tVirtualGraphics.Set(800,600) |
| ||
Heres a quick example (without DX9):
Graphics 1024,768,0 'or any user-defined res
tVirtualGraphics.Set(800,600)
AutoMidHandle 1
Global BMX01IMG:TImage = LoadImage("C:\BlitzMax\samples\birdie\misc\filmclip\media\B-Max.png",FILTEREDIMAGE|DYNAMICIMAGE)
While Not AppTerminate()
Cls
DrawLine 0,0,TVirtualGraphics.virtualWidth,TVirtualGraphics.virtualHeight
DrawImage BMX01IMG,TVirtualGraphics.virtualWidth/2,TVirtualGraphics.virtualHeight/2
DrawText "Virtual Width: "+TVirtualGraphics.virtualWidth,10,10
DrawText "Virtual Width: "+TVirtualGraphics.virtualHeight ,10,20
controls()
Flip
Wend
Function controls()
If KeyHit(KEY_1)
tVirtualGraphics.Set(640,480)
EndIf
If KeyHit(KEY_2)
tVirtualGraphics.Set(800,600)
EndIf
If KeyHit(KEY_3)
tVirtualGraphics.Set(1024,768)
EndIf
End Function
Type TVirtualGraphics
Global virtualWidth, virtualHeight
Global xRatio!, yRatio!
Function Set(width=640, height=480, scale#=1)
TVirtualGraphics.virtualWidth = width
TVirtualGraphics.virtualHeight = height
TVirtualGraphics.xRatio! = width / Double(GraphicsWidth())
TVirtualGraphics.yRatio! = height / Double(GraphicsHeight())
?Win32
Local dxVer:Byte
Local D3D7Driver:TD3D7Max2DDriver = TD3D7Max2DDriver(_max2dDriver)
If TD3D7Max2DDriver(_max2dDriver) <> Null
dxVer = 7
EndIf
If dxVer <> 0 'dx driver was set, otherwise its GL
Local matrix#[] = [2.0 / (width / scale#), 0.0, 0.0, 0.0,..
0.0, -2.0 / (height / scale#), 0.0, 0.0,..
0.0, 0.0, 1.0, 0.0,..
-1 - (1.0 / width), 1 + (1.0 / height), 1.0, 1.0] ',scale#]
Select dxVer
Case 7
D3D7Driver.device.SetTransform(D3DTS_PROJECTION, matrix)
End Select
Else
?
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, width / scale:Float, height / scale:Float, 0, - 1, 1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
?Win32
EndIf
?
End Function
Function MouseX()
Return (BRL.PolledInput.MouseX() * TVirtualGraphics.xRatio!)
End Function
Function MouseY()
Return (BRL.PolledInput.MouseY() * TVirtualGraphics.yRatio!)
End Function
End Type
Press 1 for (640,480) Press 2 for (800,600) Press 3 for (1024,768) |
| ||
| No one has been able to get this to work in DX9 yet. |
| ||
| Didn't Mark build this into BMax? |
| ||
| Yup, 1.37's 'virtual resolution' commands are using the projection matrix. |
Code Archives Forum