Preparations for 1.2 update.

This commit is contained in:
Michael Dirks
2015-06-20 15:52:40 +02:00
parent f22d496961
commit 7a96afeda7
25 changed files with 1036 additions and 2080 deletions
+309 -204
View File
@@ -14,9 +14,316 @@
; You should have received a copy of the GNU Lesser General Public License
; along with this program. If not, see <http:;www.gnu.org/licenses/>.
;----------------------------------------------------------------
; Utility ----------------------------------------------------------------------
;-- Mass Operation
; Constants: Supported Types
Const BU_MASSOP_TYPE_DOUBLE = 0
Const BU_MASSOP_TYPE_LONGLONG = 1
Const BU_MASSOP_TYPE_VECTOR2 = 10
Const BU_MASSOP_TYPE_VECTOR3 = 11
; Constants: Supported OpCodes
Const BU_MASSOP_OPCODE_CREATE = 0
Const BU_MASSOP_OPCODE_DESTROY = 1
Const BU_MASSOP_OPCODE_COPY = 2
Const BU_MASSOP_OPCODE_TEMPCREATE = 5
Const BU_MASSOP_OPCODE_TEMPDESTROY = 6
Const BU_MASSOP_OPCODE_TEMPCLEANUP = 7
Const BU_MASSOP_OPCODE_SET = 10
Const BU_MASSOP_OPCODE_ADD = 11
Const BU_MASSOP_OPCODE_SUB = 12
Const BU_MASSOP_OPCODE_MUL = 13
Const BU_MASSOP_OPCODE_DIV = 14
Const BU_MASSOP_OPCODE_COMPARE = 15
; GoTo
; leftOperand: new massop index
Const BU_MASSOP_OPCODE_GOTO = 249
; SetOpCode
; leftOperand: target massop index
; rightOperand: new OpCode
Const BU_MASSOP_OPCODE_SETOPCODE = 250
; CopyLeft
; leftOperand: source massop index
; rightOperand: target massop index
; result: target position (0/leftOperand, 1/rightOperand, 2/result)
Const BU_MASSOP_OPCODE_COPYLEFT = 251
; CopyRight
; leftOperand: source massop index
; rightOperand: target massop index
; result: target position (0/leftOperand, 1/rightOperand, 2/result)
Const BU_MASSOP_OPCODE_COPYRIGHT = 252
; CopyOut
; leftOperand: source massop index
; rightOperand: target massop index
; result: target position (0/leftOperand, 1/rightOperand, 2/result)
Const BU_MASSOP_OPCODE_COPYOUT = 253
; If - Compares the result of <leftOperand> with the result of <rightOperand>,
; skipping over <result> instructions if the results match.
; leftOperand: source massop index
; rightOperand: target massop index
; result: amount to skip
Const BU_MASSOP_OPCODE_IF = 254
; IfValue - Compares the result of <leftOperand> with <rightOperand>, skipping
; over <result> instructions if the results match.
; leftOperand: source massop index
; rightOperand: target massop index
; result: amount to skip
Const BU_MASSOP_OPCODE_IFVALUE = 255
; Helpers ----------------------------------------------------------------------
Type BU_Point
Field X,Y
End Type
Type BU_Rectangle
Field X,Y,X2,Y2
End Type
Function BU_Helper_Window_LockPointer(HWND% = 0)
If HWND = 0 Then
BU_User32_ClipCursor(0)
Else
Local tRect.BU_Rectangle = New BU_Rectangle
; Retrieve Information about the selected window.
BU_User32_GetWindowRect(HWND, tRect)
; Correct Rectangle to be inside the selected Window.
tRect\X2=tRect\X2-1
tRect\Y2=tRect\Y2-1
; Update clipping area.
BU_User32_ClipCursor(tRect)
Delete tRect
EndIf
End Function
Function BU_Helper_Window_LockPointerAuto(HWND=0)
If BU_User32_GetActiveWindow() = HWND Then
BU_Helper_Window_LockPointer(HWND)
Else
BU_Helper_Window_LockPointer(0)
EndIf
End Function
Function BU_Helper_Window_MakeBorderless(HWND=0)
If HWND = 0 Then HWND = SystemProperty("AppHwnd")
; Create Storage
Local tRect.BU_Rectangle = New BU_Rectangle
; Client Information
BU_User32_GetClientRect(HWND, tRect)
Local clientX, clientY, clientW, clientH
clientX = tRect\X
clientY = tRect\Y
clientW = tRect\X2 - clientX
clientH = tRect\Y2 - clientY
; Convert Client coordinates to screen position.
Local tPoint.BU_Point = New BU_Point
BU_User32_ClientToScreen(HWND, tPoint)
Local realClientX, realClientY
realClientX = tPoint\X
realClientY = tPoint\Y
Delete tPoint
; Window Information
BU_User32_GetWindowRect(HWND, tRect)
Local windowX, windowY, windowW, windowH
windowX = tRect\X
windowY = tRect\Y
windowW = tRect\X2 - windowX
windowH = tRect\Y2 - windowY
; Delete Storage
Delete tRect
; Calculate new position and size.
Local newX, newY, newW, newH
newX = windowX + (realClientX - windowX)
newY = windowY + (realClientY - windowY)
newW = clientW
newH = clientH
; DebugLog "Window: " + RSet(windowX,8) + "," + RSet(windowY,8) + ":" + RSet(windowW,8) + "," + RSet(windowH,8)
; DebugLog "Client: " + RSet(clientX,8) + "," + RSet(clientY,8) + ":" + RSet(clientW,8) + "," + RSet(clientH,8)
; DebugLog "RealClient: " + RSet(realClientX,8) + "," + RSet(realClientY,8)
; DebugLog "Diff: " + RSet(realClientX - windowX,8) + "," + RSet(realClientY - windowY,8) + ":" + RSet(windowW - clientW,8) + "," + RSet(windowH - clientH,8)
; DebugLog "New: " + RSet(newX,8) + "," + RSet(newY,8) + ":" + RSet(newW,8) + "," + RSet(newH,8)
; Apply changes
BU_User32_SetWindowLong HWND, -16, $01000000
BU_User32_SetWindowPos HWND, 0, newX, newY, newW, newH, $4 + $10 + $20 + $40
End Function
Function BU_Helper_Window_Center(HWND=0, Monitor=0)
Local displayEnumerator = BU_DisplayEnumerator_Create()
Local displayAmount = BU_DisplayEnumerator_Enumerate(displayEnumerator)
If Monitor >= displayAmount Then Monitor = displayAmount - 1
If Monitor < 0 Then Monitor = 0
; Get Display Information
Local displayRectangle.BU_Rectangle = New BU_Rectangle
BU_DisplayEnumerator_Retrieve displayEnumerator, Monitor, displayRectangle
BU_DisplayEnumerator_Destroy displayEnumerator
Local displayX, displayY, displayW, displayH
displayX = displayRectangle\X
displayY = displayRectangle\Y
displayW = displayRectangle\X2 - displayRectangle\X
displayH = displayRectangle\Y2 - displayRectangle\Y
Delete displayRectangle
; Get Window Information
Local windowRectangle.BU_Rectangle = New BU_Rectangle
BU_User32_GetWindowRect(HWND, windowRectangle)
Local windowW%, windowH%
windowW = windowRectangle\X2 - windowRectangle\X
windowH = windowRectangle\Y2 - windowRectangle\Y
Delete windowRectangle
; Calculate new position and size.
Local newX, newY, newW, newH
newX = displayX + (displayW/2 - windowW/2)
newY = displayY + (displayH/2 - windowH/2)
newW = windowW
newH = windowH
; DebugLog "New: " + RSet(newX,8) + "," + RSet(newY,8) + ":" + RSet(newW,8) + "," + RSet(newH,8)
; Apply changes
BU_User32_SetWindowPos HWND, 0, newX, newY, newW, newH, $1 + $4 + $10 + $20 + $40
End Function
; Database ---------------------------------------------------------------------
;-- SQLite3
;;[Block] Return Codes / Error Codes
;; Many SQLite functions return an integer result code from the set shown
;; here in order to indicate success or failure.
;;
;; New error codes may be added in future versions of SQLite.
;Const SQLITE_OK% = 0 ; Successful result
;Const SQLITE_ERROR% = 1 ; SQL error or missing database
;Const SQLITE_INTERNAL% = 2 ; Internal logic error in SQLite
;Const SQLITE_PERM% = 3 ; Access permission denied
;Const SQLITE_ABORT% = 4 ; Callback routine requested an abort
;Const SQLITE_BUSY% = 5 ; The database file is locked
;Const SQLITE_LOCKED% = 6 ; A table in the database is locked
;Const SQLITE_NOMEM% = 7 ; A malloc() failed
;Const SQLITE_READONLY% = 8 ; Attempt to write a readonly database
;Const SQLITE_INTERRUPT% = 9 ; Operation terminated by SQLite3_Interrupt()
;Const SQLITE_IOERR% = 10 ; Some kind of disk I/O error occurred
;Const SQLITE_CORRUPT% = 11 ; The database disk image is malformed
;Const SQLITE_NOTFOUND% = 12 ; Unknown opcode in sqlite3_file_control()
;Const SQLITE_FULL% = 13 ; Insertion failed because database is full
;Const SQLITE_CANTOPEN% = 14 ; Unable to open the database file
;Const SQLITE_PROTOCOL% = 15 ; Database lock protocol error
;Const SQLITE_EMPTY% = 16 ; Database is empty
;Const SQLITE_SCHEMA% = 17 ; The database schema changed
;Const SQLITE_TOOBIG% = 18 ; String or BLOB exceeds size limit
;Const SQLITE_CONSTRAINT% = 19 ; Abort due to constraint violation
;Const SQLITE_MISMATCH% = 20 ; Data type mismatch
;Const SQLITE_MISUSE% = 21 ; Library used incorrectly
;Const SQLITE_NOLFS% = 22 ; Uses OS features not supported on host
;Const SQLITE_AUTH% = 23 ; Authorization denied
;Const SQLITE_FORMAT% = 24 ; Auxiliary database format error
;Const SQLITE_RANGE% = 25 ; 2nd parameter to sqlite3_bind out of range
;Const SQLITE_NOTADB% = 26 ; File opened that is not a database file
;Const SQLITE_NOTICE% = 27 ; Notifications from sqlite3_log()
;Const SQLITE_WARNING% = 28 ; Warnings from sqlite3_log()
;Const SQLITE_ROW% = 100 ; sqlite3_step() has another row ready
;Const SQLITE_DONE% = 101 ; sqlite3_step() has finished executing
;;[End Block]
;
;;[Block] SQLite_Open Flags
;; These bit values are intended for use in the
;; 3rd parameter to the [sqlite3_open_v2()] interface.
;Const SQLITE_OPEN_READONLY% = $00000001
;Const SQLITE_OPEN_READWRITE% = $00000002
;Const SQLITE_OPEN_CREATE% = $00000004
;Const SQLITE_OPEN_URI% = $00000040
;Const SQLITE_OPEN_MEMORY% = $00000080
;Const SQLITE_OPEN_NOMUTEX% = $00008000
;Const SQLITE_OPEN_FULLMUTEX% = $00010000
;Const SQLITE_OPEN_SHAREDCACHE% = $00020000
;Const SQLITE_OPEN_PRIVATECACHE% = $00040000
;;[End Block]
;
;;[Block] Column Type
;Const SQLITE_UNKNOWN = 0
;Const SQLITE_INTEGER = 1
;Const SQLITE_REAL = 2
;Const SQLITE_FLOAT = 2
;Const SQLITE_DOUBLE = 2
;Const SQLITE_TEXT = 3
;Const SQLITE_STRING = 3
;Const SQLITE_BLOB = 4
;Const SQLITE_NULL = 5
;;[End Block]
;
;;[Block] Internal Types
;Type SQLite_Container
; Field Pointer%
;End Type
;
;Type SQLite_Int64
; Field Left%, Right%
;End Type
;;[End Block]
;
;Function SQLite_Open%(File$, Flags% = $00000006)
; ; Create a Container to hold the database pointer.
; Local Container.SQLite_Container = New SQLite_Container
; Local ErrCode = SQLite3_Open_V2(File, Container, Flags, 0)
; Local Database = Container\Pointer
; Delete Container
;
; If ErrCode = SQLITE_OK
; Return Database
; Else
; Return False
; EndIf
;End Function
;
;Function SQLite_Execute(Database, SQL$)
; Return SQLite3_Exec(Database, SQL, 0, 0, 0)
;End Function
;
;Function SQLite_Prepare(Database, SQL$)
; Local Container.SQLite_Container = New SQLite_Container
; Local ErrCode = SQLite3_Prepare(Database, SQL$, -1, Container, 0)
; Local Statement = Container\Pointer
; Delete Container
;
; If ErrCode = SQLITE_OK
; Return Statement
; Else
; Return False
; EndIf
;End Function
;
;Global SQLite_Column_Int64_L%, SQLite_Column_Int64_R%
;Function SQLite_Column_Int64(Statement, ColumnIndex%)
; Local Result.SQLite_Int64 = New SQLite_Int64
; SQLite3_Column_Int64(Statement, ColumnIndex, Result)
; SQLite_Column_Int64_L = Result\Left
; SQLite_Column_Int64_R = Result\Right
; Delete Result
;End Function
;
;Function SQLite_Bind_Text(Statement, ColumnIndex%, Value$)
; Return SQLite3_Bind_Text(Statement, ColumnIndex, Value, -1, -1)
;End Function
;
;Function SQLite_Bind_Blob(Statement, ColumnIndex%, Bank)
; If Bank <> 0 Then
; Local Size% = BankSize(Bank)
; Return SQLite3_Bind_Blob(Statement, ColumnIndex, Bank, Size, 0)
; EndIf
;End Function
; Math -------------------------------------------------------------------------
;-- Vector2
;----------------------------------------------------------------
Type Vector2
Field X#, Y#
End Type
@@ -28,9 +335,7 @@ Function Vector2_Create.Vector2(X#, Y#)
Return vec
End Function
;----------------------------------------------------------------
;-- Vector3
;----------------------------------------------------------------
Type Vector3
Field X#, Y#, Z#
End Type
@@ -43,206 +348,6 @@ Function Vector3_Create.Vector3(X#, Y#, Z#)
Return vec
End Function
;----------------------------------------------------------------
;-- SQLite3
;----------------------------------------------------------------
;[Block] Return Codes / Error Codes
; Many SQLite functions return an integer result code from the set shown
; here in order to indicate success or failure.
;
; New error codes may be added in future versions of SQLite.
Const SQLITE_OK% = 0 ; Successful result
Const SQLITE_ERROR% = 1 ; SQL error or missing database
Const SQLITE_INTERNAL% = 2 ; Internal logic error in SQLite
Const SQLITE_PERM% = 3 ; Access permission denied
Const SQLITE_ABORT% = 4 ; Callback routine requested an abort
Const SQLITE_BUSY% = 5 ; The database file is locked
Const SQLITE_LOCKED% = 6 ; A table in the database is locked
Const SQLITE_NOMEM% = 7 ; A malloc() failed
Const SQLITE_READONLY% = 8 ; Attempt to write a readonly database
Const SQLITE_INTERRUPT% = 9 ; Operation terminated by SQLite3_Interrupt()
Const SQLITE_IOERR% = 10 ; Some kind of disk I/O error occurred
Const SQLITE_CORRUPT% = 11 ; The database disk image is malformed
Const SQLITE_NOTFOUND% = 12 ; Unknown opcode in sqlite3_file_control()
Const SQLITE_FULL% = 13 ; Insertion failed because database is full
Const SQLITE_CANTOPEN% = 14 ; Unable to open the database file
Const SQLITE_PROTOCOL% = 15 ; Database lock protocol error
Const SQLITE_EMPTY% = 16 ; Database is empty
Const SQLITE_SCHEMA% = 17 ; The database schema changed
Const SQLITE_TOOBIG% = 18 ; String or BLOB exceeds size limit
Const SQLITE_CONSTRAINT% = 19 ; Abort due to constraint violation
Const SQLITE_MISMATCH% = 20 ; Data type mismatch
Const SQLITE_MISUSE% = 21 ; Library used incorrectly
Const SQLITE_NOLFS% = 22 ; Uses OS features not supported on host
Const SQLITE_AUTH% = 23 ; Authorization denied
Const SQLITE_FORMAT% = 24 ; Auxiliary database format error
Const SQLITE_RANGE% = 25 ; 2nd parameter to sqlite3_bind out of range
Const SQLITE_NOTADB% = 26 ; File opened that is not a database file
Const SQLITE_NOTICE% = 27 ; Notifications from sqlite3_log()
Const SQLITE_WARNING% = 28 ; Warnings from sqlite3_log()
Const SQLITE_ROW% = 100 ; sqlite3_step() has another row ready
Const SQLITE_DONE% = 101 ; sqlite3_step() has finished executing
;[End Block]
;[Block] SQLite_Open Flags
; These bit values are intended for use in the
; 3rd parameter to the [sqlite3_open_v2()] interface.
Const SQLITE_OPEN_READONLY% = $00000001
Const SQLITE_OPEN_READWRITE% = $00000002
Const SQLITE_OPEN_CREATE% = $00000004
Const SQLITE_OPEN_URI% = $00000040
Const SQLITE_OPEN_MEMORY% = $00000080
Const SQLITE_OPEN_NOMUTEX% = $00008000
Const SQLITE_OPEN_FULLMUTEX% = $00010000
Const SQLITE_OPEN_SHAREDCACHE% = $00020000
Const SQLITE_OPEN_PRIVATECACHE% = $00040000
;[End Block]
;[Block] Column Type
Const SQLITE_UNKNOWN = 0
Const SQLITE_INTEGER = 1
Const SQLITE_REAL = 2
Const SQLITE_FLOAT = 2
Const SQLITE_DOUBLE = 2
Const SQLITE_TEXT = 3
Const SQLITE_STRING = 3
Const SQLITE_BLOB = 4
Const SQLITE_NULL = 5
;[End Block]
;[Block] Internal Types
Type SQLite_Container
Field Pointer%
End Type
Type SQLite_Int64
Field Left%, Right%
End Type
;[End Block]
Function SQLite_Open%(File$, Flags% = $00000006)
; Create a Container to hold the database pointer.
Local Container.SQLite_Container = New SQLite_Container
Local ErrCode = SQLite3_Open_V2(File, Container, Flags, 0)
Local Database = Container\Pointer
Delete Container
If ErrCode = SQLITE_OK
Return Database
Else
Return False
EndIf
End Function
Function SQLite_Execute(Database, SQL$)
Return SQLite3_Exec(Database, SQL, 0, 0, 0)
End Function
Function SQLite_Prepare(Database, SQL$)
Local Container.SQLite_Container = New SQLite_Container
Local ErrCode = SQLite3_Prepare(Database, SQL$, -1, Container, 0)
Local Statement = Container\Pointer
Delete Container
If ErrCode = SQLITE_OK
Return Statement
Else
Return False
EndIf
End Function
Global SQLite_Column_Int64_L%, SQLite_Column_Int64_R%
Function SQLite_Column_Int64(Statement, ColumnIndex%)
Local Result.SQLite_Int64 = New SQLite_Int64
SQLite3_Column_Int64(Statement, ColumnIndex, Result)
SQLite_Column_Int64_L = Result\Left
SQLite_Column_Int64_R = Result\Right
Delete Result
End Function
Function SQLite_Bind_Text(Statement, ColumnIndex%, Value$)
Return SQLite3_Bind_Text(Statement, ColumnIndex, Value, -1, -1)
End Function
Function SQLite_Bind_Blob(Statement, ColumnIndex%, Bank)
If Bank <> 0 Then
Local Size% = BankSize(Bank)
Return SQLite3_Bind_Blob(Statement, ColumnIndex, Bank, Size, 0)
EndIf
End Function
;----------------------------------------------------------------
;-- Helpers
;----------------------------------------------------------------
Type BlitzUtility_Rectangle
Field X,Y,X2,Y2
End Type
Type BlitzUtility_Point
Field X,Y
End Type
Global BlitzUtility_Rect.BlitzUtility_Rectangle = New BlitzUtility_Rectangle
Global BlitzUtility_Point.BlitzUtility_Point = New BlitzUtility_Point
Function BlitzUtility_LockPointerToWindow(hwnd=0)
If hwnd = 0 Then
BlitzUtility_User32_ClipCursorI(0)
Else
BlitzUtility_User32_GetWindowRect(hwnd, BlitzUtility_Rect)
;Grab TopLeft
BlitzUtility_Point\X = BlitzUtility_Rect\X
BlitzUtility_Point\Y = BlitzUtility_Rect\Y
BlitzUtility_Rect\X = BlitzUtility_Point\X
BlitzUtility_Rect\Y = BlitzUtility_Point\Y
;Grab BottomRight
BlitzUtility_Point\X = BlitzUtility_Rect\X2 - 1
BlitzUtility_Point\Y = BlitzUtility_Rect\Y2 - 1
BlitzUtility_Rect\X2 = BlitzUtility_Point\X
BlitzUtility_Rect\Y2 = BlitzUtility_Point\Y
BlitzUtility_User32_ClipCursor(BlitzUtility_Rect)
EndIf
End Function
Function BlitzUtility_LockPointerToWindowAuto(hwnd=0)
If BlitzUtility_User32_GetActiveWindow() = hwnd Then
BlitzUtility_LockPointerToWindow(hwnd)
Else
BlitzUtility_LockPointerToWindow(0)
EndIf
End Function
Function BlitzUtility_BorderlessWindowmode(hwnd=0, MonitorId=0, Width=0, Height=0)
If hwnd = 0 Then hwnd = SystemProperty("AppHwnd")
BlitzUtility_EnumerateDisplays()
Local dispCnt = BlitzUtility_GetDisplayCount()
If MonitorId < 0 Then MonitorId = 0
If MonitorId >= dispCnt Then MonitorId = dispCnt - 1
Local rct.BlitzUtility_Rectangle = New BlitzUtility_Rectangle
BlitzUtility_GetDisplay(MonitorId, rct)
Local rctW, rctH
rctW = (rct\X2 - rct\X)
rctH = (rct\Y2 - rct\Y)
rct\X = rct\X + (rctW / 2.0) - Width / 2.0
rct\Y = rct\Y + (rctH / 2.0) - Height / 2.0
rct\X2 = Width
rct\Y2 = Height
BlitzUtility_User32_SetWindowLong hwnd, -16, $01000000
BlitzUtility_User32_SetWindowPos hwnd, 0, rct\X, rct\Y, rct\X2, rct\Y2, 64
Delete rct
End Function
Function FlushFile(File%)
Return BlitzUtility_Kernel32_FlushFileBuffers(File)
End Function
;~IDEal Editor Parameters:
;~F#20#46#54
;~C#Blitz3D