OpenGL Subsystem: 2DDrawing-Workaround

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

OpenGL Subsystem: 2DDrawing-Workaround

Beitrag 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).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Hallo !

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

/usr/bin/ld:
cannot find lXxf86vm collect2:
Id returned 1 exit status
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Antworten