Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:06

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: array[0..15] of single <-> PGLFloat
BeitragVerfasst: Di Mai 19, 2009 09:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Mahlzeit! Ich habe eine eher simple Frage (hoffe ich)
Mein Versuch ist es, ein array of single in einen pglfloat um zuwandeln. Folgendes habe ich vor:

In einer Vector unit lege ich standart typen fest für Vektorrechnung, unteranderem auch Matrizen. Da mir die Genauigkeit relativ egal ist, rechne ich mit single werten. Diese unit möchte ich jetzt verwenden, um eine MocelViewmatrix zu errechnen und an die GrafikKarte zu schicken. Ich habe also ein Objekt, dass mir die ModelViewMatrix innerhalb einer Funktion berechnet. Diese ist vom Typ array[0..15] of single. Als rückgabe Parameter würde ich jetzt gerne auch ein solches Array nehmen. Also habe ich mir dafür einen Type erstellt:

TMatrix4x4 : array[0..15] of single;

jetzt muss es doch möglich sein, diesen Typ, von der Funktion zu erhalten und darauß einen Pointer zu machen, den ich mittels glLoadMatrixf(); an die GrafikKarte schicken kann. Alles was ich bisher erreiche ist, dass mir Delphi sagt, die Typen würden nicht zusammen passen, dabei ist doch pglfloat doch nichts anderes als ein ^single, genauso wie auch ^TMatrix4x4, oder irre ich da? In Code form sieht das etwa so aus:

Code:
  1.  
  2. procedure TCamera.CalcModelView:TMatrix4x4;
  3. var tmpMatrix:TMatrix4x4;
  4. begin
  5.   tmpMatrix := blabla;
  6.  
  7.   Result := tmpMatrix;
  8. end;
  9.  


das klappt soweit auch wunderbar! Versuch ich dann aber folgendes, gibts Ärger:

Code:
  1.  
  2. procedure Form1.CameraBenutzen;
  3. var tmpMatrix:PGLFloat;
  4. begin
  5.   tmpMatrix := @(myCamera.CalcModelView);
  6.   glMatrixMode(GL_MODELVIEW);
  7.   glLoadMatrixf(tmpMatrix);
  8. end;
  9.  


Das geht so nicht, obwohl das doch eigentlich klappen müsste!? Der Grund dass ich das so mache liegt daran, das die Camera Klasse und die Vector Unit "OpenGl-frei" bleiben sollen, daher möchte ich das erst später umwandeln und nicht direkt mit glfloat/pglfloat arbeiten. Ich hoffe ihr könnt mir dabei helfen. Denn ich möchte, bevor ich die KollisionsDemo schreibe ersteinmal meine Klassen aufräumen und redundanten/irrelevanten Code raußschmeißen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 19, 2009 09:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Du musst zuerst eine Variable deklarieren, in der du die Matrix speicherst, danach kannst du erst einen Pointer darauf bekommen.

Code:
  1.  
  2. var
  3.   mat: TMatrix4x4
  4. begin
  5.   glMatrixMode..
  6.   mat:= myCamera.CalcModelView();
  7.   glLoadMatrixf(@mat);
  8. end;
  9.  


Optional kannst du natürlich noch eine zweite Variable als PglFloat deklarieren und vorher den Zeiger erstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 19, 2009 09:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Dankeschön! Funktioniert prächtig. Ich wusste ja, das es nicht so schwer sein kann :)

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 19, 2009 10:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Statt Procedure würde ich mal function schreiben und beim 2. Codeschnipsel hast du schlicht weg, die Klammern nach CalcModelView vergessen und somit den Pointer von CalcModelview und nicht von der rückgabevariable versucht zu nutzen. Funktionspointer eignen sich selten gut, als Matrizen ^^.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 19, 2009 10:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Nein, das ist vielleicht bei C++ so, aber in Delphi würde ist nichtmal mit den Klammern gehen. Bei seinem Code wird CalcModelView sogar ausgeführt, weil es in Klammern steht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 19, 2009 10:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Also das mit dem function/procedure war in dem Fall nur ein "Flüchtigkeits" Fehler. Hab mir das aus den Fingern gesogen um nicht den ganzen Code hier reinhacken zu müssen. Das mit den Klammern am Ende ist egal. Bei Delphi müssen die Klammern am Ende einer Funktion nicht angegeben werden, wenn die Funktion (oder Procedure) keine Parameterliste hat.

