it's working! :)

This commit is contained in:
Kied Llaentenn 2019-12-12 21:18:56 -05:00
parent 43f70b7c90
commit 93a8575f08
6 changed files with 100 additions and 169 deletions

View File

@ -11,6 +11,6 @@
#define TRUE 1
#define FALSE 0
typedef char bool
typedef char bool;
#endif

146
main.c
View File

@ -1,7 +1,6 @@
#include <math.h>
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include "termbox.h"
@ -11,9 +10,18 @@
#define STEPS 13
void init ( struct term_buf buf );
void dofire ( void );
void draw ( void );
typedef struct term_buf
{
usize width;
usize height;
usize init_width;
usize init_height;
u8* tmp_buf;
} term_buf;
void init ( struct term_buf *buf );
void dofire ( struct term_buf *term_buf );
int
main ( void )
@ -22,86 +30,114 @@ main ( void )
tb_init();
tb_select_output_mode(TB_OUTPUT_NORMAL);
tb_clear();
struct term_buf buf;
draw_init(&buf);
// initialize drawing
// initialize drawing
buf.width = tb_width();
buf.height = tb_height();
init(&buf);
draw();
dofire();
// animate
while (TRUE)
{
tb_clear();
dofire(&buf);
tb_present();
}
// cleanup termbox
tb_shutdown();
free(buf.tmp_buf);
return 0;
}
void
init ( struct term_buf buf )
init ( struct term_buf *buf )
{
buf->init_width = buf->width;
buf->init_height = buf->height;
usize len = buf->width * buf->height;
buf->tmp_buf = malloc(len);
buf->tmp_buf = (u8*) malloc(len);
len -= buf->width;
if (buf->tmp_buf == NULL)
PRINT("fire: error: unable to malloc() memory for buffer\n");
if (buf->tmp_buf == NULL) {
PRINT("fire: cannot ");
perror("calloc()");
exit(1);
}
memset(buf->tmp_buf, 0, len);
memset(buf->tmp_buf + len, STEPS - 1, buf->width);
}
void
dofire ( void )
dofire ( struct term_buf *term_buf )
{
for (usize x = 0; x < width; x++)
static struct tb_cell fire[STEPS] =
{
for (usize y = 0; y < height; y++)
{' ', 9, 0}, // default
{0x2591, 2, 0}, // red
{0x2592, 2, 0}, // red
{0x2593, 2, 0}, // red
{0x2588, 2, 0}, // red
{0x2591, 4, 2}, // yellow
{0x2592, 4, 2}, // yellow
{0x2593, 4, 2}, // yellow
{0x2588, 4, 2}, // yellow
{0x2591, 8, 4}, // white
{0x2592, 8, 4}, // white
{0x2593, 8, 4}, // white
{0x2588, 8, 4}, // white
};
usize src;
usize random;
usize dst;
usize w = term_buf->init_width;
u8* tmp = term_buf->tmp_buf;
if ((term_buf->width != term_buf->init_width) || (term_buf->height != term_buf->init_height))
{
return;
}
struct tb_cell* buf = tb_cell_buffer();
for (usize x = 0; x < w; ++x)
{
for (usize y = 1; y < term_buf->init_height; ++y)
{
usize src = y * width + x;
usize random = 0;//(rand() % 7) & 3;
usize dest = src - random + 1;
usize color;
src = y * w + x;
random = ((rand() % 7) & 3);
dst = src - random + 1;
if (width > dest ) dest = 0;
else dest -= width;
color = pixels[src];
if (color == 0 || color == (usize) NULL)
pixels[(src - width) % ((width * height) - 1)] = palette[0];
if (w > dst)
{
dst = 0;
}
else
pixels[(dest - width) % ((width * height) - 1)] = pixels[src] - (random & 1);
draw();
{
dst -= w;
}
tmp[dst] = tmp[src] - (random & 1);
if (tmp[dst] > 12)
{
tmp[dst] = 0;
}
buf[dst] = fire[tmp[dst]];
buf[src] = fire[tmp[src]];
}
}
}
void
draw ( void )
{
// clear screen
PRINT("%c[2J", esc);
// draw pixels onto screen
for (usize y = 0; y < height; y++)
{
for (usize x = 0; x < width; x++)
{
usize color = pixels[y * width + x];
if (color == (usize) NULL) continue;
// extract RGB value from color
u8 blue = color % 256;
u8 green = ((color - blue) / 256) % 256;
u8 red = ((color - blue) / (int)pow((double)256, (double)2))-(green / 256);
PRINT("%c[48;2;%i;%i;%im %c[0m", esc, red, blue, green, esc);
}
PRINT("\n");
}
}
//u8 blue = color % 256;
//u8 green = ((color - blue) / 256) % 256;
//u8 red = ((color - blue) / (int)pow((double)256, (double)2))-(green / 256);

