So, here's the sample with latest changes. Instead of using my Direct3d type for initialization, you ca also use your driver with only comment out:
If _flags & GRAPHICS_DEPTHBUFFER
'_PresentParams.EnableAutoDepthStencil = True ' true if we want z-buffer
'_PresentParams.AutoDepthStencilFormat=D3DFMT_D16
End If
If _flags & GRAPHICS_STENCILBUFFER
'_PresentParams.EnableAutoDepthStencil=True ' true if we want z-buffer
'_PresentParams.AutoDepthStencilFormat=D3DFMT_D24S8
End If
Warning, it's ~1200 lines of code because of TMatrix and TSurface from miniB3d.
TSurface is completely adjusted to TRenderable, which is normaly an interface implementation...
Strict
Global d3dx9Lib=LoadLibraryA( "d3dx9d_33" )
Global D3DXMatrixPerspectiveFovLH( pOutMatrix:Float ptr , fovy:Float, Aspect:Float, zn:Float,zf:Float ) "win32"=GetProcAddress( d3dx9Lib,"D3DXMatrixPerspectiveFovLH" )
Global D3DXMatrixLookAtLH:Float ptr(pOutMatrix:Float ptr, pEyeVector:Float ptr, pAtVector:Float ptr,pUpVector:Float ptr ) "win32" = GetProcAddress( d3dx9Lib,"D3DXMatrixLookAtLH" )
Global _DX9GRAPHICSEXWINDOWCLASS:Byte Ptr="DX9WinClass".ToCString()
Global D3DXVec3TransformCoord:Float ptr(pOutVector:Float ptr, pV:Float ptr, pM:Float ptr ) "win32" = GetProcAddress( d3dx9Lib,"D3DXVec3TransformCoord" )
'####################################################################################
local hwnd = CreateGameWindow(800,600)
Local d3d9Graphics:Direct3d = New Direct3d
d3d9Graphics._Init(hwnd,800,600,true)
d3d9Graphics.SetClsColor(255,255,255)
'####################################################################################
TDXRenderable.D3DDevice = d3d9Graphics.GetDevice()
TDXCamera.D3DDevice = d3d9Graphics.GetDevice()
local lpD3DDevice:IDirect3DDevice9 = d3d9Graphics.GetDevice()
'####################################################################################
Local cam:TDXCamera = New TDXCamera
Local cube:TDXMesh = New TDXMesh.CreateCube()
cube.PositionEntity(- 1.5, 0, 0)
Local sphere:TDXMesh = New TDXMesh.CreateSphere()
sphere.PositionEntity(1.5, 0, 0)
'####################################################################################
local e:TDXEntity = new TDXEntity
e.PositionEntity(0, 0, -10)
cam.SetMatrix(e.mat)
cam.SetViewport(10,10,780,580)
cam.SetClippingPlanes(1,2000)
Repeat
If d3d9Graphics.BeginScene()
cam.Update()
cube.TurnEntity(0.0, 0.6, 0.0)
sphere.TurnEntity(0.0, 0.6, 0.0)
cube.Update()
sphere.Update()
lpD3DDevice.EndScene()
EndIf
lpD3DDevice.Present(Null,Null,Null,Null);
until KeyHit(Key_Escape)
End
'####################################################################################
Type TDXCamera
Global D3DDevice:IDirect3DDevice9
Global vUp :Float[] = [0.0,1.0,0.0]
Global vLook :Float[] = [0.0,0.0,1.0]
Field vLookAt :Float[3]
Field vWorldUp :Float[3]
Field vWorldLook :Float[3]
Field mView :Float[16]
Field mProj :Float[16]
Field viewport :D3DVIEWPORT9 = New D3DVIEWPORT9
Field Zoom :Float = 1.0
Field ClearColor :Int = $FF000000
Field ClsMode :Int = D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER
field mat:TMatrix
method SetMatrix(m:tMatrix)
mat = m
end method
method Clear()
D3DDevice.Clear(0,Null, ClsMode, ClearColor,1.0,0)
end method
method UpdateViewPort()
D3DDevice.SetViewport( Byte ptr(viewport) )
end method
method Update()
UpdateViewPort()
Clear()
UpdateView()
end method
Method UpdateView()
' Only rotation values are needed
Local mCam:TMatrix = mat.Copy()
mCam.grid[3,0] = 0.0
mCam.grid[3,1] = 0.0
mCam.grid[3,2] = 0.0
' Transform vectors based on camera's rotation matrix
D3DXVec3TransformCoord( vWorldUp, vUp, mCam.grid )
D3DXVec3TransformCoord( vWorldLook, vLook, mCam.grid )
'Update the lookAt position based on the eye position
Local vPos:Float[] = [mat.grid[3,0],mat.grid[3,1],mat.grid[3,2]]
vLookAt[0] = vWorldLook[0] + vPos[0]
vLookAt[1] = vWorldLook[1] + vPos[1]
vLookAt[2] = vWorldLook[2] + vPos[2]
' Update the view matrix
D3DXMatrixLookAtLH(mView, vPos, vLookAt, vUp)
D3DDevice.SetTransform(D3DTS_VIEW, mView)
' Init Projection Matrix
D3DXMatrixPerspectiveFovLH(mProj, Pi / 4, 800.0 / 600.0, 1.0, 300.0)
D3DDevice.SetTransform(D3DTS_PROJECTION, mProj)
End Method
Method SetViewport(x:Int, y:Int, width:Int, height:Int)
viewport.X = x
viewport.Y = y
viewport.WIDTH = WIDTH
viewport.HEIGHT = HEIGHT
End Method
Method SetClippingPlanes(n:Float,f:Float)
viewport.MinZ = n
viewport.MaxZ = f
End Method
Method SetZoom(zoom:Float)
Zoom = zoom
End Method
Method SetClsMode(p:Int, d:Int)
ClsMode = 0
If p Then
ClsMode = ClsMode | D3DCLEAR_TARGET
End If
If d Then
ClsMode = ClsMode | D3DCLEAR_ZBUFFER
End If
End Method
Method SetClsColor(r:Float, g:Float , b:Float, a:Float = 1.0)
ClearColor = $ff000000|(Int(r) Shl 16)|(Int(G) Shl 8)|Int(b)
End Method
Method GetViewport:Int[]()
Return [viewport.X, viewport.Y, viewport.WIDTH, viewport.HEIGHT]
End Method
End Type
'####################################################################################
Type TDXRenderable
Const VERTEXSIZE:Int = 44
Const INDEXSIZE:Int = 2
Global D3D_VERTEX_FORMAT:Int = (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX0 | D3DFVF_TEX1)
Global D3D_INDEX_FORMAT:Int = D3DFMT_INDEX16
Global D3DDevice:IDirect3DDevice9
Field VertexBufferObj:IDirect3DVertexBuffer9
Field verts:Byte Ptr
Field no_verts:Int
Field vert_array_size:Int
Field IndexBufferObj:IDirect3DIndexBuffer9
Field tris:Short[]
Field no_tris:Int
Field tri_array_size:Int
Field mat:TMatrix
Method New()
verts = MemAlloc(1)
vert_array_size = 1
tri_array_size = 1
End Method
Method Delete()
MemFree verts
tris = tris[..0]
If VertexBufferObj Then VertexBufferObj.Release_()
If IndexBufferObj Then IndexBufferObj.Release_()
End Method
Method AddVertex:Int(x:Float, y:Float, z:Float, u:Float = 0.0, v:Float = 0.0, w:Float = 0.0)
no_verts:+1
If no_verts * VERTEXSIZE > vert_array_size Then
Local oldSize:Int = vert_array_size
Repeat
vert_array_size = vert_array_size * 2
Until vert_array_size > no_verts * VERTEXSIZE
Local tmp_verts:Byte Ptr = MemAlloc(vert_array_size)
MemCopy(tmp_verts, verts, oldSize)
MemFree(verts)
verts = tmp_verts
EndIf
Local vId:Int = (no_verts - 1)
SetVertexPos(vId, x, y, z)
SetVertexColor(vId, 1.0, 1.0, 1.0)
SetVertexTexCoord(vId, u, v, 0)
Return vId
End Method
Method SetVertexPos(vId:Int, x:Float, y:Float, z:Float)
vId:*VERTEXSIZE
Local p:Float Ptr = Float Ptr(verts + vId )
p[0] = x; p[1] = y; p[2] = z
End Method
Method SetVertexNormal(vId:Int, nx:Float, ny:Float, nz:Float)
vId:*VERTEXSIZE
Local p:Float Ptr = Float Ptr(verts + vId + 12)
p[0] = nx; p[1] = ny; p[2] = nz
End Method
Method SetVertexColor(vId:Int, r:Float, g:Float, b:Float, a:Float = 1.0)
vId:*VERTEXSIZE
Local p:Int Ptr = Int Ptr(verts + vId + 24)
'p[0] = Int((Int(a * 255.0) Shl 24) | (Int(r * 255.0) Shl 16) | (Int(g * 255.0) Shl 8) | Int(b * 255.0))
p[0] = Int((255 Shl 24) | (Rand(0, 255) Shl 16) | (Rand(0, 255) Shl 8) | Rand(0, 255))
End Method
Method SetVertexTexCoord(vId:Int, u:Float, v:Float, coord:Int)
vId = vId * VERTEXSIZE + coord * 8
Local p:Float Ptr = Float Ptr(verts + vId + 28)
p[0] = u; p[1] = v
End Method
Method GetVertexPos:Float[] (vId:Int)
vId:*VERTEXSIZE
Local p:Float Ptr = Float Ptr(verts + vId)
Return[p[0] , p[1] , p[2] ]
End Method
Method GetVertexNormal:Float[] (vId:Int)
vId:*VERTEXSIZE
Local p:Float Ptr = Float Ptr(verts + vId + 12)
Return[p[0] , p[1] , p[2] ]
End Method
Method GetVertexColor:Float[] (vId:Int)
vId:*VERTEXSIZE
Local color:Int = (Float Ptr(verts + vId + 24))[0]
Return[Float(((color & $ff000000) Shr 24) / 255.0), Float(((color & $00ff0000) Shr 16) / 255.0), ..
Float(((color & $0000ff00) Shr 8) / 255.0), Float((color & $000000ff) / 255.0)]
End Method
Method GetVertexTexCoord:Float[] (vId:Int, coord:Int)
vId = vId * VERTEXSIZE + coord * 8
Local p:Float Ptr = Float Ptr(verts + vId + 28)
Return[p[0] , p[1] ]
End Method
Method AddTriangle:Int(v0:Int, v1:Int, v2:Int)
no_tris = no_tris + 1
' resize array
If no_tris * 3 >= tri_array_size
Repeat
tri_array_size=tri_array_size*2
Until tri_array_size > no_tris * 3
tris = tris[..tri_array_size]
EndIf
Local vid:Int = (no_tris * 3)
tris[vid - 3] = v2
tris[vid - 2] = v1
tris[vid - 1] = v0
Return no_tris
End Method
Method SetTriAngles:Int(start:Int, count:Int, triangles:Short Ptr, srcOffset:Int = 0)
If tris.length < start+count Then
tris = tris[..(start+count)]
no_tris = tris.length / 3
EndIf
Local dstPtr:Byte Ptr = tris
MemCopy(dstPtr+start*2, Byte Ptr(triangles)+srcOffset*2 , count*2 )
End Method
Method GetTriangles:Short Ptr()
Return tris
End Method
Method OverrideVertexCount(count:Int)
no_verts = Count
End Method
Method OverrideTrisCount(count:Int)
no_Tris = Count
End Method
Method Clear(clear_verts:Int = True, clear_tris:Int = True)
If clear_verts
no_verts = 0
MemFree verts
vert_array_size = 1
EndIf
If clear_tris
no_tris = 0
tris = tris[..0]
tri_array_size = 1
EndIf
End Method
Method FreeVBO()
If VertexBufferObj Then VertexBufferObj.Release_()
If IndexBufferObj Then IndexBufferObj.Release_()
End Method
Method SetMatrix(Matrix:TMatrix)
mat = Matrix
End Method
Method EnableVBO(vbo_enabled:Int)
If vbo_enabled Then
If D3DDevice.CreateVertexBuffer(vert_array_size, 0, D3D_VERTEX_FORMAT, D3DPOOL_DEFAULT, VertexBufferObj, Null) <> D3D_OK Then
Assert "Failed to create VB"
EndIf
If D3DDevice.CreateIndexBuffer(tri_array_size, 0, D3D_INDEX_FORMAT, D3DPOOL_DEFAULT, IndexBufferObj, Null) <> D3D_OK Then
Assert "Failed to create IB"
EndIf
EndIf
End Method
Method Update()
D3DDevice.SetTransform(D3DTS_WORLD, mat.grid)
D3DDevice.SetFVF(D3D_VERTEX_FORMAT)
D3DDevice.SetStreamSource(0, VertexBufferObj, 0, VERTEXSIZE)
D3DDevice.SetIndices(IndexBufferObj)
D3DDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, no_verts, 0, no_tris)
End Method
Method CountTriangles:Int()
Return no_tris
End Method
Method CountVertices:Int()
Return no_verts
End Method
Method UpdateVBO:Int(reset_vbo:Int Var)
If Not VertexBufferObj Or Not IndexBufferObj Or reset_vbo <> 0 Then
EnableVBO(True)
Local VertexBufferStart:Byte Ptr
Local IndexBufferStart:Byte Ptr
If VertexBufferObj.Lock(0, no_verts * VERTEXSIZE, VertexBufferStart, D3DLOCK_NOSYSLOCK) = D3D_OK Then
MemCopy(VertexBufferStart, verts, no_verts * VERTEXSIZE)
VertexBufferObj.Unlock()
EndIf
If IndexBufferObj.Lock(0, no_tris * 3 * INDEXSIZE, IndexBufferStart, D3DLOCK_NOSYSLOCK) = D3D_OK Then
MemCopy(IndexBufferStart, Byte Ptr(tris), no_tris * 3 * INDEXSIZE)
IndexBufferObj.Unlock()
EndIf
reset_vbo = False
EndIf
Return True
End Method
End Type
Type TDXEntity
Field rx:Float, ry:Float, rz:Float
Field px:Float, py:Float, pz:Float
Field sx:Float, sy:Float, sz:Float
Field mat:TMatrix = New TMatrix
Method New()
sx = 1.0; sy = 1.0; sz = 1.0
End Method
Method PositionEntity(x:Float, y:Float, z:Float)
px=x
py=y
pz = z
UpdateMat(True)
End Method
Method Turnentity(x:Float, y:Float, z:Float)
Local tx:Float = -x
Local ty:Float = y
Local tz:Float = z
rx=rx+tx
ry=ry+ty
rz=rz+tz
UpdateMat(True)
End Method
Method RotateEntity(x:Float, y:Float, z:Float)
rx = -x
ry = y
rz = z
UpdateMat(True)
End Method
Method ScaleEntity(x:Float, y:Float, z:Float, glob = False)
sx = x
sy = y
sz = z
UpdateMat(True)
End Method
Method UpdateMat(load_identity = False)
If load_identity=True
mat.LoadIdentity()
mat.Translate(px,py,pz)
mat.Rotate(rx,ry,rz)
mat.Scale(sx,sy,sz)
Else
mat.Translate(px,py,pz)
mat.Rotate(rx,ry,rz)
mat.Scale(sx, sy, sz)
EndIf
End Method
End Type
Type TDXSurface
Field rederable:TDXRenderable = New TDXRenderable
Field reset_vbo:Int
Field new_bounds:Int
Method Delete()
rederable.FreeVBO()
End Method
Method ClearSurface(clear_verts = True, clear_tris = True)
Self.rederable.Clear(clear_verts,clear_tris)
End Method
Method AddVertex(x#,y#,z#,u#=0.0,v#=0.0,w#=0.0)
Return Self.rederable.AddVertex(x,y,z,u,v,W)
End Method
Method AddTriangle(v0,v1,v2)
reset_vbo:|1 | 2 | 16
new_bounds=True
Return Self.rederable.AddTriangle(v0,v1,v2)
End Method
Method CountVertices()
Return Self.rederable.CountVertices()
End Method
Method CountTriangles()
Return Self.rederable.CountTriangles()
End Method
Method VertexCoords(vid,x#,y#,z#)
Self.rederable.SetVertexPos(vid,x,y,z)
reset_vbo:|1
End Method
Method VertexColor(vid,r#,g#,b#,a#=1.0)
Self.rederable.SetVertexColor(vid,r,G,b,a)
reset_vbo:|8
End Method
Method VertexNormal(vid,nx#,ny#,nz#)
Self.rederable.SetVertexNormal(vid,nx#,ny#,nz#)
reset_vbo:|4
End Method
Method VertexTexCoords(vid,u#,v#,w#=0.0,coord_set=0)
Self.rederable.SetVertexTexCoord(vid,u#,v#,coord_set )
reset_vbo:|2
End Method
Method VertexX#(vid)
Return Self.rederable.GetVertexPos(vid)[0]
End Method
Method VertexY#(vid)
Return Self.rederable.GetVertexPos(vid)[1]
End Method
Method VertexZ#(vid)
Return Self.rederable.GetVertexPos(vid)[2]
End Method
Method VertexRed#(vid)
Return Self.rederable.GetVertexColor(vid)[0]*255
End Method
Method VertexGreen#(vid)
Return Self.rederable.GetVertexColor(vid)[1]*255
End Method
Method VertexBlue#(vid)
Return Self.rederable.GetVertexColor(vid)[2]*255
End Method
Method VertexAlpha#(vid)
Return Self.rederable.GetVertexColor(vid)[3]*255
End Method
Method VertexNX#(vid)
Return Self.rederable.GetVertexNormal(vid)[0]
End Method
Method VertexNY#(vid)
Return Self.rederable.GetVertexNormal(vid)[1]
End Method
Method VertexNZ#(vid)
Return Self.rederable.GetVertexNormal(vid)[2]
End Method
Method VertexU#(vid,coord_set=0)
Return Self.rederable.GetVertexTexCoord(vid,coord_set)[0]
End Method
Method VertexV#(vid,coord_set=0)
Return Self.rederable.GetVertexTexCoord(vid,coord_set)[1]
End Method
Method VertexW#(vid,coord_set=0)
Return 0
End Method
Method TriangleVertex(tri_no,corner)
Local tris:Short Ptr = Self.rederable.GetTriAngles()
Local vid[3]
tri_no=(tri_no+1)*3
vid[0]=tris[tri_no-1]
vid[1]=tris[tri_no-2]
vid[2]=tris[tri_no-3]
Return vid[corner]
End Method
Method UpdateNormals()
'rederable.UpdateNormals()
End Method
Method TriangleNX#(tri_no)
Local v0=Self.TriangleVertex(tri_no,0)
Local v1=Self.TriangleVertex(tri_no,1)
Local v2=Self.TriangleVertex(tri_no,2)
'Local ax#=VertexX#(v1)-VertexX#(v0)
Local ay#=Self.VertexY#(v1)-Self.VertexY#(v0)
Local az#=Self.VertexZ#(v1)-Self.VertexZ#(v0)
'Local bx#=VertexX#(v2)-VertexX#(v1)
Local by#=Self.VertexY#(v2)-Self.VertexY#(v1)
Local bz#=Self.VertexZ#(v2)-Self.VertexZ#(v1)
Return (ay#*bz#)-(az#*by#)
End Method
Method TriangleNY#(tri_no)
Local v0=Self.TriangleVertex(tri_no,0)
Local v1=Self.TriangleVertex(tri_no,1)
Local v2=Self.TriangleVertex(tri_no,2)
Local ax#=Self.VertexX#(v1)-Self.VertexX#(v0)
'Local ay#=VertexY#(v1)-VertexY#(v0)
Local az#=Self.VertexZ#(v1)-Self.VertexZ#(v0)
Local bx#=Self.VertexX#(v2)-Self.VertexX#(v1)
'Local by#=VertexY#(v2)-VertexY#(v1)
Local bz#=Self.VertexZ#(v2)-Self.VertexZ#(v1)
Return (az#*bx#)-(ax#*bz#)
End Method
Method TriangleNZ#(tri_no)
Local v0=Self.TriangleVertex(tri_no,0)
Local v1=Self.TriangleVertex(tri_no,1)
Local v2=Self.TriangleVertex(tri_no,2)
Local ax#=Self.VertexX#(v1)-Self.VertexX#(v0)
Local ay#=Self.VertexY#(v1)-Self.VertexY#(v0)
'Local az#=VertexZ#(v1)-VertexZ#(v0)
Local bx#=Self.VertexX#(v2)-Self.VertexX#(v1)
Local by#=Self.VertexY#(v2)-Self.VertexY#(v1)
'Local bz#=VertexZ#(v2)-VertexZ#(v1)
Return (ax#*by#)-(ay#*bx#)
End Method
Method UpdateVBO()
Self.rederable.UpdateVBO(reset_vbo)
Return True
End Method
Method FreeVBO()
Self.rederable.FreeVBO()
Return True
End Method
End Type
Type TDXMesh Extends TDXEntity
Field surf_list:TList = CreateList()
Method CreateCube:TDXMesh()
Local surf:TDXSurface = New TDXSurface
'DebugStop
surf.AddVertex(-1.0,-1.0,-1.0)
surf.AddVertex(-1.0, 1.0,-1.0)
surf.AddVertex( 1.0, 1.0,-1.0)
surf.AddVertex( 1.0,-1.0,-1.0)
surf.AddVertex(-1.0,-1.0, 1.0)
surf.AddVertex(-1.0, 1.0, 1.0)
surf.AddVertex( 1.0, 1.0, 1.0)
surf.AddVertex( 1.0,-1.0, 1.0)
surf.AddVertex(-1.0,-1.0, 1.0)
surf.AddVertex(-1.0, 1.0, 1.0)
surf.AddVertex( 1.0, 1.0, 1.0)
surf.AddVertex( 1.0,-1.0, 1.0)
surf.AddVertex(-1.0,-1.0,-1.0)
surf.AddVertex(-1.0, 1.0,-1.0)
surf.AddVertex( 1.0, 1.0,-1.0)
surf.AddVertex( 1.0,-1.0,-1.0)
surf.AddVertex(-1.0,-1.0, 1.0)
surf.AddVertex(-1.0, 1.0, 1.0)
surf.AddVertex( 1.0, 1.0, 1.0)
surf.AddVertex( 1.0,-1.0, 1.0)
surf.AddVertex(-1.0,-1.0,-1.0)
surf.AddVertex(-1.0, 1.0,-1.0)
surf.AddVertex( 1.0, 1.0,-1.0)
surf.AddVertex( 1.0,-1.0,-1.0)
surf.VertexNormal(0,0.0,0.0,-1.0)
surf.VertexNormal(1,0.0,0.0,-1.0)
surf.VertexNormal(2,0.0,0.0,-1.0)
surf.VertexNormal(3,0.0,0.0,-1.0)
surf.VertexNormal(4,0.0,0.0,1.0)
surf.VertexNormal(5,0.0,0.0,1.0)
surf.VertexNormal(6,0.0,0.0,1.0)
surf.VertexNormal(7,0.0,0.0,1.0)
surf.VertexNormal(8,0.0,-1.0,0.0)
surf.VertexNormal(9,0.0,1.0,0.0)
surf.VertexNormal(10,0.0,1.0,0.0)
surf.VertexNormal(11,0.0,-1.0,0.0)
surf.VertexNormal(12,0.0,-1.0,0.0)
surf.VertexNormal(13,0.0,1.0,0.0)
surf.VertexNormal(14,0.0,1.0,0.0)
surf.VertexNormal(15,0.0,-1.0,0.0)
surf.VertexNormal(16,-1.0,0.0,0.0)
surf.VertexNormal(17,-1.0,0.0,0.0)
surf.VertexNormal(18,1.0,0.0,0.0)
surf.VertexNormal(19,1.0,0.0,0.0)
surf.VertexNormal(20,-1.0,0.0,0.0)
surf.VertexNormal(21,-1.0,0.0,0.0)
surf.VertexNormal(22,1.0,0.0,0.0)
surf.VertexNormal(23,1.0,0.0,0.0)
surf.VertexTexCoords(0,0.0,1.0)
surf.VertexTexCoords(1,0.0,0.0)
surf.VertexTexCoords(2,1.0,0.0)
surf.VertexTexCoords(3,1.0,1.0)
surf.VertexTexCoords(4,1.0,1.0)
surf.VertexTexCoords(5,1.0,0.0)
surf.VertexTexCoords(6,0.0,0.0)
surf.VertexTexCoords(7,0.0,1.0)
surf.VertexTexCoords(8,0.0,1.0)
surf.VertexTexCoords(9,0.0,0.0)
surf.VertexTexCoords(10,1.0,0.0)
surf.VertexTexCoords(11,1.0,1.0)
surf.VertexTexCoords(12,0.0,0.0)
surf.VertexTexCoords(13,0.0,1.0)
surf.VertexTexCoords(14,1.0,1.0)
surf.VertexTexCoords(15,1.0,0.0)
surf.VertexTexCoords(16,0.0,1.0)
surf.VertexTexCoords(17,0.0,0.0)
surf.VertexTexCoords(18,1.0,0.0)
surf.VertexTexCoords(19,1.0,1.0)
surf.VertexTexCoords(20,1.0,1.0)
surf.VertexTexCoords(21,1.0,0.0)
surf.VertexTexCoords(22,0.0,0.0)
surf.VertexTexCoords(23,0.0,1.0)
surf.VertexTexCoords(0,0.0,1.0,0.0,1)
surf.VertexTexCoords(1,0.0,0.0,0.0,1)
surf.VertexTexCoords(2,1.0,0.0,0.0,1)
surf.VertexTexCoords(3,1.0,1.0,0.0,1)
surf.VertexTexCoords(4,1.0,1.0,0.0,1)
surf.VertexTexCoords(5,1.0,0.0,0.0,1)
surf.VertexTexCoords(6,0.0,0.0,0.0,1)
surf.VertexTexCoords(7,0.0,1.0,0.0,1)
surf.VertexTexCoords(8,0.0,1.0,0.0,1)
surf.VertexTexCoords(9,0.0,0.0,0.0,1)
surf.VertexTexCoords(10,1.0,0.0,0.0,1)
surf.VertexTexCoords(11,1.0,1.0,0.0,1)
surf.VertexTexCoords(12,0.0,0.0,0.0,1)
surf.VertexTexCoords(13,0.0,1.0,0.0,1)
surf.VertexTexCoords(14,1.0,1.0,0.0,1)
surf.VertexTexCoords(15,1.0,0.0,0.0,1)
surf.VertexTexCoords(16,0.0,1.0,0.0,1)
surf.VertexTexCoords(17,0.0,0.0,0.0,1)
surf.VertexTexCoords(18,1.0,0.0,0.0,1)
surf.VertexTexCoords(19,1.0,1.0,0.0,1)
surf.VertexTexCoords(20,1.0,1.0,0.0,1)
surf.VertexTexCoords(21,1.0,0.0,0.0,1)
surf.VertexTexCoords(22,0.0,0.0,0.0,1)
surf.VertexTexCoords(23,0.0,1.0,0.0,1)
surf.AddTriangle(0,1,2) ' front
surf.AddTriangle(0,2,3)
surf.AddTriangle(6,5,4) ' back
surf.AddTriangle(7,6,4)
surf.AddTriangle(6+8,5+8,1+8) ' top
surf.AddTriangle(2+8,6+8,1+8)
surf.AddTriangle(0+8,4+8,7+8) ' bottom
surf.AddTriangle(0+8,7+8,3+8)
surf.AddTriangle(6+16,2+16,3+16) ' right
surf.AddTriangle(7+16,6+16,3+16)
surf.AddTriangle(0+16,1+16,5+16) ' left
surf.AddTriangle(0 + 16, 5 + 16, 4 + 16)
surf_list.AddLast(surf)
Return Self
End Method
' Function by Coyote
Method CreateSphere:TDXMesh(segments = 8)
If segments<2 Or segments>100 Then Return Null
Local thissurf:TDXSurface = New TDXSurface
Local div#=Float(360.0/(segments*2))
Local height#=1.0
Local upos#=1.0
Local udiv#=Float(1.0/(segments*2))
Local vdiv#=Float(1.0/segments)
Local RotAngle#=90
If segments=2 ' diamond shape - no center strips
For Local i=1 To (segments*2)
Local np=thissurf.AddVertex(0.0,height,0.0,upos#-(udiv#/2.0),0)'northpole
Local sp=thissurf.AddVertex(0.0,-height,0.0,upos#-(udiv#/2.0),1)'southpole
Local XPos#=-Cos(RotAngle#)
Local ZPos#=Sin(RotAngle#)
Local v0=thissurf.AddVertex(XPos#,0,ZPos#,upos#,0.5)
RotAngle#=RotAngle#+div#
If RotAngle#>=360.0 Then RotAngle#=RotAngle#-360.0
XPos#=-Cos(RotAngle#)
ZPos#=Sin(RotAngle#)
upos#=upos#-udiv#
Local v1=thissurf.AddVertex(XPos#,0,ZPos#,upos#,0.5)
thissurf.AddTriangle(np,v0,v1)
thissurf.AddTriangle(v1,v0,sp)
Next
Else ' have center strips now
' poles first
For Local i=1 To (segments*2)
Local np=thissurf.AddVertex(0.0,height,0.0,upos#-(udiv#/2.0),0)'northpole
Local sp=thissurf.AddVertex(0.0,-height,0.0,upos#-(udiv#/2.0),1)'southpole
Local YPos#=Cos(div#)
Local XPos#=-Cos(RotAngle#)*(Sin(div#))
Local ZPos#=Sin(RotAngle#)*(Sin(div#))
Local v0t=thissurf.AddVertex(XPos#,YPos#,ZPos#,upos#,vdiv#)
Local v0b=thissurf.AddVertex(XPos#,-YPos#,ZPos#,upos#,1-vdiv#)
RotAngle#=RotAngle#+div#
XPos#=-Cos(RotAngle#)*(Sin(div#))
ZPos#=Sin(RotAngle#)*(Sin(div#))
upos#=upos#-udiv#
Local v1t=thissurf.AddVertex(XPos#,YPos#,ZPos#,upos#,vdiv#)
Local v1b=thissurf.AddVertex(XPos#,-YPos#,ZPos#,upos#,1-vdiv#)
thissurf.AddTriangle(np,v0t,v1t)
thissurf.AddTriangle(v1b,v0b,sp)
Next
' then center strips
upos#=1.0
RotAngle#=90
For Local i=1 To (segments*2)
Local mult#=1
Local YPos#=Cos(div#*(mult#))
Local YPos2#=Cos(div#*(mult#+1.0))
Local Thisvdiv#=vdiv#
For Local j=1 To (segments-2)
Local XPos#=-Cos(RotAngle#)*(Sin(div#*(mult#)))
Local ZPos#=Sin(RotAngle#)*(Sin(div#*(mult#)))
Local XPos2#=-Cos(RotAngle#)*(Sin(div#*(mult#+1.0)))
Local ZPos2#=Sin(RotAngle#)*(Sin(div#*(mult#+1.0)))
Local v0t=thissurf.AddVertex(XPos#,YPos#,ZPos#,upos#,Thisvdiv#)
Local v0b=thissurf.AddVertex(XPos2#,YPos2#,ZPos2#,upos#,Thisvdiv#+vdiv#)
' 2nd tex coord set
thissurf.VertexTexCoords(v0t,upos#,Thisvdiv#,0.0,1)
thissurf.VertexTexCoords(v0b,upos#,Thisvdiv#+vdiv#,0.0,1)
Local tempRotAngle#=RotAngle#+div#
XPos#=-Cos(tempRotAngle#)*(Sin(div#*(mult#)))
ZPos#=Sin(tempRotAngle#)*(Sin(div#*(mult#)))
XPos2#=-Cos(tempRotAngle#)*(Sin(div#*(mult#+1.0)))
ZPos2#=Sin(tempRotAngle#)*(Sin(div#*(mult#+1.0)))
Local temp_upos#=upos#-udiv#
Local v1t=thissurf.AddVertex(XPos#,YPos#,ZPos#,temp_upos#,Thisvdiv#)
Local v1b=thissurf.AddVertex(XPos2#,YPos2#,ZPos2#,temp_upos#,Thisvdiv#+vdiv#)
' 2nd tex coord set
thissurf.VertexTexCoords(v1t,temp_upos#,Thisvdiv#,0.0,1)
thissurf.VertexTexCoords(v1b,temp_upos#,Thisvdiv#+vdiv#,0.0,1)
thissurf.AddTriangle(v1t,v0t,v0b)
thissurf.AddTriangle(v1b,v1t,v0b)
Thisvdiv#=Thisvdiv#+vdiv#
mult#=mult#+1
YPos#=Cos(div#*(mult#))
YPos2#=Cos(div#*(mult#+1.0))
Next
upos#=upos#-udiv#
RotAngle#=RotAngle#+div#
Next
EndIf
'thissphere.UpdateNormals()
surf_list.AddLast(thissurf)
Return Self
End Method
Method Update()
For Local surf:TDXSurface = EachIn surf_list
If surf.reset_vbo Then surf.UpdateVBO()
surf.rederable.SetMatrix(mat)
surf.rederable.Update()
Next
End Method
End Type
Type Direct3d
Field clsColor :Int = $FF000000
Field Direct3D9 :IDirect3D9 = Null
Field Direct3DDevice9 :IDirect3DDevice9 = Null
Field BackBuffer :IDirect3DSurface9 = Null
Field PParams :D3DPRESENT_PARAMETERS = Null
Field hwnd :Int = 0
Method _Init(hwnd:Int, w:Int, h:Int, bWindowed:Int = False)
Self.hwnd = hwnd
Direct3D9 = Direct3DCreate9( $900 )
If Not Direct3D9 Then
assert "error creating d3d9interface!"
EndIf
PParams = New D3DPRESENT_PARAMETERS
PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PParams.hDeviceWindow = hwnd;
PParams.Windowed = bWindowed;
PParams.BackBufferWidth = w;
PParams.BackBufferHeight = h;
PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
PParams.EnableAutoDepthStencil = True
PParams.AutoDepthStencilFormat=D3DFMT_D16
If Direct3D9.CreateDevice(0, D3DDEVTYPE_HAL, hwnd , D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, PParams, Direct3DDevice9) <> D3D_OK
If Direct3D9.CreateDevice(0, D3DDEVTYPE_HAL, hwnd , D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, PParams, Direct3DDevice9) <> D3D_OK
If Direct3D9.CreateDevice(0, D3DDEVTYPE_HAL, hwnd , D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, PParams, Direct3DDevice9) <> D3D_OK
assert "failed To create device _D3dDev9"
End If
End If
EndIf
Direct3DDevice9.GetBackBuffer(0,0, D3DBACKBUFFER_TYPE_MONO, BackBuffer );
Direct3DDevice9.SetRenderState(D3DRS_AMBIENT, $00FFFFFF)
Direct3DDevice9.SetRenderState(D3DRS_LIGHTING, false)
Direct3DDevice9.SetRenderState(D3DRS_CULLMODE, D3DCULL_CW)
Direct3DDevice9.SetRenderState(D3DRS_DITHERENABLE, true)
End Method
Method SetClsColor(r:Int,g:Int,b:Int)
clsColor = Int(( 255 Shl 24)| (r Shl 16)| (g Shl 8)| b )
End Method
Method BeginScene()
'Direct3DDevice9.Clear(0,Null,D3DCLEAR_TARGET,clsColor,0,0);
return Direct3DDevice9.BeginScene();
End Method
Method EndScene()
Direct3DDevice9.EndScene();
Direct3DDevice9.Present(Null,Null,Null,Null);
End Method
Method GetDevice:IDirect3DDevice9()
Return Direct3DDevice9
End Method
Method GetBackBuffer:IDirect3DSurface9()
Return BackBuffer
End Method
method SetAmbientLight(color:int = $00FFFFFF)
Direct3DDevice9.SetRenderState(D3DRS_AMBIENT, color)
end method
method SetLightningEnable(enable:int)
Direct3DDevice9.SetRenderState(D3DRS_LIGHTING, enable)
end method
method SetCullMode(mode:int = D3DCULL_CW )
Direct3DDevice9.SetRenderState(D3DRS_CULLMODE, mode )
end method
method SetDitherEnable(enable:int = true)
Direct3DDevice9.SetRenderState(D3DRS_DITHERENABLE, enable)
end method
End Type
Type TMatrix
Field grid#[4,4]
Method LoadIdentity()
grid[0,0]=1.0
grid[1,0]=0.0
grid[2,0]=0.0
grid[3,0]=0.0
grid[0,1]=0.0
grid[1,1]=1.0
grid[2,1]=0.0
grid[3,1]=0.0
grid[0,2]=0.0
grid[1,2]=0.0
grid[2,2]=1.0
grid[3,2]=0.0
grid[0,3]=0.0
grid[1,3]=0.0
grid[2,3]=0.0
grid[3,3]=1.0
End Method
' copy - create new copy and returns it
Method Copy:TMatrix()
Local mat:TMatrix=New TMatrix
mat.grid[0,0]=grid[0,0]
mat.grid[1,0]=grid[1,0]
mat.grid[2,0]=grid[2,0]
mat.grid[3,0]=grid[3,0]
mat.grid[0,1]=grid[0,1]
mat.grid[1,1]=grid[1,1]
mat.grid[2,1]=grid[2,1]
mat.grid[3,1]=grid[3,1]
mat.grid[0,2]=grid[0,2]
mat.grid[1,2]=grid[1,2]
mat.grid[2,2]=grid[2,2]
mat.grid[3,2]=grid[3,2]
' do not remove
mat.grid[0,3]=grid[0,3]
mat.grid[1,3]=grid[1,3]
mat.grid[2,3]=grid[2,3]
mat.grid[3,3]=grid[3,3]
Return mat
End Method
' overwrite - overwrites self with matrix passed as parameter
Method Overwrite(mat:TMatrix)
grid[0,0]=mat.grid[0,0]
grid[1,0]=mat.grid[1,0]
grid[2,0]=mat.grid[2,0]
grid[3,0]=mat.grid[3,0]
grid[0,1]=mat.grid[0,1]
grid[1,1]=mat.grid[1,1]
grid[2,1]=mat.grid[2,1]
grid[3,1]=mat.grid[3,1]
grid[0,2]=mat.grid[0,2]
grid[1,2]=mat.grid[1,2]
grid[2,2]=mat.grid[2,2]
grid[3,2]=mat.grid[3,2]
grid[0,3]=mat.grid[0,3]
grid[1,3]=mat.grid[1,3]
grid[2,3]=mat.grid[2,3]
grid[3,3]=mat.grid[3,3]
End Method
Method Inverse:TMatrix()
Local mat:TMatrix=New TMatrix
Local tx#=0
Local ty#=0
Local tz#=0
' The rotational part of the matrix is simply the transpose of the
' original matrix.
mat.grid[0,0] = grid[0,0]
mat.grid[1,0] = grid[0,1]
mat.grid[2,0] = grid[0,2]
mat.grid[0,1] = grid[1,0]
mat.grid[1,1] = grid[1,1]
mat.grid[2,1] = grid[1,2]
mat.grid[0,2] = grid[2,0]
mat.grid[1,2] = grid[2,1]
mat.grid[2,2] = grid[2,2]
' The right column vector of the matrix should always be [ 0 0 0 1 ]
' in most cases. . . you don't need this column at all because it'll
' never be used in the program, but since this code is used with GL
' and it does consider this column, it is here.
mat.grid[0,3] = 0
mat.grid[1,3] = 0
mat.grid[2,3] = 0
mat.grid[3,3] = 1
' The translation components of the original matrix.
tx = grid[3,0]
ty = grid[3,1]
tz = grid[3,2]
' Result = -(Tm * Rm) To get the translation part of the inverse
mat.grid[3,0] = -( (grid[0,0] * tx) + (grid[0,1] * ty) + (grid[0,2] * tz) )
mat.grid[3,1] = -( (grid[1,0] * tx) + (grid[1,1] * ty) + (grid[1,2] * tz) )
mat.grid[3,2] = -( (grid[2,0] * tx) + (grid[2,1] * ty) + (grid[2,2] * tz) )
Return mat
End Method
Method Multiply(mat:TMatrix)
Local m00# = grid#[0,0]*mat.grid#[0,0] + grid#[1,0]*mat.grid#[0,1] + grid#[2,0]*mat.grid#[0,2] + grid#[3,0]*mat.grid#[0,3]
Local m01# = grid#[0,1]*mat.grid#[0,0] + grid#[1,1]*mat.grid#[0,1] + grid#[2,1]*mat.grid#[0,2] + grid#[3,1]*mat.grid#[0,3]
Local m02# = grid#[0,2]*mat.grid#[0,0] + grid#[1,2]*mat.grid#[0,1] + grid#[2,2]*mat.grid#[0,2] + grid#[3,2]*mat.grid#[0,3]
'Local m03# = grid#[0,3]*mat.grid#[0,0] + grid#[1,3]*mat.grid#[0,1] + grid#[2,3]*mat.grid#[0,2] + grid#[3,3]*mat.grid#[0,3]
Local m10# = grid#[0,0]*mat.grid#[1,0] + grid#[1,0]*mat.grid#[1,1] + grid#[2,0]*mat.grid#[1,2] + grid#[3,0]*mat.grid#[1,3]
Local m11# = grid#[0,1]*mat.grid#[1,0] + grid#[1,1]*mat.grid#[1,1] + grid#[2,1]*mat.grid#[1,2] + grid#[3,1]*mat.grid#[1,3]
Local m12# = grid#[0,2]*mat.grid#[1,0] + grid#[1,2]*mat.grid#[1,1] + grid#[2,2]*mat.grid#[1,2] + grid#[3,2]*mat.grid#[1,3]
'Local m13# = grid#[0,3]*mat.grid#[1,0] + grid#[1,3]*mat.grid#[1,1] + grid#[2,3]*mat.grid#[1,2] + grid#[3,3]*mat.grid#[1,3]
Local m20# = grid#[0,0]*mat.grid#[2,0] + grid#[1,0]*mat.grid#[2,1] + grid#[2,0]*mat.grid#[2,2] + grid#[3,0]*mat.grid#[2,3]
Local m21# = grid#[0,1]*mat.grid#[2,0] + grid#[1,1]*mat.grid#[2,1] + grid#[2,1]*mat.grid#[2,2] + grid#[3,1]*mat.grid#[2,3]
Local m22# = grid#[0,2]*mat.grid#[2,0] + grid#[1,2]*mat.grid#[2,1] + grid#[2,2]*mat.grid#[2,2] + grid#[3,2]*mat.grid#[2,3]
'Local m23# = grid#[0,3]*mat.grid#[2,0] + grid#[1,3]*mat.grid#[2,1] + grid#[2,3]*mat.grid#[2,2] + grid#[3,3]*mat.grid#[2,3]
Local m30# = grid#[0,0]*mat.grid#[3,0] + grid#[1,0]*mat.grid#[3,1] + grid#[2,0]*mat.grid#[3,2] + grid#[3,0]*mat.grid#[3,3]
Local m31# = grid#[0,1]*mat.grid#[3,0] + grid#[1,1]*mat.grid#[3,1] + grid#[2,1]*mat.grid#[3,2] + grid#[3,1]*mat.grid#[3,3]
Local m32# = grid#[0,2]*mat.grid#[3,0] + grid#[1,2]*mat.grid#[3,1] + grid#[2,2]*mat.grid#[3,2] + grid#[3,2]*mat.grid#[3,3]
'Local m33# = grid#[0,3]*mat.grid#[3,0] + grid#[1,3]*mat.grid#[3,1] + grid#[2,3]*mat.grid#[3,2] + grid#[3,3]*mat.grid#[3,3]
grid[0,0]=m00
grid[0,1]=m01
grid[0,2]=m02
'grid[0,3]=m03
grid[1,0]=m10
grid[1,1]=m11
grid[1,2]=m12
'grid[1,3]=m13
grid[2,0]=m20
grid[2,1]=m21
grid[2,2]=m22
'grid[2,3]=m23
grid[3,0]=m30
grid[3,1]=m31
grid[3,2]=m32
'grid[3,3]=m33
End Method
Method Translate(x#,y#,z#)
grid[3,0] = grid#[0,0]*x# + grid#[1,0]*y# + grid#[2,0]*z# + grid#[3,0]
grid[3,1] = grid#[0,1]*x# + grid#[1,1]*y# + grid#[2,1]*z# + grid#[3,1]
grid[3,2] = grid#[0,2]*x# + grid#[1,2]*y# + grid#[2,2]*z# + grid#[3,2]
End Method
Method Scale(x#,y#,z#)
grid[0,0] = grid#[0,0]*x#
grid[0,1] = grid#[0,1]*x#
grid[0,2] = grid#[0,2]*x#
grid[1,0] = grid#[1,0]*y#
grid[1,1] = grid#[1,1]*y#
grid[1,2] = grid#[1,2]*y#
grid[2,0] = grid#[2,0]*z#
grid[2,1] = grid#[2,1]*z#
grid[2,2] = grid#[2,2]*z#
End Method
Method Rotate(rx#,ry#,rz#)
Local cos_ang#,sin_ang#
' yaw
cos_ang#=Cos(ry#)
sin_ang#=Sin(ry#)
Local m00# = grid#[0,0]*cos_ang + grid#[2,0]*-sin_ang#
Local m01# = grid#[0,1]*cos_ang + grid#[2,1]*-sin_ang#
Local m02# = grid#[0,2]*cos_ang + grid#[2,2]*-sin_ang#
grid[2,0] = grid#[0,0]*sin_ang# + grid#[2,0]*cos_ang
grid[2,1] = grid#[0,1]*sin_ang# + grid#[2,1]*cos_ang
grid[2,2] = grid#[0,2]*sin_ang# + grid#[2,2]*cos_ang
grid[0,0]=m00#
grid[0,1]=m01#
grid[0,2]=m02#
' pitch
cos_ang#=Cos(rx#)
sin_ang#=Sin(rx#)
Local m10# = grid#[1,0]*cos_ang + grid#[2,0]*sin_ang
Local m11# = grid#[1,1]*cos_ang + grid#[2,1]*sin_ang
Local m12# = grid#[1,2]*cos_ang + grid#[2,2]*sin_ang
grid[2,0] = grid#[1,0]*-sin_ang + grid#[2,0]*cos_ang
grid[2,1] = grid#[1,1]*-sin_ang + grid#[2,1]*cos_ang
grid[2,2] = grid#[1,2]*-sin_ang + grid#[2,2]*cos_ang
grid[1,0]=m10
grid[1,1]=m11
grid[1,2]=m12
' roll
cos_ang#=Cos(rz#)
sin_ang#=Sin(rz#)
m00# = grid#[0,0]*cos_ang# + grid#[1,0]*sin_ang#
m01# = grid#[0,1]*cos_ang# + grid#[1,1]*sin_ang#
m02# = grid#[0,2]*cos_ang# + grid#[1,2]*sin_ang#
grid[1,0] = grid#[0,0]*-sin_ang# + grid#[1,0]*cos_ang#
grid[1,1] = grid#[0,1]*-sin_ang# + grid#[1,1]*cos_ang#
grid[1,2] = grid#[0,2]*-sin_ang# + grid#[1,2]*cos_ang#
grid[0,0]=m00#
grid[0,1]=m01#
grid[0,2]=m02#
End Method
Method RotatePitch(ang#)
Local cos_ang#=Cos(ang#)
Local sin_ang#=Sin(ang#)
Local m10# = grid#[1,0]*cos_ang + grid#[2,0]*sin_ang
Local m11# = grid#[1,1]*cos_ang + grid#[2,1]*sin_ang
Local m12# = grid#[1,2]*cos_ang + grid#[2,2]*sin_ang
grid[2,0] = grid#[1,0]*-sin_ang + grid#[2,0]*cos_ang
grid[2,1] = grid#[1,1]*-sin_ang + grid#[2,1]*cos_ang
grid[2,2] = grid#[1,2]*-sin_ang + grid#[2,2]*cos_ang
grid[1,0]=m10
grid[1,1]=m11
grid[1,2]=m12
End Method
Method RotateYaw(ang#)
Local cos_ang#=Cos(ang#)
Local sin_ang#=Sin(ang#)
Local m00# = grid#[0,0]*cos_ang + grid#[2,0]*-sin_ang#
Local m01# = grid#[0,1]*cos_ang + grid#[2,1]*-sin_ang#
Local m02# = grid#[0,2]*cos_ang + grid#[2,2]*-sin_ang#
grid[2,0] = grid#[0,0]*sin_ang# + grid#[2,0]*cos_ang
grid[2,1] = grid#[0,1]*sin_ang# + grid#[2,1]*cos_ang
grid[2,2] = grid#[0,2]*sin_ang# + grid#[2,2]*cos_ang
grid[0,0]=m00#
grid[0,1]=m01#
grid[0,2]=m02#
End Method
Method RotateRoll(ang#)
Local cos_ang#=Cos(ang#)
Local sin_ang#=Sin(ang#)
Local m00# = grid#[0,0]*cos_ang# + grid#[1,0]*sin_ang#
Local m01# = grid#[0,1]*cos_ang# + grid#[1,1]*sin_ang#
Local m02# = grid#[0,2]*cos_ang# + grid#[1,2]*sin_ang#
grid[1,0] = grid#[0,0]*-sin_ang# + grid#[1,0]*cos_ang#
grid[1,1] = grid#[0,1]*-sin_ang# + grid#[1,1]*cos_ang#
grid[1,2] = grid#[0,2]*-sin_ang# + grid#[1,2]*cos_ang#
grid[0,0]=m00#
grid[0,1]=m01#
grid[0,2]=m02#
End Method
End Type
Type TRect
Field _Left :Int
Field _Top : Int
Field _Right : Int
Field _Bottom: Int
Function Create:TRect(ALeft:Int,ATop:Int,ARight:Int,ABottom:Int)
Local this:TRect=New TRect
this._Left=ALeft
this._Top=ATop
this._Right=ARight
this._Bottom=ABottom
Return this
End Function
Method Width:Int()
Return _Right-_Left
End Method
Method Height:Int()
Return _Bottom-_Top
End Method
End Type
Function WndProc:Int( hwnd:Int,message:Int,wp:Int,lp:Int ) "win32"
bbSystemEmitOSEvent hwnd,message,wp,lp,Null
Select message
Case WM_CLOSE
end
Case WM_SYSKEYDOWN
If wp<>KEY_F4 Return 0
' ensure the valid Flag is current due to mode/focus changes
Case WM_SETFOCUS
'_dx9driver.ValidateGraphics
' ensure the valid Flag is current due to mode/focus changes
Case WM_KILLFOCUS
'_dx9driver.ValidateGraphics
End Select
Return DefWindowProcA( hwnd,message,wp,lp )
End Function
function CreateGameWindow:int(width:int, height:int )
Local wc:WNDCLASS=New WNDCLASS
wc.hInstance = GetModuleHandleA(0)
wc.lpfnWndProc = WndProc
wc.hCursor=LoadCursorA( Null,Byte Ptr IDC_ARROW )
wc.lpszClassName=_DX9GRAPHICSEXWINDOWCLASS
RegisterClassA( wc )
Local hinst:Int = GetModuleHandleA(0)
Local title:Byte Ptr=AppTitle.ToCString()
Local hwnd:Int
width:int = 800
height:int = 600
Local style:Int=WS_VISIBLE|WS_CAPTION|WS_SYSMENU |WS_SIZEBOX
Local rect :TRect = TRect.Create(32,32,width+32,height+32)
AdjustWindowRect Int Ptr Byte Ptr rect,style,0
width=rect.Width()
height=rect.Height()
hwnd=CreateWindowExA( 0,_DX9GRAPHICSEXWINDOWCLASS,title,style,rect._Left,rect._Top,width,height,0,0,hinst,Null )
return hwnd
end functionEdit:
hmm, if I create the window with CreateWindowExA insted of using a maxgui window, the programm also chrashes at device.present, when using D3DCREATE_SOFTWARE_VERTEXPROCESSING...same as using your d3d9GraphicsDriver :)
Edit:
ok, _PresentParams.EnableAutoDepthStencil = True works also fine...I yust must clear the zBuffer( Field ClsMode :Int = D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ) :)