Direct X in PB? Irgendwelche Tutorials?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Sebe
Beiträge: 585
Registriert: 11.09.2004 21:57
Wohnort: Europa
Kontaktdaten:

Beitrag von Sebe »

Wenn ich den Code ausführen will kommt folgender Fehler:

Structure not found: IDirect3D9

Das hat nicht zufällig was mit dem fehlenden Win32 API Support der Demo zu tun oder?
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

SRY!
Hab nicht gesehen, dass ich bei JaPBe noch ein IncludeFile hatte!
Habs noch hinzugefügt!

greetz
remi
Sebe
Beiträge: 585
Registriert: 11.09.2004 21:57
Wohnort: Europa
Kontaktdaten:

Beitrag von Sebe »

Also braucht man doch ein Includefile? Schade, schade, schade...
Wäre ja auch zu schön gewesen, die DirectX DLL ohne vorherige Definitionen ansprechen zu können...
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Geht schon, hab nur grad kein Beispiel. Viele (alle?) Interfaces von DX7 sind schon in Purebasic vordefiniert (In Resident-Files), das Problem sind oft die Konstanten.
Weiss aber nicht ob das mit der Demo geht!
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Ausm Code-Archiv (DirectSound8):

Code: Alles auswählen

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8786&highlight= 
; Author: Danilo 
; Date: 18. December 2003 

;  
; example of playing a sound buffer with DIRECTX 8  
;   by Danilo in co-operation with www.MasterCreating.de  
;  
#DD_OK = 0  
#DS_OK = 0  

#DSBCAPS_LOCSOFTWARE   = $8  
#DSBCAPS_CTRLFREQUENCY = $20  
#DSBCAPS_CTRLVOLUME    = $80  
#DSBCAPS_CTRLPAN       = $40  

Structure WAVEFORMATEX  
  wFormatTag.w        ; Waveform-audio format type. A complete list of format tags can be found in the Mmreg.h header file. For one- Or two-channel PCM data, this value should be WAVE_FORMAT_PCM.  
  nChannels.w         ; Number of channels in the waveform-audio data. Monaural data uses one channel and stereo data uses two channels.  
  nSamplesPerSec.l    ; Sample rate, in samples per second (hertz). If wFormatTag is WAVE_FORMAT_PCM, then common values for nSamplesPerSec are 8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz. For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.  
  nAvgBytesPerSec.l   ; Required average data-transfer rate, in bytes per second, for the format tag. If wFormatTag is WAVE_FORMAT_PCM, nAvgBytesPerSec should be equal to the product of nSamplesPerSec and nBlockAlign. For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.  
  nBlockAlign.w       ; Block alignment, in bytes. The block alignment is the minimum atomic unit of data for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE, nBlockAlign must be equal to the product of nChannels and wBitsPerSample divided by 8 (bits per byte). For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.  :Software must process a multiple of nBlockAlign bytes of Data at a time. Data written To And Read from a device must always start at the beginning of a block. For example, it is illegal To start playback of PCM Data in the middle of a sample (that is, on a non-block-aligned boundary).  
  wBitsPerSample.w    ; Bits per sample for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM, then wBitsPerSample should be equal to 8 or 16. For non-PCM formats, this member must be set according to the manufacturer's specification of the format tag. If wFormatTag is WAVE_FORMAT_EXTENSIBLE, this value can be any integer multiple of 8. Some compression schemes cannot define a value for wBitsPerSample, so this member can be zero.  
  cbSize.w            ; Size, in bytes, of extra format information appended to the end of the WAVEFORMATEX structure. This information can be used by non-PCM formats to store extra attributes for the wFormatTag. If no extra information is required by the wFormatTag, this member must be set to zero. For WAVE_FORMAT_PCM formats (and only WAVE_FORMAT_PCM formats), this member is ignored.  
EndStructure  

Structure DSBUFFERDESC  
  dwSize.l            ; Size of the Structure  
  dwFlags.l           ; Flags specifying the capabilities of the buffer  
  dwBufferBytes.l     ; Size of the new buffer, in bytes. This value must be 0 when creating a buffer with the DSBCAPS_PRIMARYBUFFER flag. For secondary buffers, the minimum and maximum sizes allowed are specified by DSBSIZE_MIN and DSBSIZE_MAX, defined in Dsound.h.  
  dwReserved.l        ; Must be 0  
  *lpwfxFormat        ; Address of a WAVEFORMATEX or WAVEFORMATEXTENSIBLE structure specifying the waveform format for the buffer.  
  guid3DAlgorithm.GUID; Unique identifier of the two-speaker virtualization algorithm to be used by DirectSound3D hardware emulation. If DSBCAPS_CTRL3D is not set in dwFlags, this member must be GUID_NULL (DS3DALG_DEFAULT).  
EndStructure  


Procedure Delete(*obj.IUnknown)  
  ProcedureReturn *Obj\Release()  
EndProcedure  

Procedure Error_Msg(String.s)  
  MessageRequester("Error",String.s,0)  
  End  
EndProcedure  

hwnd = OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Sound")  
CreateGadgetList(hwnd)  
TextGadget    (1,10,10,180,15,"Frequency: 44100")  
TrackBarGadget(2,10,25,180,20,0,441)  
SetGadgetState(2,441)  
TextGadget    (3,10,50,180,15,"Pan: 0")  
TrackBarGadget(4,10,65,180,20,0,200)  
SetGadgetState(4,100)  
TextGadget    (5,10,90,180,15,"Volume: 10000")  
TrackBarGadget(6,10,105,180,20,0,10000)  
SetGadgetState(6,10000)  


If OpenLibrary(0,"DSOUND.DLL") = 0  
  Error_Msg("Can't open direct Sound")  
EndIf  

*RA_DirectSound.IDirectSound8  

; create DS8 Sound Object  
Result.l = CallFunction(0,"DirectSoundCreate8",0,@*RA_DirectSound,0)  
If Result.l <> #DD_OK  
  Error_Msg("Can't do DirectSoundCreate8 : " + Str(Result.l))  
EndIf  

; Set Coop Level  
Result.l = *RA_DirectSound\SetCooperativeLevel(hwnd,1)  
If Result.l <> #DD_OK  
  Error_Msg("Can't Set Coop Level : " + Str(Result.l))  
EndIf  


; Setting up Primary Buffer  
dsbd.DSBUFFERDESC                          ; Set up structure  
dsbd\dwSize        = SizeOf(DSBUFFERDESC)  ; Save structure size  
dsbd\dwFlags       = 1                     ; It is the primary Buffer (see DSound.h)  
dsbd\dwBufferBytes = 0                     ; NULL ? Because primary Buffer must be Null  
dsbd\lpwfxFormat   = 0                     ; NULL ? ? ? <- ist ein Pointer  

Result.l = *RA_DirectSound\CreateSoundBuffer(@dsbd,@*pDSBPrimary.IDirectSoundBuffer,0)  
If Result.l <> #DD_OK  
  Error_Msg("Can't Set up primary sound buffer : " + Str(Result))  
EndIf  

#channels = 2  

wfx.WAVEFORMATEX                ; Wave Format Structure  
RtlZeroMemory_(@wfx,SizeOf(WAVEFORMATEX));  
wfx\wFormatTag      = #WAVE_FORMAT_PCM;  
wfx\nChannels       = #channels ;dwPrimaryChannels;  
wfx\nSamplesPerSec  = 44100     ;dwPrimaryFreq;  
wfx\wBitsPerSample  = 16        ;dwPrimaryBitRate;  
wfx\nBlockAlign     = (wfx\wBitsPerSample / 8 * wfx\nChannels)  
wfx\nAvgBytesPerSec = (wfx\nSamplesPerSec * wfx\nBlockAlign)  

; secondary Buffer (see DSound.h)  
dsbd\dwFlags       = #DSBCAPS_LOCSOFTWARE|#DSBCAPS_CTRLVOLUME|#DSBCAPS_CTRLFREQUENCY|#DSBCAPS_CTRLPAN  
dsbd\dwBufferBytes = 10 * wfx\nAvgBytesPerSec ; alloc 10 Seconds  
dsbd\lpwfxFormat   = @wfx  

; CREATE Secondary Buffer  
Result.l = *RA_DirectSound\CreateSoundBuffer(@dsbd,@*pDSB.IDirectSoundBuffer,0)  
If Result.l <> #DD_OK  
  Error_Msg("Can't Set up secondary sound buffer : " + Str(Result))  
EndIf  

; ASK for DirectSoundBuffer8 INTERFACE  
*DSB8.IDirectSoundBuffer8 = 0  
*pDSB\QueryINTERFACE(?IID_DirectSoundBuffer8,@*DSB8)  
Delete(*pDSB)  

If *DSB8 = 0  
  Error_Msg("Can't get DirectSoundBuffer8 INTERFACE")  
EndIf  

#DSBLOCK_ENTIREBUFFER = $2  
If *DSB8\Lock(0,0,@lpvWrite,@dwLength,0,0,#DSBLOCK_ENTIREBUFFER) = #DS_OK  
  
  ; OK, now copy data in buffer...  
  
  Structure SOUND_BUFFER ; channels, each 16 bit  
    channel.w[#channels]  
  EndStructure  
  
  *Buffer.SOUND_BUFFER = lpvWrite  
  
  
  ; GENERATE SOUND DATA ;)  
  For a = 0 To dwLength/SizeOf(SOUND_BUFFER)  
    If b < $FFFF And flag = 0  
      b + 1000  
      c + 5000  
    Else  
      flag = 1  
      b - 50  
      c - 700  
      If b <= 0: b=0: flag = 0: EndIf  
    EndIf  
    *Buffer\channel[0] = b  
    *Buffer\channel[1] = c  
    *Buffer + SizeOf(SOUND_BUFFER)  
  Next a  
  ; GENERATE SOUND END  
  
  
  *DSB8\UnLock(lpvWrite,dwLength,0,0)  
  #DSBPLAY_LOOPING = $1  
  *DSB8\Play(0,0,#DSBPLAY_LOOPING) ; PLAYYYYY!!!  
EndIf  

Repeat  
  Select WaitWindowEvent()  
    Case #PB_Event_CloseWindow  
      Quit = 1  
    Case #PB_Event_Gadget  
      Select EventGadgetID()  
        Case 2 ; Frequency Control  
          Frequ = GetGadgetState(2)  
          SetGadgetText(1,"Frequency: "+Str(Frequ*100))  
          *DSB8\SetFrequency(Frequ*100)  
        Case 4 ; Pan: Left <> Right  
          Pan = GetGadgetState(4)*100-10000  
          SetGadgetText(3,"Pan: "+Str(Pan))  
          *DSB8\SetPan(Pan)  
        Case 6 ; Volume  
          Vol = GetGadgetState(6)  
          SetGadgetText(5,"Volume: "+Str(Vol))  
          *DSB8\SetVolume(Vol-10000)  
      EndSelect  
  EndSelect  
Until Quit  

*DSB8\Stop()  

; Release/Delete Objects  
; (reversed order of creation)  
Delete(*DSB8)  
Delete(*pDSBPrimary)  
Delete(*RA_DirectSound)  

End  

DataSection  
IID_DirectSoundBuffer8:  ; DSOUND.h  
Data.l $6825A449  
Data.w $7524,$4D82  
Data.b $92,$0F,$50,$E3,$6A,$B3,$AB,$1E  
EndDataSection 
; ExecutableFormat=Windows 
; FirstLine=1 
; EnableXP 
; EOF
Funktioniert bei mir ohne Zusätze. So oder so ähnlich kann man dan auch DirectDraw/D3D benutzen.
supermario
Beiträge: 6
Registriert: 27.09.2004 13:37
Wohnort: Wilhelmshaven

Konvertierung DirectX in OGRE

Beitrag von supermario »

mein hauptproblem ist, ein DirectX-File (.x) in PB zu laden. Wenn es erstmal im OGRE-Format vorliegt, läst sich schon eine ganze Menge machen. Wann kommt die DirectX-Konverter-DLL / Library für PB?

Gruß
SUPERMARIO :freak:
Antworten