Ajout de l'ensemble du workspace.
[GPU.git] / WCudaMSE / Tuto_Image / src / cpp / core / 02_Damier_Zoomable / b_moo / DamierMOO.cpp
diff --git a/WCudaMSE/Tuto_Image/src/cpp/core/02_Damier_Zoomable/b_moo/DamierMOO.cpp b/WCudaMSE/Tuto_Image/src/cpp/core/02_Damier_Zoomable/b_moo/DamierMOO.cpp
new file mode 100755 (executable)
index 0000000..53cd5cf
--- /dev/null
@@ -0,0 +1,183 @@
+#include <iostream>\r
+#include <math.h>\r
+\r
+#include "DamierMOO.h"\r
+\r
+#include "OmpTools.h"\r
+#include "MathTools.h"\r
+\r
+#include "IndiceTools.h"\r
+\r
+\r
+using std::cout;\r
+using std::endl;\r
+using std::string;\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
+/**\r
+ * variateurT:         fait varier t in [0,2pi] par increment de dt,\r
+ *             d'abord de mani�re croissante jusqua 2PI, puis de maniere decroissante jusqua 0, puis en boucle a l'infini selon ce procede\r
+ */\r
+DamierMOO::DamierMOO(unsigned int w, unsigned int h, float dt, int n):variateurT(IntervalF(0, 2 * PI), dt)\r
+    {\r
+    // Inputs\r
+    this->n =n;\r
+    this->w=w;\r
+    this->h=h;\r
+\r
+    //Tools\r
+    this->isEntrelacement=true;\r
+\r
+    // OMP (facultatif)\r
+    const int NB_THREADS = OmpTools::setAndGetNaturalGranularity();\r
+    cout << "\n[DAMIER] nbThread = " << NB_THREADS << endl;;\r
+    }\r
+\r
+DamierMOO::~DamierMOO(void)\r
+    {\r
+    // rien\r
+    }\r
+\r
+/*--------------------------------------*\\r
+ |*            Override                *|\r
+ \*-------------------------------------*/\r
+\r
+void DamierMOO::process(uchar4* ptrTabPixels, int w, int h, const DomaineMath& domaineMath)\r
+    {\r
+    if (isEntrelacement)\r
+       {\r
+       entrelacementOMP(ptrTabPixels,w,h,domaineMath); // Plus lent\r
+       }\r
+    else\r
+       {\r
+       forAutoOMP(ptrTabPixels,w,h,domaineMath);  // Plus rapide\r
+       }\r
+\r
+    isEntrelacement=!isEntrelacement; // Pour tester que les deux implementations fonctionnent\r
+    }\r
+\r
+void DamierMOO::animationStep()\r
+    {\r
+    variateurT.varierAndGet();\r
+    }\r
+\r
+/*--------------*\\r
+ |*    get     *|\r
+ \*-------------*/\r
+\r
+int DamierMOO::getN()\r
+    {\r
+    return n;\r
+    }\r
+\r
+float DamierMOO::getT()\r
+    {\r
+    return variateurT.get();\r
+    }\r
+\r
+/*--------------------------------------*\\r
+ |*            Private                 *|\r
+ \*-------------------------------------*/\r
+\r
+\r
+/**\r
+ * Code naturel et direct OMP\r
+ */\r
+void DamierMOO::forAutoOMP(uchar4* ptrTabPixels, int w, int h, const DomaineMath& domaineMath)\r
+    {\r
+    DamierMath damierMath(n); // 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
+           workPixel(&ptrTabPixels[s],i, j,s, domaineMath,&damierMath);\r
+           }\r
+       }\r
+    }\r
+\r
+/**\r
+ * Code entrainement Cuda\r
+ */\r
+void DamierMOO::entrelacementOMP(uchar4* ptrTabPixels, int w, int h, const DomaineMath& domaineMath)\r
+    {\r
+    DamierMath damierMath(n); // ici pour preparer cuda\r
+\r
+    const int WH=w*h;\r
+\r
+\r
+\r
+#pragma omp parallel\r
+       {\r
+       const int NB_THREAD = OmpTools::getNbThread(); // dans region parallel\r
+\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
+           workPixel(&ptrTabPixels[s],i, j,s, domaineMath,&damierMath);\r
+\r
+           s += NB_THREAD;\r
+           }\r
+       }\r
+    }\r
+\r
+/*--------------------------------------*\\r
+ |*            Private                 *|\r
+ \*-------------------------------------*/\r
+\r
+/**\r
+ * i in [1,h]\r
+ * j in [1,w]\r
+ * code commun �\r
+ *     entrelacementOMP\r
+ *     forAutoOMP\r
+ */\r
+void DamierMOO::workPixel(uchar4* ptrColorIJ,int i, int j,int s, const DomaineMath& domaineMath,DamierMath* ptrDamierMath)\r
+    {\r
+    DamierMath damierMath(n); // ici pour preparer cuda\r
+\r
+    // (i,j) domaine ecran dans N2\r
+    // (x,y) domaine math dans R2\r
+\r
+    double x;\r
+    double y;\r
+\r
+    domaineMath.toXY(i, j, &x, &y); // fill (x,y) from (i,j)\r
+\r
+    float t=variateurT.get();\r
+    ptrDamierMath->colorXY(ptrColorIJ,x, y, domaineMath,t); // in [01]\r
+    }\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |*                    End                                             *|\r
+ \*---------------------------------------------------------------------*/\r
+\r