22 for(
unsigned long i = 0; i < taille; i++)
36 for(
int i = 0 ; i < sx; i++ )
38 m_mutex.push_back(
new std::mutex());
51 for(
unsigned int i = 0; i <
m_mutex.size(); i++)
70 drawLine(somettransformer,monpipeline,facette);
80 delete[] somettransformer;
154 somettransformer =
new Sommet[3];
160 for(
unsigned int i = 0; i <
m_thread.size();i++ )
179 std::cout <<std::endl<<std::endl <<
"////////////////ETAPE OPERATION ASEMBLAGE FACETTE ////////////////"<< std::endl;
183 float nz = ((somettransformer[2].
pos.
x*somettransformer[1].
pos.
y)-(somettransformer[1].pos.x*somettransformer[2].
pos.
y))-
184 ((somettransformer[2].pos.x*somettransformer[0].pos.y)-(somettransformer[0].pos.x*somettransformer[2].pos.y))-
185 ((somettransformer[0].pos.x*somettransformer[1].pos.y)-(somettransformer[1].pos.x*somettransformer[0].pos.y));
187 std::cout <<
"Culling nz : " << nz << std::endl;
203 facette->
som1.
x = (somettransformer[0].pos.x/fi) + ((
float)
sizeX/2.0);
204 facette->
som1.
y = ((somettransformer[0].pos.y)/fi) + ((float)
sizeY/2.0);
205 facette->
som2.
x = (somettransformer[1].pos.x/fi) + ((
float)
sizeX/2.0);
206 facette->
som2.
y = ((somettransformer[1].pos.y)/fi) + ((float)
sizeY/2.0);
207 facette->
som3.
x = (somettransformer[2].pos.x/fi) + ((
float)
sizeX/2.0);
208 facette->
som3.
y = ((somettransformer[2].pos.y)/fi) + ((float)
sizeY/2.0);
216 std::cout <<
"Facette Hors ecran rejeter par le cliping" << std::endl;
232 std::cout <<
"Facette rejeter par l'operation de culling" << std::endl;
251 facette->
som1.
x = (somettransformer[0].
pos.
x/fi) + ((
float)
sizeX/2.0);
252 facette->
som1.
y = ((somettransformer[0].
pos.
y)/fi) + ((float)
sizeY/2.0);
253 facette->
som2.
x = (somettransformer[1].
pos.
x/fi) + ((
float)
sizeX/2.0);
254 facette->
som2.
y = ((somettransformer[1].
pos.
y)/fi) + ((float)
sizeY/2.0);
255 facette->
som3.
x = (somettransformer[2].
pos.
x/fi) + ((
float)
sizeX/2.0);
256 facette->
som3.
y = ((somettransformer[2].
pos.
y)/fi) + ((float)
sizeY/2.0);
266 std::cout <<
"Facette Hors ecran rejeter par le cliping" << std::endl;
299 for(
unsigned int i = 0; i <
m_thread.size();i++ )
321 drawLine(somettransformer,
this,facette);
346 std::cout <<std::endl<<std::endl <<
"////////////////ETAPE OPERATION TRACAGE LIGNE NAIF PIPELINE////////////////"<< std::endl;
352 for(
int p = 0; p < 3; p++)
356 std::cout <<
"Tracage du sommet : ";
358 std::cout <<
" au sommet :";
360 std::cout << std::endl;
364 som2 = facette->
som3;
368 som1 = facette->
som2;
374 a = (float)(som2.
y - som1.
y) / (float)(som2.
x - som1.
x);
380 std::cout <<
"Coeficien directeur a : " << a << std::endl;
384 if(a >= -1 && a <= 1 && som2.
x != som1.
x)
386 for(
int i = som1.
x; i < som2.
x; i++)
398 a = (float)(som2.
x - som1.
x) / (float)(som2.
y - som1.
y);
404 for(
int i = som1.
y; i < som2.
y; i++)
425 std::cout <<std::endl<<std::endl<<
"////////////////ETAPE OPERATION TRACAGE LIGNE PIPELINE////////////////"<< std::endl;
432 for(
int p = 0; p < 3; p++)
436 std::cout <<
"Tracage du sommet : ";
438 std::cout <<
" au sommet :";
440 std::cout << std::endl;
444 som2 = facette->
som3;
448 som1 = facette->
som2;
451 if(som1.
x == som2.
x && som1.
y == som2.
y)
460 a = (float)(som2.
y - som1.
y) / (float)(som2.
x - som1.
x);
469 if(a >= 0 && a <= 1 && som2.
x != som1.
x)
471 int di = som2.
x - som1.
x, dj= som2.
y - som1.
y;
473 int fp = 2*(dj-di), fn = 2* dj;
475 std::cout <<
"fp : " << fp <<
" fn : " << fn <<
" f : " << f <<std::endl;
477 for(
int i = som1.
x, j= som1.
y; i < som2.
x; i++)
492 else if(a < 0 && a >= -1)
494 int di = som2.
x - som1.
x, dj= som1.
y - som2.
y ;
496 int fp = 2*(dj-di), fn = 2* dj;
498 std::cout <<
"fp : " << fp <<
" fn : " << fn <<
" f : " << f <<std::endl;
500 for(
int i = som1.
x, j= som1.
y; i < som2.
x; i++)
521 if((a > 1 || a == 0) && som2.
y != som1.
y)
523 int di = som2.
x - som1.
x, dj= som2.
y - som1.
y;
525 int fp = 2*(di-dj), fn = 2* di;
528 printf(
"som1.x : %d som2.x : %d, som1.y %d som2.y %d fp %d fn %d f %d\n",som1.
x,som2.
x,som1.
y,som2.
y,fp,fn,f);
530 for(
int i = som1.
x, j= som1.
y; j < som2.
y; j++)
533 printf(
"paint y %d x %d \n",i,j);
546 else if(a < -1 && som2.
y != som1.
y)
548 int di = som1.
x - som2.
x , dj= som2.
y - som1.
y;
550 int fp = 2*(di-dj), fn = 2* di;
553 printf(
"tttsom1.x : %d som2.x : %d, som1.y %d som2.y %d fp %d fn %d f %d\n",som1.
x,som2.
x,som1.
y,som2.
y,fp,fn,f);
555 for(
int i = som1.
x, j= som1.
y; j < som2.
y; j++)
558 printf(
"paint y %d x %d \n",i,j);
591 std::cout <<std::endl<<std::endl<<
"////////////////ETAPE OPERATION REMPLISSAGE PIPELINE////////////////"<< std::endl;
594 for(
int i = 0; i < 2; i++)
637 float yH = local.
som1.
y;
638 float yB = local.
som1.
y;
640 int x = local.
som1.
x;
646 std::cout <<
"dy1 : " << dy1 <<
" dy2 : "<< dy2 <<
" dy3 : "<<dy3 << std::endl;
651 while( x < local.
som2.
x)
654 std::cout <<
"x : " << x <<
" yB : "<< yB <<
" yH : "<<yH << std::endl;
656 for(
int y = yB; y < yH; y++)
670 while( x <= local.
som3.
x)
673 std::cout <<
"x : " << x <<
" yB : "<< yB <<
" yH : "<<yH << std::endl;
675 for(
int y = yB; y < yH; y++)
687 while( x < local.
som2.
x)
690 std::cout <<
"x : " << x <<
" yB : "<< yB <<
" yH : "<<yH << std::endl;
692 for(
int y = yB; y < yH; y++)
706 while( x <= local.
som3.
x)
709 std::cout <<
"x : " << x <<
" yB : "<< yB <<
" yH : "<<yH << std::endl;
712 for(
int y = yB; y < yH; y++)
738 std::cout <<std::endl<<std::endl<<
"////////////////ETAPE OPERATION PIXEL PIPELINE////////////////"<< std::endl;
741 int coordpointtab = (monpipeline->
sizeX * P.
y) + P.
x;
746 std::cout <<
"Position : ";
748 std::cout <<
"Z Barycentrique calculer : " << z <<
" Dans ZBuffer : " << monpipeline->
zBuffer[coordpointtab] << std::endl;
751 monpipeline->
m_mutex.at(P.
y)->lock();
752 if(monpipeline->
zBuffer[coordpointtab] > z)
758 tab.
sommet = somettransformer;
762 monpipeline->
zBuffer[coordpointtab] = z;
763 monpipeline->
Display[coordpointtab] = out.
col;
767 monpipeline->
m_mutex.at(P.
y)->unlock();
783 if(x < 0 || x >=
sizeX || y < 0 || y >=
sizeY)
811 return (
unsigned char *)this->
Display;
823 for(i = 0; i < taille; i++)
873 unsigned char * test =
new unsigned char[
sizeX*
sizeY];
879 for(i = 0; i < taille; i++)
887 float mult = 255/
max ;
888 for(i = 0; i < taille; i++)
void SetShader(ShaderBase *VS)
Pipeline::SetShader(ShaderBase *VS) Permet de definir le shader qui sera utiliser pour le traitement...
static void Remplissage(Sommet *somettransformer, Pipeline *monpipeline, FaceteEcran *facette, bool debug=false)
Pipeline::Remplissage(Sommet *somettransformer, FaceteEcran *facette,rgb color, bool debug) Parmet de...
std::vector< std::thread > m_thread
ShaderBase * shader
Pointeur vers une classe shader.
unsigned char * getDisplay()
Pipeline::getDisplay() Permet de recuperer le tableau de unsigned char du buffer de rendu...
int sizeY
Taille en y de la fenêtre de rendu.
void SaveRenderTarget(std::string fichier)
Pipeline::SaveRenderTarget(std::string name) Sauvegarde le resultat du rendu dans un fichier...
void setCliping(bool var)
Pipeline::setCliping(bool var) Slot permetant de changer si le pipeline utilise le cliping...
void AsemblageFacette(Sommet *somettransformer, bool debug=false)
Pipeline::AsemblageFacette(Sommet *somettransformer) Prend les facete et regarde si on peut les élimi...
void SetVertexBuffer(unsigned int VBsz, void *VB, unsigned int VSstride)
Pipeline::SetVertexBuffer(unsigned int VBsz, void *VB, unsigned int VSstride) Permet de definir le ve...
void setViewPoint(bool var)
Pipeline::setViewPoint(bool var) Slot permetant de changer la vue du Pipeline en desactivant ou activ...
void PpmWrite(suint sx, suint sy, color *buff, const char *name)
unsigned int * IndexBuffer
Pointeur vers le tableau d'index.
void DrawTriangles()
Pipeline::DrawTriangles() Lance l'execution du pipeline ! Il commence par envoiyer 3 sommet au vertex...
void PgmWrite(suint sx, suint sy, byte *buff, const char *name)
void DiscretisationFacette(Sommet *somettransformer, FaceteEcran *facette)
Pipeline::DiscretisationFacette(Sommet *somettransformer) Discretise les facette dans le plan de l'éc...
void ClearRenderTarget(defColor::color Couleur)
Pipeline::ClearRenderTarget(defColor::color Couleur) Permet de remplir l'image de buffer avec une cou...
structure pour les vecteurs 3D (de taille 3).
bool IsOffScreen(int x, int y)
Pipeline::IsOffScreen(int x, int y) Permet de savoir si un point est a l'exterieur de la zone visible...
Pipeline(int sx=600, int sy=600, bool dothread=true)
Pipeline::Pipeline(int sx,int sy) Constructeur du pipeline, par defaut : Culling desactiver Cliping A...
std::vector< std::mutex * > m_mutex
static void threadRemplissage(Pipeline *monpipeline, Sommet *somettransformer, FaceteEcran *facette)
void SaveZBuffer(std::string name)
Pipeline::SaveZBuffer(std::string name) Sauvegarde le contenu du Zbuffer sous la forme d'une image en...
Classe de gestion du pipeline.
void * VertexBuffer
Pointeur vers le tableau de sommets.
void setViewRemplisage(bool var)
Pipeline::setViewRemplisage(bool var) Slot permetant de changer la vue du Pipeline en desactivant ou ...
void setViewMaille(bool var)
Pipeline::setViewMaille(bool var) Slot permetant de changer la vue du Pipeline en desactivant ou acti...
void SetIndexBuffer(unsigned int IBsz, unsigned int *IB)
Pipeline::SetIndexBuffer(unsigned int IBsz, unsigned int *IB) Permet de definir le vertex buffer qui ...
static void drawLine(Sommet *somettransformer, Pipeline *monpipeline, FaceteEcran *facette, bool debug=false)
Pipeline::drawLine(Sommet *somettransformer, FaceteEcran *facette,rgb color, bool debug) Permet de tr...
virtual void VertexShader(void *In, void *Out, void *Param, std::size_t Id0, std::size_t Id1)
ShaderBase::VertexShader(void *In, void *Out, void *Param, std::size_t x, std::size_t y) Fonction per...
unsigned int VertexBufferSize
Taille en octet du tableau de sommets (en octets).
float zBaricentrique(Math::coord2d P, FaceteEcran *facette, Sommet *somettransformer)
zBaricentrique(Math::coord2d P,FaceteEcran *facette, Sommet *somettransformer) Fonction permetant de ...
static void drawLineNaif(Sommet *somettransformer, Pipeline *monpipeline, FaceteEcran *facette, bool debug=false)
Pipeline::drawLineNaif(Sommet *somettransformer, FaceteEcran *facette,rgb color, bool debug) Permet d...
int sizeX
Taille en x de la fenêtre de rendu.
void setCulling(bool var)
Pipeline::setCulling(bool var) Slot permetant de changer si le pipeline utilise le culling...
Math::vecteur4d pos
Coordonnées du sommet.
unsigned int IndexBufferSize
Taille en octet du tableau d'index.
static void OperationPixel(coord2d P, Pipeline *monpipeline, Sommet *somettransformer, FaceteEcran *facette, bool debug=false)
Pipeline::OperationPixel(coord2d P,Sommet *somettransformer,FaceteEcran *facette,rgb color...
virtual void PixelShader(void *In, void *Out, void *Param, std::size_t x, std::size_t y)
ShaderBase::PixelShader(void *In, void *Out, void *Param, std::size_t x, std::size_t y) Fonction perm...
void ClearZBuffer(float Zmax=FLT_MAX)
Pipeline::ClearZBuffer(float Zmax) Permet de remplir le ZBuffer avec la valeur Zmax a toute les cordo...