add 1x sprite preview over tiles
This commit is contained in:
parent
ba62a080e9
commit
ca1abba60b
10
jiles.jor
10
jiles.jor
|
@ -5,12 +5,21 @@ var spriteindex
|
|||
var refresh-needed
|
||||
: refresh 1 refresh-needed ! ;
|
||||
|
||||
array preview 128 allot
|
||||
|
||||
: color! >r dup r@ @ = if drop else r@ ! refresh then rdrop ;
|
||||
|
||||
: +sprite! spriteindex spritecount +!cycle refresh ;
|
||||
|
||||
: draw-palette 0 0x11 for i 79 i 3 << drawfatbox next ;
|
||||
|
||||
: draw-preview
|
||||
0 18 for
|
||||
i preview tile>buf
|
||||
spriteindex @ preview spr>buf
|
||||
i 3 % 2 * 65 + i 3 / 16 * preview paintbuf
|
||||
next ;
|
||||
|
||||
: mousepos>sprpos 3 >> swap 3 >> swap ;
|
||||
: mousexys mousepos mousepos>sprpos spriteindex @ ;
|
||||
|
||||
|
@ -52,6 +61,7 @@ var jiles-old-draw
|
|||
: jiles-draw
|
||||
refresh-needed @ if
|
||||
mousehide
|
||||
draw-preview
|
||||
spriteindex @ drawfatsprite
|
||||
lcolor @ 77 0 drawfatbox
|
||||
rcolor @ 78 0 drawfatbox
|
||||
|
|
26
testbed.c
26
testbed.c
|
@ -346,6 +346,7 @@ void f_drawfatsprite() {
|
|||
int x, y;
|
||||
|
||||
DROP(1);
|
||||
setAllPlanes();
|
||||
for ( y = 0; y < 16; y ++ ) {
|
||||
for ( x = 0; x < 16; x ++ ) {
|
||||
int color = getsprpixel(x, y, spr);
|
||||
|
@ -422,6 +423,28 @@ void f_spritecount() {
|
|||
PUSHI(NUM_SPRITES);
|
||||
}
|
||||
|
||||
void f_tile2buf() {
|
||||
unsigned int *buf = TOP().p;
|
||||
unsigned int itile = ST1().u;
|
||||
DROP(2);
|
||||
writeTile(buf, &tiles[itile * TILE_STRIDE]);
|
||||
}
|
||||
|
||||
void f_spr2buf() {
|
||||
unsigned int *buf = TOP().p;
|
||||
unsigned int isprite = ST1().u;
|
||||
DROP(2);
|
||||
overlaySprite(buf, &sprites[isprite * SPRITE_STRIDE], 0, 0);
|
||||
}
|
||||
|
||||
void f_paintbuf() {
|
||||
unsigned int *buf = TOP().p;
|
||||
int y = ST1().i;
|
||||
int x = ST2().i;
|
||||
DROP(3);
|
||||
paintBuffer(buf, x + (y * 40));
|
||||
}
|
||||
|
||||
/* INIT */
|
||||
void game_f_init(char *exe, char *bootjor) {
|
||||
f_init(exe);
|
||||
|
@ -457,6 +480,9 @@ void game_f_init(char *exe, char *bootjor) {
|
|||
CDEF("getpixel", f_getpixel);
|
||||
CDEF("spritecount", f_spritecount);
|
||||
CDEF("savegfx", f_savegfx);
|
||||
CDEF("tile>buf", f_tile2buf);
|
||||
CDEF("spr>buf", f_spr2buf);
|
||||
CDEF("paintbuf", f_paintbuf);
|
||||
|
||||
f_loadjor(bootjor);
|
||||
|
||||
|
|
118
tiles.c
118
tiles.c
|
@ -74,57 +74,18 @@ void loadMap(unsigned char *map, unsigned int w, unsigned int h) {
|
|||
memset(screen.dirty, D_BGTILE, PAGE_TILES_COUNT * 2);
|
||||
}
|
||||
|
||||
int prepareBuffer(int pageX, int pageY) {
|
||||
unsigned char *dirty = &screen.dirty[screen.currentPage][pageX + (pageY * PAGE_TILES_W)];
|
||||
void writeTile(unsigned int *buf, unsigned int far *tile) {
|
||||
int i;
|
||||
if (!isBufIndex(*dirty)) {
|
||||
unsigned int startX = screen.scrollX >> 4;
|
||||
unsigned int startY = screen.scrollY >> 4;
|
||||
unsigned char tile = screen.map[startX + pageX + ((startY + pageY) * screen.w)];
|
||||
unsigned char ibuffer = screen.nextBuffer;
|
||||
screen.nextBuffer = nextBufferIndex(ibuffer);
|
||||
*dirty = ibuffer;
|
||||
if ((tile & 0xf0) == 0xf0) {
|
||||
unsigned int val = (tile & 0x01) ? 0xffff : 0x0000;
|
||||
for (i = 0; i < 16; i ++) {
|
||||
screen.buffer[ibuffer][i] = val;
|
||||
}
|
||||
val = (tile & 0x02) ? 0xffff : 0x0000;
|
||||
for (i = 16; i < 32; i ++) {
|
||||
screen.buffer[ibuffer][i] = val;
|
||||
}
|
||||
val = (tile & 0x04) ? 0xffff : 0x0000;
|
||||
for (i = 32; i < 48; i ++) {
|
||||
screen.buffer[ibuffer][i] = val;
|
||||
}
|
||||
val = (tile & 0x08) ? 0xffff : 0x0000;
|
||||
for (i = 48; i < 64; i ++) {
|
||||
screen.buffer[ibuffer][i] = val;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < BUF_WSIZE; i ++) {
|
||||
screen.buffer[ibuffer][i] = (&screen.memTiles[tile * BUF_WSIZE])[i];
|
||||
buf[i] = tile[i];
|
||||
}
|
||||
}
|
||||
screen.bufferOffset[ibuffer] = screen.pageOffset[screen.currentPage]
|
||||
+ (pageX << 1) + (pageY * PAGE_STRIDE * 16);
|
||||
}
|
||||
return *dirty;
|
||||
}
|
||||
|
||||
void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, int yStart) {
|
||||
unsigned int *buf;
|
||||
void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart) {
|
||||
unsigned int far *mask;
|
||||
unsigned int maskval;
|
||||
int y, h, plane;
|
||||
if (pageX < 0 || pageY < 0 ||
|
||||
pageX >= PAGE_TILES_W || pageY >= PAGE_TILES_H ||
|
||||
shift >= 16 || shift <= -16 ||
|
||||
yStart <= -16 || yStart >= 16) {
|
||||
return;
|
||||
}
|
||||
|
||||
buf = screen.buffer[prepareBuffer(pageX, pageY)];
|
||||
if (yStart < 0) {
|
||||
sprite = &sprite[-yStart];
|
||||
h = yStart + 16;
|
||||
|
@ -155,6 +116,37 @@ void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift,
|
|||
}
|
||||
}
|
||||
|
||||
int prepareBuffer(int pageX, int pageY) {
|
||||
unsigned char *dirty = &screen.dirty[screen.currentPage][pageX + (pageY * PAGE_TILES_W)];
|
||||
int i;
|
||||
if (!isBufIndex(*dirty)) {
|
||||
unsigned int startX = screen.scrollX >> 4;
|
||||
unsigned int startY = screen.scrollY >> 4;
|
||||
unsigned char tile = screen.map[startX + pageX + ((startY + pageY) * screen.w)];
|
||||
unsigned char ibuffer = screen.nextBuffer;
|
||||
screen.nextBuffer = nextBufferIndex(ibuffer);
|
||||
*dirty = ibuffer;
|
||||
writeTile(screen.buffer[ibuffer], &screen.memTiles[tile * BUF_WSIZE]);
|
||||
screen.bufferOffset[ibuffer] = screen.pageOffset[screen.currentPage]
|
||||
+ (pageX << 1) + (pageY * PAGE_STRIDE * 16);
|
||||
}
|
||||
return *dirty;
|
||||
}
|
||||
|
||||
void drawSpriteToBuf(unsigned int far *sprite, int pageX, int pageY, int shift, int yStart) {
|
||||
unsigned int *buf;
|
||||
|
||||
if (pageX < 0 || pageY < 0 ||
|
||||
pageX >= PAGE_TILES_W || pageY >= PAGE_TILES_H ||
|
||||
shift >= 16 || shift <= -16 ||
|
||||
yStart <= -16 || yStart >= 16) {
|
||||
return;
|
||||
}
|
||||
|
||||
buf = screen.buffer[prepareBuffer(pageX, pageY)];
|
||||
overlaySprite(buf, sprite, shift, yStart);
|
||||
}
|
||||
|
||||
void drawSprite(unsigned int far *sprite, int x, int y) {
|
||||
int pageX = (int)(x - (screen.scrollX & 0xfff0)) >> 4;
|
||||
int pageY = (int)(y - (screen.scrollY & 0xfff0)) >> 4;
|
||||
|
@ -195,6 +187,25 @@ void scroll(int newX, int newY) {
|
|||
screen.scrollY = newY;
|
||||
}
|
||||
|
||||
void paintBufferPlane(unsigned int *buf, unsigned int vidOffset, int stride, int plane) {
|
||||
unsigned int drawOffset = vidOffset >> 1;
|
||||
unsigned int y, bmp;
|
||||
for (y = 0; y < 16; y ++) {
|
||||
bmp = buf[y + (BUF_WSTRIDE * plane)];
|
||||
WVID[drawOffset] = (bmp << 8) | (bmp >> 8);
|
||||
drawOffset += stride >> 1;
|
||||
}
|
||||
}
|
||||
|
||||
void paintBuffer(unsigned int *buf, unsigned int vidOffset) {
|
||||
int plane;
|
||||
setWriteMode(0);
|
||||
for (plane = 0; plane < 4; plane ++) {
|
||||
setPlane(plane);
|
||||
paintBufferPlane(buf, vidOffset, 40, plane);
|
||||
}
|
||||
}
|
||||
|
||||
void drawScreen() {
|
||||
unsigned int startX = screen.scrollX >> 4;
|
||||
unsigned int startY = screen.scrollY >> 4;
|
||||
|
@ -213,10 +224,8 @@ void drawScreen() {
|
|||
for (x = startX; x < startX + PAGE_TILES_W; x ++) {
|
||||
if (dirty[di++] == D_BGTILE) {
|
||||
char tile = screen.map[x + (y * screen.w)];
|
||||
if ((tile & 0xf0) != 0xf0) {
|
||||
blitTile(screen.tilesOffset + (tile << 5), drawOffset);
|
||||
}
|
||||
}
|
||||
drawOffset += 2;
|
||||
}
|
||||
drawOffset += PAGE_STRIDE * 15;
|
||||
|
@ -225,29 +234,10 @@ void drawScreen() {
|
|||
for(plane = 0; plane < 4; plane ++) {
|
||||
setPlane(plane);
|
||||
for (di = screen.firstBuffer; di != screen.nextBuffer; di = nextBufferIndex(di)) {
|
||||
drawOffset = screen.bufferOffset[di] >> 1;
|
||||
for (y = 0; y < 16; y ++) {
|
||||
bmp = screen.buffer[di][y + (BUF_WSTRIDE * plane)];
|
||||
WVID[drawOffset] = (bmp << 8) | (bmp >> 8);
|
||||
drawOffset += PAGE_STRIDE >> 1;
|
||||
}
|
||||
paintBufferPlane(screen.buffer[di], screen.bufferOffset[di], PAGE_STRIDE, plane);
|
||||
}
|
||||
}
|
||||
setAllPlanes();
|
||||
di = 0;
|
||||
drawOffset = screen.pageOffset[screen.currentPage];
|
||||
for (y = startY; y < startY + PAGE_TILES_H; y ++) {
|
||||
for (x = startX; x < startX + PAGE_TILES_W; x ++) {
|
||||
if (dirty[di++] == D_BGTILE) {
|
||||
char tile = screen.map[x + (y * screen.w)];
|
||||
if ((tile & 0xf0) == 0xf0) {
|
||||
blitSolidBlock(drawOffset, tile & 0x0f);
|
||||
}
|
||||
}
|
||||
drawOffset += 2;
|
||||
}
|
||||
drawOffset += PAGE_STRIDE * 15;
|
||||
}
|
||||
|
||||
setDisplayOffset(scrollOffset);
|
||||
setHorizontalPan(screen.scrollX & 0x07);
|
||||
|
|
4
tiles.h
4
tiles.h
|
@ -12,6 +12,10 @@ void drawScreen();
|
|||
|
||||
void blit32x32(unsigned int offsetFrom, unsigned int offsetTo);
|
||||
|
||||
void writeTile(unsigned int *buf, unsigned int far *tile);
|
||||
void overlaySprite(unsigned int *buf, unsigned int far *sprite, int shift, int yStart);
|
||||
void paintBuffer(unsigned int *buf, unsigned int vidOffset);
|
||||
|
||||
#define PAGE_TILES_W 21
|
||||
#define PAGE_TILES_H 14
|
||||
#define PAGE_TILES_COUNT (PAGE_TILES_H * PAGE_TILES_W)
|
||||
|
|
Loading…
Reference in a new issue