Page 1 sur 5

Questions pour créer un loader B3D

Publié : mer. 11/oct./2006 10:16
par Progi1984
Salut à tous, je travaille sur un loader B3D (avant de m'attaquer à d'autres formats). j'ai réussi à dumper le fichier B3D. Mtnt j'essaie de l'afficher, mais dés que je crée le mesh, j'ai un IMAà la ligne 257.

File:1->MGEB3DLoader.zip
Image

Tous les fichier B3D :
B3DSamples.zip 8Mo

Publié : mer. 11/oct./2006 10:29
par tmyke
Perso cela s'arrete a la ligne
CreateMesh(0,n_verts*3)
Je ne connais pas trop bien les instruction 3D native de PB, mais je regarde
et je te tiens au courant...

Publié : mer. 11/oct./2006 10:39
par Progi1984
C'est cette ligne-là ! Merci !

Publié : mer. 11/oct./2006 10:57
par tmyke
J'ai placé les appels B3D après l'init de l'ecran graphique.
Cette fois j'arrive sur un message d'erreur ligne 289
SetMeshData(0,#PB_Mesh_Vertex,@Vertices(),n_verts*3)

en passant comme parametre
SetMeshData(0,#PB_Mesh_Vertex,@Vertices(),n_verts)
cela se termine sans arret violent.

En lisant la doc, il y a une embiguité entre
CreateMesh(0, Taille) ou 'Taille' est la taille du Mesh (mais en quoi ?)
et
SetMeshData() ou le dernier paramètre est le nombre de sommets...
Dans ce cas le nombre de sommet est n_verts je pense et non pas
n_verts*3 qui dans ce cas est la taille du tableau 'Vertices'

Publié : mer. 11/oct./2006 11:03
par Progi1984
Parfait ! Merci !

Publié : mer. 11/oct./2006 11:13
par Progi1984
J'ai mis à jour le zip... et j'ai toujours un problème.

Je charge les sommets et les triangles.

Mais rien ne s'affiche... j'ai du lourder quelque part !

Publié : mer. 11/oct./2006 11:20
par comtois
Progi1984 a écrit :Parfait ! Merci !
Ah ça marche maintenant ?
parce que ça me parait curieux ce bout de code

Code : Tout sélectionner

         Dim Vertices(n_verts*3)
          Protected Inc_vert=0
          ;read all verts in chunk
          While b3dChunkSize()
            x.f = b3dReadFloat()
            Vertices(Inc_vert) = x
            Inc_vert+1
            y.f = b3dReadFloat()
            Vertices(Inc_vert) = x
            Inc_vert+1
            z.f = b3dReadFloat()
            Vertices(Inc_vert) = x
Déjà ton tableau n'utilise pas de structure, après tout pourquoi pas, mais ça serait plus parlant avec une structure.
Ensuite c'est un tableau d'entier , c'est plutôt rare en 3D, en principe les coordonnées des vertices sont en flottant, ensuite tu recopies la même valeur 3 fois ? ça ne devrait pas être x,y et z ?

Pour la taille du CreateMesh() il faut indiquer la dimension du mesh.
C'est chiant ce truc là , on ne l'avait pas avant.
ça devrait être à la fonction de le calculer ! après tout la fonction a accès aux données, elle peut déterminer elle même la dimension du mesh en analysant les coordonnées mini maxi.
Bref si tu ne connais pas la dimesion du mesh , tu peux mettre 1000, ça n'a d'influence que sur l'affichage à l'écran.

Ensuite

Code : Tout sélectionner

SetMeshData(0,#PB_Mesh_Vertex,@Vertices(),n_verts)
ça ne suffit pas, il faut aussi définir les triangles avec un autre SetMeshData() et #Pb_Mesh_Face

Et tu mets ton SetmesData() dans une boucle ? dans la boucle il faut mémoriser toutes les données du mesh ,et seulement après tu construits le mesh en une fois, mais j'ai pas étudié plus que ça, c'est peut-être correct ce que tu as fait.

Publié : mer. 11/oct./2006 11:33
par tmyke
Comtois a raison, j'ai ecris plutot cela, et cela marche, je vois le zombie

Code : Tout sélectionner

Dim Vertices.f(n_verts*3)
          Protected Inc_vert=0
          ;read all verts in chunk
          While b3dChunkSize()
            x.f = b3dReadFloat()
            Vertices(Inc_vert) = x
            Inc_vert+1
            y.f = b3dReadFloat()
            Vertices(Inc_vert) = y
            Inc_vert+1
            z.f = b3dReadFloat()
            Vertices(Inc_vert) = z

Publié : mer. 11/oct./2006 11:33
par Progi1984
Grace aux infos de Comtois, j'ai réussi à afficher mon bonhomme.

Mtnt, je continue par la texture. Mais il faut que j'améliore d'abord mon code !

Publié : mer. 11/oct./2006 15:38
par Progi1984
Bon, bah la texture est chargée mais en fait, il faut charger les coordonnées UV et c'est là que ca me pose problèmes
- je voie où les charger (ligne 305)
- mais dés que j'essaie de les charger ! Paf : aucun effet !

J'ai MAJ le zip tout en haut ! Donc si il y en a qui sont prets à m'aider... pas de problème :D

Publié : mer. 11/oct./2006 18:31
par comtois
dans ton dernier zip on est censé le voir ton zombi ? moi je ne vois rien.

sinon pour les coordonnées uv
il faut ajouter deux paramètres dans ta structure

Code : Tout sélectionner

  Structure S_Vertices
    x.f
    y.f
    z.f
    u.f
    v.f
  EndStructure

Code : Tout sélectionner

; Coordonnées UV
For j = 0 To tc_sets-1 ;texture coords per vertex - 1 for simple uv, 8 max
  For k = 1 To tc_size ;components per set - 2 for simple uv, 4 max
     b3dReadFloat()  ; ici il faudrait lire Vertices\u() et Vertices\v()
  Next
Next
Wend
SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_UVCoordinate,@Vertices(),n_verts)


il faut ajouter #PB_Mesh_UVCoordinate, et mémoriser les valeurs de u et v dans ton tableau Vertices()

Publié : jeu. 12/oct./2006 5:10
par tmyke
Comme dit Comtois, il faut intégrer les coordonnées de textures dans la structure Vertex.
Et dans la boucle de VRTS, il faudrait ecrire un truc comme ça

Code : Tout sélectionner

          Dim Vertices.S_Vertices(n_verts)
          Protected Inc_vert=0
          ;read all verts in chunk
          While b3dChunkSize()
            x.f = b3dReadFloat()
            y.f = b3dReadFloat()
            z.f = b3dReadFloat()
            With Vertices(Inc_vert)
              \x = x
              \y = y
              \z = z
            EndWith
            If flags & 1
              nx.f = b3dReadFloat()
              ny.f = b3dReadFloat()
              nz.f = b3dReadFloat()
            EndIf
            If flags & 2
              red.f = b3dReadFloat()
              grn.f = b3dReadFloat()
              blu.f = b3dReadFloat()
              lfa.f = b3dReadFloat()
            EndIf
            ; Coordonnées UV
            Dim uv.f(8,4)
            For j = 0 To tc_sets
              For k = 0 To tc_size
                uv(j,k)= b3dReadFloat()
              Next
            Next
            With Vertices(Inc_vert)
               \u = uv(0,0)
               \v = uv(0,1)
            EndWith    
            Inc_vert+1
          Wend
          SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_UVCoordinate,@Vertices(),n_verts)
        Else
          Debug tab+"***** Illegal number of vertices *****"
        EndIf
La je pars bosser, mais en rentrant je reprend (en espérant pas rentrer dans la nuit)...
A+

PS: en C/C++ voila comment c'est écris (si ça peut t'aider)

Code : Tout sélectionner

char* b3d_getVRTS_Dat(char* fp, int* decision)
{
	float tex_coord[8][4];
	float nx,ny,nz,r=1.0,g=1.0,b=1.0,a=1.0;

	int flags=*((int*)fp);fp+=4;*decision-=4;
	int texcoordsets=*((int*)fp);fp+=4;*decision-=4;
	if(texcoordsets>FVF_format) FVF_format = (short)texcoordsets;
	int texcoordsetsize=*((int*)fp);fp+=4;*decision-=4;
	while(*decision)
	{
		float x=*((float*)fp);fp+=4;*decision-=4;
		float y=*((float*)fp);fp+=4;*decision-=4;
		float z=*((float*)fp);fp+=4;*decision-=4;
		if(flags&1)
		{
			nx=*((float*)fp);fp+=4;*decision-=4;
			ny=*((float*)fp);fp+=4;*decision-=4;
			nz=*((float*)fp);fp+=4;*decision-=4;
		}
		if(flags&2)
		{
			 r=*((float*)fp);fp+=4;*decision-=4;
			 g=*((float*)fp);fp+=4;*decision-=4;
			 b=*((float*)fp);fp+=4;*decision-=4;
			 a=*((float*)fp);fp+=4;*decision-=4;
		}
		for(int n=0;n<texcoordsets;++n)
			for(int i=0;i<texcoordsetsize;++i)
			{
				tex_coord[n][i] = *((float*)fp);		
				fp+=4;*decision-=4;
			}

		// mémorisation du vertice, après transformation
		D3DXVECTOR3 pt = D3DXVECTOR3(x,y,z);
		D3DXVec3TransformCoord(&pt, &pt,  &mat_entity);
		vtx8[nbre_vertex].p = pt;
		vtx8[nbre_vertex].n = D3DXVECTOR3(nx,ny,nz);
		vtx8[nbre_vertex].color = D3DXCOLOR(r,g,b,a);
		vtx8[nbre_vertex].u[0] = tex_coord[0][0];
		vtx8[nbre_vertex].u[1] = tex_coord[0][1];
		vtx8[nbre_vertex].u[2] = tex_coord[1][0];
		vtx8[nbre_vertex].u[3] = tex_coord[1][1];
		vtx8[nbre_vertex].u[4] = tex_coord[2][0];
		vtx8[nbre_vertex].u[5] = tex_coord[2][1];
		vtx8[nbre_vertex].u[6] = tex_coord[3][0];
		vtx8[nbre_vertex].u[7] = tex_coord[3][1];
		vtx8[nbre_vertex].u[8] = tex_coord[4][0];
		vtx8[nbre_vertex].u[9] = tex_coord[4][1];
		vtx8[nbre_vertex].u[10]= tex_coord[5][0];
		vtx8[nbre_vertex].u[11]= tex_coord[5][1];
		vtx8[nbre_vertex].u[12]= tex_coord[6][0];
		vtx8[nbre_vertex].u[13]= tex_coord[6][1];
		vtx8[nbre_vertex].u[14]= tex_coord[7][0];
		vtx8[nbre_vertex].u[15]= tex_coord[7][1];

		nbre_vertex++;
	}

Publié : jeu. 12/oct./2006 8:10
par Progi1984
J'a mis à jour le ZIP.

Ca marche, merci à vous (TMyke & Comtois) mais le problème est que les UV sont pourris. Car cela applique mal les UV au modèle.

Publié : jeu. 12/oct./2006 8:29
par comtois
la boucle k doit commencer par 0

Code : Tout sélectionner

For k = 0 To tc_size-1 
pour le -1 je ne sais si c'est utile ,tu verras bien.

Publié : jeu. 12/oct./2006 8:38
par Progi1984
Merci, c'est parfait...

Petite question pour le SetMeshData :
Au lieu d'utiliser des tableaux, peut on utiliser des listes chaînées ?