JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=bb575812a5e2f6816c8de8376ae010b1Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fragen zu Feldern in Feldern...
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 15:47    Titel: Fragen zu Feldern in Feldern... Antworten mit Zitat

hi!
Man kann ja ein Feld von Feldern auf folgende art machen:
Code:

char Feld[10][13];


Ich hab jetzt noch ein paar Fragen zu diesen Feldern.

a) Geht es, das die Felder innerhalb des Feldes verschiedene Größe haben?
Das zum Bespiel das feld an stelle Feld[0] 15 Elemente groß ist, also Feld[0][0-14] und das Feld an der Stelle 1 10 Elemente groß ist (Feld[1][0-9])? Kann man das mit realloc machen? z.B.
Code:

int iElements = 1;
char Feld[10][1]; //Standart größe der Felder im Feld = 1;
for( int  i = NULL; i < ( sizeof(Feld)/sizeof(char) ); i++ )
{
  iElements += 2;
  Feld[i] = (char*)realloc( Feld[i], ( sizeof(char) * iElements ) );
}


b) Wie kann man so ein Feld erzeugen, Wenn man die Größe vorher nich kennt? Geht das so in der Art:
Code:

TYP* Feld;
Feld = new TYP[ ELEMENTS ]; //Elements is ne Variable
Feld[0] = new TYP[ ELEMENTS2 ]; //Is auch ne Variable


Ich muss des Wissen, damit ich die Polygone von z.B. ner Map, so "aufbewahren" kann, dass sie it der rihtigen Textur und so gezeichnet werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 16:42    Titel: Antworten mit Zitat

Code:

TYP **Array = NULL;

Array = new TYP*[16];

Array[0] = new TYP[12];
Array[1] = new TYP[32];
...


ein festes array, also nicht mit pointern (eigentlich ja schon), kann nur eine feste größe haben:
float a[10][10];

Man kann allerdings ein festes array mit pointern auf andere arrays haben. diese arrays können dann verschiedene größen haben.
float a*[10]; // bin mir hier in der schreibweise SEHR unsicher!!

a ist nun ein array mit 10 elementen. diese elemente sind pointer, die auf arrays zeigen können.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 17:51    Titel: Antworten mit Zitat

Ok, danke!

Ich hab jetzt aber noch ein Prob:
Ich weiß ja, wie ich an den Vertex Buffer eines Meshes herankomme, und auch wie ich dessen Vertexe ins richtige Format bekomme, und auch wie sie in dem Buffer angeordnet sind. Jetzt weiß ich auch wie ich die Vertexe in meinen Polygonen richtig "ablege". Was ich noch wissen muss: ein Mesh kann ja durchaus mehrere Textures haben, woher weiß ich, für welches Face eines Mesh, oder welche Vertexe, zum Beispiel die Textur eins haben? Ich will folgendes machen:
- Ich hab eine Polygon klasse.
- Da sind drei Vertexe drin.
- Ich will einen Mesh von nem X-File laden
- Und die Vertexe in die Polygone verfrachten.
- Die Polygone sind jetzt in den Feldern, pro Textur ein Feld.
- Diese Felder sind in einem Großen Feld drin, das soviele elemente hat, wie der Mesh Texturen.

Dazu muss ich wissen, welches Polygon welche Textur hat, damit ich es richtig einordne. Hoffe ihr habt mein Problem verstanden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:10    Titel: Antworten mit Zitat

ich habe es leider nicht ganz verstanden.
aber ich glaube du willst die polygone nach den verwendeten texturen sortieren damit du nicht so oft ne neue textur setzen musst.

liegt dein problem jetzt in der x-datei, also das du nicht weißt wo steht welchem polygon welche textur zugeordnet ist oder eher vom programmieren der arrays und strukturen mit denen du die polygone verwaltest?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:17    Titel: Antworten mit Zitat

Mein Problem liegt darin, das ich nich weiß, wie ich herausfinde, welche Textur ein Polygon hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:21    Titel: Antworten mit Zitat

in den materialen steht das drinn.
also wenn Face 0 material 0 verwendet dann musst du in material 0 gucken welcher texturname da steht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:24    Titel: Antworten mit Zitat

hmm, aber wie bekomme ich das Material raus, Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:27    Titel: Antworten mit Zitat

steht in der datei Smile...
hast du die x datei selber geparst oder hast du fertige funktionen benutzt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:29    Titel: Antworten mit Zitat

"D3DXLoadMeshFromX"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:35    Titel: Antworten mit Zitat

Code:

HRESULT D3DXLoadMeshFromX(
  LPSTR pFilename,
  DWORD Options,
  LPDIRECT3DDEVICE8 pDevice,
  LPD3DXBUFFER* ppAdjacency,
  LPD3DXBUFFER* ppMaterials,
  PDWORD pNumMaterials,
  LPD3DXMESH* ppMesh
);



