diff --git a/server/src/checker.cpp b/server/src/checker.cpp index b0ce4dc..361f28b 100644 --- a/server/src/checker.cpp +++ b/server/src/checker.cpp @@ -54,17 +54,8 @@ void checker() } printf("Start Check\n"); DnaManagerData data; - data.id = user_id; - data.randSeed = mrand::getState(data.id); - data.queued = 0; - data.showed = 0; - data.generation = 0; - data.vector.resize(NUM_PER_GEN); + DnaManager::setUp(&data, user_id); - for (std::size_t i = 0; i < NUM_PER_GEN; i++) - { - DNA::newDna(&data.vector[i], &data.randSeed); - } bool found_err = false; while (found_err != true) { diff --git a/shared/inc/values/DnaManager.hpp b/shared/inc/values/DnaManager.hpp index e58f415..50332da 100644 --- a/shared/inc/values/DnaManager.hpp +++ b/shared/inc/values/DnaManager.hpp @@ -45,4 +45,6 @@ namespace DnaManager UiUnit next(DnaManagerData *data); bool like(UiUnit unit, DnaManagerData *data); void newGen(DnaManagerData *data); + void setUp(DnaManagerData *data, int64_t id); + void cleanUp(DnaManagerData *data, int64_t id); }; diff --git a/shared/src/values/DnaManager.cpp b/shared/src/values/DnaManager.cpp index 14c4b99..cbc531b 100644 --- a/shared/src/values/DnaManager.cpp +++ b/shared/src/values/DnaManager.cpp @@ -108,3 +108,25 @@ void DnaManager::newGen(DnaManagerData *data) data->disliked.clear(); data->liked.clear(); } + +void DnaManager::setUp(DnaManagerData *data, int64_t id) +{ + data->vector.resize(NUM_PER_GEN); + cleanUp(data, id); +} + +void DnaManager::cleanUp(DnaManagerData *data, int64_t id) +{ + data->id = id; + data->randSeed = mrand::getState(id); + data->queued = 0; + data->showed = 0; + data->generation = 0; + data->liked.clear(); + data->disliked.clear(); + + for (std::size_t i = 0; i < NUM_PER_GEN; i++) + { + DNA::newDna(&data->vector[i], &data->randSeed); + } +} diff --git a/view/inc/Vapp.hpp b/view/inc/Vapp.hpp index b75cab3..25752cb 100644 --- a/view/inc/Vapp.hpp +++ b/view/inc/Vapp.hpp @@ -1,5 +1,14 @@ #include #include "sql.hpp" +#include "values/DnaManager.hpp" +#include "canvas/Canvas.hpp" + +enum DrawingStage{ + setup, + drawTree, + drawBig, + done, +}; class Vapp { @@ -16,8 +25,20 @@ private: sqlite3_stmt *get_gen_num; std::vector ids; int64_t gens = -1; - int selected_id = -1; bool update_gen = false; - int selected_gen = -1; bool enableAll = true; + + int64_t selected_id = -1; + int selected_gen = -1; + DnaManagerData manager; + DrawingStage stageOfDrawing = DrawingStage::done; + + Canvas canvas; + RenderTexture2D treeTexture; + int drawTreeIndex = -1; + + RenderTexture2D bigTexture; + int drawX = 0; + int drawY = 0; + void setUpManager(); }; \ No newline at end of file diff --git a/view/src/Vapp.cpp b/view/src/Vapp.cpp index bed6620..6388e33 100644 --- a/view/src/Vapp.cpp +++ b/view/src/Vapp.cpp @@ -10,8 +10,16 @@ const char select_user_id[] = "SELECT USER_ID FROM user_table GROUP BY USER_ID;"; +constexpr int sizeOfCanvas = 1000; + void Vapp::init() { + bigTexture = LoadRenderTexture(sizeOfCanvas * 4, sizeOfCanvas * 4); + treeTexture = LoadRenderTexture(sizeOfCanvas, sizeOfCanvas); + canvas.init(sizeOfCanvas); + + DnaManager::setUp(&manager, 0); + sql::init(); sql::open(DB_NAME, &db); @@ -47,21 +55,75 @@ void Vapp::update() update_gen = false; } + + switch (stageOfDrawing) + { + case DrawingStage::setup: + setUpManager(); + stageOfDrawing = DrawingStage::drawTree; + drawTreeIndex = 0; + drawX = 0; + drawY = 0; + canvas.newGen(treeTexture, &manager.vector[drawTreeIndex]); + break; + case DrawingStage::drawTree: + if (canvas.tick(treeTexture)) + { + stageOfDrawing = DrawingStage::drawBig; + } + break; + case DrawingStage::drawBig: + BeginTextureMode(bigTexture); + DrawTexture(treeTexture.texture, drawX * sizeOfCanvas, drawY * sizeOfCanvas, WHITE); + EndTextureMode(); + + drawTreeIndex++; + if (drawTreeIndex < NUM_PER_GEN) + { + canvas.newGen(treeTexture, &manager.vector[drawTreeIndex]); + stageOfDrawing = DrawingStage::drawTree; + } + else + { + stageOfDrawing = DrawingStage::done; + } + + drawX++; + if (drawX == 4) + { + drawY++; + drawX = 0; + } + if (drawY == 4) + { + drawY = 0; + } + break; + case DrawingStage::done: + enableAll = true; + break; + default: + break; + } } void Vapp::draw() { ClearBackground(RAYWHITE); + DrawTextureEx(bigTexture.texture, Vector2(0,0), 0.0f, 0.25f, WHITE); + ImGui::DockSpaceOverViewport(0, NULL, ImGuiDockNodeFlags_PassthruCentralNode); if (ImGui::BeginMainMenuBar()) { ImGui::MenuItem("Demo Window", nullptr, &showDemoWindow, enableAll); ImGui::MenuItem("Selection", nullptr, &showSelection, enableAll); - if(ImGui::MenuItem("Draw", nullptr, false, enableAll)){ + if (ImGui::MenuItem("Draw", nullptr, false, enableAll)) + { enableAll = false; showSelection = false; + stageOfDrawing = DrawingStage::setup; } ImGui::EndMainMenuBar(); } @@ -103,5 +165,51 @@ void Vapp::draw() void Vapp::deinit() { + UnloadRenderTexture(treeTexture); + UnloadRenderTexture(bigTexture); + canvas.deinit(); sql::close(db); + sql::shutdown(); +} + +void Vapp::setUpManager() +{ + + sqlite3_stmt *get_gen_stmt; + sql::prepare_v2(db, get_gen, -1, &get_gen_stmt, NULL); + + DnaManager::cleanUp(&manager, selected_id); + int lodedGen = -1; + + while (lodedGen < selected_gen) + { + sql::bind_int64(get_gen_stmt, 1, manager.id); + sql::bind_int64(get_gen_stmt, 2, manager.generation); + + bool new_gen = false; + while (sql::step(get_gen_stmt) != SQL_DONE) + { + int64_t pos = sql::column_int64(get_gen_stmt, 1); + int64_t liked = sql::column_int64(get_gen_stmt, 2); + UiUnit unit = DnaManager::next(&manager); + if ((unit.index != pos)) + { + // DOTO: SET ERROR + sql::finalize(get_gen_stmt); + return; + } + unit.liked = (Liked)liked; + new_gen = DnaManager::like(unit, &manager); + } + + if (manager.generation < selected_gen) + { + DnaManager::newGen(&manager); + } + + sql::reset(get_gen_stmt); + lodedGen++; + } + + sql::finalize(get_gen_stmt); }