Autor Beitrag
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 27.08.11 20:06 
Hallo Allerseits,

Ich habe ein kleines Problem mit DirectX.

Zur Vorgeschichte:
Ich programmiere nun schon seit einer Weile mit Delphi.
Nach einer längeren Pause hab ich mich mal wieder mit dem Thema beschäftigt und wollte mich etwas tiefer in die 3D Programmierung einarbeiten.
Nach ein wenig googeln hab ich festgestellt das DirectDraw inzwischen wohl Schnee von gestern ist und DirectX (zusammen mit den JEDI Headern) eine deutlich bessere Wahl ist.

Ich habe mir dazu einmal ein Tutorial vorgenommen.
Dieses hier: www.ieap.uni-kiel.de.../delphi-directx.html
Ich hab das auch brav durchgearbeitet und das ganze funktioniert auch ganz gut soweit.

Das Problem:
Wenn ich die ganze Sache in eine eigene Klasse aulagern will, sehe ich nur ein shwarzes Display.

Der Code den ich verwende entspricht im Wesentlichen dem Tutorial, nur ein paar Sachen sind leicht abgeändert. Zum Beispiel das Einlesen der Vertexdaten.
Ausserdem verwende ich ein Panel zurAnzeige und nicht die Form.

Kann sich bitte mal jemand das kurz ansehen? Vielleicht mach ich ja auch nur nen ganz blöden Denkfehler, aber ich komm einfach nicht drauf. :oops:

Warum dreht sich auf dem Editor sheet die Kiste nicht so wie auf dem 3D sheet? :?:

Ich habe einmal das ganze Projekt zusammengepackt
Wäre echt super wenn mir hier jemand ein bischen auf die Sprünge helfen könnte.
Ich wollte jetzt nicht ellenlang Quelltext posten und weiss auch nicht welcher Auschnitt relevant wäre.

Cheers,
Catweasel
Einloggen, um Attachments anzusehen!
_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Sa 27.08.11 20:20 
Auf meinem Asbach-Computer (Laptop) mit Windows 2000, der nie ernsthaft zum Spielen herhalten mußte, kann ich dem Programm leider überhaupt keine 3-D-Visualisierungen abringen: Beim Klick auf "Test Engine" und bzw. oder auch auf "Startup 3D" kommt stattdessen nur die Fehlermeldung:

'-1.0' is not a valid floating point value.

mit eben diesen Anführungsstrichen, die die negative Zahl einrahmen/umhüllen.

Wird dort evtl. ein String nicht in einen Fließkommawert konvertiert?

Vielleicht liegt es auch nur an der lausigen Version des DirectX auf meinem Surfknecht.
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 27.08.11 20:29 
Hi,

Danke für die Antwort.
Hmm... ich kapsele eigentlich alles mit floattostr() und bei mir funktioniert es auch.
'-1.0' ist eigentlich ein gültiger float wert.

Versuch doch mal im Text die Dezimalpunkte durch Kommas zu tauschen.
Vielleicht werden bei dir Strings aus irgendeinem Grund anders interpretiert...

Cheers,
Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Sa 27.08.11 20:51 
user profile iconcatweasel hat folgendes geschrieben Zum zitierten Posting springen:
Hi,

Danke für die Antwort.
Hmm... ich kapsele eigentlich alles mit floattostr() und bei mir funktioniert es auch.
'-1.0' ist eigentlich ein gültiger float wert.

Versuch doch mal im Text die Dezimalpunkte durch Kommas zu tauschen.
Vielleicht werden bei dir Strings aus irgendeinem Grund anders interpretiert...


Nein, damit hatte es nichts zu tun. Ich mußte alle (!) -1.0-Werte durch -1, alle 1.0-Werte durch 1 ersetzen.

Danach erschien keine Fehlermeldung nach Anklicken mehr, sondern nach Klick auf "Test Engine" ein schwarzer Hintergrund, und nach Klick auf "Startup 3D" - voilà – eine sich im Raum drehende Holzkiste.

Also, grundsätzlich scheint einiges zu funktionieren.

Ich könnte morgen Deine Quelltexte in Turbo-Delphi einlesen, nur wird bis dahin sicher jemand schon reagiert haben und fundierte - von 3-D-Programmierung habe ich nämlich keine Ahnung - Antwort gegeben haben.

Hoffe, daß Dir das als erste Rückmeldung aber auch schon geholfen hat.

Ergänzung: Auch wenn Dein Program optisch, also scheinbar nichts tut, ist die Prozessorauslastung heftig.
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 27.08.11 21:02 
Hi,

Ja, irgendwie will er das Dezimalzeichen nicht richtig einlesen..
Weiss nicht warum es bei mir mit '-1.0' klappt.... Seltsam.

Mit der drehenden Kiste bei "StartUp3D" und den scwarzen Bildschirm bei "Test Engine" hast dann genau was ich auch sehe.
Ich weiss eben nur nicht warum das so ist....

Ich hoffe auch das mir jemand hier helfen kann.

Wegen der Prozessorauslastung.. keine Ahnung, aber das ird wohl das DirectX sein....(?)

Cheers,
Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 28.08.11 22:43 
Die Fließkommawerte -1.0 und 1.0 mußte ich auch auf bei Compilierungsabsicht (einmal D7 und einmal Turbo-Delphi) in integre Zahlen umwandeln, was ich der Einfachheit halber gleich im Memo "datadisplay" und damit quasi im Quelltext tat.

Ich fand bisher keinen Unterschied in den aufrufenden Prozeduren, so daß auch mir der Fehler rätselhaft ist. Oben verstand ich Dich so, daß es auch eine Variante gibt, bei der auch auf den Druck auf die Schaltfläche "Test engine" etwas angezeigt wird - wie ist denn dafür der Quelltext?

Zwischenergebnis: Der Aufruf "D3DRender" führt beiden zu ungleichen Ergebnissen, bin noch am Suchen...

(Vorläufiges?) Endergebnis: Die Funktion Present zeigt unterschiedliche Ergebnisse auf dem Bildschirm, Grund unbekannt. Beim Suchen der Deklaration stürzte Turbo-Delphi nach dem Finden derselben in der Unit "Direct3D8" ab (so sieht moderne Softwarequalität aus).
storestore
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 397
Erhaltene Danke: 7

WIN 7
C#
BeitragVerfasst: So 28.08.11 23:26 
Hi,
als ich es auf meinem Desktop entpackt habe kam der fehler das das D3DX8ab.ddl fehlt.
Wenn ich es nicht entpacke öffnet er das Programm normal.

mfg storestore

_________________
Der Pc ist nur so schlau, wie derjenige der in steuert!
"Don't Quit. Suffer now, and live the rest of your life as a champion"
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 29.08.11 00:01 
Das kann ich bestätigen, wollte Dich, catweasel, aber damit nicht aufhalten: Die Exe-Datei im Archiv startet nur, wenn ich sie aus dem Packprogramm heraus extrahiere und starte, wird sie zunächst irgendwo abgelegt, dann kommt der von storestone benannte Fehler auch bei mir.

Beim Starten aus der IDE heraus klappt es, das Programm zum Laufen zu bringen (sonst hätte ich ja oben keine lausigen Ergebnisse schildern können), aber das von der IDE erzeugte und abgelegte Compilat wird wahrscheinlich das gleiche Problem verursachen.

Für diesen Beitrag haben gedankt: storestore
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 29.08.11 22:11 
Hi,

Wenn man das Zip File im Explorer anzeigen lässt, enpackt Windows das ganze Zip in einem Temp Verzeichnis welches dann auch das Arbeitsverzeichnis in diesem Fall ist.
Da ist dann auch die DLL und alles vorhanden.
Wenn man nur die EXE auspackt und in ein Verzeichnis speichert, dann fehlt die DLL.
Ich denke mal das wird es sein..(?)

Die beiden Quelltexte für das 3D sind einmal in der Unit "Umain". Das wird augeführt wenn man auf "StartUp3D" klickt. Und das funktioniert.

Eigentlich genau die gleichen 3D relevanten Funktionen finden sich in der Klasse T3DEngine aus der Unit UD3DEngine wieder. (Viewport der Klasse ist das Panel). Nur da get es eben nicht.
Ich will doch nur ein bischen Code aus dem Hauptformular auslagern und das DirextX handling in einer eigenen Klasse machen.

Und wegen der Fließkommageschichte: Ich benutzeDelphi Professsional 7.2 Second Edition.
Gibts da irgendwelche Versionsinkompatibilitäten?

Und vielen Dank fü die Mühe. :-)

Cheers,
Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 29.08.11 22:25 
user profile iconcatweasel hat folgendes geschrieben Zum zitierten Posting springen:
Wenn man das Zip File im Explorer anzeigen lässt, enpackt Windows das ganze Zip in einem Temp Verzeichnis welches dann auch das Arbeitsverzeichnis in diesem Fall ist.
Da ist dann auch die DLL und alles vorhanden.
Wenn man nur die EXE auspackt und in ein Verzeichnis speichert, dann fehlt die DLL.
Ich denke mal das wird es sein..(?)


Nein! Zum einen benutze ich z.B. nicht die Explorer-integrierte Zip-Funktion (hat Windows 2000 nicht), sondern WinRar, zum anderen enthält Dein Archiv die benötigte und manchmal auch als fehlend monierte DLL nicht.
Ergänzung: So einfach ist es doch nicht: Extrahiert man alles aus Deinem Archiv in ein gemeinsames Verzeichnis, so ist wenigstens das DLL-Problem gelöst. Also gehört neben der Exe-Datei auch noch mindestens eine weitere Datei zu den "executables", das ließe sich herausfinden (ich sehe gerade, daß sie enthalten ist). Alternativ funktioniert es auch, die fehlende DLL sich von seinem eigenen Computer zu besorgen und in das Verzeichnis zu kopieren, aber wie lästig ist das denn, oder, wie Du es tust, sie gleich mitzuliefern (Urheberrecht?!).

user profile iconcatweasel hat folgendes geschrieben Zum zitierten Posting springen:
Die beiden Quelltexte für das 3D sind einmal in der Unit "Umain". Das wird augeführt wenn man auf "StartUp3D" klickt. Und das funktioniert.

Eigentlich genau die gleichen 3D relevanten Funktionen finden sich in der Klasse T3DEngine aus der Unit UD3DEngine wieder. (Viewport der Klasse ist das Panel). Nur da get es eben nicht.
Ich will doch nur ein bischen Code aus dem Hauptformular auslagern und das DirextX handling in einer eigenen Klasse machen.


Mein Vorschlag: Gehe die entscheidenden Prozeduren (die ich oben nannte und bei denen du "Guttenberg" spieltest :-)) mit einem Debugger Schritt für Schritt durch und beobachte alle Daten der entsprechenden Datenstrukturen, schreibe zur Not auf, welcher Schritt welche Daten wie ändert und vergleiche dann. Irgendetwas muß doch anders sein!

user profile iconcatweasel hat folgendes geschrieben Zum zitierten Posting springen:


Und wegen der Fließkommageschichte: Ich benutzeDelphi Professsional 7.2 Second Edition.
Gibts da irgendwelche Versionsinkompatibilitäten?


Inwiefern? Dieses Problem tritt auch schon mit dem Compilat auf, daß Du mitlieferst. Bei einem fertigen Compilat gibt es keine "Versionsinkompatibilitäten", weil andere (Delphi-)Versionen überhaupt nicht mitmischen!
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 29.08.11 23:58 
Hi,

