Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
120 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |