Seems that the code is too long for one post, is that possible? So here's the rest:
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 TVector Field x#,y#,z# Const EPSILON=.0001 Method ToPtr:Float[]() Return [x,y,z] End Method Method New() 'If LOG_NEW ' DebugLog "New TVector" 'EndIf End Method Method Delete() 'If LOG_DEL ' DebugLog "Del TVector" 'EndIf End Method Function Create:TVector(x#,y#,z#) Local vec:TVector=New TVector vec.x=x vec.y=y vec.z=z Return vec End Function Method Copy:TVector() Local vec:TVector=New TVector vec.x=x vec.y=y vec.z=z Return vec End Method Method Add:TVector(vec:TVector) Local new_vec:TVector=New TVector new_vec.x=x+vec.x new_vec.y=y+vec.y new_vec.z=z+vec.z Return new_vec End Method Method Subtract:TVector(vec:TVector) Local new_vec:TVector=New TVector new_vec.x=x-vec.x new_vec.y=y-vec.y new_vec.z=z-vec.z Return new_vec End Method Method Multiply:TVector(val#) Local new_vec:TVector=New TVector new_vec.x=x*val# new_vec.y=y*val# new_vec.z=z*val# Return new_vec End Method Method Divide:TVector(val#) Local new_vec:TVector=New TVector new_vec.x=x/val# new_vec.y=y/val# new_vec.z=z/val# Return new_vec End Method Method Dot:Float(vec:TVector) Return (x#*vec.x#)+(y#*vec.y#)+(z#*vec.z#) End Method Method Cross:TVector(vec:TVector) Local new_vec:TVector=New TVector new_vec.x=(y*vec.z)-(z*vec.y) new_vec.y=(z*vec.x)-(x*vec.z) new_vec.z=(x*vec.y)-(y*vec.x) Return new_vec End Method Method Normalize() Local d#=1/Sqr(x*x+y*y+z*z) x:*d y:*d z:*d End Method Method Length#() Return Sqr(x*x+y*y+z*z) End Method Method SquaredLength#() Return x*x+y*y+z*z End Method Method SetLength#(val#) Normalize() x=x*val y=y*val z=z*val End Method Method Compare( with:Object ) Local q:TVector=TVector(with) If x-q.x>EPSILON Return 1 If q.x-x>EPSILON Return -1 If y-q.y>EPSILON Return 1 If q.y-y>EPSILON Return -1 If z-q.z>EPSILON Return 1 If q.z-z>EPSILON Return -1 Return 0 End Method ' Function by patmaba Function VectorYaw#(vx#,vy#,vz#) Return ATan2(-vx#,vz#) End Function ' Function by patmaba Function VectorPitch#(vx#,vy#,vz#) Local ang#=ATan2(Sqr(vx#*vx#+vz#*vz#),vy#)-90.0 If ang#<=0.0001 And ang#>=-0.0001 Then ang#=0 Return ang# End Function 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 function '################### ' UTILS '################### Function AdjustPixmap:TPixmap(pixmap:TPixmap) ' adjust width and height size to next biggest power of 2 size Local width=Pow2Size(pixmap.width) Local height=Pow2Size(pixmap.height) ' if width or height have changed then resize pixmap If width<>pixmap.width Or height<>pixmap.height pixmap=ResizePixmap(pixmap,width,height) EndIf ' return pixmap Return pixmap End Function Function Pow2Size( n ) Local t=1 While t<n t:*2 Wend Return t End Function