// // WaterDropletsSample.h // #ifndef WaterDropletsSample_H #define WaterDropletsSample_H // Libra #include // C and C++ API class WaterDropletsSample { public: // Implements LibraSample.h (Native Code Interface) virtual int init(int argc, char **argv); virtual void getRenderBufferBytes8888(int* renderBufferBytes); virtual void tick(); virtual void shutdown(); // Custom sample functions void setupWaveEquationSystem(); void solveRenderWaveEquation(); private: double totalTime; double iterationTime; double averageIterationTime; const static int timeSteps = 5000; const static int gridSizeX = 256; const static int gridSizeY = 256; double startTime; int i; float alpha; gVar M, s, o; gVar A,x,b; gVar g1, g2, g3, g4; }; #endif // // WaterDropletsSample.cpp // #include "WaterDropletsSample.h" #include #include #include void setCmdLine(int argc, char** argv, int *customArgc, char*** customArgv) { int i=0; for (;i=gridSizeX) ? -alpha : 0; // setup data main diagonal-1 for (i = 0; i < vectorSize; i++) data2[i] = (i%gridSizeY) ? -alpha : 0; // setup data main diagonal for (i = 0; i < vectorSize; i++) data3[i] = mainDiag; const int bandCount = 5; int bandOffsetDatas[] = {-gridSizeX, -1, 0, 1, gridSizeX}; float* bandValues[] = {data1, data2, data3, data2, data1}; // create the sparse matrix with input on band form A = sparseBanded(matrixSizeX, matrixSizeY, bandValues, bandOffsetDatas, bandCount); delete []data1; delete []data2; delete []data3; gVar u = floor(step(0.f, vectorSize - 1.f, 1.f) % (float)gridSizeX); gVar v = floor(div(step(0.f, vectorSize - 1.f, 1.f), (float)gridSizeX)); g1 = max(u - 1.f, 0.f) + v * (float)gridSizeX; g2 = min(u + 1.f, gridSizeX - 1.f) + v * (float)gridSizeX; g3 = u + max(v - 1.f, 0.f) * (float)gridSizeX; g4 = u + min(v + 1.f, gridSizeX - 1.f) * (float)gridSizeX; // setup initial solution, x = 0 x = ones(vectorSize, 1)*0.0001f; // create drops by scattering a few random values into x int dropCount = int(gridSizeX / 20.f); scatter(rand(dropCount, 1) * (float)(x.rowCount() - 1), rand(dropCount, 1)*0.5f, x); M = diag(A); s = gVar(gridSizeX, gridSizeY); o = zeros(x.rowCount(), x.columnCount()); } // // LibraSampleInerface.cpp // #include "LibraSample.h" #include "WaterDropletsSample.h" WaterDropletsSample* g_libraSample = 0; //////////////////////////////////////////////////////////////////////////////////////////////// // Libra Sample exported functions //////////////////////////////////////////////////////////////////////////////////////////////// LIBRA_API int libraSample_Init(int argc, char** argv) { if (g_libraSample == 0) g_libraSample = new WaterDropletsSample(); g_libraSample->init(argc, argv); return 0; } LIBRA_API void libraSample_Shutdown() { if (g_libraSample) { g_libraSample->shutdown(); delete g_libraSample; g_libraSample = 0; } } LIBRA_API void libraSample_GetRenderBufferBytes8888(int* renderBufferBytes) { if (g_libraSample) g_libraSample->getRenderBufferBytes8888(renderBufferBytes); } LIBRA_API void libraSample_Tick() { if (g_libraSample) g_libraSample->tick(); }