#include "node.h" #include "prototypes.h" #include "tools.h" Node::Node(uint16_t number, Coords c, uint8_t _dir) { _number = number; coords = c; direction = _dir; LOGln("Created Node #%d at coordinates %d,%d with direction %d.", _number, coords.x, coords.y, direction); for(int i=0; iadd_led(number * CORNERS_PER_PART * LEDS_PER_CORNER + i * LEDS_PER_CORNER + j); } if (last_corner != nullptr) { c->_long_neighbours.push_back(last_corner); last_corner->_long_neighbours.push_back(c); } _corners[i] = c; corners.push_back(c); last_corner = c; } _corners[0]->_long_neighbours.push_back(last_corner); last_corner->_long_neighbours.push_back(_corners[0]); } Coords Node::coords_at_direction(uint8_t edge) { return {(int8_t)(coords.x + dx[direction][edge]), (int8_t)(coords.y + dy[direction][edge])}; } Node* Node::create_neighbour(uint8_t edge) { Coords new_c = coords_at_direction(edge); int8_t new_dir = (edge==1) ? ((direction - 1) % 6) : ((direction + 1) % 6); if (new_dir < 0) new_dir+=6; Node* node = new Node(_number + 1, new_c, new_dir); node->neighbours[0] = this; neighbours[edge] = node; node->edges[0]->neighbour = this->edges[edge]; this->edges[edge]->neighbour = node->edges[0]; return node; } void Node::blend_to(CRGB color, uint16_t effect_id, uint8_t effect_speed) { if (effect_speed == 0) effect_speed = random8(2)+1; if (effect_id == 0) effect_id = random16(); for(Corner* corner : this->_corners) { corner->blend_to(color, effect_id, effect_speed); } } void Node::step() { for (Corner* corner : this->_corners) { corner->step(); } } void Node::draw() { for (Corner* corner : this->_corners) { corner->draw(); } } void Node::set_color(CRGB color) { for(Corner* corner : this->_corners) { corner->set_color(color); } } void Node::infect(uint16_t level) { if (this->_corners[0]->reached_level(level)) { for (Node* neighbour : neighbours) { if (neighbour == nullptr) continue; neighbour->blend_to(_corners[0]->target_color, _corners[0]->effect_id, _corners[0]->effect_speed); } } }