Seite 1 von 1

OpenGL Subsystem: 2DDrawing-Workaround

Verfasst: 20.06.2008 15:14
von DarkDragon
Hallo,

Ich hab mir gedacht, heute mach ich mal was für euch:

Code: Alles auswählen

EnableExplicit
; Structure from http://www.purebasic.fr/english/viewtopic.php?t=19908
Structure PB_Sprite
  Texture.l     ; SpriteID
  Width.w       ; Current width of the sprite (could change if ClipSprite() is used)
  Height.w      ; Current height of the sprite (could change if ClipSprite() is used)
  Depth.w       ; depth of the file. (in bits)
  Mode.w        ; Sprite mode, as described in LoadSprite()
  FileName.l    ; Pointer on the filename, if any
  RealWidth.w   ; Original width of the sprite when it was loaded
  RealHeight.w  ; Original height of the sprite when it was loaded
  ClipX.w       ; X offset if ClipSprite()
  ClipY.w       ; Y offset if ClipSprite()
EndStructure

CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
ImportC "/usr/lib/libGL.so"
  glBindTexture_(a.l, b.l) As "glBindTexture"
  glTexImage2D_(a.l,b.l,c.l,d.l,e.l,f.l,g.l,h.l,i.l) As "glTexImage2D"
  glGetTexImage_(a.l,b.l,c.l,d.l,e.l) As "glGetTexImage"
EndImport
CompilerEndIf

Global *sprite2DDrawing.PB_Sprite
Global image2DDrawing.l = -1

#GL_TEXTURE_RECTANGLE_ARB = $84F5
#GL_RGBA = $1908
#GL_UNSIGNED_BYTE = $1401

Procedure StopDrawingGL()
  Protected mx.l, my.l
  Protected color.l
  Protected *mem.BYTE, *cursor.BYTE
 
  StopDrawing()

  If IsImage(image2DDrawing) And image2DDrawing <> -1
    StartDrawing(ImageOutput(image2DDrawing))
    *mem = AllocateMemory(*sprite2DDrawing\Width * *sprite2DDrawing\Height * 32)
    If *mem
      *cursor = *mem
      For my = 1 To *sprite2DDrawing\Height
        For mx = 0 To *sprite2DDrawing\Width - 1
          color = Point(mx, *sprite2DDrawing\Height - my)
          *cursor\b = Red(color) & $FF
          *cursor + 1
          *cursor\b = Green(color) & $FF
          *cursor + 1
          *cursor\b = Blue(color) & $FF
          *cursor + 2
        Next mx
      Next my

      glBindTexture_(#GL_TEXTURE_RECTANGLE_ARB, *sprite2DDrawing\Texture)
      glTexImage2D_(#GL_TEXTURE_RECTANGLE_ARB, 0, #GL_RGBA, *sprite2DDrawing\Width, *sprite2DDrawing\Height, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, *mem)

      FreeMemory(*mem)
    Else
      Debug "Error: Can't allocate (enough) memory."
    EndIf
    StopDrawing()
  Else
    Debug "Error: Image doesn't exist."
  EndIf
EndProcedure

Procedure SpriteGLOutput(Sprite.l)
  Protected *mem.BYTE, *cursor.BYTE
  Protected mx.l, my.l
  Protected color.q

  *sprite2DDrawing = IsSprite(Sprite)

  If *sprite2DDrawing
    *mem = AllocateMemory(*sprite2DDrawing\Width * *sprite2DDrawing\Height * 32)
    If *mem

      glBindTexture_(#GL_TEXTURE_RECTANGLE_ARB, *sprite2DDrawing\Texture)
      glGetTexImage_(#GL_TEXTURE_RECTANGLE_ARB, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, *mem)

      If IsImage(image2DDrawing) = 0 Or image2DDrawing = -1
        image2DDrawing = CreateImage(#PB_Any, *sprite2DDrawing\Width, *sprite2DDrawing\Height, 32)
      Else
        ResizeImage(image2DDrawing, *sprite2DDrawing\Width, *sprite2DDrawing\Height, #PB_Image_Raw)
      EndIf

      If IsImage(image2DDrawing) And image2DDrawing <> -1
        *cursor = *mem

        StartDrawing(ImageOutput(image2DDrawing))
        For my = 0 To *sprite2DDrawing\Height - 1
          For mx = 0 To *sprite2DDrawing\Width - 1
            color = RGB(0, 0, *cursor\b & $FF)
            *cursor + 1
            color + RGB(0, *cursor\b & $FF, 0)
            *cursor + 1
            color + RGB(*cursor\b & $FF, 0, 0)
            *cursor + 2

            Plot(mx, my, color)
          Next mx
        Next my
        StopDrawing()

        FreeMemory(*mem)

        ProcedureReturn ImageOutput(image2DDrawing)
      Else
        Debug "Error: Can't create image."
      EndIf

      FreeMemory(*mem)
    Else
      Debug "Error: Can't allocate (enough) memory."
    EndIf
   
  Else
    Debug "Error: Sprite doesn't exist."
  EndIf

  ProcedureReturn 0
EndProcedure

InitSprite()
InitKeyboard()

OpenWindow(0, 0, 0, 640, 480, "Test")
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 1, 0, 0)

CreateSprite(0, 256, 256)

StartDrawing(SpriteGLOutput(0))
Box(0, 0, 256, 256, RGB(255, 0, 0))
Box(128, 0, 128, 128, RGB(0, 0, 255))
Box(0, 128, 128, 128, RGB(0, 0, 255))
StopDrawingGL()

; And we can do it again ...
StartDrawing(SpriteGLOutput(0))
Circle(64, 64, 64, RGB(255, 255, 0))
StopDrawingGL()

Repeat
  ClearScreen(0)
  DisplaySprite(0, 0, 0)
  FlipBuffers()

  ExamineKeyboard()
  Delay(10)
  WindowEvent()
Until KeyboardPushed(#PB_Key_Escape)

CloseScreen()
Sollte auf allen Systemen laufen wo das OpenGL Subsystem/2DDrawing mit Images auch läuft.

Vergesst nicht das OpenGL Subsystem einzuschalten!

[EDIT]
Kleine Verbesserung für Linux (MacOS müsste etwas angepasst werden, da das libGL.so sicher wieder anders heißt).

Verfasst: 02.07.2008 07:52
von Xaby
Mein SubSystem befindet sich hier
C:\Program Files\PureBasic\SubSystems\OpenGL\PureLibraries
und die Fehlermeldung ist:
---------------------------
PureBasic - Compiler Error
---------------------------
Das folgende Subsystem konnte nicht gefunden werden: C:\ProgramFiles\PureBasic\SubSystems\OpenGL\PureLibraries
---------------------------
OK
---------------------------
Es scheint so als würde ein Leerzeichen fehlen im Pfad.
BUG???

Ohne irgendwas hinzuschreiben bleibt der Screen schwarz.
:roll:

Verfasst: 02.07.2008 08:58
von DarkDragon
Xaby hat geschrieben:Mein SubSystem befindet sich hier
C:\Program Files\PureBasic\SubSystems\OpenGL\PureLibraries
und die Fehlermeldung ist:
---------------------------
PureBasic - Compiler Error
---------------------------
Das folgende Subsystem konnte nicht gefunden werden: C:\ProgramFiles\PureBasic\SubSystems\OpenGL\PureLibraries
---------------------------
OK
---------------------------
Es scheint so als würde ein Leerzeichen fehlen im Pfad.
BUG???

Ohne irgendwas hinzuschreiben bleibt der Screen schwarz.
:roll:
Du musst einfach nur "OpenGL" (ohne ") in Compiler-Optionen -> Subsystems eintragen unter Windows. Unter Linux vllt noch ein - davor (Irgendwann hatte ich da mal ein Problem damit).

Verfasst: 02.07.2008 11:28
von legion
Hallo !

Bringt bei mir unter Linux einen Linker-Error ! :(

/usr/bin/ld:
cannot find lXxf86vm collect2:
Id returned 1 exit status

Verfasst: 02.07.2008 11:36
von DarkDragon
legion hat geschrieben:Hallo !

Bringt bei mir unter Linux einen Linker-Error ! :(

/usr/bin/ld:
cannot find lXxf86vm collect2:
Id returned 1 exit status
Bei mir nicht :freak: . Du hast anscheinend kein xf86vm (Laut dem ubuntu-forum heißt das Paket libxxf86vm1 - Das solltest du demnach installieren). Und schau ob die Datei "/usr/lib/libGL.so" bei dir vorhanden ist.

Verfasst: 02.07.2008 12:05
von legion
Paket X11 libxxf86vm1 ist installiert und libGL.so ist auch vorhanden !
Der Bug muss wo anders liegen :(
Ich benutze Kanotix Thorhammer RC7 Debian Etch

Lg. Legion

Verfasst: 02.07.2008 12:22
von DarkDragon
legion hat geschrieben:Paket X11 libxxf86vm1 ist installiert und libGL.so ist auch vorhanden !
Der Bug muss wo anders liegen :(
Ich benutze Kanotix Thorhammer RC7 Debian Etch

Lg. Legion
Gehts vllt mit libXxf86vm-devel? Hast du auch den neuesten Grafikkartentreiber installiert?

Verfasst: 02.07.2008 23:54
von legion
Hallo !

Nach der Installation von "libXxf86vm-devel" ist der Linker-Error weg !
#EDIT
Sobald ich das "opengl" Subsystem in den Compiler-Optionen aktiviere
funktioniert "CreateSprite" nicht mehr. "IsSprite" liefert dann immer "0".

Lg. Legion