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

Aktuelle Zeit: Mo Jul 14, 2025 05:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: XML laden o. speichern
BeitragVerfasst: Mi Aug 30, 2006 14:08 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ich nutze die Jedikomponente um XML zu laden und zu speichern.
Delphi-Quellcode:
Code:
  1. uses JvSimpleXml;


Nun meine Methode zum Speichern:

Delphi-Quellcode:
Code:
  1. procedure TGLObjekt.SaveToXML ();
  2. var xml : TJvSimpleXml;
  3.     DrawModeLokal, NextObjekt : String;
  4.     i : Integer;
  5. begin
  6.   xml := TJvSimpleXML.Create(nil);
  7.   DrawModeLokal := DrawModeToStr(DrawMode);
  8.  
  9.   if (FileExists(MAP_NAME) = TRUE) then
  10.   begin
  11.     xml.LoadFromFile(MAP_NAME);
  12.     NextObjekt := xml.root.Items.ItemNamed['Objekte'].Items.ItemNamed['GLObjekt'].Value;
  13.     ShowMessage(NextObjekt);
  14.  
  15.   end
  16.  
  17.   else
  18.   begin
  19.     try
  20.       xml.Root.Items.Add('Objekte');
  21.       xml.Root.Items.ItemNamed['Objekte'].Items.Add('GLObjekt');
  22.       xml.Root.Items.ItemNamed['Objekte'].Items.ItemNamed['GLObjekt'].Items.Add(DrawModeLokal);
  23.       xml.Root.Items.ItemNamed['Objekte'].Items.ItemNamed['GLObjekt'].Items.ItemNamed[DrawModeLokal].Properties.Add('ID','1');
  24.  
  25.       with xml.Root.Items.ItemNamed['Objekte'].Items.ItemNamed['GLObjekt'].Items.ItemNamed[DrawModeLokal] do
  26.       begin
  27.         Items.Add('NumVertices',NumVertices);
  28.         Items.Add('Texturpfad',Texturpfad);
  29.  
  30.         Items.Add('Vertices');
  31.  
  32.         for i:=0 to NumVertices-1 do
  33.         begin
  34.           Items.ItemNamed['Vertices'].Items.Add('Vertex');
  35.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('X', FloatToStr(Vertices[i].X));
  36.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('Y', FloatToStr(Vertices[i].Y));
  37.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('Z', FloatToStr(Vertices[i].Z));
  38.         end;
  39.  
  40.         Items.Add('Textur');
  41.  
  42.         for i:=0 to NumVertices-1 do
  43.         begin
  44.           Items.ItemNamed['Textur'].Items.Add('Koordinaten');
  45.           Items.ItemNamed['Textur'].Items.ItemNamed['Koordinaten'].Properties.Add('X', FloatToStr(Textur[i].X));
  46.           Items.ItemNamed['Textur'].Items.ItemNamed['Koordinaten'].Properties.Add('Y', FloatToStr(Textur[i].Y));
  47.         end;
  48.  
  49.         Items.Add('Color');
  50.  
  51.         for i:=0 to NumVertices-1 do
  52.         begin
  53.           Items.ItemNamed['Color'].Items.Add('RGB');
  54.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('R', FloatToStr(Color[i].R));
  55.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('G', FloatToStr(Color[i].G));
  56.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('B', FloatToStr(Color[i].B));
  57.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('A', FloatToStr(Color[i].A));
  58.         end;
  59.       end;
  60.     except
  61.       ShowMessage('Die Anwendung konnte nicht ausgeführt werden. Bitte überprüfen sie ihre Angaben');
  62.     end;
  63.   end;
  64.   xml.SaveToFile(MAP_NAME);
  65.   xml.Free;
  66. end;



DIe entstehende XMLStruktur ist zb:
Code:
  1.   <?xml version="1.0" encoding="iso-8859-1" ?>
  2. - <Objekte>
  3. - <GLObjekt>
  4. - <GL_POINTS ID="1">
  5.   <NumVertices>1</NumVertices>
  6.   <Texturpfad>TexturPfad</Texturpfad>
  7. - <Vertices>
  8.   <Vertex X="0" Y="0" Z="0" />
  9.   </Vertices>
  10. - <Textur>
  11.   <Koordinaten X="0" Y="0" />
  12.   </Textur>
  13. - <Color>
  14.   <RGB R="0" G="0" B="0" A="0" />
  15.   </Color>
  16.   </GL_POINTS>
  17.   </GLObjekt>
  18.   </Objekte>


In den if (FileExists(MAP_NAME) = TRUE) -Block kommt spaeter noch einiges mehr.

Das Prob nun ist das NextObject:
Delphi-Quellcode:
NextObjekt := xml.root.Items.ItemNamed['Objekte'].Items.ItemNamed['GLObjekt']

Ich brauche jetz eine Möglichkeit, in Nextobject alle in GLObjekt enthaltenen Objekte zu bekommen. In diesem Fall wäre es GL_TRIANGLES, aber es könnte auch GL_QUADS usw. sein. in NextObject muss das also gespeichert sein, damit ich per
xml.root.Items.ItemNamed['Objekte'].Items.ItemNamed['GLObjekt'].Items.ItemNamed[NextObjekt].Value
draufzugreifen kann

Danke schonma


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 30, 2006 21:23 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Problem Gelöst


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 30, 2006 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
Wie? (How?)

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 31, 2006 08:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja. Bitte immer Lösungen angeben. Das hilft allen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 31, 2006 14:23 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Okay okay vergebt mir! *hände schuetzend vor sich heb* ;)

Okay also ich musste es etwas anders lösen.
Ich speichere die Anzahl der enthaltenen Objekte - bei der Erstellung einer neuen Datei ist das logischerweise eins.
Dann durchlaufe ich eine Forschleife bis die Objektanzahl (NumObjekte) erreicht ist. Da ich nicht auf GL_TRIANGLE zugreifen kann, weil ich ja im Voraus nicht weiß, ob es überhaupt ein TRIANGLE ist oder nicht doch ein POINTS oder ein QUADS. Also heissen meine Objekte ab jetzt 'Objekt'+i. I ist - wie ihr sicherlich intelligenter Weise schon lange erkannt habt, der Incrementor der Forschleife.
Danach wird als Propertie eben dieser Objekte der DrawMode (also POINTS, QUADS etc) gespeichert.

Speichern is ja ganz einfach dann und auslesen ist nun ja auch gelöst.

