#ifndef CUBE_3D_H__ #define CUBE_3D_H__ #include #include "ILI9341_t3.h" #include "MathUtil.h" #include "BaseAnimation.h" const float CUBE_3D_ROTATE_SPEED = 0.02f; class Cube3D : public BaseAnimation { public: Cube3D() : BaseAnimation() {}; void init( ILI9341_t3 tft ); uint_fast16_t bgColor( void ); String title(); void perFrame( ILI9341_t3 tft, FrameParams frameParams ); private: float _phase = 0; float _audio = 0; uint_fast16_t _bgColor; }; void Cube3D::init( ILI9341_t3 tft ) { _bgColor = tft.color565( 0, 0, 0 ); } uint_fast16_t Cube3D::bgColor(){ return _bgColor; } String Cube3D::title() { return "Cube3D"; } void Cube3D::perFrame( ILI9341_t3 tft, FrameParams frameParams ) { uint_fast16_t w = (uint_fast16_t)tft.width(); uint_fast16_t h = (uint_fast16_t)tft.height(); uint_fast16_t w_2 = (w>>1); uint_fast16_t h_2 = (h>>1); float oldPhase = _phase; float oldAudio = _audio; float oldCos = cos( oldPhase ); float oldSin = sin( oldPhase ); _phase += frameParams.timeMult * CUBE_3D_ROTATE_SPEED; _audio = frameParams.audioMean; float pCos = cos( _phase ); float pSin = sin( _phase ); //uint_fast16_t border = tft.color565( 0x08, 0, 0 ); uint_fast16_t eraseColor = tft.color565( 0, 0, 0 ); // Rotating cube yo for( float x=-1.0f; x<=1.0f; x+=0.333f ) { for( float y=-1.0f; y<=1.0f; y+=1.0f ) { for( float z=-1.0f; z<=1.0f; z+=1.0f ) { // Audio hash float hash = 3.7f*x + 5.1f*y + 9.8f*z; hash -= floor(hash); hash = (hash*2.0) - 1.0; // bipolar signal, -1..1 // Erase the old point float x3d = oldCos*x - oldSin*z; float y3d = y + hash*oldAudio; float z3d = 3.0 + oldCos*z + oldSin*x; Point16 pt = xyz2screen( x3d, y3d, z3d, w_2, h_2 ); //tft.drawCircle( pt.x, pt.y, 5, border ); if( pt.y >= 0 ) { // sanity check tft.drawCircle( pt.x, pt.y, 7.0-z3d, eraseColor ); } x3d = pCos*x - pSin*z; y3d = y + hash*_audio; z3d = 3.0 + pCos*z + pSin*x; pt = xyz2screen( x3d, y3d, z3d, w_2, h_2 ); if( pt.y >= 0 ) { // sanity check float bright = ((3.0f+M_SQRT2)-z3d) * (1.0f/(2*M_SQRT2)); // range 0..1, higher number == closer uint_fast16_t fillColor = tft.color565( 0x44, lerp8(0x66,0xff,bright), 0x44 ); tft.drawCircle( pt.x, pt.y, 7.0-z3d, fillColor ); } } } } } #endif