Ben al een daagje of drie aan het proberen een centrale texturedump te maken voor m'n Engine. Dit zorgt ervoor dat elk model in de scene niet egoïstisch zijn eigen zooi bijhoudt, maar het van een aparte dump haalt. Hiervoor zijn gare constructies nodig:
Een array van structs, genaamd MODEL, waar in elke MODEL een pointer naar een struct genaamd TEXTURE zit, waarin weer een pointer naar een Direct3D-texture is te vinden.
Dit ziet er als het goed is zo uit:
Maar het werkt niet. De pointer en de naam waardes geven gaat perfect (geen segfaults ofzo), maar gebruiken van de pointer levert altijd een instantcrash op:
Het opvullen van de items gaat overigens zo:
Maar gebruiken werkt zoals gezegd niet. Wat er wel zeker is:
Een array van structs, genaamd MODEL, waar in elke MODEL een pointer naar een struct genaamd TEXTURE zit, waarin weer een pointer naar een Direct3D-texture is te vinden.
Dit ziet er als het goed is zo uit:
C++:
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
27
| // De textures struct TEXTURE { LPDIRECT3DTEXTURE9 pointer; char name[MAX_PATH]; } textures[MAX_TEXTURES]; // De modellen struct MODEL { // Model LPDIRECT3DVERTEXBUFFER9 vertexbuffer; LPDIRECT3DINDEXBUFFER9 indexbuffer; // Textures TEXTURE *diffusetex,*speculartex,*normaltex,*parallaxtex,*ambienttex; // Params float diffuse,specular,shininess; D3DXHANDLE shader; // Generic Data D3DXMATRIX worldpos; int numfaces,numverts,sortindex; float r; } models[MAX_MODELS]; // En een denkbeeldige selectie models[index].diffusetex->pointer; |
Maar het werkt niet. De pointer en de naam waardes geven gaat perfect (geen segfaults ofzo), maar gebruiken van de pointer levert altijd een instantcrash op:
C++:
1
| FX->SetTexture(FXSpeculartex,models[a].speculartex->pointer); // CRASH |
Het opvullen van de items gaat overigens zo:
C++:
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
| if(currentregel[0] == 's') { ssmat >> str >> texstr >> models[index].specular >> models[index].shininess; // Kijk of er al eentje in gebruik is bool reuse = false; for(int a = 0;a < numtextures;a++) { if(!strcmp(texstr,textures[a].name)) { // Als we deze al hebben models[index].speculartex = &textures[a]; reuse = true; break; } } // Nee, een nieuwe if(!reuse) { if(texstr[1] != ':') { // DAN GEEN VOLLEDIG PAD sprintf(textemp,"%s\\Data\\Textures\\%s",exepath,texstr); D3DXCreateTextureFromFile(d3ddev,textemp,&textures[numtextures].pointer); } else { D3DXCreateTextureFromFile(d3ddev,texstr,&textures[numtextures].pointer); } strcpy(textures[numtextures].name,texstr); models[index].speculartex = &textures[numtextures]; numtextures++; } } |
Maar gebruiken werkt zoals gezegd niet. Wat er wel zeker is:
- De 3D-code zelf werkt perfect.
- Ik ga niet over MAX_PATH (260), MAX_TEXTURES (1024) of MAX_MODELS (65536) heen.
- Nalopen van de namen levert geen problemen op.