Der Code:
Code:
  1. procedure TGLObjekt.SaveToXML ();
  2. var xml : TJvSimpleXml;
  3.     DrawModeLokal, NextObjekt : String;
  4.     i, NumObjekte : Integer;
  5. begin
  6.   xml := TJvSimpleXML.Create(nil);
  7.   DrawModeLokal := DrawModeToStr(DrawMode);
  8.  
  9.   if (FileExists(MAP_NAME) = TRUE) then
  10.   begin
  11.     xml.LoadFromFile(MAP_NAME);
  12.     NumObjekte := StrToInt(Xml.Root.Items.ItemNamed['NumObjekte'].Value);
  13.     NextObjekt := IntToStr(NumObjekte+1);
  14.  
  15.     try
  16.       xml.Root.Items.ItemNamed['NumObjekte'].Value := NextObjekt;
  17.       xml.Root.Items.Add('Objekt'+NextObjekt);
  18.       xml.Root.Items.ItemNamed['Objekt'+NextObjekt].Properties.Add('DrawMode',DrawModeLokal);
  19.  
  20.       with xml.Root.Items.ItemNamed['Objekt'+NextObjekt] do
  21.       begin
  22.         Items.Add('NumVertices',NumVertices);
  23.         Items.Add('Texturpfad',Texturpfad);
  24.  
  25.         Items.Add('Vertices');
  26.  
  27.         for i:=0 to NumVertices-1 do
  28.         begin
  29.           Items.ItemNamed['Vertices'].Items.Add('Vertex');
  30.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('X', FloatToStr(Vertices[i].X));
  31.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('Y', FloatToStr(Vertices[i].Y));
  32.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('Z', FloatToStr(Vertices[i].Z));
  33.         end;
  34.  
  35.         Items.Add('Textur');
  36.  
  37.         for i:=0 to NumVertices-1 do
  38.         begin
  39.           Items.ItemNamed['Textur'].Items.Add('Koordinaten');
  40.           Items.ItemNamed['Textur'].Items.ItemNamed['Koordinaten'].Properties.Add('X', IntToStr(Textur[i].X));
  41.           Items.ItemNamed['Textur'].Items.ItemNamed['Koordinaten'].Properties.Add('Y', IntToStr(Textur[i].Y));
  42.         end;
  43.  
  44.         Items.Add('Color');
  45.  
  46.         for i:=0 to NumVertices-1 do
  47.         begin
  48.           Items.ItemNamed['Color'].Items.Add('RGB');
  49.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('R', FloatToStr(Color[i].R));
  50.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('G', FloatToStr(Color[i].G));
  51.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('B', FloatToStr(Color[i].B));
  52.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('A', FloatToStr(Color[i].A));
  53.         end;
  54.       end;
  55.     except
  56.       ShowMessage('Die Anwendung konnte nicht ausgeführt werden. Bitte überprüfen sie ihre Angaben');
  57.     end;
  58.   end
  59.  
  60.   else
  61.   begin
  62.     try
  63.       xml.Root.Items.Add('GLObjekte');
  64.       xml.Root.Items.ItemNamed['GLObjekte'].Items.Add('NumObjekte','1');
  65.       xml.Root.Items.ItemNamed['GLObjekte'].Items.Add('Objekt1');
  66.       xml.Root.Items.ItemNamed['GLObjekte'].Items.ItemNamed['Objekt1'].Properties.Add('DrawMode',DrawModeLokal);
  67.  
  68.       with xml.Root.Items.ItemNamed['GLObjekte'].Items.ItemNamed['Objekt1'] do
  69.       begin
  70.         Items.Add('NumVertices', NumVertices);
  71.         Items.Add('Texturpfad', Texturpfad);
  72.  
  73.         Items.Add('Vertices');
  74.  
  75.         for i:=0 to NumVertices-1 do
  76.         begin
  77.           Items.ItemNamed['Vertices'].Items.Add('Vertex');
  78.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('X', FloatToStr(Vertices[i].X));
  79.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('Y', FloatToStr(Vertices[i].Y));
  80.           Items.ItemNamed['Vertices'].Items.ItemNamed['Vertex'].Properties.Add('Z', FloatToStr(Vertices[i].Z));
  81.         end;
  82.  
  83.         Items.Add('Textur');
  84.  
  85.         for i:=0 to NumVertices-1 do
  86.         begin
  87.           Items.ItemNamed['Textur'].Items.Add('Koordinaten');
  88.           Items.ItemNamed['Textur'].Items.ItemNamed['Koordinaten'].Properties.Add('X', FloatToStr(Textur[i].X));
  89.           Items.ItemNamed['Textur'].Items.ItemNamed['Koordinaten'].Properties.Add('Y', FloatToStr(Textur[i].Y));
  90.         end;
  91.  
  92.         Items.Add('Color');
  93.  
  94.         for i:=0 to NumVertices-1 do
  95.         begin
  96.           Items.ItemNamed['Color'].Items.Add('RGB');
  97.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('R', FloatToStr(Color[i].R));
  98.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('G', FloatToStr(Color[i].G));
  99.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('B', FloatToStr(Color[i].B));
  100.           Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('A', FloatToStr(Color[i].A));
  101.         end;
  102.       end;
  103.     except
  104.       ShowMessage('Die Anwendung konnte nicht ausgeführt werden. Bitte überprüfen sie ihre Angaben');
  105.     end;
  106.   end;
  107.   xml.SaveToFile(MAP_NAME);
  108.   xml.Free;
  109. end;
  110.  


Alles was in der IfSchleife steht, liegt bei mir in der LoadFromXML.

Die entstehende XMLDatei sieht zb so aus:
Code:
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <GLObjekte>
  3.   <NumObjekte>3</NumObjekte>
  4.   <Objekt1 DrawMode="GL_POINTS">
  5.     <NumVertices>1</NumVertices>
  6.     <Texturpfad>wall.bmp</Texturpfad>
  7.     <Vertices>
  8.       <Vertex X="0" Y="0" Z="0"/>
  9.     </Vertices>
  10.     <Textur>
  11.       <Koordinaten X="0" Y="0"/>
  12.     </Textur>
  13.     <Color>
  14.       <RGB R="0" G="0" B="0" A="0"/>
  15.     </Color>
  16.   </Objekt1>
  17.   <Objekt2 DrawMode="GL_POINTS">
  18.     <NumVertices>1</NumVertices>
  19.     <Texturpfad>wall.bmp</Texturpfad>
  20.     <Vertices>
  21.       <Vertex X="0" Y="0" Z="0"/>
  22.     </Vertices>
  23.     <Textur>
  24.       <Koordinaten X="0" Y="0"/>
  25.     </Textur>
  26.     <Color>
  27.       <RGB R="0" G="0" B="0" A="0"/>
  28.     </Color>
  29.   </Objekt2>
  30.   <Objekt3 DrawMode="GL_LINES">
  31.     <NumVertices>2</NumVertices>
  32.     <Texturpfad>wall.bmp</Texturpfad>
  33.     <Vertices>
  34.       <Vertex X="1,1" Y="2,2" Z="3,3"/>
  35.       <Vertex X="3,3" Y="1,1" Z="2,2"/>
  36.     </Vertices>
  37.     <Textur>
  38.       <Koordinaten X="1" Y="2"/>
  39.       <Koordinaten X="0" Y="0"/>
  40.     </Textur>
  41.     <Color>
  42.       <RGB R="0" G="0" B="0" A="0"/>
  43.       <RGB R="0" G="0" B="0" A="0"/>
  44.     </Color>
  45.   </Objekt3>
  46. </GLObjekte>
  47.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 31, 2006 16:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich will ja nicht unken. Schon mal vorab Entschuldigung dafür, dass ich heute die Rolle des Arschloches übernehmen. Okay. Okay. Der Ein oder Andere wird sich jetzt denken. "Heute?" ;-)

Aber ohne um den heißen Brei herum zu reden. Ich finde deinen XML Aufbau merkwürdig. Dieses Listenverhalten. Also abspeichern einer Anzahl und Namensgebung mit einem Index ist äußerst untypisch für XML. Bzw hast du bei Objekt3 auch 2 Vertices angegeben aber alle heißen "Vertex". Da dürftest du dann später irgendwann Probleme bekommen.

