Hallo Autoit Community!
Ich habe vor einiger Zeit mal für ein Spiel angefangen eine Direct3D9 UDF zu erstellen. Mitlerweile liegt das Projekt leider brach, aber vielleicht hat ja einer von euch Interresse weiter zu arbeiten, oder das bereits fertiggestellte zu verwenden.
Die UDF benutzt die AutoitObject.au3, welche beigelegt ist. Mein Dank geht übrigens an Prog@ndy, der mir durch die entwicklung dieser und einiger zusätzlicher Informationen einiges an Zeit ersparte.
Hier ein PreView der 3 beigelegten Beispiele.
[Blockierte Grafik: http://img3.imagebanana.com/img/ozt8jzuz/PreView.PNG]
Erfolgreich getestet Wurde die UDF auf WinXP 32Bit und Win7 64Bit.
Außerdem hatte ich noch an einer XACT (3D SoundEngine) gearbeitet, mit der sich auch bereits Sounds abspielen lassen. Es wird aber Vorwissen über XACT benötigt um mit diesen Funktionen etwas anfangen zu können.
Spoiler anzeigen
#include-once
#include "AutoitObject.au3"
#include "WinApi.au3"
#include "D3D9 Constants.au3"
Func _XACT3Create(ByRef $oXACT3Engine, $tEngineParameters = 0)
Local $CLSID_XACTEngine = _AutoItObject_CLSIDFromString("{94c1affa-66e7-4961-9521-cfdef3128d4f}")
Local $IID_IXACT3Engine = _AutoItObject_CLSIDFromString("{e72c1b9a-d717-41c0-81a6-50eb56e80649}")
If Not $CLSID_XACTEngine Or Not $IID_IXACT3Engine Then SetError(1, 0, 0)
Local $pXACT3Engine, $iErr
If Not $tEngineParameters Then $tEngineParameters = DllStructCreate($tagXACT_RUNTIME_PARAMETERS)
[/autoit] [autoit][/autoit] [autoit]If Not _AutoItObject_CoCreateInstance(DllStructGetPtr($CLSID_XACTEngine), 0, 1, DllStructGetPtr($IID_IXACT3Engine), $pXACT3Engine) Then SetError(2, 0, 0)
$oXACT3Engine = _AutoItObject_WrapperCreate($pXACT3Engine, $tagIXACT3EngineInterface)
$iErr = $oXACT3Engine.Initialize("long", "ptr", Number(DllStructGetPtr($tEngineParameters)))
If $iErr[0] Then SetError(3, 0, $pXACT3Engine)
Return $pXACT3Engine
EndFunc ;==>_XACT3Create
Func _XACT3LoadXWB(ByRef $oXACT3Engine, ByRef $oWaveBank, $sFileXWB)
Local $hWaveFile, $hMapFile, $pWaveBankMapping, $pWaveBank, $iFileSizeXWB
$hWaveFile = _WinAPI_CreateFile($sFileXWB, 2, 2, 2)
If Not $hWaveFile Then SetError(1, 0, 0)
$iFileSizeXWB = FileGetSize($sFileXWB)
$hMapFile = _CreateFileMapping($hWaveFile, 0, 2, 0, $iFileSizeXWB, 0)
If Not $hMapFile Then SetError(2, 0, 0)
$pWaveBankMapping = _MapViewOfFile($hMapFile, 4, 0, 0, 0)
If Not $pWaveBankMapping Then SetError(3, 0, 0)
$pWaveBank = $oXACT3Engine.CreateInMemoryWaveBank("long", "ptr", Number($pWaveBankMapping), "dword", $iFileSizeXWB, "dword", 0, "dword", 0, "ptr*", 0)
$pWaveBank = $pWaveBank[6]
If Not $pWaveBank Then SetError(4, 0, 0)
$oWaveBank = _AutoItObject_WrapperCreate($pWaveBank, $tagIXACT3WaveBank)
[/autoit] [autoit][/autoit] [autoit]Return $pWaveBank
EndFunc ;==>_XACT3LoadXWB
Func _XACT3LoadXSB(ByRef $oXACT3Engine, ByRef $oSoundBank, $sFileXSB)
Local $hSoundBankFile, $iBytesRead, $iFileSizeXSB, $pSoundBank
Static $tXSBBuffer
$hSoundBankFile = _WinAPI_CreateFile($sFileXSB, 2, 2, 2)
If Not $hSoundBankFile Then SetError(1, 0, 0)
$iFileSizeXSB = FileGetSize($sFileXSB)
$tXSBBuffer = DllStructCreate(StringFormat("byte[%i]", $iFileSizeXSB))
_WinAPI_ReadFile($hSoundBankFile, DllStructGetPtr($tXSBBuffer, 1), $iFileSizeXSB, $iBytesRead)
If Not $iBytesRead Then SetError(2, 0, 0)
$pSoundBank = $oXACT3Engine.CreateSoundBank("long", "ptr", Number(DllStructGetPtr($tXSBBuffer, 1)), "dword", $iFileSizeXSB, "dword", 0, "dword", 0, "ptr*", 0)
$pSoundBank = $pSoundBank[6]
$oSoundBank = _AutoItObject_WrapperCreate($pSoundBank, $tagIXACT3SoundBank)
[/autoit] [autoit][/autoit] [autoit]Return $pSoundBank
EndFunc ;==>_XACT3LoadXSB
Func _XACT3GetCueIndex(ByRef $oSoundBank, $sName)
Local $iCueIndex
$iCueIndex = $oSoundBank.GetCueIndex("USHORT", "str", $sName)
Return $iCueIndex[0]
EndFunc ;==>_XACT3GetCueIndex
Func _CreateFileMapping($hFile, $lpAttributes, $flProtect, $dwMaximumSizeHigh, $dwMaximumSizeLow, $lpName)
Local $iErr, $hOpen
$hOpen = DllCall("Kernel32.dll", "HANDLE", "CreateFileMapping", "HANDLE", $hFile, "ptr", $lpAttributes, "dword", $flProtect, "dword", $dwMaximumSizeHigh, "dword", $dwMaximumSizeLow, "str", $lpName)
$iErr = @error
If $iErr Then SetError($iErr, 0, $hOpen)
Return $hOpen[0]
EndFunc ;==>_CreateFileMapping
Func _MapViewOfFile($hFileMappingObject, $dwDesiredAccess, $dwFileOffsetHigh, $dwFileOffsetLow, $dwNumberOfBytesToMap)
Local $iErr, $hOpen, $SIZE_T = "UINT"
If @AutoItX64 Then $SIZE_T = "UINT64"
$hOpen = DllCall("Kernel32.dll", "ptr", "MapViewOfFile", "HANDLE", $hFileMappingObject, "dword", $dwDesiredAccess, "dword", $dwFileOffsetHigh, "dword", $dwFileOffsetLow, $SIZE_T, $dwNumberOfBytesToMap)
$iErr = @error
If $iErr Then SetError($iErr, 0, $hOpen)
Return $hOpen[0]
EndFunc ;==>_MapViewOfFile
Ich entschuldige mich hiermit nochmal, das ganze Projekt aus Zeit und Motivationsgründen nicht so vorstellen zu können wie es die Arbeit verdienen würde.
Freue mich dennoch über Rückmeldungen,
Deathly Assassin!