Questions pour créer un loader B3D

Généralités sur la programmation 3D
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Questions pour créer un loader B3D

Message 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
Dernière modification par Progi1984 le mar. 17/oct./2006 10:39, modifié 5 fois.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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...
Force et sagesse...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

C'est cette ligne-là ! Merci !
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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'
Force et sagesse...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Parfait ! Merci !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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
Force et sagesse...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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()
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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++;
	}
Force et sagesse...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 ?
Répondre