XML lebt davon, dass die Knoten einen einheitlichen Namen haben, damit es sich ein bisschen wie eine strukturierte Textdatenbank verhält. XML Typisch wäre eigentlich etwas in der Art.
Code:
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <GLObjekte>
  3.   <Objekt Name="Blah" DrawMode="GL_POINTS">
  4.     <Textur Pfad="wall.bmp" Einstellungen="etc" />
  5.     <Vertex>
  6.       <Coord X="0" Y="0" Z="0" />
  7.       // evtl auch noch einen Datentypen anhängen damit man auch
  8.       // floats sinnvoll unterstützen kann etc. Das aber nur am Rand.
  9.       // <Coord DataType="int" X="0" Y="0" Z="0" />
  10.       <TexCoord X="0" Y="0" Z="0" />
  11.       <Normal X="0" Y="0" Z="0" />
  12.       <Color R="0" G="0" B="0" A="0" />
  13.     </Vertex>
  14.     <Vertex>
  15.       <Coord X="0" Y="0" Z="0" />
  16.       <TexCoord X="0" Y="0" Z="0" />
  17.       <Normal X="0" Y="0" Z="0" />
  18.       <Color R="0" G="0" B="0" A="0" />
  19.     </Vertex>
  20.   </Objekt>
  21.   <Objekt Name="Blub" DrawMode="GL_POINTS">
  22.     <Textur Pfad="wall.bmp" Einstellungen="etc" />
  23.     <Vertex>
  24.       <Coord X="0" Y="0" Z="0" />
  25.       <TexCoord X="0" Y="0" Z="0" />
  26.       <Normal X="0" Y="0" Z="0" />
  27.       <Color R="0" G="0" B="0" A="0" />
  28.     </Vertex>
  29.     <Vertex>
  30.       <Coord X="0" Y="0" Z="0" />
  31.       <TexCoord X="0" Y="0" Z="0" />
  32.       <Normal X="0" Y="0" Z="0" />
  33.       <Color R="0" G="0" B="0" A="0" />
  34.     </Vertex>
  35.   </Objekt>
  36. </GLObjekte>


Ich muss allerdings gestehe, dass ich keine Ahnung habe wie so etwas dann mit diesen Komponenten einzulesen bzw wegzuschreiben wäre, da ich mich mit denen überhaupt nicht auskenne. Aber da XML eigentlich für solch eine Namensgebung konzipiert wurde kann ich mir nur schwer vorstellen, dass das nicht geht. Höchstwahrscheinlich wird es aber darauf hinauslaufen, dass du nicht mehr solche Dinge sagen kannst wie ItemNamed['Textur'], da du vorraussetzt, dass die Bezeichner eindeutig sein müssen. Was aber nicht Sinn und Zweck von XML ist.

Ich denke mal es würde dann eher so sein, dass du zu der Klasse hingehst und dann sagst gib mir mal alle Items mit dem Namen "Objekt". Und dort würdest du dann eine Liste mit 2 Elementen bekommen. Bzw in einem dieser Elemente dann auch alle elemete Namens "Vertex". So nach dem Prinzip.

PS: Ich würde beim Einlesen, dass nicht immer darauf bestehen, dass du zu jedem Punkt eine Farbe oder Normale angegeben hast.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 31, 2006 16:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Kleiner Hinweis zu JvSimpleXML:

beim direkt Zugriff auf irgendwas über Items.ItemNamed['Objekte'] gibts ne lustige AV wenn es das Item nicht gibt. Immer vorher prüfen ob Items.ItemNamed['Objekte']<>nil oder in TJvSimpleXML.Options den Flag setzen das nicht bestehende Items beim Zugriff über ItemNamed direkt erzeugt werden. Beachtet man das nicht kann es ziemlich schnell passieren das es einem gerade bei großen XML Dateien die ganze Lade/Speicher routine zerlegt weil er irgendwo mittendrin mit ner AV verreckt.



Sachen wie
Code:
  1. Items.ItemNamed['Color'].Items.Add('RGB');
  2. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('R', FloatToStr(Color[i].R));
  3. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('G', FloatToStr(Color[i].G));
  4. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('B', FloatToStr(Color[i].B));
  5. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('A', FloatToStr(Color[i].A));
  6.  

lassen sich wesentlich besser schreiben als :
Code:
  1. With Items.ItemNamed['Color'].Items.Add('RGB') do
  2. begin
  3.   Properties.Add('R', FloatToStr(Color[i].R));
  4.   Properties.Add('G', FloatToStr(Color[i].G));
  5.   Properties.Add('B', FloatToStr(Color[i].B));
  6.   Properties.Add('A', FloatToStr(Color[i].A));
  7. end;

Die ItemNamed funktion ist zwar ne Prima sache, aber ständigs rum gewurschtel damit kann das ganze ziemlich langsam machen da er ja jedesmal das Item mit dem Namen suchen muß was wesentlich langsamer ist als direkt über den Index zuzugreifen. Bei großen XML Dateien wird das ein echter Zeit Faktor.


[Edit]
Gerade erst gesehen, aber sowas:
Code:
  1. NumObjekte := StrToInt(Xml.Root.Items.ItemNamed['NumObjekte'].Value);
ist ganz ganz Böse \":)\"
Das kannst du zum speichern machen, aber zum laden würde ich es besser so machen :
Code:
  1. NumObjekte := Xml.Root.Items.IntValue('NumObjekte',0);

Hier sparst du dir das blöde StrToInt und kannst noch einen Default Wert angeben (die ",0)") falls es das Item nicht gibt .

[Edit 2]
Noch ein allgemeiner Hinweis zum speichern von Daten mit JvSimpleXML,
wenn du irgendwo nichts anderes machst als teile einer Klassen/Record Structur als einzelne Items ins XML zu speichern dann macht es sich einfacher das Item in das man speichern will einfach per Items.Clear komplett leer zu machen und die Daten mittels Items.Add neu rein zu schreiben.
Beispiel:
du hast eine xml Datei:
Code:
  1. <myxmlfile>
  2.   <item>
  3.     <ID>1</ID>
  4.     <Data>something</Data>
  5.     <MoreData>something else</MoreData>
  6.   </item>
  7.   <item>
  8.     <ID>2</ID>
  9.     <Data>123</Data>
  10.     <MoreData>123456</MoreData>
  11.   </item>
  12. </myxmlfile>

Willst du jetzt in dieser Datei das Item mit ID = 1 aktualisieren (neue Settings rein schreiben) würde ich das so machen:
Code:
  1. for n := to XML.Root.Items.Count -1 do
  2.     with XML.Root.Items.Item[n].Items do
  3.     begin
  4.       if IntValue('ID') = 1 then
  5.       begin
  6.         Clear;
  7.         Add('Data',...);
  8.         Add('MoreData',...);
  9.         break;
  10.       end;
  11.     end;

Ist meiner persönlichen Erfarhung nach wesentlich eleganter als da jedesmal mit Items.ItemNamed['Data'].Value := zu kommen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 31, 2006 17:32 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Billi Berserker hat geschrieben:
Kleiner Hinweis zu JvSimpleXML:

beim direkt Zugriff auf irgendwas über Items.ItemNamed['Objekte'] gibts ne lustige AV wenn es das Item nicht gibt. Immer vorher prüfen ob Items.ItemNamed['Objekte']<>nil oder in TJvSimpleXML.Options den Flag setzen das nicht bestehende Items beim Zugriff über ItemNamed direkt erzeugt werden. Beachtet man das nicht kann es ziemlich schnell passieren das es einem gerade bei großen XML Dateien die ganze Lade/Speicher routine zerlegt weil er irgendwo mittendrin mit ner AV verreckt.

Unmöglich. denn bei jedem Start ueberprueft er ob die Datei existiert, wenn nicht legt er sie so an, wie sie eben aussehen muss.

Billi Berserker hat geschrieben:
Sachen wie
Code:
  1. Items.ItemNamed['Color'].Items.Add('RGB');
  2. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('R', FloatToStr(Color[i].R));
  3. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('G', FloatToStr(Color[i].G));
  4. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('B', FloatToStr(Color[i].B));
  5. Items.ItemNamed['Color'].Items.ItemNamed['RGB'].Properties.Add('A', FloatToStr(Color[i].A));
  6.  

lassen sich wesentlich besser schreiben als :
Code:
  1. With Items.ItemNamed['Color'].Items.Add('RGB') do
  2. begin
  3.   Properties.Add('R', FloatToStr(Color[i].R));
  4.   Properties.Add('G', FloatToStr(Color[i].G));
  5.   Properties.Add('B', FloatToStr(Color[i].B));
  6.   Properties.Add('A', FloatToStr(Color[i].A));
  7. end;


Hat ich mir schon ueberlegt, aber dann doch wieder verworfen. naja das ändern is ja kein Prob mehr

Billi Berserker hat geschrieben:
Die ItemNamed funktion ist zwar ne Prima sache, aber ständigs rum gewurschtel damit kann das ganze ziemlich langsam machen da er ja jedesmal das Item mit dem Namen suchen muß was wesentlich langsamer ist als direkt über den Index zuzugreifen. Bei großen XML Dateien wird das ein echter Zeit Faktor.

Wie soll ich es denn sonst machen, wenn nicht mit ItemNamed?

Billi Berserker hat geschrieben:
Gerade erst gesehen, aber sowas:
Code:
  1. NumObjekte := StrToInt(Xml.Root.Items.ItemNamed['NumObjekte'].Value);
ist ganz ganz Böse \":)\"
Das kannst du zum speichern machen, aber zum laden würde ich es besser so machen :
Code:
  1. NumObjekte := Xml.Root.Items.IntValue('NumObjekte',0);

Hier sparst du dir das blöde StrToInt und kannst noch einen Default Wert angeben (die ",0)") falls es das Item nicht gibt .

Hat ich grade geändert \";)\"

Billi Berserker hat geschrieben:
Noch ein allgemeiner Hinweis zum speichern von Daten mit JvSimpleXML,
wenn du irgendwo nichts anderes machst als teile einer Klassen/Record Structur als einzelne Items ins XML zu speichern dann macht es sich einfacher das Item in das man speichern will einfach per Items.Clear komplett leer zu machen und die Daten mittels Items.Add neu rein zu schreiben.
Beispiel:
du hast eine xml Datei:
Code:
  1. <myxmlfile>
  2.   <item>
  3.     <ID>1</ID>
  4.     <Data>something</Data>
  5.     <MoreData>something else</MoreData>
  6.   </item>
  7.   <item>
  8.     <ID>2</ID>
  9.     <Data>123</Data>
  10.     <MoreData>123456</MoreData>
  11.   </item>
  12. </myxmlfile>

Willst du jetzt in dieser Datei das Item mit ID = 1 aktualisieren (neue Settings rein schreiben) würde ich das so machen:
Code:
  1. for n := to XML.Root.Items.Count -1 do
  2.     with XML.Root.Items.Item[n].Items do
  3.     begin
  4.       if IntValue('ID') = 1 then
  5.       begin
  6.         Clear;
  7.         Add('Data',...);
  8.         Add('MoreData',...);
  9.         break;
  10.       end;
  11.     end;


Naja ob nun so oder so, mal schaun

Habe jetz auch alles in eine Funktion ausgelagert nun funkt es wunderbar
Btw: diese geschichte mit Objekt+inttostr(i) musste ich auch bei Vertex, Koordinaten und RGB anwenden, sonst haette ich sie nicht trennen können


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 31, 2006 18:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Shaddow hat geschrieben:
Unmöglich. denn bei jedem Start ueberprueft er ob die Datei existiert, wenn nicht legt er sie so an, wie sie eben aussehen muss.

Was wenn die Datei die richtig gespeichert wurde vom User/einem anderen Programm nachträglich editiert wurde und fehler rein gebaut wurden?
(mag sein das es jetzt bei dir nicht passieren wird, ist aber ganz allgemein durchaus möglich)
Lieber komplett komplett Idiotensicher schreiben als sich dann später damit rum ärgern :)


Shaddow hat geschrieben:
Wie soll ich es denn sonst machen, wenn nicht mit ItemNamed?
[...]
Btw: diese geschichte mit Objekt+inttostr(i) musste ich auch bei Vertex, Koordinaten und RGB anwenden, sonst haette ich sie nicht trennen können

Kommt immer ganz auf die Situation drauf an. ItemNamed[''] ist immer gut um die großen Schlüssel Items zu finden, also z.b. nen "Items" tag unter dem dann alle anderen Items als extra Elemente gespeichert sind. Dann aber besser auch den Key wenn einmal gefunden abspeichern oder mit "With ... do" arbeiten damit er nicht 100 mal das gleiche item mit ItemNamed[''] sucht.
Und ansonsten einfach alle Items von 0 bis Count -1 durchgehen und gucken wann du das passende gefunden hast und dann damit weiter arbeiten. Hier kannst du dann auch in Jedes Item nen extra ID/Name Wert haben und kannst es dir sparen die Items Objekt1,Objekt2 etc. zu nennen. Was anderes als alle Items von 0 bis Count -1 durchzugehen macht ItemNamed auch nicht.
Beispiel:
deine XML Datei sieht so aus:
Code:
  1. <Objekt1 DrawMode="GL_POINTS">
  2.     [...]
  3.   </Objekt1>

Richtig und wesentlich besser wäre (wie Lossy bereits geschrieben hat):
Code:
  1. <Objekt DrawMode="GL_POINTS">
  2.     <ID>1</ID>
  3.     [...]
  4.   </Objekt>

Um das Item zu finden was du suchst geht du einfach alle Items von 0 bis Count -1 durch und schaust dir für Items.Item[n] den Wert 'ID' an.
also... Items.Item[n].Items.IntValue('ID');
Was anderes macht ItemNamed[''] auch nicht, nur ist es wenn du es selbst machst
a) eleganter
b) xml konform
c) wesentlich leichter zu erweitern - z.b wenn du eh alle Items von 0 bis Count - 1 brauchst gehst du sie direkt von oben nach unten durch und machst greifst nicht über Items.ItemNamed['Object'+inttostr(n)] drauf zu.


Die Sache mit dem speichern und den Key vorher leer machen klingt etwas komisch,
ist aber meine persönliche Erfahrung das es so wesentlich besser geht.
Ansonsten müßtest du es ganz korrekt so machen:
Code:
  1. for n := to XML.Root.Items.Count -1 do
  2.     with XML.Root.Items.Item[n].Items do
  3.     begin
  4.       if IntValue('ID') = 1 then
  5.       begin
  6.         if ItemNamed['Data'] <> nil then ItemNamed['Data'].Value := ...
  7.            else Add('Data',...);
  8.         if ItemNamed['MoreData'] <> nil then ItemNamed['MoreData'].Value := ...
  9.            else Add('DataMore',...);
  10.         break;
  11.       end;
  12.     end;

da ist die sache mit dem clear wesentlich hübscher ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 31, 2006 22:32 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
So habes jetz nochmal ueberarbeitet. Meine SaveMethode:
Code:
  1. procedure TGLObjekt.SaveToXML ();
  2. var xml : TJvSimpleXml;
  3.     DrawModeLokal, NextObjekt : String;
  4.     i, NumObjekte, NextVertice : Integer;
  5. begin
  6.   xml := TJvSimpleXML.Create(nil);
  7.   DrawModeLokal := DrawModeToStr(DrawMode);
  8.  
  9.   if (FileExists(MAP_NAME) = TRUE) then
  10.   begin
  11.     try
  12.       xml.LoadFromFile(MAP_NAME);
  13.       xml.Root.Items.Add('Objekt');
  14.  
  15.       with xml.Root.Items.ItemNamed['Objekt'] do
  16.       begin
  17.  
  18.         Properties.Add('Name', ObjektName);
  19.         Properties.Add('DrawMode', DrawModeLokal);
  20.         Properties.Add('ID',IntToStr(xml.Root.Items.Count));
  21.         Properties.Add('TexturPfad', TexturPfad);
  22.  
  23.         Items.Add('Vertex');
  24.  
  25.         with Items.ItemNamed['Vertex'].Items do
  26.         begin
  27.           Add('Coord');
  28.           with ItemNamed['Coord'].Properties do
  29.           begin
  30.             Add('X', FloatToStr(Coord[0].X));
  31.             Add('Y', FloatToStr(Coord[0].Y));
  32.             Add('Z', FloatToStr(Coord[0].Z));
  33.           end;
  34.  
  35.           Add('TexCoord');
  36.           with ItemNamed['TexCoord'].Properties do
  37.           begin
  38.             Add('X', FloatToStr(TexCoord[0].X));
  39.             Add('Y', FloatToStr(TexCoord[0].Y));
  40.             Add('Z', FloatToStr(TexCoord[0].Z));
  41.           end;
  42.  
  43.           Add('Color');
  44.           with ItemNamed['Color'].Properties do
  45.           begin
  46.             Add('R', FloatToStr(Color[0].R));
  47.             Add('G', FloatToStr(Color[0].G));
  48.             Add('B', FloatToStr(Color[0].B));
  49.             Add('A', FloatToStr(Color[0].A));
  50.           end;
  51.         end;
  52.       end;
  53.     except
  54.       ShowMessage('Die Anwendung konnte nicht ausgeführt werden. Bitte überprüfen sie ihre Angaben');
  55.     end;
  56.   end
  57.  
  58.   else
  59.   begin
  60.     try
  61.       xml.Root.Items.Add('GLObjekte');
  62.       xml.Root.Items.ItemNamed['GLObjekte'].Items.Add('Objekt');
  63.  
  64.       with xml.Root.Items.ItemNamed['GLObjekte'].Items.ItemNamed['Objekt'] do
  65.       begin
  66.  
  67.         Properties.Add('Name', ObjektName);
  68.         Properties.Add('DrawMode', DrawModeLokal);
  69.         Properties.Add('ID','1');
  70.         Properties.Add('TexturPfad', TexturPfad);
  71.  
  72.         Items.Add('Vertex');
  73.  
  74.         with Items.ItemNamed['Vertex'].Items do
  75.         begin
  76.           Add('Coord');
  77.           with ItemNamed['Coord'].Properties do
  78.           begin
  79.             Add('X', FloatToStr(Coord[0].X));
  80.             Add('Y', FloatToStr(Coord[0].Y));
  81.             Add('Z', FloatToStr(Coord[0].Z));
  82.           end;
  83.  
  84.           Add('TexCoord');
  85.           with ItemNamed['TexCoord'].Properties do
  86.           begin
  87.             Add('X', FloatToStr(TexCoord[0].X));
  88.             Add('Y', FloatToStr(TexCoord[0].Y));
  89.             Add('Z', FloatToStr(TexCoord[0].Z));
  90.           end;
  91.  
  92.           Add('Color');
  93.           with ItemNamed['Color'].Properties do
  94.           begin
  95.             Add('R', FloatToStr(Color[0].R));
  96.             Add('G', FloatToStr(Color[0].G));
  97.             Add('B', FloatToStr(Color[0].B));
  98.             Add('A', FloatToStr(Color[0].A));
  99.           end;
  100.         end;
  101.       end;
  102.     except
  103.       ShowMessage('Die Anwendung konnte nicht ausgeführt werden. Bitte überprüfen sie ihre Angaben');
  104.     end;
  105.   end;
  106.   xml.SaveToFile(MAP_NAME);
  107.   xml.Free;
  108. end;


Und die LoadObjects(), die allerdings keine Methode sondern nur eine Funktion ist, da sie direkt die Angaben zu ALLEN Objekten auslesen soll und nicht einzeln zu jedem einzelnen Objekt:
Code:
  1. function LoadObjects (): TRenderObjekte;
  2. var xml: TJvSimpleXml;
  3.     RenderObjekte: TRenderObjekte;
  4.     Name, TexturPfad: string;
  5.     DrawModeLokal: GLEnum;
  6.     Coord: TCoord;
  7.     TexCoord: TTexCoord;
  8.     Color: TFarbe;
  9.     i, j, k: Integer;
  10. begin
  11.   try
  12.     xml := TJvSimpleXML.Create(nil);
  13.     xml.LoadFromFile(MAP_NAME);
  14.  
  15.     with xml.Root do
  16.     begin
  17.       for i:=0 to Items.Count-1 do ///////////////////// Durchlauf aller Objekte
  18.       begin
  19.         with Items[i] do //////////////// Instanz aller Objekte
  20.         begin
  21.           ////////////////// Properties Name und DrawMode //////////////////////
  22.           Name := Properties.ItemNamed['Name'].Value;
  23.  
  24.           DrawModeLokal := StrToDrawMode(Properties.ItemNamed['DrawMode'].Value);
  25.  
  26.           TexturPfad := Properties.ItemNamed['TexturPfad'].Value;
  27.  
  28.           for j:=0 to Items.Count-1 do ///////////// j:=1 weil j:=0 der Texturpfad ist
  29.           begin
  30.             with items[j] do
  31.             begin
  32.               ////////////////// Objekte Coord, TexCoord, Color ////////////////
  33.               with Items.ItemNamed['Coord']  do
  34.               begin
  35.                 SetLength(Coord, Length(Coord)+1);
  36.                 Coord[j].X := Properties.ItemNamed['X'].FloatValue;
  37.                 Coord[j].Y := Properties.ItemNamed['Y'].FloatValue;
  38.                 Coord[j].Z := Properties.ItemNamed['Z'].FloatValue;
  39.               end;
  40.  
  41.               with Items.ItemNamed['TexCoord'] do
  42.               begin
  43.                 SetLength(TexCoord, Length(TexCoord)+1);
  44.                 TexCoord[j].X := Properties.ItemNamed['X'].IntValue;
  45.                 TexCoord[j].Y := Properties.ItemNamed['Y'].IntValue;
  46.                 TexCoord[j].Z := Properties.ItemNamed['Z'].IntValue;
  47.               end;
  48.  
  49.               with Items.ItemNamed['Color'] do
  50.               begin
  51.                 SetLength(Color, Length(Color)+1);
  52.                 Color[j].R := Properties.ItemNamed['R'].FloatValue;
  53.                 Color[j].G := Properties.ItemNamed['G'].FloatValue;
  54.                 Color[j].B := Properties.ItemNamed['B'].FloatValue;
  55.                 Color[j].A := Properties.ItemNamed['A'].FloatValue;
  56.               end;
  57.             end;
  58.           end;
  59.         end;
  60.         SetLength(RenderObjekte, Length(RenderObjekte)+1);
  61.         RenderObjekte[i] := TGLObjekt.Create(Name, DrawModeLokal, Texturpfad, Coord, TexCoord, Color);
  62.       end;
  63.      end;
  64.     except
  65.       ShowMessage('Die Anwendung konnte nicht ausgeführt werden. Bitte überprüfen sie ihre Angaben');
  66.     end;
  67.   xml.Free;
  68. end;


Die entstehende XMLDatei ist zb:
Code:
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <GLObjekte>
  3.   <Objekt Name="1" DrawMode="GL_POINTS" ID="1" TexturPfad="">
  4.     <Vertex>
  5.       <Coord X="0" Y="0" Z="0"/>
  6.       <TexCoord X="0" Y="0" Z="0"/>
  7.       <Color R="0" G="0" B="0" A="0"/>
  8.     </Vertex>
  9.   </Objekt>
  10.   <Objekt Name="1" DrawMode="GL_POINTS" ID="2" TexturPfad="">
  11.     <Vertex>
  12.       <Coord X="0" Y="0" Z="0"/>
  13.       <TexCoord X="0" Y="0" Z="0"/>
  14.       <Color R="0" G="0" B="0" A="0"/>
  15.     </Vertex>
  16.   </Objekt>
  17. </GLObjekte>
  18.  


Hoffe so ist es besser :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 01, 2006 08:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Perfekt. Ich sehe jetzt so keine Probleme mehr. :-D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 01, 2006 12:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Ohne jetzt XML schlecht machen zu wollen, aber wieso sich die Mühe machen und Modell-Daten in XML speichern? Zum einen kann man die nicht gerade gut komprimieren, User können sie direkt bearbeiten und die Datei wird unnötig groß. Als Quell Format ist XML legitim, aber spätestens als End Format ist Schluss. Da sollte eine binäre Form gewählt werden. Das spart Platz, lässt sich in den meisten Fällen vernünftig komprimieren und der User kann es nicht mal eben manipulieren und damit evtl. das Model zerstören. Warum also die Mühe?

Hab XML mal für Konfig Dateien probiert, bin dann aber wieder zu der klassischen INI Datei übergegangen.Ist einfach komfortabler. Außer bei GUI Elemente, da finde ich XML sehr praktisch. Warum also XML für die Modelle?
Würd mich jetzt echt mal interessieren!

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 01, 2006 12:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich muss doch auch mal was schreiben, wäre dumm wenn ich es nicht täte.
Da ich ja mit XD_Data(im forum eher bekannt als dgl meshformat) arbeite, will ich mal meine variante posten.
Der meiste Quellcode ist zum darstellen der Daten von nöten. Exporter ist eine minimal modifikation und die Daten kann man wahlweise in xml oder bin speicher/laden. Modifizieren kann man auch aber in der Regel will man ja nur lesen.
Durch das mitliefern der Typen und header infos hat man es bequemer, so kann man überprüfen ob die file für den loader gedacht ist und neben der Code validierung, kann man dann auch die Daten eines Typ mit einem Befehl(.asType) komplett laden.

Das Beispiel ist der Anfang meines Map Formates, man hat momentan mesh,texturen und ein Entity was ein statisch konfiguriertes Partikelsystem ist(ermöglicht durch FireBlade). Momentan arbeite ich am Material System und es macht gute fortschritte.
Um das Format zu erweitern ist so gut wie kein Code von nöten. Für das erweitern um Materials braucht man 1-2zeilen im exporter,1-2 zeilen in record des typs und der code zum darstellen.