Wie dem auch sei, mit der temporär ausgelagerten Matrix funktioniert es Prima. Nochmal Dankeschön für die vielen Mühe :)

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 19, 2009 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Folgender Code ist nicht korrekt: edit:Folgender Code ist richtig, da die Methode geklammert ist
Code:
  1. procedure Form1.CameraBenutzen;
  2.   var tmpMatrix:PGLFloat;
  3. begin
  4.   tmpMatrix := @(myCamera.CalcModelView);//Freepascal(ich hoffe doch Delphi auch) holt sich den pointer von myCamera.CalcModelView, da die Syntax sagt, dass die Methode nicht aufgerufen wird ohne Klammern(nach den Methodennamen) und somit die Methode selber gemeint ist(im Fall von @ Operator).
  5.   glMatrixMode(GL_MODELVIEW);
  6.   glLoadMatrixf(tmpMatrix);
  7. end;


Folgender Code ist korrekt:
Code:
  1. function TCamera.CalcModelView:TMatrix4x4;
  2.   var tmpMatrix:TMatrix4x4;
  3. begin
  4.   tmpMatrix := blabla;
  5.   Result := tmpMatrix;
  6. end;
  7.  
  8. procedure Form1.CameraBenutzen;
  9.   var tmpMatrix:PGLFloat;
  10. begin
  11.   tmpMatrix := @myCamera.CalcModelView();//führt die Methode aus und gibt TMatrix4x4 zurück, wovon nun der pointer angefordert und in tmpMatrix gespeichert wird.
  12.   glMatrixMode(GL_MODELVIEW);
  13.   glLoadMatrixf(tmpMatrix);
  14. end;


Es stimmt allerdings auch, dass ich schon sehr lange nicht mehr mit Objekt Pascal arbeite und vieleicht ein bischen eingerostet bin.

Ich würde dies nicht so machen, da TMatrix4x4 als Rückgabewert ganz böse ist.
Wenn du Klassen als Rückgabewert benutzt, ist das in Objekt Pascal nicht schlimm, da class und object pointer sind, die auf die Strukturen zeigen und somit auf den Stack nur ein pointer hin und her geschoben wird.
Sollte man allerdings eine record, array oder ähnliches haben, dann geht der als ganzes auf den Stack und das kostet viel Zeit.
Alles was größer als ein Pointer ist, sollte durch ein Pointer ersetzt werden, um den Stack klein zu halten und die Zugriffe möglichst schnell zu realisieren.
Folgendes Design wäre wohl am besten geeignet.
Code:
  1. function TCamera.CalcModelView:PGLFloat;
  2. begin
  3.   ...//mach was mit m_ModelViewMatrix
  4.  
  5.   result:=@this.m_ModelViewMatrix; edit: result:=@self.m_ModelViewMatrix;
  6. end;
  7.  
  8. procedure Form1.CameraBenutzen;
  9.   var tmpMatrix:PGLFloat;
  10. begin
  11.   tmpMatrix := myCamera.CalcModelView();//führt die Methode aus und gibt TMatrix4x4 zurück, wovon nun der pointer angefordert und in tmpMatrix gespeichert wird.
  12.   glMatrixMode(GL_MODELVIEW);
  13.   glLoadMatrixf(tmpMatrix);
  14. end;


edit: Geistige Umnachtung lässt grüßen, es stimmt natürlich, dass erstmal alles in der Klammer aufgelöst wird und daher auch die Methode aufgerufen wird.
Irgendwie habe ich die Klammerung um den Methodenaufruf mal garnicht wahr genommen, erst als ich gerade nochmal geguckt hab, ob ich was im Post vergessenn hab.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Zuletzt geändert von TAK2004 am Di Mai 19, 2009 10:57, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 19, 2009 10:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Uiuiui, jetzt kommen wir ganz durcheinander. In Delphi ist richtig, was ich gesagt habe, man braucht keine Klammern für einen Funktionsaufruf. Mit dem FreePascal-Compiler ist das wieder was anderes,
ist ja auch kein Delphi :wink:. Da braucht man die Klammern wieder. Ein "this" gibts aber glaube ich in beiden Versionen nicht, da heißt es "self". Es ist aber natürlich richtig, dass man besser bei jedem Funktionsaufruf die Klammern mitverwendet. Als ich angefangen habe ein bisschen mit C++ anzufangen habe ich gleich gemerkt, was man sich mit Delphi aneignet. Das reicht von eben diesen Klammern bis dazu, dass man Groß- und Kleinschreibung miteinander vermischt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]