Deutsch
C ++ Forum

Warum muss ich : drawogl 2x hintereinander eingeben..

 
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


2 kB
Hochgeladen:27.02.2009
Ladeanzahl205
Herunterladen
 
27.02.2009  
 




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
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
27.02.2009  
 



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


49 kB
Hochgeladen:27.02.2009
Ladeanzahl243
Herunterladen
 
27.02.2009  
 




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.
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
27.02.2009  
 




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.
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
27.02.2009  
 



Imho (nur überflogen) DeleteObject handleogl& beim ersten Male handleogl& ohne Wert.

Besser
KompilierenMarkierenSeparieren
case handleogl& : DeleteObject handleogl&
 
27.02.2009  
 




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.
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
01.03.2009  
 




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
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
04.03.2009  
 




funkheld
Danke.

Aber das Window im Hauptrogramm wird erst gezeichnet wenn ich es mit der Maus etwas verschoben habe.

Danke.
Gruss
 
28.04.2016  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

7.880 Betrachtungen

Unbenanntvor 0 min.
H.Brill29.10.2023
funkheld14.05.2023
Georg Teles03.02.2018
Andreas Koch08.11.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie