Graphics Abstraction Layer - Suggestions?
BlitzMax Forums/BlitzMax Programming/Graphics Abstraction Layer - Suggestions?
| ||
| I was wondering if anyone would mind taking a look over this and tell me if that have any suggestions on areas that would need another look-over for the abstraction layer of my graphics engine (not game engine -- this will not know what entities are or that they even exist). So, here's the code, if nobody minds taking a look-see at it:
Rem
Cower General Public License
This license is based off of the zlib/libpng license,
I do not take credit for the creation of it as such.
This software is 'as-is', without any express or implied
warranty. In no event will the author(s) be held liable
for damages arising from the use of this software.
You are granted to use this software for any purpose,
including commercial applications of the software, and
to alter, redistribute, and copy it freely, subject to
the following terms:
1. You are not to misrepresent the origin of the software;
you must not claim that you created the original software.
If you use this software, an acknowledgement in the product
documentation (or elsewhere) would be appreciated, but it is
not required.
2. Altered source versions must be plainly marked as such, and must
not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
4. Any modifications made to the source code must be made freely available
upon request and under the Cower General Public License.
5. Usage of the software and license can be terminated at any time
by the author of the software.
If you disagree with any of the terms of the license, you are not permitted
to use the software and should delete it immediately.
EndRem
Strict
Private
Global __glob_activeDevice:GraphicsDevice=Null
Public
Type GraphicsDevice Abstract
Method New()
__glob_activeDevice=Self
End Method
Function GetActiveDevice:GraphicsDevice( )
Return __glob_activeDevice
End Function
Method Initialize( gmode:GraphicsMode ) Abstract
Method Reset( gmode:GraphicsMode ) Abstract
Method SetTextureUnit( idx:Int ) Abstract
Method SetTexture( t:Texture ) Abstract
Method GetTexture:Texture( ) Abstract
Method SetWorldMatrix( mat:Matrix, idx:Int = 0 ) Abstract
Method SetTextureMatrix( mat:Matrix, idx:Int = 0 ) Abstract
Method SetProjectionMatrix( mat:Matrix ) Abstract
Method SetViewMatrix( mat:Matrix ) Abstract
Method GetWorldMatrix:Matrix( idx:Int = 0 ) Abstract
Method GetTextureMatrix:Matrix( idx:Int = 0 ) Abstract
Method GetProjectionMatrix:Matrix( ) Abstract
Method GetViewMatrix:Matrix( ) Abstract
Method SetGraphicsState( s:GraphicsState ) Abstract
Method GetGraphicsState:GraphicsState( ) Abstract
Method SetClearMode( cm:ClearMode ) Abstract
Method GetClearMode( cm:ClearMode ) Abstract
Method Clear( ) Abstract
Method Present( ) Abstract
Method GetBackBuffer:Buffer( ) Abstract
Method SetShader( s:Shader ) Abstract
Method GetShader( s:Shader ) Abstract
Method AddRenderTarget( t:RenderTarget ) Abstract
Method RemoveRenderTarget( t:RenderTarget ) Abstract
Method Render( op:RenderOp ) Abstract
Method BeginScene( ) Abstract
Method EndScene( ) Abstract
Method CreateTexture:Texture( flags:TextureFlags ) Abstract
End Type
Type GraphicsMode
Field Width:Int
Field Height:Int
Field BPP:Int
Field Hertz:Int
Field FullScreen:Int
Field BackBuffer:Int
Field StencilBuffer:Int
Field DepthBuffer:Int
End Type
Type VertexData
Field _data:Vertex[]
Method AddVertex( x#=0, y#=0, z#=0,..
u#=0, v#=0, w#=0,..
r#=1, g#=1, b#=1, a#=1 )
Local idx:Int=_data.Length
_data[idx]=Vertex.Create(x, y, z,..
u, v, w,..
r, g, b, a)
Return idx
End Method
End Type
Type VertexBufferFactory
Method CreateVertexBuffer:VertexBuffer( vd:VertexData ) Abstract
End Type
Type VertexBuffer Extends Buffer
Method Bind( ) Abstract
End Type
Type IndexData
Field Data:Int[]
End Type
Type IndexBufferFactory
Method CreateIndexBuffer:IndexBuffer( id:IndexData ) Abstract
End Type
Type IndexBuffer Extends Buffer
Method Bind( ) Abstract
End Type
Type Vertex
Function Create:Vertex( X#, Y#, Z#,..
U#, V#, W#,..
R#, G#, B#, A# )
Local i:Vertex = New Vertex
i.X=X
i.Y=Y
i.Z=Z
i.U=U
i.V=V
i.W=W
i.R=R
i.G=G
i.B=B
i.A=A
Return i
End Function
Field X#
Field Y#
Field Z#
Field NX#
Field NY#
Field NZ#
Field U#
Field V#
Field W#
Field R#
Field G#
Field B#
Field A#
End Type
Type TextureFlags
Field Width:Int
Field Height:Int
Field MipMaps:Int
Field CubeTexture:Int
Field VolumeTexture:Int
Field SphereMap:Int
Method Copy:TextureFlags()
Local i:TextureFlags = New TextureFlags
MemCopy(i.GetPtr(), GetPtr(), 24)
Return i
End Method
Method GetPtr:Byte Ptr()
Return Varptr Width
End Method
End Type
Type Texture
Field Pixmap:TPixmap
Function Create:Texture( tf:TextureFlags ) Abstract
Method Lock( ) Abstract
Method Unlock( ) Abstract
Method IsLocked( ) Abstract
Method WritePixel( X, Y, ARGB )
Local lockit:Int = Not IsLocked()
If lockit Then
Lock()
EndIf
Pixmap.WritePixel(X, Y, ARGB)
If lockit Then
Unlock()
EndIf
End Method
Method ReadPixel( X, Y )
Pixmap.ReadPixel(X, Y)
End Method
Method Dispose( ) Abstract
Method Delete( )
Dispose()
End Method
End Type
Type Shader
Method Dispose( ) Abstract
Method Delete( )
Dispose()
End Method
End Type
Type RenderTarget
End Type
Type RenderOp
Field vb:VertexBuffer
Field ib:IndexBuffer
Field drawMode:Int
End Type
Type Matrix
End Type
Type Vector
End Type
Type Quat
End Type
Type Plane
End Type
Type GraphicsState
End Type
Type ClearMode
Field ZBuffer:Int
Field Targets:Int
Field Stencil:Int
Field Color:Int
Field Z:Float
Field S:Int
Method GetColorPtr:Byte Ptr( )
Return Byte Ptr(Varptr Color)
End Method
End Type
Type Buffer Abstract
Method Dispose( ) Abstract
Method Delete( )
Dispose()
End Method
End Type
This is pretty heavily designed with a likeness to Managed DirectX/Axiom in mind. Some things I'm somewhat unsure about are the way vertex and index buffers are handled in this so far, that bugs me a bit, and textures -- I'm going to probably scrap the current idea for textures and redesign it. I haven't begun writing anything that implements the classes because I want to get the foundation at least somewhat well designed before going ahead with writing different implementations for the common APIs (and probably software, 'cause I've seen how slow Direct3D's software rendering is). |