View File

@ -8,9 +8,7 @@ NAME = fire
WARNING = -Wall -Wextra -pedantic -Wmissing-prototypes \
-Wold-style-definition -Werror
SUBDIR = sub
INC = -I$(SUBDIR)/termbox_next/
INC = -Isub/termbox_next/src
CC = clang
CFLAGS = -g -std=c99 $(WARNING) $(INC)
@ -18,6 +16,7 @@ LDFLAGS = -fuse-ld=lld
SRC = main.c
OBJ = $(SRC:.c=.o)
TRMBOX = sub/termbox_next/bin/termbox.a
all: $(NAME)
@ -28,7 +27,11 @@ clean:
@echo "\tCC\t\t$@"
@$(CC) $(CFLAGS) -c $<
$(NAME): $(OBJ)
$(TRMBOX):
@echo "\tCC\t\ttermbox.c"
@cd sub/termbox_next/ && make
$(NAME): $(OBJ) $(TRMBOX)
@echo "\tLD\t\t$(NAME)"
@$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)

View File

View File

@ -1,109 +0,0 @@
#include <math.h>
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#define BOOL unsigned char
#define TRUE 1
#define FALSE 0
#define PRINT(...) fprintf(stderr, __VA_ARGS__);
// I miss the Rust type system :(
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
#if UINTPTR_MAX == 0xffff
typedef uint16_t usize;
#elif UINTPTR_MAX == 0xffffffff
typedef uint32_t usize;
#elif UINTPTR_MAX == 0xffffffffffffffff
typedef uint64_t usize;
#endif
char esc = (char) 27;
usize width;
usize height;
usize palette[] = { 0x00, 0xff0000, 0xff6611, 0xffff66, 0xffffff };
usize *pixels;
void dofire ( void );
void draw ( void );
int
main ( void )
{
// populate width and height
struct winsize w;
ioctl(0, TIOCGWINSZ, &w);
width = w.ws_col;
height = w.ws_row;
pixels = (usize*) calloc((width * height), sizeof(usize));
// init pixels
for (usize c = 0; c < (width * height); c++) pixels[c] = (usize) NULL;
for (usize i = 0; i < width; i++)
{
pixels[((width * (height - 1)) - width) + i] = palette[4];
}
draw();
dofire();
return 0;
}
void
dofire ( void )
{
for (usize x = 0; x < width; x++)
{
for (usize y = 0; y < height; y++)
{
usize src = y * width + x;
usize random = 0;//(rand() % 7) & 3;
usize dest = src - random + 1;
usize color;
if (width > dest ) dest = 0;
else dest -= width;
color = pixels[src];
if (color == 0 || color == (usize) NULL)
pixels[(src - width) % ((width * height) - 1)] = palette[0];
else
pixels[(dest - width) % ((width * height) - 1)] = pixels[src] - (random & 1);
draw();
}
}
}
void
draw ( void )
{
// clear screen
PRINT("%c[2J", esc);
// draw pixels onto screen
for (usize y = 0; y < height; y++)
{
for (usize x = 0; x < width; x++)
{
usize color = pixels[y * width + x];
if (color == (usize) NULL) continue;
// extract RGB value from color
u8 blue = color % 256;
u8 green = ((color - blue) / 256) % 256;
u8 red = ((color - blue) / (int)pow((double)256, (double)2))-(green / 256);
PRINT("%c[48;2;%i;%i;%im %c[0m", esc, red, blue, green, esc);
}
PRINT("\n");
}
}

View File

@ -10,6 +10,7 @@
#ifndef TYPE_H
#define TYPE_H
#include <stdint.h>
typedef uint8_t u8;
typedef uint16_t u16;