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 | 7.876 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |