Whirl code before optimizations
#include "EasyCE.h"
unsigned short* buffer;
#define MAX_INDEX 20
class CWhirlField
{
public:
CWhirlField() {
m_pData = new byte[240*320];
m_pData2 = new byte[240*320];
}
~CWhirlField() {
delete m_pData;
delete m_pData2;
}
void Draw(unsigned short* pBuffer) {
for (int x=0; x<240; x++) {
for (int y=0; y<320; y++) {
pBuffer[x+y*240] = BuildColor(m_pData[x+240*y]);
}
}
}
void NextStep() {
for (int x=0; x<240; x++) {
for (int y=0; y<320; y++) {
byte nOriginal = m_pData[x+y*240];
m_pData2[x+240*y] = nOriginal;
for (int dx=-1; dx<=1; dx++) {
for (int dy=-1; dy<=1; dy++) {
if ( (x>=0) && (x<240) && (y>=0) && (y<320) ) {
byte nNeigh = m_pData[x+dx+240*(y+dy)];
if ((1+nNeigh)%MAX_INDEX == nOriginal) {
m_pData2[x+y*240] = nNeigh;
}
}
}
}
}
}
Copy2To1();
}
void Copy2To1() {
for (int x=0; x<240; x++) {
for (int y=0; y<320; y++) {
m_pData[x+240*y] = m_pData2[x+240*y];
}
}
}
void SetRandom() {
for (int x=0; x<240; x++) {
for (int y=0; y<320; y++) {
m_pData[x+y*240] = (byte)((double)(rand())*MAX_INDEX/RAND_MAX);
}
}
}
static unsigned short BuildColor(byte R, byte G, byte B) {
return ((R>>3)<<11) + ((G>>2)<<5) + (B>>3);
}
static unsigned short BuildColor(byte n) {
int N = n*255.0/MAX_INDEX;
return BuildColor(N, N%16, (255-N)%64);
}
protected:
byte *m_pData;
byte *m_pData2;
};
void PutPixel(int x, int y, byte R, byte G, byte B)
{
unsigned short c = ((R>>3)<<11) + ((G>>2)<<5) + (B>>3);
buffer[x+y*240] = c;
}
void main()
{
buffer = (unsigned short*)getbuffer();
while (clicked()) { update(); };
CWhirlField wf;
wf.SetRandom();
wf.Draw(buffer);
while (!clicked()) { update(); };
for (int i=0; i<1000; i++) {
wf.NextStep();
wf.Draw(buffer);
update();
}
}