Programmcode zum lesen der Daten und darstellen:
Code:
  1. program x_dream;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   XDream,
  5.   XD_Data,
  6.   dglopengl,
  7.   sysutils,
  8.   System_Settings,
  9.   fireblade,
  10.   classes;
  11.  
  12. type
  13.   TGLVector2f=array [0..1] of single;
  14.   pTGLVector3f=^TGLVector3f;
  15.   pTGLVector2f=^TGLVector2f;
  16.  
  17.   pTFaces=^TFaces;
  18.   TFaces=packed record
  19.     numofvert:cardinal;
  20.     smooth:Boolean;
  21.     normal:TGLVector3f;
  22.     verts:pTGLVector3f;
  23.     uv:pTGLVector2f;
  24.   end;
  25.  
  26.   pTMesh=^TMesh;
  27.   TMesh=packed record
  28.     name:pchar;
  29.     numfaces:cardinal;
  30.     numverts:cardinal;
  31.     hasfaceuv:Boolean;
  32.     faces:pTFaces;
  33.   end;
  34.  
  35.   TParticle1=packed record
  36.     pos:TGLVector3f;
  37.   end;
  38.  
  39.   pTEntity=^TEntity;
  40.   TEntity=packed record
  41.     name:pchar;
  42.     kind:pchar;
  43.     particle:TParticle1
  44.   end;
  45.  
  46. var
  47.   glData:TXD_Data;
  48.   mesh:array of pTMesh;
  49.   Entity:array of pTEntity;
  50.   meshnode:TXD_Node;
  51.   i,f,m:cardinal;
  52.   light_position:array [0..3] of single;
  53.  
  54.   EffectContainer: TParticleEffectContainer;
  55.  
  56. procedure ParticleFireEffect;
  57. var
  58.    i, New: Integer;
  59.    Color, Velocity: Vector3f;
  60. begin
  61.      For i := 0 to 299 - EffectContainer.ParticleCount do
  62.      begin
  63.           Color := MakeVector3f(1, 0.375, 0.254);
  64.           Velocity := MakeVector3f(random * 0.2-0.1, random * 0.2-0.1, random*0.2-0.1);
  65.           EffectContainer.AddParticle(MakeVector3f(random * 0.025 , 0.0,
  66.                                     random * 0.025), MakeVector3f(0.05, 0.05, 0), Color, 7, random);
  67.           New := EffectContainer.ParticleCount - 1;
  68.           EffectContainer.SetForce(MakeVector3f(0, 1, 0), New);
  69.           EffectContainer.SetEnlargement(MakeVector3f(0.1, 0.1, 0), New);
  70.           EffectContainer.SetInertia(MakeVector3f(0.1, 0.1, 0.1), New);
  71.           EffectContainer.SetMass(1, New);
  72.           EffectContainer.SetVelocity(Velocity, New);
  73.           EffectContainer.SetBeginFadeOut(0.2, New);
  74.      end;
  75.      glDepthMask(False);
  76.      EffectContainer.CycleContainer(XD.Timer.FrameTime);
  77.      glDepthMask(True);
  78. end;
  79.  
  80. procedure SetupContainer;
  81. var
  82.   Texture: cardinal;
  83. begin
  84.   Texture := XD.TextureManager.Texture(XD.TextureManager.AddTexture('../common/particles.tga')).opengl.id;
  85.  
  86.   EffectContainer := TParticleEffectContainer.Create();
  87.   EffectContainer.SetContainerTexturePropertys(Texture, 2, 4);
  88.   EffectContainer.SetBlendFactor(GL_SRC_ALPHA, GL_ONE);
  89. end;
  90.  
  91. procedure Draw();
  92. var
  93.   face:pTFaces;
  94.   vert:pTGLVector3f;
  95.   uv:pTGLVector2f;
  96. begin
  97.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  98.   glLoadIdentity;
  99.  
  100.   XD.Timer.UpdateData;
  101.   XD.movement.Update;
  102.   XD.Cameras.Update;
  103.  
  104.   glEnable(GL_Texture_2D);
  105.   glEnable(GL_LIGHTING);
  106.   glEnable(GL_LIGHT0);
  107.   glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  108.  
  109.   xd.texturemanager.BindTexture(1);
  110.   if length(mesh)>0 then
  111.     for m:=0 to length(mesh)-1 do
  112.     begin
  113.       cardinal(face):=cardinal(mesh[m]^.faces);
  114.       for i:=0 to Mesh[m]^.numfaces-1 do
  115.       begin
  116.         if face^.numofvert=3 then
  117.           glbegin(GL_Triangles);
  118.         if face.numofvert=4 then
  119.           glbegin(GL_Quads);
  120.  
  121.         glnormal3f(face^.normal[0],face^.normal[1],face^.normal[2]);
  122.  
  123.         cardinal(vert):=cardinal(face^.verts);
  124.         cardinal(uv):=cardinal(face^.uv);
  125.         if mesh[m]^.hasfaceuv then
  126.           for f:=0 to face^.numofvert-1 do
  127.           begin
  128.             gltexcoord2f(uv^[0],uv^[1]);
  129.             glvertex3f(vert^[0],vert^[1],vert^[2]);
  130.             inc(vert);
  131.             inc(uv);
  132.           end
  133.         else
  134.           for f:=0 to face^.numofvert-1 do
  135.           begin
  136.             glvertex3f(vert^[0],vert^[1],vert^[2]);
  137.             inc(vert);
  138.           end;
  139.         glend;
  140.         inc(face);
  141.       end;
  142.     end;
  143.  
  144.   glDisable(GL_LIGHT0);
  145.   glDisable(GL_LIGHTING);
  146.   glDisable(GL_Texture_2D);
  147.  
  148.   if length(entity)>0 then
  149.   begin
  150.  
  151.     for m:=0 to length(entity)-1 do
  152.       if entity[m]^.kind='Particle' then
  153.       begin
  154.         gltranslatef(entity[m]^.particle.pos[0],entity[m]^.particle.pos[2],entity[m]^.particle.pos[1]);
  155.         ParticleFireEffect;
  156.       end;
  157.   end;
  158.  
  159.   XD.Perfmon.draw;
  160.   XD.Render.SwapBuffers;
  161. end;
  162.  
  163. begin
  164.   Default_UsePerfmon:=true;
  165.  
  166.   XD:=TXDream.create;
  167.  
  168.   glclearcolor(0.6,0.7,1,1);
  169.  
  170.   glData:=TXD_Data.create;
  171.   gldata.LoadFromFile('test.xml');
  172.   gldata.SaveToFile('test1.bin');
  173.   gldata.LoadFromFile('test1.bin');
  174.  
  175.   setlength(mesh,glData.Segment(xdd_data).Container('objdata').Container('objcount').AsLongWord);
  176.   meshnode:=glData.Segment(xdd_data).Container('mesh');
  177.   for i:=0 to length(mesh)-1 do
  178.   begin
  179.     mesh[i]:=meshnode.AsType.data;
  180.     meshnode:=meshnode.nextnode;
  181.   end;
  182.  
  183.   setlength(entity,glData.Segment(xdd_data).Container('entdata').Container('entcount').AsLongWord);
  184.   meshnode:=glData.Segment(xdd_data).Container('entity');
  185.   if length(entity)>0 then
  186.   for i:=0 to length(entity)-1 do
  187.   begin
  188.     entity[i]:=meshnode.AsType.data;
  189.     meshnode:=meshnode.nextnode;
  190.   end;
  191.  
  192.   glenable(GL_Texture_2D);
  193.   XD.TextureManager.AddTexture('../common/textures/rock.jpg');
  194.  
  195.   SetupContainer;
  196.  
  197.   light_position[0]:=0;
  198.   light_position[1]:=0.25;
  199.   light_position[2]:=0;
  200.   light_position[3]:=1;
  201.  
  202.   glEnable(GL_Depth_Test);
  203.  
  204.   XD.EventManager.AddIdle(@Draw);
  205.   XD.Start;
  206.  
  207.   XD.destroy;
  208. end.


