--- /dev/null
+#include <iostream>\r
+#include <omp.h>\r
+#include <math.h>\r
+\r
+#include "VagueMOO.h"\r
+#include "VagueMath.h"\r
+\r
+#include "OmpTools.h"\r
+#include "IndiceTools.h"\r
+\r
+using std::cout;\r
+using std::endl;\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* Declaration *|\r
+ \*---------------------------------------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |* Public *|\r
+ \*-------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |* Private *|\r
+ \*-------------------------------------*/\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* Implementation *|\r
+ \*---------------------------------------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |* Public *|\r
+ \*-------------------------------------*/\r
+\r
+VagueMOO::VagueMOO(unsigned int w, unsigned int h, float dt)\r
+ {\r
+ // Input\r
+ this->dt = dt;\r
+ this->w=w;\r
+\r
+\r
+ // Tools\r
+ this->t = 0;\r
+ this->isEntrelacement=true;\r
+\r
+\r
+ // OMP (facultatif)\r
+ const int NB_THREADS = OmpTools::setAndGetNaturalGranularity();\r
+ cout << "\n[VAGUE] nbThread = " << NB_THREADS << endl;\r
+ }\r
+\r
+VagueMOO::~VagueMOO(void)\r
+ {\r
+ // rien\r
+ }\r
+\r
+/*--------------------------------------*\\r
+ |* Public *|\r
+ \*-------------------------------------*/\r
+\r
+void VagueMOO::process(uchar4* ptrTabPixels, int w, int h)\r
+ {\r
+ if (isEntrelacement)\r
+ {\r
+ entrelacementOMP(ptrTabPixels, w, h); // Plus lent\r
+ }\r
+ else\r
+ {\r
+ forAutoOMP(ptrTabPixels, w, h); // Plus rapide\r
+ }\r
+\r
+ isEntrelacement = !isEntrelacement; // Pour tester que les deux implementations fonctionnent\r
+ }\r
+\r
+void VagueMOO::animationStep()\r
+ {\r
+ t+=dt;\r
+ }\r
+\r
+/*--------------*\\r
+ |* get *|\r
+ \*-------------*/\r
+\r
+float VagueMOO::getT()\r
+ {\r
+ return t;\r
+ }\r
+\r
+float VagueMOO::getDT()\r
+ {\r
+ return dt;\r
+ }\r
+\r
+/*--------------------------------------*\\r
+ |* Private *|\r
+ \*-------------------------------------*/\r
+\r
+/**\r
+ * Code naturel et direct OMP\r
+ */\r
+void VagueMOO::forAutoOMP(uchar4* ptrTabPixels, int w, int h)\r
+ {\r
+ VagueMath vagueMath(w,h); // ici pour preparer cuda\r
+\r
+#pragma omp parallel for\r
+ for (int i = 0; i < h; i++)\r
+ {\r
+ for (int j = 0; j < w; j++)\r
+ {\r
+ // int s = i * W + j;\r
+ int s = IndiceTools::toS(w, i, j); // i[0,H[ j[0,W[ --> s[0,W*H[\r
+\r
+ vagueMath.colorIJ(&ptrTabPixels[s], i, j,t);\r
+ }\r
+ }\r
+ }\r
+\r
+/**\r
+ * Code entrainement Cuda\r
+ */\r
+void VagueMOO::entrelacementOMP(uchar4* ptrTabPixels, int w, int h)\r
+ {\r
+ VagueMath vagueMath(w,h); // ici pour preparer cuda\r
+\r
+ const int WH = w * h;\r
+\r
+\r
+#pragma omp parallel\r
+ {\r
+ const int NB_THREAD = OmpTools::getNbThread();// dans region parallel\r
+ const int TID = OmpTools::getTid();\r
+ int s = TID; // in [0,...\r
+\r
+ int i;\r
+ int j;\r
+ while (s < WH)\r
+ {\r
+ IndiceTools::toIJ(s, w, &i, &j); // s[0,W*H[ --> i[0,H[ j[0,W[\r
+\r
+ vagueMath.colorIJ(&ptrTabPixels[s], i, j,t);\r
+\r
+ s += NB_THREAD;\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* End *|\r
+ \*---------------------------------------------------------------------*/\r
+\r