diff --git a/inc/canvas/Tree.hpp b/inc/canvas/Tree.hpp index 9169ac6..bc4942c 100644 --- a/inc/canvas/Tree.hpp +++ b/inc/canvas/Tree.hpp @@ -9,7 +9,6 @@ struct DrawArgs { Vector2 start; float angleDeg; - float length; int dep; Color parent; int size; @@ -40,4 +39,5 @@ private: inline Color get_end_color(int dep, Color &start); inline int get_start_size(DrawArgs &arg); inline int get_end_size(DrawArgs &arg, int start); + inline float get_lenght(DrawArgs &arg); }; \ No newline at end of file diff --git a/inc/values/Dna.hpp b/inc/values/Dna.hpp index 4a01563..6e7154b 100644 --- a/inc/values/Dna.hpp +++ b/inc/values/Dna.hpp @@ -40,8 +40,6 @@ struct Branch uint8_t size_var; uint8_t length; - uint8_t length_parent; - uint8_t length_level; uint8_t length_var; uint8_t branch_count; @@ -56,7 +54,7 @@ struct Dna uint128 mountenSeed; uint128 starSeed; uint128 branchSeed; - std::array branches; + Branch branches[MAX_DEPTH]; }; void newDna(Dna &dna); diff --git a/src/canvas/Tree.cpp b/src/canvas/Tree.cpp index 70609cb..0bd2f8a 100644 --- a/src/canvas/Tree.cpp +++ b/src/canvas/Tree.cpp @@ -21,14 +21,26 @@ constexpr int max_size_var = 5; constexpr int min_size_var = -5; constexpr int max_size_chnage = 5; constexpr int min_size_change = -5; - constexpr int sizes[] = {2, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}; + +float lengths[MAX_DEPTH]; + +void calculateLevels(int canvasSize) +{ + lengths[0] = canvasSize / 4.0f; + for (size_t i = 1; i < MAX_DEPTH; i++) + { + lengths[i] = lengths[i - 1] * 0.7f; + } +} + // Public void Tree::init(int size) { this->canvasSize = size; start.x = size / 2; start.y = size; + calculateLevels(size); } void Tree::draw(Dna *dna) @@ -37,7 +49,7 @@ void Tree::draw(Dna *dna) m_dna = dna; branchSeed = dna->branchSeed; - draw_calls.push_back({start, 180.0f, (float)canvasSize / 4, 0}); + draw_calls.push_back({start, 180.0f, 0}); tick(); } @@ -61,15 +73,17 @@ bool Tree::tick() void Tree::drawBranch() { DrawArgs arg = draw_calls.front(); - + if (arg.dep == MAX_DEPTH) + return; float angle = ((arg.angleDeg) * PI) / 180.0f; - float nx = arg.length * std::sin(angle); - float ny = arg.length * std::cos(angle); + float length = get_lenght(arg); + float nx = length * std::sin(angle); + float ny = length * std::cos(angle); Vector2 end = {arg.start.x + nx, arg.start.y + ny}; int size_start = get_start_size(arg); int size_end = get_end_size(arg, size_start); - float fstep = 1.0 / ((arg.length / size_start) * 2.0f); + float fstep = 1.0 / ((length / size_start) * 2.0f); Color colorStart = get_start_color(arg); Color colorEnd = get_end_color(arg.dep, colorStart); @@ -92,14 +106,13 @@ void Tree::drawBranch() if (arg.dep + 1 >= MAX_DEPTH) return; - float next_len = 0.7f; float sectors = get_num_of_branches(arg.dep) + 1; float degres = 180.0f / sectors; for (size_t i = 0; i < get_num_of_branches(arg.dep); i++) { float newAngle = arg.angleDeg - 90 + (degres * (i + 1)); - draw_calls.push_back({end, newAngle, arg.length * next_len, arg.dep + 1, colorEnd, size_end}); + draw_calls.push_back({end, newAngle, arg.dep + 1, colorEnd, size_end}); } } @@ -169,3 +182,15 @@ inline int Tree::get_end_size(DrawArgs &arg, int start) size = 1; return size; } + +inline float Tree::get_lenght(DrawArgs &arg) +{ + float lenght = lengths[arg.dep]; + float lenght_ratio = Remap(m_dna->branches[arg.dep].length, 0, 255, 0.5f, 1.3f); + lenght *= lenght_ratio; + float lenght_var = Remap(m_dna->branches[arg.dep].length_var, 0, 255, -0.15f, 0.15f); + lenght += lenght * lenght_var * mrand::getFloat(&branchSeed); + if (lenght < 1) + lenght = 1; + return lenght; +} diff --git a/src/values/Dna.cpp b/src/values/Dna.cpp index 8c75ee0..3f17e63 100644 --- a/src/values/Dna.cpp +++ b/src/values/Dna.cpp @@ -7,6 +7,7 @@ void newDna(Dna &dna) { + TraceLog(LOG_INFO, "SIZE OF DNA:%d", sizeof(dna)); dna.moon = {mrand::getFloat(), mrand::getFloat(), mrand::getFloat()}; dna.colorSet = mrand::getValue(0, 3); dna.time = std::floor(Remap(dna.moon.y, 0, 1, 4, 0)); @@ -26,7 +27,7 @@ void newDna(Dna &dna) dna.branchSeed.c = mrand::getInt(); dna.branchSeed.d = mrand::getInt(); - for (size_t i = 0; i < dna.branches.size(); i++) + for (size_t i = 0; i < MAX_DEPTH; i++) { uint8_t *array = (uint8_t *)&dna.branches[i]; for (size_t i = 0; i < sizeof(Branch); i++)