Ausgabe der daten als xml:
Code:
  1. <xddata>
  2.   <header>
  3.     <version> 1.0</version>
  4.     <typ>mesh</typ>
  5.   </header>
  6.   <type>
  7.     <objdata>
  8.       <objcount typ='integer' count='1'/>
  9.     </objdata>
  10.     <entdata>
  11.       <entcount typ='integer' count='1'/>
  12.     </entdata>
  13.     <uvcoord>
  14.       <u typ='float' count='1'/>
  15.       <v typ='float' count='1'/>
  16.     </uvcoord>
  17.     <vector>
  18.       <x typ='float' count='1'/>
  19.       <y typ='float' count='1'/>
  20.       <z typ='float' count='1'/>
  21.     </vector>
  22.     <particles>
  23.       <pos typ='vector' count='1'/>
  24.     </particles>    <faces>
  25.       <numverts typ='longword' count='1'/>
  26.       <smooth typ='boolean' count='1'/>
  27.       <normal typ='vector' count='1'/>
  28.       <vertex typ='vector' count='-1'/>
  29.       <uv typ='uvcoord' count='-1'/>
  30.     </faces>
  31.     <mesh>
  32.       <name typ='string' count='1' />
  33.       <numfaces typ='longword' count='1'/>
  34.       <numverts typ='longword' count='1'/>
  35.       <hasFaceUV typ='boolean' count='1'/>
  36.       <face typ='faces' count='-1'/>
  37.     </mesh>
  38.     <entity>
  39.       <name typ='string' count='1'/>
  40.       <kind typ='string' count='1'/>
  41.       <particle typ='particles' count='1'/>
  42.     </entity>
  43.   </type>
  44.   <data>
  45.     <objdata objcount='5'/>
  46.     <entdata entcount='1'/>
  47. <mesh name='Cube.004' numfaces='1' numverts='4' hasFaceUV='1'>
  48.   <face numverts='4' smooth='0'>
  49.     <normal x='-2.2e-007' y='1.0' z='-1.9e-007'/>
  50.     <vertex x='-0.39999992' y='-1.5e-007' z='-0.39999971'/>
  51.     <vertex x='-0.39999974' y='3e-008' z='0.39999971'/>
  52.     <vertex x='0.39999959' y='1.8e-007' z='0.39999971'/>
  53.     <vertex x='0.39999971' y='6e-008' z='-0.39999971'/>
  54.     <uv u='1.5' v='-0.5'/>
  55.     <uv u='-0.5' v='-0.5'/>
  56.     <uv u='-0.5' v='1.5'/>
  57.     <uv u='1.5' v='1.5'/>
  58.   </face>
  59. </mesh>
  60.  
  61. <mesh name='Cube.024' numfaces='1' numverts='4' hasFaceUV='1'>
  62.   <face numverts='4' smooth='0'>
  63.     <normal x='-2.2e-007' y='-1.0' z='0.0'/>
  64.     <vertex x='-1.19999933' y='0.79999924' z='1.19999909'/>
  65.     <vertex x='-1.19999921' y='0.79999924' z='0.39999971'/>
  66.     <vertex x='-0.39999983' y='0.79999906' z='0.39999971'/>
  67.     <vertex x='-0.39999971' y='0.79999906' z='1.19999909'/>
  68.     <uv u='1.5' v='-0.5'/>
  69.     <uv u='-0.5' v='-0.5'/>
  70.     <uv u='-0.5' v='1.5'/>
  71.     <uv u='1.5' v='1.5'/>
  72.   </face>
  73. </mesh>
  74.  
  75. <mesh name='Cube.025' numfaces='1' numverts='4' hasFaceUV='1'>
  76.   <face numverts='4' smooth='0'>
  77.     <normal x='-2.2e-007' y='-1.0' z='0.0'/>
  78.     <vertex x='0.3999995' y='0.79999936' z='0.39999968'/>
  79.     <vertex x='0.39999968' y='0.79999936' z='-0.39999974'/>
  80.     <vertex x='1.19999897' y='0.79999918' z='-0.39999974'/>
  81.     <vertex x='1.19999909' y='0.79999918' z='0.39999968'/>
  82.     <uv u='1.5' v='-0.5'/>
  83.     <uv u='-0.5' v='-0.5'/>
  84.     <uv u='-0.5' v='1.5'/>
  85.     <uv u='1.5' v='1.5'/>
  86.   </face>
  87. </mesh>
  88.  
  89. <mesh name='Cube.026' numfaces='1' numverts='4' hasFaceUV='1'>
  90.   <face numverts='4' smooth='0'>
  91.     <normal x='-2.2e-007' y='-1.0' z='0.0'/>
  92.     <vertex x='-1.19999933' y='0.79999936' z='0.39999968'/>
  93.     <vertex x='-1.19999921' y='0.79999936' z='-0.39999974'/>
  94.     <vertex x='-0.39999983' y='0.79999918' z='-0.39999974'/>
  95.     <vertex x='-0.39999971' y='0.79999918' z='0.39999968'/>
  96.     <uv u='1.5' v='-0.5'/>
  97.     <uv u='-0.5' v='-0.5'/>
  98.     <uv u='-0.5' v='1.5'/>
  99.     <uv u='1.5' v='1.5'/>
  100.   </face>
  101. </mesh>
  102.  
  103. <mesh name='Cube.027' numfaces='1' numverts='4' hasFaceUV='1'>
  104.   <face numverts='4' smooth='0'>
  105.     <normal x='-2.2e-007' y='-1.0' z='0.0'/>
  106.     <vertex x='-1.19999933' y='0.79999948' z='-0.39999971'/>
  107.     <vertex x='-1.19999921' y='0.79999948' z='-1.19999909'/>
  108.     <vertex x='-0.39999983' y='0.7999993' z='-1.19999909'/>
  109.     <vertex x='-0.39999971' y='0.7999993' z='-0.39999971'/>
  110.     <uv u='1.5' v='-0.5'/>
  111.     <uv u='-0.5' v='-0.5'/>
  112.     <uv u='-0.5' v='1.5'/>
  113.     <uv u='1.5' v='1.5'/>
  114.   </face>
  115. </mesh>
  116.  
  117. <entity name='particle' kind='Particle'>
  118.   <particle>
  119.     <pos x='0.0' y='0.0' z='0.119999907911'/>
  120.   </particle></entity></data></xddata>


Die Ausgabe als Binärdaten wäre nicht sinnvol hier zu posten.

Bild

_________________
"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: Fr Sep 01, 2006 12:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Auch wenn die Frage nicht primär an mich gerichtet war.

Mit der Größe hast du bei XML vollkommen recht. Die ist einfach nur abartig. Aber in der heutigen Zeit denke ich mal nicht mehr so ganz entscheidend.

Die Möglichkeit es selber zu editieren bzw zu sehen was drinne steckt sieht der Ein oder Andere auch als Vorteil an. Klar. Wenn es empfindliche Daten sind und später da wirklich Endbenutzer grundlegende Sachen daran ändern können ist es nicht unbedingt die taktisch beste Wahl.

Sonst sehe ich bei XML den riesen Vorteil, dass es beliebig komplexe Strukturen aufnehmen kann. Und dann auch auf Basis eines Datensatzes. Also mehrere gleiche Strukturen können damit gespeichert werden. Und dadurch, dass es sich um Text handelt kann man es später noch weiter benutzen selbst, dann wenn die Bedeutung einzelnen Bytes auf immer und Ewig vergessen wäre.

Für ein Model weiß ich auch nicht ob ich unbedingt XML benutzen würde, da alleine ein Singlewert von 4 Bytes Binär auf 12 Bytes Text anschwillt. Und das ist alleine der Wert. Es fehlt aber noch der Bezeichner. Aber ist reine Geschmackssache. Wenn man jetzt aber so level ala Wolfenstein 3D oder so abspeichern wollte wäre das für mich zu mindest wieder legitim.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 01, 2006 12:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Bei dem gezeigten Level Beispiel ist es auch nachvollziehbar. Die Struktur ist logisch aufgebaut und verbrät nicht unnötigen Speicher. Deswegen auch mein Bsp. mit dem GUI. Bei Strukturen die man schnell ändern will/kann ist es durchaus legitim.

Mit der Speichergröße kann ich nur bedingt zustimmen. Da ich aus dem Java Lager komme ist es mit der Speichergröße immer sehr kritisch. Man kann bei Java nicht mal eben 200MB (ein wenig übertreib) Speicher anfordern und danach wieder freigeben. Dazu ist die VM einfach nicht in der Lage, vielleicht wird sie es eines Tages sein. Derzeit kann sie es jedenfalls nicht.

Wiederwendbare Strukturen, ok. Ist ein Argument. Was ist mit Serialisierung? Wäre definitiv eine Möglichkeit, denn auch da ändert sich in der Regel die Art und Weise der Serialisierung nicht. Und Byte Werte sind bei Java fast egal, da die ihr eigenes System verfolgt ;)

Also, nochmal in Kurzform: Meine Meinung zum XML Einsatz, alles was sensisitv ist sollte nicht als XML gespeichert werden, dazu gehören häufig auch Konfig Dateien. Vielleicht schreibt mal jemand einen guten XML Kompressor der nicht nur nach Byte Übereinkunft sondern auch über TAG Übereinkunft komprimiert.

Bei Level und Modelldaten wo effektiv sehr viele gleiche Bezeichner vorkommen wäre das eine enorme Platzersparnis :)

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.019s | 16 Queries | GZIP : On ]