C ++ Forum |  |  |   |   |    | Warum muss ich meine Funktion : drawogl 2x hintereinander eingeben, damit sich das Objekt dreht. Aber nur beim Compilieren mit Profan2Cpp. Ansonsten nicht. Die dll braucht man mit zum Ablauf. KompilierenMarkierenSeparieren $H Windows.ph
DEF rgb_umwandlung(2) ! bmptex.dll,bmptex
declare x1!,y1!,dx!,dy!,winkel!,groesse&,handleogl&
declare hWin&,hwin1&,hintergr&,tex.auto&
declare width&,height&,texid&,ende&
declare bild_auto_h&,bild_umw_h&
declare bmi#,bildxy#
groesse&=128*128*4
dim bildxy#,groesse&
ende&=1
Window 20,20-800,600
Cls @RGB(220,220,220)
hWin& = Create(text, %hWnd, Test1, 10, 10, 128,128)
hWin1& = Create(text, %hWnd, Test2, 250, 20, 500,500)
oGL(Init, hwin&, 0,0, 0, 0)
oGL(PosMode, 1)
bild_auto_h& = Create(hnewPic,64,64,0 )
hintergr&=create(hnewpic,500,500,$00ffff)
tex.auto&=erzeugetex(auto.bmp)
drawogl
drawogl
oglzubmp
drawscene
WHILE ende&
    WaitInput
    if isKey(87)
        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!-x1!
        dy!=dy!-y1!
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
    if isKey(83)
        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!+x1!
        dy!=dy!+y1!
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
    if isKey(81)
        winkel!=winkel!+1.0
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
    if isKey(69)
        winkel!=winkel!-1.0
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
ENDWHILE
end
proc drawogl
    OGL(Clear)
    OGL(origin,0,0,-1.11)
    OGL(texture,tex.auto&,1)
    OGL(rotate,0,0,winkel!)
    OGL(quad,0.5,0.5)
    OGL(show)
endproc
proc oglzubmp
    DeleteObject handleogl&
    handleogl&=create(hPic,0,&OGLBMP )
endproc
proc drawscene
    StartPaint hwin1&
    drawpic hintergr&,0,0;0
    drawpic handleogl&,100+dx!,100+dy!,-1 ;-1
    EndPaint
endproc
proc bitmap_header
    def &BI_RGB 0
    def &DIB_RGB_COLORS 0
    struct BITMAPINFOHEADER =
    biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&,
    biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
    dim bmi#,BITMAPINFOHEADER
    clear bmi#
    with bmi#
        .biSize&        = sizeof(bmi#)
        .biWidth&       = width&
        .biHeight&      = height&
        .biPlanes%      = 1
        .biBitCount%    = 32
        .biCompression& = &BI_RGB
        .biSizeImage&   = ((.biWidth& * .biBitCount%  8 - 1) | 3 + 1) * abs(.biHeight&)
    endwith
endproc
proc erzeugetex
    parameters namebild$
    texid&=0
    height&=128
    width&=128
    dispose bmi#
    bitmap_header()
    bild_umw_h& = Create(hPic, -1, namebild$)
    ~GetDIBits(%hdc,bild_umw_h&,0,bmi#.biHeight&,bildxy#,bmi#,0)
    rgb_umwandlung(bildxy#,groesse&)
    OGL(glGenTextures,1,ADDR(texid&))
    OGL(glBindTexture,~GL_TEXTURE_2D,texid&)
    OGL(glEnable,~GL_ALPHA_TEST)
    OGL(glAlphaFunc,~GL_GREATER, 0.1)
    OGL(glTexParameteri,~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
    OGL(glTexParameteri,~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR)
    OGL(gluBuild2DMipmaps,~GL_TEXTURE_2D, ~GL_RGBA, height&, width&, ~GL_RGBA, ~GL_UNSIGNED_BYTE, bildxy#)
    dispose bildxy#
    RETURN texid&
endproc
 |  
 
   |  |   |   |  |  |   |  
 
 
  |   |    Sebastian König | Hallo Peter,
  Peter Bierbachh
 Warum muss ich meine Funktion : drawogl 2x hintereinander eingeben, damit sich das Objekt dreht. Aber nur beim Compilieren mit Profan2Cpp. Ansonsten nicht. Die dll braucht man mit zum Ablauf. 
  leider kann ich das Problem noch nicht nachvollziehen... Auch wenn ich die doppelten drawogl-Aufrufe auskommentiere, kann ich keinen Unterschied zwischen XProfan- und Profan2Cpp-Variante feststellen. Das Objekt dreht und bewegt sich wie es soll.
  Kann es evtl. mal jemand anders, der hier mitliest, bei sich ausprobieren?
  MfG
  Sebastian |  
  |  |   |   |  |  |   |  
 
 
  |   |    | Hier mal ohne dll. Im linken Ogl-Fenster dreht es sich. Aber im rechten Fenster normalen Screen bleibt es stehen , ist aber zu sehen. Ich habe auf Farbtiefe 32 und 16 bit probiert. KompilierenMarkierenSeparieren $H Windows.ph
declare x1!,y1!,dx!,dy!,winkel!,groesse&,handleogl&
declare hWin&,hwin1&,hintergr&,hintergr1&,tex.auto&,adresse%,groesse%
declare width&,height&,texid&,ende&
declare bild_auto_h&,bild_umw_h&
declare bmi#,bildxy#
groesse%=128*128*4
dim bildxy#,groesse%
ende&=1
Window 20,20-800,600
Cls @RGB(220,220,220)
hWin& = Create(text, %hWnd, Test1, 10, 10, 128,128)
hWin1& = Create(text, %hWnd, Test2, 250, 20, 500,500)
oGL(Init, hwin&, 0,0, 0, 0)
oGL(PosMode, 1)
bild_auto_h& = Create(hnewPic,64,64,0 )
hintergr&=create(hnewpic,500,500,$00ffff)
hintergr1&=create(hnewpic,500,500,$000000)
tex.auto&=erzeugetex(auto.bmp)
drawogl
drawogl
oglzubmp
drawscene
WHILE ende&
    if isKey(87)
        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!-x1!
        dy!=dy!-y1!
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
    if isKey(83)
        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!+x1!
        dy!=dy!+y1!
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
    if isKey(81)
        winkel!=winkel!+1.0
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
    if isKey(69)
        winkel!=winkel!-1.0
        drawogl
        drawogl
        oglzubmp
        drawscene
    endif
ENDWHILE
end
proc drawogl
    OGL(Clear)
    OGL(origin,0,0,-1.11)
    OGL(texture,tex.auto&,1)
    OGL(rotate,0,0,winkel!)
    OGL(quad,0.5,0.5)
    OGL(show)
endproc
proc oglzubmp
    DeleteObject handleogl&
    handleogl&=create(hPic,0,&OGLBMP )
endproc
proc drawscene
    StartPaint hintergr1&
    drawpic hintergr&,0,0;0
    drawpic handleogl&,100+dx!,100+dy!,-1 ;-1
    EndPaint
    StartPaint hwin1&
    drawpic hintergr1&,0,0;0
    EndPaint
endproc
proc bitmap_header
    def &BI_RGB 0
    def &DIB_RGB_COLORS 0
    struct BITMAPINFOHEADER =
    biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&,
    biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
    dim bmi#,BITMAPINFOHEADER
    clear bmi#
    with bmi#
        .biSize&        = sizeof(bmi#)
        .biWidth&       = width&
        .biHeight&      = height&
        .biPlanes%      = 1
        .biBitCount%    = 32
        .biCompression& = &BI_RGB
        .biSizeImage&   = ((.biWidth& * .biBitCount%  8 - 1) | 3 + 1) * abs(.biHeight&)
    endwith
endproc
proc erzeugetex
    parameters namebild$
    texid&=0
    height&=128
    width&=128
    dispose bmi#
    bitmap_header()
    bild_umw_h& = Create(hPic, -1, namebild$)
    ~GetDIBits(%hdc,bild_umw_h&,0,bmi#.biHeight&,bildxy#,bmi#,0)
    bmptex()
    OGL(glGenTextures,1,ADDR(texid&))
    OGL(glBindTexture,~GL_TEXTURE_2D,texid&)
    OGL(glEnable,~GL_ALPHA_TEST)
    OGL(glAlphaFunc,~GL_GREATER, 0.1)
    OGL(glTexParameteri,~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
    OGL(glTexParameteri,~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR)
    OGL(gluBuild2DMipmaps,~GL_TEXTURE_2D, ~GL_RGBA, height&, width&, ~GL_RGBA, ~GL_UNSIGNED_BYTE, bildxy#)
    dispose bildxy#
    RETURN texid&
endproc
proc bmptex
    adresse%=bildxy#
    P2CPP: <INLINE_CPP>
    long zaehler;
    long wert;
    unsigned char b;
    unsigned char g;
    unsigned char r;
    long adrr;
    wert=PVAR(groesse%);
    adrr=PVAR(adresse%);
    char* bereich = reinterpret_cast<char*>(adrr);
    for(zaehler = 0; zaehler <= wert; zaehler = zaehler + 4)
    {
        b=bereich[zaehler] & 255;
        g=bereich[zaehler+1] & 255;
        r=bereich[zaehler+2] & 255;
        if ((r==0) & (b==0) & (g==0))
            bereich[zaehler+3]=0;
        else
            {
                bereich[zaehler+3]=255;
            }
            bereich[zaehler+2]=b;
            bereich[zaehler]=r;
        }
        P2CPP: </INLINE_CPP>
    endproc
 |  
 
   |  |   |   |  |  |   |  
 
 
  |   |    Sebastian König | Peter Bierbachh
 Hier mal ohne dll. Im linken Ogl-Fenster dreht es sich. Aber im rechten Fenster normalen Screen bleibt es stehen , ist aber zu sehen. Ich habe auf Farbtiefe 32 und 16 bit probiert. 
  Also bei mir zumindest ist das Ergebnis gleich - es dreht sich in beiden Fenstern, auch wenn ich die doppelten Aufrufe auskommentiere. |  
  |  |   |   |  |  |   |  
 
 
  |   |    Sebastian König | | Nachtrag: Auf einem anderen System konnte ich den Fehler jetzt reproduzieren. Ich melde mich hier wieder, sobald ich die Ursache gefunden habe. |  
  |  |   |   |  |  |   |  
 
 
  |   |    |  |  |   |   |  |  |   |  
 
 
  |   |    Sebastian König | Um den Thread hier abzuschließen: Der letzte Stand ist, dass es bei mir auf einem XP-System in beiden Varianten (XProfan und Profan2Cpp) funktioniert, auf einem anderen (mit Vista) jedoch grundsätzlich nicht. Es scheint also ein Problem mit &OGLBMP zu geben, dass nicht Profan2Cpp-spezifisch ist... Peter hat hier [...]   eine Alternative beschrieben, die immer sicher funktionieren sollte. |  
  |  |   |   |  |  |   |  
 
 
  |   |    Sebastian König | Hallo Peter,
  beim Testen einer neuen, auf Deinem glReadPixels()-Beispiel aufbauenden Variante für &OGLBMP stieß ich vorhin auf einen mysteriösen Absturz, der unregelmäßig auftrat. Ich meine die Ursache in Deinem C++-Code gefunden zu haben: In der Zeile KompilierenMarkierenSeparieren sollte meiner Meinung nach das <= ein einfaches < sein, sonst wird die Bereichsgrenze um einige Bytes überschritten. Da ich vermute, dass der Bug auch in der DLL steckt, wollte ich hier mal darauf hinweisen...  
  MfG
  Sebastian |  
  |  |   |   |  |  |   |  
 
 
  |   |    funkheld | Danke.
  Aber das Window im Hauptrogramm wird erst gezeichnet wenn ich es mit der Maus etwas verschoben habe.
  Danke. Gruss |  
  |  |   |   |  |  |   |  
 
 
  |  
 AntwortenThemenoptionen | 8.934 Betrachtungen |  
 ThemeninformationenDieses Thema hat 4 Teilnehmer:  |