Danke für die Erklärung.
Das Archiv ist im Prinzip das ganze Projektverzeichnis.
Die DLL müsste ich entwerder vorraussetzen, oder mitliedren wenn es jemals ein kommerzielles Produkt werden sollte. Und dann kann man die Lizenz immernoch vorher erwerben. Über sowas mache ich mir noch keine Gedanken.
Ich möchte einfach ein wenig programmieren.
Ich will auch keine High End 3D Engine auf die Beine Stellen, sondern was ganz simples.

Wegen der Kompatibilität. Ich dachte du lässt das in der IDE laufen...
In welchem Format stellst du bei deinen Programmen einen Float Wert als String dar.

Die betreffende Routine ist:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function TSample3DForm.DecodeVertexDef(expression: string): TMyVertex;
var
buffer : string;
values : array [0..7of extended;
x,p : integer;
begin
p := 0;
for x := 1 to length(expression) do
  begin
  if expression[x] = ';' then
    begin
    values[p] := strtofloat(buffer);
    buffer := '';
    inc(p);
    end else begin
             buffer := buffer + expression[x];
             end;
  end;
if length(buffer) > 0 then values[p] := strtofloat(buffer);
Result.x := values[0];
Result.y := values[1];
Result.z := values[2];
Result.color := rgb(round(values[3]),round(values[4]),round(values[5]));
Result.tu := values[6];
Result.tv := values[7];
end;


Wie kann man da was falsch machen... Zumal ja mit '-1.0' ja nicht irgend ein Zeichensalat moniert wird..
Da es bei mir klappt und ich keine Fehlermeldung bekomme kann ich hier auch schlecht Ursachen ergründen.
Später speichere ich die Vertexdaten sowieso in einem Binärformat.
Das mit dem Text ist nur zum Testen...

Cheers,
Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.08.11 06:40 
Du benutzt StrToFloat. Dementsprechend wird logischerweise der im System eingestellte Dezimalseparator benutzt. Das ist bei dir offenbar ein Punkt, während es auf deutschen Systemen in der Regel ein Komma ist.

Da du immer einen Punkt benutzen willst, musst du bei der Umwandlungsroutine das auch angeben. Als zweiten Parameter können entsprechende Formateinstellungen angegeben werden. ;-)

user profile iconcatweasel hat folgendes geschrieben Zum zitierten Posting springen:
Wegen der Prozessorauslastung.. keine Ahnung, aber das ird wohl das DirectX sein....(?)
Bei mir liegt die zwischen 0 und 1 Prozent.
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mi 31.08.11 15:22 
Ja, daran hatte ich jetzt nicht gedacht.
Wenn ich die Vertices als Binärdaten einlese wird sich das sowieso erledigt haben.

Aber zu meiner ursprünglichen Frage:
Warum bekomme ich nur einem schwarzen Bildschirm sobald ich den Code in eine Klasse auslagere?

Cheers,
Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Di 13.09.11 23:06 
Hallo,

ist ja schon ein paar Tage alt, die Anfrage, trotzdem:

Ich habe den Code gedownloaded, compiliert (Delphi 7), und angestartet. Dann habe ich einen Breakpoint auf die erste Zeile der Procedure D3DRender gesetzt. Der wurde aber nie erreicht. Es scheint also alles nichts mit DirectX zu tun zu haben, eher ein Fehler im allgemeinen Programmablauf. Logisch, dass dan nichts auf dem Bildschirm zu sehen ist.

Gruß GuaAck
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 24.09.11 12:44 
Hi,

Danke für die Antwort.
Ich habe mir das mal angesehn.
Meinst du die Funktion die bei Zeile 239 beginnt?
Der wird bei mir erreicht wenn ich die Version auf der Page "3D View" starte.

Wenn ich einen Breakpoint in der d3dRender Funktion in UD3DEngine Unit setze (Zeile 208) wird der auch erreicht bei klick auf "Test Engine".

Wo hast du genau den Breakpoint gesetzt?

Cheers,
Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.