espleaf/src/node.cpp

93 lines
2.5 KiB
C++

#include "node.h"
#include "prototypes.h"
#include "tools.h"
Node::Node(uint16_t number) {
_number = number;
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]);
}
Node* Node::create_neighbour(uint8_t edge) {
Node* node = new Node(_number + 1);
node->neighbours[0] = this;
neighbours[edge] = node;
node->edges[0]->neighbour = this->edges[edge];
this->edges[edge]->neighbour = node->edges[0];
node->_corners[0]->_short_neighbours.push_back(_corners[(edge-1) % CORNERS_PER_PART]);
node->_corners[CORNERS_PER_PART - 1]->_short_neighbours.push_back(_corners[edge]);
_corners[(edge-1) % CORNERS_PER_PART]->_short_neighbours.push_back(node->_corners[0]);
_corners[edge]->_short_neighbours.push_back(node->_corners[CORNERS_PER_PART - 1]);
/*
delete node->edges[0];
node->edges[0] = this->edges[edge];
Corner* c = this->corners[(edge-1) % CORNERS_PER_PART];
c->merge_leds(node->corners[0]);
delete node->corners[0];
node->corners[0] = c;
c = this->corners[edge];
c->merge_leds(node->corners[CORNERS_PER_PART-1]);
delete node->corners[CORNERS_PER_PART-1];
node->corners[CORNERS_PER_PART-1] = c;
*/
return node;
}
void Node::blend_to(CRGB color, uint16_t effect_id, uint8_t effect_speed) {
//LOGln("Node::blend_to called. this:%p", this);
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);
}
}
}