Skip to content

Commit

Permalink
Create LEDSprites.h
Browse files Browse the repository at this point in the history
  • Loading branch information
dgjohnson committed Dec 10, 2016
1 parent f6c5492 commit f0f4e2f
Showing 1 changed file with 120 additions and 0 deletions.
120 changes: 120 additions & 0 deletions LEDSprites.h
@@ -0,0 +1,120 @@
#ifndef LEDSprites_h
#define LEDSprites_h
#include "FastLED/FastLED.h"
#include "LEDMatrix.h"
FASTLED_USING_NAMESPACE

#define B8_1B__(x) (uint8_t)(((x&0x10000000LU)>>21)+((x&0x01000000LU)>>18)+((x&0x00100000LU)>>15)+((x&0x00010000LU)>>12)+ \
((x&0x00001000LU)>>9)+((x&0x00000100LU)>>6)+((x&0x00000010LU)>>3)+((x&0x00000001LU)))
#define B8_2B__(x) (uint8_t)(((x&0x30000000LU)>>22)+((x&0x03000000LU)>>20)+((x&0x00300000LU)>>18)+((x&0x00030000LU)>>16)), \
(uint8_t)(((x&0x00003000LU)>>6)+((x&0x00000300LU)>>4)+((x&0x00000030LU)>>2)+((x&0x00000003LU)))
#define B8_3B__(x) (uint8_t)(((x&0x70000000LU)>>23)+((x&0x07000000LU)>>22)+((x&0x00700000LU)>>21)), \
(uint8_t)(((x&0x00700000LU)>>13)+((x&0x00070000LU)>>12)+((x&0x00007000LU)>>11)+((x&0x00000700LU)>>10)), \
(uint8_t)(((x&0x00000700LU)>>2)+((x&0x00000070LU)>>1)+((x&0x00000007LU)))
#define B8_4B__(x) (uint8_t)(((x&0xf0000000LU)>>24)+((x&0x0f000000LU)>>24)), \
(uint8_t)(((x&0x00f00000LU)>>16)+((x&0x000f0000LU)>>16)), \
(uint8_t)(((x&0x0000f000LU)>>8)+((x&0x00000f00LU)>>8)), \
(uint8_t)((x&0x000000f0LU)+(x&0x0000000fLU))
#define B8_5B__(x) (uint8_t)(((x[0]>'9'?(x[0]-'A')+10:x[0]-'0')<<3)+(((x[1]>'9'?(x[1]-'A')+10:x[1]-'0')>>2)&0x07)), \
(uint8_t)(((x[1]>'9'?(x[1]-'A')+10:x[1]-'0')<<6)+((x[2]>'9'?(x[2]-'A')+10:x[2]-'0')<<1)+(((x[3]>'9'?(x[3]-'A')+10:x[3]-'0')>>4)&0x01)), \
(uint8_t)(((x[3]>'9'?(x[3]-'A')+10:x[3]-'0')<<4)+((x[4]>'9'?(x[4]-'A')+10:x[4]-'0')>>1)), \
(uint8_t)(((x[4]>'9'?(x[4]-'A')+10:x[4]-'0')<<7)+((x[5]>'9'?(x[5]-'A')+10:x[5]-'0')<<2)+(((x[6]>'9'?(x[6]-'A')+10:x[6]-'0')>>3)&0x03)), \
(uint8_t)(((x[6]>'9'?(x[6]-'A')+10:x[6]-'0')<<5)+(x[7]>'9'?(x[7]-'A')+10:x[7]-'0'))

#define B8_1BIT(d) B8_1B__(0x##d##LU)
#define B8_2BIT(d) B8_2B__(0x##d##LU)
#define B8_3BIT(d) B8_3B__(0x##d##LU)
#define B8_4BIT(d) B8_4B__(0x##d##LU)
#define B8_5BIT(d) B8_5B__(#d)

enum SpriteNumBits_t { _1BIT=1,
_2BIT=2,
_3BIT=3,
_4BIT=4,
_5BIT=5,
_8BIT=8 };

enum SpritePriority_t { SPR_FRONT,
SPR_BACK,
SPR_FORWARD,
SPR_BACKWARD };

