got basic 2bpp sprites working. need to test 1bpp again with new system.
This commit is contained in:
+73
-33
@@ -26,7 +26,6 @@ export type uxn = struct {
|
|||||||
palette: [4] u16,
|
palette: [4] u16,
|
||||||
};
|
};
|
||||||
|
|
||||||
//TODO find a way to use these below
|
|
||||||
export def MAXWIDTH = 4096;
|
export def MAXWIDTH = 4096;
|
||||||
export def MAXHEIGHT = 2160;
|
export def MAXHEIGHT = 2160;
|
||||||
export def SCREENRATE = 60;
|
export def SCREENRATE = 60;
|
||||||
@@ -237,37 +236,22 @@ fn copy_sprite_to_screen(bpp2: bool, colors: u8, x: u16, y: u16, addr: u16, flip
|
|||||||
let yoff: u16 = 0;
|
let yoff: u16 = 0;
|
||||||
|
|
||||||
|
|
||||||
|
if(!bpp2) {
|
||||||
// fmt::printfln("Drawing Sprite to x: {} y: {}", x, y)!;
|
const pixels = get_pixels_from_1bpp_sprite(addr,state);
|
||||||
for(let i = 0; i < bytes_per_sprite; i+=1){
|
|
||||||
let data: u8 = state.ram[addr + i: u16];
|
|
||||||
const pixels: []u8 = if(bpp2){
|
|
||||||
yield [
|
|
||||||
(data & 0b11000000) >> 6,
|
|
||||||
(data & 0b00110000) >> 4,
|
|
||||||
(data & 0b00001100) >> 2,
|
|
||||||
(data & 0b00000011) >> 0 ];
|
|
||||||
} else {
|
|
||||||
yield [
|
|
||||||
(data & 0b10000000) >> 7,
|
|
||||||
(data & 0b01000000) >> 6,
|
|
||||||
(data & 0b00100000) >> 5,
|
|
||||||
(data & 0b00010000) >> 4,
|
|
||||||
(data & 0b00001000) >> 3,
|
|
||||||
(data & 0b00000100) >> 2,
|
|
||||||
(data & 0b00000010) >> 1,
|
|
||||||
(data & 0b00000001) >> 0 ];
|
|
||||||
};
|
|
||||||
|
|
||||||
for(let p .. pixels){
|
for(let p .. pixels){
|
||||||
const color: u8 = if (bpp2){
|
const color = if(p == 0) { yield 0:u8;} else {yield colors: u8; };
|
||||||
yield p: u8; // implement real value based on colors value
|
if(layer1) { state.screen.1[x+xoff][y+yoff] = color; }
|
||||||
}else {
|
else {state.screen.0[x+xoff][y+yoff] = color; };
|
||||||
if( p == 0 ) yield 0: u8;
|
xoff += 1;
|
||||||
yield colors: u8;
|
if(xoff >= 8){
|
||||||
|
xoff = 0;
|
||||||
} & 0b00000011;
|
yoff += 1;
|
||||||
// fmt::printfln("Drawing 2bpp: {} Sprite Pixel to x: {} y: {} color: {}", bpp2, x+xoff, y+yoff, p)!;
|
};
|
||||||
|
};
|
||||||
|
}else{
|
||||||
|
const pixels = get_pixels_from_2bpp_sprite(addr,state);
|
||||||
|
for(let p .. pixels){
|
||||||
|
const color = p; //TODO use colors bits
|
||||||
if(layer1) { state.screen.1[x+xoff][y+yoff] = color; }
|
if(layer1) { state.screen.1[x+xoff][y+yoff] = color; }
|
||||||
else {state.screen.0[x+xoff][y+yoff] = color; };
|
else {state.screen.0[x+xoff][y+yoff] = color; };
|
||||||
xoff += 1;
|
xoff += 1;
|
||||||
@@ -275,11 +259,67 @@ fn copy_sprite_to_screen(bpp2: bool, colors: u8, x: u16, y: u16, addr: u16, flip
|
|||||||
xoff = 0;
|
xoff = 0;
|
||||||
yoff += 1;
|
yoff += 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// fmt::printfln("Drawing Sprite to x: {} y: {}", x, y)!;
|
||||||
|
// for(let i = 0; i < bytes_per_sprite; i+=1){
|
||||||
|
// const pixels = get_pixels_from_sprite(bpp2,addr,state);
|
||||||
|
// for(let p .. pixels){
|
||||||
|
// const color: u8 = (if (bpp2){
|
||||||
|
// yield p: u8; // implement real value based on colors value
|
||||||
|
// }else {
|
||||||
|
// if( p == 0 ) yield 0: u8;
|
||||||
|
// yield colors: u8;
|
||||||
|
|
||||||
|
// } )& 0b00000011;
|
||||||
|
// // fmt::printfln("Drawing 2bpp: {} Sprite Pixel to x: {} y: {} color: {}", bpp2, x+xoff, y+yoff, p)!;
|
||||||
|
// if(layer1) { state.screen.1[x+xoff][y+yoff] = color; }
|
||||||
|
// else {state.screen.0[x+xoff][y+yoff] = color; };
|
||||||
|
// xoff += 1;
|
||||||
|
// if(xoff >= 8){
|
||||||
|
// xoff = 0;
|
||||||
|
// yoff += 1;
|
||||||
|
// };
|
||||||
|
|
||||||
|
|
||||||
|
// };
|
||||||
|
// };
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
fn get_pixels_from_1bpp_sprite(addr: u16, state: *uxn) []u8 = {
|
||||||
|
let pixels: [64]u8 = [0...];
|
||||||
|
|
||||||
|
for(let i = 0; i < 8; i+=1){
|
||||||
|
let data: u8 = state.ram[addr + i: u16];
|
||||||
|
pixels[i*8 +0] = (data & 0b10000000) >> 7;
|
||||||
|
pixels[i*8 +1] = (data & 0b01000000) >> 6;
|
||||||
|
pixels[i*8 +2] = (data & 0b00100000) >> 5;
|
||||||
|
pixels[i*8 +3] = (data & 0b00010000) >> 4;
|
||||||
|
pixels[i*8 +4] = (data & 0b00001000) >> 3;
|
||||||
|
pixels[i*8 +5] = (data & 0b00000100) >> 2;
|
||||||
|
pixels[i*8 +6] = (data & 0b00000010) >> 1;
|
||||||
|
pixels[i*8 +7] = (data & 0b00000001) >> 0;
|
||||||
|
};
|
||||||
|
return pixels;
|
||||||
|
};
|
||||||
|
fn get_pixels_from_2bpp_sprite(addr: u16, state: *uxn) []u8 = {
|
||||||
|
let pixels: [64]u8 = [0...];
|
||||||
|
|
||||||
|
for(let i = 0; i < 8; i+=1){
|
||||||
|
const data1: u8 = state.ram[addr + i: u16];
|
||||||
|
const data2: u8 = state.ram[addr + i:u16 + 8];
|
||||||
|
pixels[i*8 +0] = ((data1 & 0b10000000) >> 6) | ((data2 & 0b10000000) >> 7);
|
||||||
|
pixels[i*8 +1] = ((data1 & 0b01000000) >> 5) | ((data2 & 0b01000000) >> 6);
|
||||||
|
pixels[i*8 +2] = ((data1 & 0b00100000) >> 4) | ((data2 & 0b00100000) >> 5);
|
||||||
|
pixels[i*8 +3] = ((data1 & 0b00010000) >> 3) | ((data2 & 0b00010000) >> 4);
|
||||||
|
pixels[i*8 +4] = ((data1 & 0b00001000) >> 2) | ((data2 & 0b00001000) >> 3);
|
||||||
|
pixels[i*8 +5] = ((data1 & 0b00000100) >> 1) | ((data2 & 0b00000100) >> 2);
|
||||||
|
pixels[i*8 +6] = ((data1 & 0b00000010) >> 0) | ((data2 & 0b00000010) >> 1);
|
||||||
|
pixels[i*8 +7] = ((data1 & 0b00000001) << 1) | ((data2 & 0b00000001) >> 0);
|
||||||
|
};
|
||||||
|
return pixels;
|
||||||
};
|
};
|
||||||
|
|
||||||
export fn get_color(x: u16, y: u16, state: *uxn) u16 = {
|
export fn get_color(x: u16, y: u16, state: *uxn) u16 = {
|
||||||
|
|||||||
Reference in New Issue
Block a user