84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
#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; i<CORNERS_PER_PART; i++) {
|
|
edges[i] = new Edge();
|
|
}
|
|
|
|
Corner* last_corner = nullptr;
|
|
for(int i=0; i<CORNERS_PER_PART; i++) {
|
|
Corner* c = new Corner(edges[i], edges[(i+1) % CORNERS_PER_PART]);
|
|
for(int j=0; j<LEDS_PER_CORNER; j++) {
|
|
c->add_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);
|
|
}
|
|
}
|
|
} |