// defines for m_Flags
#define SPRITE_EDGE_X_MIN 0x01
#define SPRITE_EDGE_X_MAX 0x02
#define SPRITE_EDGE_Y_MIN 0x04
#define SPRITE_EDGE_Y_MAX 0x08
#define SPRITE_MATRIX_X_OFF 0x10
#define SPRITE_MATRIX_Y_OFF 0x20
#define SPRITE_COLLISION 0x40
#define SPRITE_EDGE_MASK (SPRITE_EDGE_X_MIN | SPRITE_EDGE_X_MAX | SPRITE_EDGE_Y_MIN | SPRITE_EDGE_Y_MAX)
#define SPRITE_OFF_MASK (SPRITE_MATRIX_X_OFF | SPRITE_MATRIX_Y_OFF)

// defines for m_Options
#define SPRITE_DETECT_EDGE 0x01
#define SPRITE_DETECT_COLLISION 0x02
#define SPRITE_X_KEEPIN 0x40
#define SPRITE_Y_KEEPIN 0x80
#define SPRITE_KEEPIN_MASK (SPRITE_X_KEEPIN | SPRITE_Y_KEEPIN)

class cSprite
{
friend class cLEDSprites;
public:
cSprite(uint16_t Width = 0, uint16_t Height = 0, const uint8_t *Data = NULL, uint8_t NumFrames = 0, SpriteNumBits_t BitsPixel = _1BIT, const struct CRGB *ColTable = NULL, const uint8_t *Mask = NULL);
void Setup(uint16_t Width, uint16_t Height, const uint8_t *Data, uint8_t NumFrames, SpriteNumBits_t BitsPixel, const struct CRGB *ColTable, const uint8_t *Mask = NULL);
void Update();
boolean Combine(int16_t dx, int16_t dy, cSprite *Src);
void Render(cLEDMatrixBase *Matrix);
void EdgeDetect(cLEDMatrixBase *Matrix);
void SetPosition(int16_t X, int16_t Y);
void SetFrame(uint8_t Frame, uint8_t FrameRate = 0);
void SetMotion(int8_t XChange, uint8_t XRate, int8_t YChange, uint8_t YRate);
void SetOptions(uint8_t Options);
void SetPositionFrameMotionOptions(int16_t X, int16_t Y, uint8_t Frame, uint8_t FrameRate, int8_t XChange, uint8_t XRate, int8_t YChange, uint8_t YRate, uint8_t Options = 0);
uint8_t GetFlags() { return(m_Flags); };
uint8_t GetCurrentFrame() { return(m_Frame); };
int8_t GetXChange() { return(m_XChange); };
int8_t GetYChange() { return(m_YChange); };
uint8_t GetXCounter() { return(m_CounterX); };
uint8_t GetYCounter() { return(m_CounterY); };
void SetXChange(int8_t XC) { m_XChange = XC; };
void SetYChange(int8_t YC) { m_YChange = YC; };
void SetXCounter(uint8_t Xcnt) { m_CounterX = Xcnt; };
void SetYCounter(uint8_t Ycnt) { m_CounterY = Ycnt; };
void IncreaseFrame() { m_Frame++; if (m_Frame >= m_NumFrames) m_Frame = 0; };
void DecreaseFrame() { if (m_Frame == 0) m_Frame = m_NumFrames; m_Frame--; };

private:
uint16_t m_MaskSize, m_FrameSize;
uint8_t m_CounterFrame, m_NumCols, m_Options, m_Flags, m_CounterX, m_CounterY, m_XRate, m_YRate, m_Frame, m_FrameRate;
cSprite *m_PrevSprite, *m_NextSprite;
protected:
uint8_t m_NumFrames, m_BitsPixel;
uint16_t m_Width, m_Height;
const uint8_t *m_Data, *m_Mask;
const struct CRGB *m_ColTable;
public:
int16_t m_X, m_Y;
int8_t m_XChange, m_YChange;
};

class cLEDSprites
{
public:
cLEDSprites(cLEDMatrixBase *Matrix);
void AddSprite(cSprite *Spr);
boolean IsSprite(cSprite *Spr);
void RemoveSprite(cSprite *Spr);
void RemoveAllSprites();
void ChangePriority(cSprite *Spr, SpritePriority_t Priority);
void UpdateSprites();
void RenderSprites();
void DetectCollisions(cSprite *srcSpr = NULL);

private:
cSprite *m_SpriteHead;
cLEDMatrixBase *m_Matrix;
};

#endif

0 comments on commit f0f4e2f

Please sign in to comment.