Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.01.2003, 15:47 Titel: Fragen zu Feldern in Feldern... |
|
|
hi!
Man kann ja ein Feld von Feldern auf folgende art machen:
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 |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 05.01.2003, 16:42 Titel: |
|
|
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 |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.01.2003, 17:51 Titel: |
|
|
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 |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:10 Titel: |
|
|
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 |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:17 Titel: |
|
|
Mein Problem liegt darin, das ich nich weiß, wie ich herausfinde, welche Textur ein Polygon hat. |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:21 Titel: |
|
|
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 |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:24 Titel: |
|
|
hmm, aber wie bekomme ich das Material raus, |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:27 Titel: |
|
|
steht in der datei ...
hast du die x datei selber geparst oder hast du fertige funktionen benutzt? |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:29 Titel: |
|
|
"D3DXLoadMeshFromX" |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:35 Titel: |
|
|
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 |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:37 Titel: |
|
|
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 |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 05.01.2003, 18:43 Titel: |
|
|
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 |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 05.01.2003, 23:23 Titel: |
|
|
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 |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 06.01.2003, 10:39 Titel: |
|
|
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 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
Und noch was:
nAttribCount == Anzahl der Materials, oder? Bekommt man also beim Aufruf von "D3DXLoadMeshFromX" als 6. Parameter, oder?
Und :
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 |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 06.01.2003, 13:07 Titel: |
|
|
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 |
|
|
|