| |
|
|
- Page 1 - |
|
Andreas Koch | Hallo zusammen,
eine kurze Frage zum Thema opengl und xpse: gibt es eine Möglichkeit, einen ogl("xyz",...) Befehl in un nproc einzubauen? Konkret geht es um den Befehl oGL("TestMouse", X, Y, Z), bzw @oGL("TestXY", X, Y, Z, SX, SY). Der Testmodus von opengl funktioniert nicht immer so dolle und ich versuche auf dem Weg, ihn zu umgehen.
Schönen Saluto
Andreas Koch |
|
|
| |
|
|
|
| |
|
- Page 1 - |
|
Andreas Koch | Mein erster Versuch war auch, einen OpenGL-API Ersatz per die beiden obigen Funktionen zu finden, was nicht so ganz erfolgreich war. Deswegen vermutete ich auch, dass eine ganze Reihe von Befehlen dahinter steckt, die in XProfan zu einer Funktion zusammengefügt wurden. Um die Api-Befehle nachschlagen und direkt anwenden zu können, müsste ich aber wissen, wie die heißen. Deswegen meine Frage, was hinter oGL("TestMouse", X, Y, Z), bzw @oGL("TestXY", X, Y, Z, SX, SY)) steckt.
PS: wiki.delphigl.com hat mich bisher bei opengl immer weitergebracht. |
|
|
| |
|
|
|
RGH | Bitte sehr: Der Original-Code in Delphi:
procedure fnOGLTestMouse;
{-----------------------}
var x, y, z: double;
ix, iy: longint;
fx, fy, fz: double;
modelview: array[1 .. 16] of double;
projection: array[1 .. 16] of double;
viewport: array[1 .. 4] of longint;
R: TRect;
Begin
if oGLWnd = 0 Then FehlerNr(400,'');
GetClientRect(oGLWnd,R);
LesePara(ParStack,',',0);
x := RPar.Dbl;
LesePara(ParStack,',',0);
y := RPar.Dbl;
LesePara(ParStack,')',0);
z := RPar.Dbl;
glGetDoublev(GL_MODELVIEW_MATRIX, @modelView);
glGetDoublev(GL_PROJECTION_MATRIX, @projection);
glGetIntegerv(GL_VIEWPORT, @viewPort);
gluProject(x, y, z, @modelView, @projection, @viewPort, fx, fy, fz);
ix := sqr(round(fx) - Mausx);
iy := sqr((R.Bottom - round(fy)) - Mausy);
If (ix + iy) > 0 then RPar.Lng := round(sqrt(ix + iy)) else RPar.Lng := 0;
RPar.Typ := 2;
Found := True;
End;
procedure fnOGLTestXY;
{--------------------}
var x, y, z: double;
ix, iy: longint;
dx, dy: longint;
fx, fy, fz: double;
modelview: array[1 .. 16] of double;
projection: array[1 .. 16] of double;
viewport: array[1 .. 4] of longint;
R: TRect;
Begin
if oGLWnd = 0 Then FehlerNr(400,'');
GetClientRect(oGLWnd,R);
LesePara(ParStack,',',0);
x := RPar.Dbl;
LesePara(ParStack,',',0);
y := RPar.Dbl;
LesePara(ParStack,',',0);
z := RPar.Dbl;
LesePara(ParStack,',',0);
dx := RPar.Lng;
LesePara(ParStack,')',0);
dy := RPar.Lng;
glGetDoublev(GL_MODELVIEW_MATRIX, @modelView);
glGetDoublev(GL_PROJECTION_MATRIX, @projection);
glGetIntegerv(GL_VIEWPORT, @viewPort);
gluProject(x, y, z, @modelView, @projection, @viewPort, fx, fy, fz);
ix := sqr(round(fx) - dx);
iy := sqr((R.Bottom - round(fy)) - dy);
If (ix + iy) > 0 then RPar.Lng := round(sqrt(ix + iy)) else RPar.Lng := 0;
RPar.Typ := 2;
Found := True;
End;
(Da das Foro nur XProfan-Code richtig formatieren kann, sieht es etwas seltsam aus. Mit wäre es lieber, es gäbe ein Tga, das die Formatierung so lässt, wie ich sie mühevoll eingerichtet habe.)
Einige Anmerkungen: LesePara list den nächsten Parameter der Programmzeile. Das Ergebnis wird in beiden Funktionen in RPar.Lng (Long-Integer) zurückgeliefert.Fehler 400 besagt, dass OGL nicht initialisiert wurde und es somit kein OGL-Fenster gibt.
Saluto Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 14.01.2013 ▲ |
|
|
|
|
Andreas Koch | Danke per die Aiuto, ich denke, daran kann ich mich langhangeln.
Schönen Saluto
Andreas |
|
|
| |
|
|
|
RGH | Hilfreich vielleicht auch noch OGLStartTest und OGLEndTest:
procedure oGLStartTest(mx, my, dx, dy: integer);
{---------------------------------------------}
var
viewport: array[1 .. 4] of longint;
wh: double;
R: TRect;
width, height: integer;
begin
// Store our Viewport
glGetIntegerv(GL_VIEWPORT, @viewport);
// Tell OpenGL the size of our select buffer
glSelectBuffer(512, @SelectBuffer);
// Change our render mode to GL_SELECT
glRenderMode(GL_SELECT);
// Init the namestack
glInitNames;
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
// Zoom the view to dx/dy pixel around the mouse position
gluPickMatrix(mx, viewport[4]-my, dx, dy, @viewport);
GetClientRect(oGLWnd,R);
Height := R.Bottom;
Width := R.Right;
if (Height = 0) then Height := 1;
if OGLwh <= 0 then wh := Width/Height else wh := OGLwh;
gluPerspective(45.0, wh, 0.1, oGLDepth);
End;
function oGLEndTest:longint;
{--------------------------}
var
Hits, Hit, i : Integer;
HitZValue : GLUInt;
begin
glMatrixMode(GL_PROJECTION);
glPopMatrix;
// Now store the number of hits in Hits
Hits := glRenderMode(GL_RENDER);
// Now we look which hit has the lowest Z-Value i.e. was in front
Hit := -1;
HitZValue := High(GLUInt);
for i := 0 to Hits-1 do
if SelectBuffer[(i*4)+1] < HitZValue then
begin
Hit := SelectBuffer[(i*4)+3];
HitZValue := SelectBuffer[(i*4)+1];
end;
Result := Hit;
end; |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 14.01.2013 ▲ |
|
|
|
|
| [offtopic] RGH (14.01.13)(Da das Foro nur XProfan-Code richtig formatieren kann, sieht es etwas seltsam aus. Mit wäre es lieber, es gäbe ein Tga, das die Formatierung so lässt, wie ich sie mühevoll eingerichtet habe.)
Habe Deine Postings dahingehend fix bearbeitet. Werde einfach ein 2. Code-Tag per einführen. [/offtopic] |
|
|
| |
|
|
|
| Andreas Koch (14.01.13)
Erst einmal danke per die Antwort. Sorry, ich habe das Thema jetzt 2mal eingestellt. (ich hatte das nicht mehr gefunden.)
Jojo, kein Streß.
Gibt auch eine Forenübergreifende Panoramica aktueller Argomenti: [...] Kannst Dein Thema einfach auch selbst löschen, einfach unten rechte bei Themenoptionen. |
|
|
| |
|
|
|
Andreas Koch | Noch ein kurzer Nachtrag,
auf der Seite von Uwe Pascal Niemeyer [...] gibt es eine zip-File (opengl2004.zip), worin sich sehr viele Beispiele zur Programmazione mit opengl befinden. Soweit ich das überblicken kann, wird dabei auf ogl("xyz",...) Befehle gänzlich verzichtet. Ich vermute, die Codes stammen aus einer Zeit bevor openGl in xprofan eingebunden war. Sie funktionieren aber noch tadellos. Da war auch ein Beispiel dabei, das die Original-Delphi Codes von RGH im Wesentlichen abbildet. Allen, die mit opengl zu tun haben, kann ich diese Beispiele nur empfehlen.
Schönen Saluto
Andreas Koch |
|
|
| |
|
|
|
| Stimmt, die sind super. Ich hatte damals damit ein 3D-Snake programmiert und weiß das man damit richtig komplexe Umgebungen herzaubern kann. |
|
|
| |
|
|
| |
|
- Page 2 - |
|
|
| @Roland: Fehlt in Deiner oGLStartTest nach gluPerspective(...) ein glMatrixMode(GL_MODELVIEW)? |
|
|
| |
|
|
|
RGH | Nun, es steht da zumindest nicht. Ich dache, es müsste da auch nicht stehen. Aber ich kann es ja mal einbauen. Du hast gleich Post!
Saluto Roland |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 22.01.2013 ▲ |
|
|
|
|
| |
|
| |
|
|
|
| RGH (22.01.13)
. Du hast gleich Post!
Saluto Roland
Keine Cambiamento!
stürzt ebenso auf den 3 von 3 Computern ab wo die vorherige Version abstürzte.
Auf den anderen 2 Computern wo es funktioniert da funktionierts genau so wie die vorherige Version. |
|
|
| |
|
|