X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_spri.c;h=502ed4a43a29a119b029d30329aed83aabf67eef;hb=a9fe632397649ac62b1d7febda9a62bc517c5c53;hp=063c2cd1f83f3ae42108c42b0ab3b1d46d69f7b1;hpb=8c95ad6d75b37c4bc838d30d47a83d04f906feda;p=16.git diff --git a/src/lib/16_spri.c b/src/lib/16_spri.c index 063c2cd1..502ed4a4 100755 --- a/src/lib/16_spri.c +++ b/src/lib/16_spri.c @@ -21,15 +21,69 @@ */ #include "src/lib/16_spri.h" +#include +//void draw_vrl1_vgax_modex_strip(unsigned char far *draw,unsigned char far *s); + +//=========================================================================== + +//#define NEWVRSDRAWFUN +void DrawVRL (unsigned int x,unsigned int y,struct vrl1_vgax_header *hdr,vrl1_vgax_offset_t *lineoffs/*array hdr->width long*/,unsigned char *data,unsigned int datasz) { + unsigned char far *draw; + unsigned int vram_offset = (y * vga_state.vga_draw_stride) + (x >> 2),sx; + unsigned int vramlimit = vga_state.vga_draw_stride_limit; + unsigned char vga_plane = (x & 3); + unsigned char *s; + +// byte outputvars[72][128]; + word a;//,by,bxmax,bymax; + + printf("DrawVRL:\n"); + + /* draw one by one */ + for (sx=0;sx < hdr->width;sx++) { + draw = vga_state.vga_graphics_ram + vram_offset; + vga_write_sequencer(0x02/*map mask*/,1 << vga_plane); + s = data + lineoffs[sx]; + draw_vrl1_vgax_modex_strip(draw,s); + + if(!sx) + for(a=0;aheight;a++)//hdr->width* + { +// if((*(s+a)==0x0) && (*(s+(a+1))==0x20) && (*(s+(a+2))==0xff)) a+=2; +// if(*(s+a)<=13) +// if (!(a%4) && a ) printf("\n"); +// sprintf(outputvars[sx][by], "%02x", *(s+a)); + printf("[%02u] %u\n", a, *(s+a)); +// by++; + } + + /* end of a vertical strip. next line? */ + if ((++vga_plane) == 4) { + if (--vramlimit == 0) break; + vram_offset++; + vga_plane = 0; + } + } +#if 0 + bxmax = sx; bymax = by; + for(by=0;bywidth) && sx ) printf("\n "); + printf("%02x ", outputvars[sx][by]); + } + printf("\n "); + } +#endif +} + +//=========================================================================== char* get_curr_anim_name(struct sprite *spri) { // Retrive animation name list -#ifndef VRSVRLNONPTR - struct vrs_header far *vrs = spri->spritesheet->vrs_hdr; -#else struct vrs_header far *vrs = spri->spritesheet.vrs_hdr; -#endif uint32_t far *anim_names_offsets = (uint32_t far *) ((byte far *)vrs + vrs->offset_table[VRS_HEADER_OFFSET_ANIMATION_NAME_LIST]); @@ -39,11 +93,7 @@ char* get_curr_anim_name(struct sprite *spri) void init_anim(struct sprite *spri, int anim_index) { -#ifndef VRSVRLNONPTR - struct vrs_header far *vrs = spri->spritesheet->vrs_hdr; -#else struct vrs_header far *vrs = spri->spritesheet.vrs_hdr; -#endif uint32_t far *anim_lists_offsets = (uint32_t far *) ((byte far *)vrs + vrs->offset_table[VRS_HEADER_OFFSET_ANIMATION_LIST]); @@ -64,11 +114,7 @@ int set_anim_by_id(struct sprite *spri, int anim_id) { int new_anim_index = 0; int iter_id; -#ifndef VRSVRLNONPTR - struct vrs_header far *vrs = spri->spritesheet->vrs_hdr; -#else struct vrs_header far *vrs = spri->spritesheet.vrs_hdr; -#endif // Retruve animation ids list uint16_t far *anim_ids = (uint16_t far *) ((byte far *)vrs + @@ -92,11 +138,7 @@ void print_anim_ids(struct sprite *spri) { int new_anim_index = 0; int iter_id; -#ifndef VRSVRLNONPTR - struct vrs_header far *vrs = spri->spritesheet->vrs_hdr; -#else struct vrs_header far *vrs = spri->spritesheet.vrs_hdr; -#endif // Retruve animation ids list uint16_t far *anim_ids = (uint16_t far *) ((byte far *)vrs + @@ -117,6 +159,7 @@ void animate_spri(entity_t *enti, video_t *video) #define INC_PER_FRAME if(enti->q&1) enti->persist_aniframe++; if(enti->persist_aniframe>4) enti->persist_aniframe = 1; unsigned int i,o,o2; int j; int x,y,rx,ry,w,h; + static struct glob_game_vars *ggvv; VGA_RAM_PTR omemptr = (VGA_RAM_PTR)video->page[0].data;// save original mem ptr x=enti->spri.x; @@ -164,11 +207,7 @@ void animate_spri(entity_t *enti, video_t *video) // Draw sprite -#ifndef VRSVRLNONPTR - j = get_vrl_by_id(enti->spri.spritesheet, enti->spri.curr_spri_id, enti->spri.sprite_vrl_cont); -#else j = get_vrl_by_id(&enti->spri.spritesheet, enti->spri.curr_spri_id, &enti->spri.sprite_vrl_cont); -#endif if(j < 0) { //Quit (gv, "Error retriving required sprite"); @@ -176,23 +215,18 @@ void animate_spri(entity_t *enti, video_t *video) } // render box bounds. y does not need modification, but x and width must be multiple of 4 - if(!video->rss) + if(!video->vga_state.rss) { if (x >= enti->overdraww) rx = (x - enti->overdraww) & (~3); else rx = -(video->page[0].dx); if (y >= enti->overdrawh) ry = (y - enti->overdrawh); else ry = -(video->page[0].dy); -#ifndef VRSVRLNONPTR - h = enti->spri.sprite_vrl_cont->vrl_header->height + enti->overdrawh + y - ry; - w = (x + enti->spri.sprite_vrl_cont->vrl_header->width + (enti->overdraww*2) + 3 - rx) & (~3) - enti->overdraww;//round up -#else h = enti->spri.sprite_vrl_cont.vrl_header->height + enti->overdrawh + y - ry; w = (x + enti->spri.sprite_vrl_cont.vrl_header->width + (enti->overdraww*2) + 3 - rx) & (~3) - enti->overdraww;//round up -#endif if ((rx+w) > video->page[0].width) w = video->page[0].width-rx; if ((ry+h) > video->page[0].height) h = video->page[0].height-ry; - if(!video->bgps){ + if(!video->vga_state.bgps){ // block copy pattern to where we will draw the sprite vga_setup_wm1_block_copy(); o2 = video->ofs.offscreen_ofs; @@ -212,28 +246,33 @@ void animate_spri(entity_t *enti, video_t *video) #ifndef SPRITE modexClearRegion(&video->page[0], x, y, 16, 32, 1); #else - draw_vrl1_vgax_modex( +#ifndef NEWVRSDRAWFUN + draw_vrl1_vgax_modex +#else + DrawVRL +#endif + ( x-rx, y-ry, -#ifndef VRSVRLNONPTR - enti->spri.sprite_vrl_cont->vrl_header, - enti->spri.sprite_vrl_cont->line_offsets, - enti->spri.sprite_vrl_cont->buffer + sizeof(struct vrl1_vgax_header), - enti->spri.sprite_vrl_cont->data_size -#else enti->spri.sprite_vrl_cont.vrl_header, enti->spri.sprite_vrl_cont.line_offsets, enti->spri.sprite_vrl_cont.buffer + sizeof(struct vrl1_vgax_header), enti->spri.sprite_vrl_cont.data_size -#endif ); #endif - if(!video->rss) +#ifdef __DEBUG_SPRI__ +// if(ggvv->player[0].enti.q<5) + if(dbg_delayanimation) + { + IN_Ack(ggvv);// delay(250);//{ while(!IN_KeyDown(sc_Space)/* && !IN_KeyDown(sc_Escape)*/){} delay(250); } + } +#endif + if(!video->vga_state.rss) { // restore ptr vga_state.vga_graphics_ram = omemptr; - if(!video->bgps){ + if(!video->vga_state.bgps){ // block copy to visible RAM from offscreen vga_setup_wm1_block_copy(); o = video->ofs.offscreen_ofs; // source offscreen @@ -246,6 +285,6 @@ void animate_spri(entity_t *enti, video_t *video) // restore stride vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = video->page[0].stridew; - vga_state.vga_graphics_ram = video->omemptr; + vga_state.vga_graphics_ram = video->vga_state.omemptr; video->dorender=1; }