LPD3DXBUFFER* ppMaterials,
PDWORD pNumMaterials,

der name sagt denke ich alles.
in der msdn sind mehr informationen dazu.

in dem buffer sind jedenfalls die materialien gespeichert.

Struktur eines materials:
Code:

struct D3DXMATERIAL {
    D3DMATERIAL8  MatD3D;
    LPSTR         pTextureFilename;
};


informier dich am besten in der msdn. such einfach nach D3DXLoadMeshFromX.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:37    Titel: Antworten mit Zitat

Ja, das weiß ich schon längst alles, kann das alles auch perfekt darstellen und so... aber man hat dann nur einen Puffer von allen Materials des Meshes. Ich will aber wissen welches Material speziell für mein Polygon gilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 18:43    Titel: Antworten mit Zitat

achso, da kann ich dir leider nicht viel weiter helfen.

das einzige was ich dazu weiß ist, dass es ein attribut table im mesh objekt gibt, welches für die verwaltungen von bereichen im mesh zuständig ist, die verschieden materialien und texturen verwenden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 05.01.2003, 23:23    Titel: Antworten mit Zitat

Um die einzelnen Subsets aus dem Indexbuffer herauszuholen, gehe folgendermaßen vor:
Sortiere den Indexbuffer des Meshes nach den Attribut-Ranges mit folgendem Funktionsaufruf:
Code:
pMesh->OptimizeInplace(3DXMESHOPT_ATTRSORT,NULL,NULL,NULL,NULL)))


Ansonsten brauchst du noch die Attribute-Tabelle (GetAttributeTable()), in deren Elementen jeweils FaceStart und FaceCount der einzelnen Material-Subsets steht. Über diese Werte kannst du die Indices aus dem Indexbuffer herausfinden, die zu diesem Subset gehören.
Beispielcode:
Code:

nAttribCount: Anzahl Subsets
AttribRanges: die subset-beschreibung
(kriegste beides mit GetAttributeTable())


//indexbuffer des meshes locken
WORD * pMeshIB=NULL;
pMesh->LockIndexBuffer(D3DLOCK_READONLY,(void**)&pMeshIB);

//hier sind hinterher die indices der einzelnen subsets drinne (als array im array)
WORD ** pIndices=new WORD*[nAttribCount];

for (int i=0; i<nAttribCount; i++)
{
  if (AttribRanges[i].FaceCount==0)
  {
    pIndices[i]=NULL;
    continue;
  }
  //speicher fuer indices holen
   pIndices[i]=new WORD[AttribRanges[i].FaceCount*3];
 
  //aus indexbuffer kopieren
  memcpy(pIndices[i],pMeshIB+AttribRanges[i].FaceStart*3,AttribRanges[i].FaceCount*3);
}


Das wars im Prinzip schon, in pIndices stehen die Indices jetzt nach Materialen sortiert.
_________________
www.messiahzone.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 06.01.2003, 10:39    Titel: Antworten mit Zitat

Vielen Dank!
Nur noch ein paar Sachen zum Verständniss:
Die 3 mit der du immer multiplizierst, kommt doch daher, dass ein Face 3 Vertices hat, oder?

Und die Frage traue ich mich kaum zu stellen Wink da komm ich mir irgendwie blöd vor:
du hast ja:
Code:

memcpy(pIndices[i],pMeshIB+AttribRanges[i].FaceStart*3,AttribRanges[i].FaceCount*3);

Ich versteh nur nich so ganz, was der 2. Parameter (pMeshIB+AttribRanges[i].FaceStart*3) bedeutet Sad

Und noch was:
nAttribCount == Anzahl der Materials, oder? Bekommt man also beim Aufruf von "D3DXLoadMeshFromX" als 6. Parameter, oder?

Und Smile :
Muss man den Indexbuffer des Meshes nicht erst mit "GetIndexBuffer" holen? Man hat ja sonst kein index informationen drin, oder? Wenn man ihn holen muss, kann er aber nicht vom typ "DWORD*" sein, sondern muss ein "richtiger" Indexbuffer sein!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 06.01.2003, 13:07    Titel: Antworten mit Zitat

hmm, ich hab jetzt aber folgenden komischen Fehler:
Code:

error C2664: 'LockIndexBuffer' : Konvertierung des Parameters 2 von 'void ** ' in 'unsigned char ** ' nicht moeglich
        Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat


Und mein Code sieht so aus:
Code:

WORD*dwIB = NULL;
lpMesh->LockIndexBuffer( D3DLOCK_READONLY, (void**)&dwIB );
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum