X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Flib%2F16_spri.c;h=6db37a0130126cfbc56144039508ac674f3011c3;hb=579be865a2f1d2a84d5295506f3e8ea9815d11af;hp=063c2cd1f83f3ae42108c42b0ab3b1d46d69f7b1;hpb=8c95ad6d75b37c4bc838d30d47a83d04f906feda;p=proj16%2F16.git diff --git a/src/lib/16_spri.c b/src/lib/16_spri.c index 063c2cd1..6db37a01 100755 --- a/src/lib/16_spri.c +++ b/src/lib/16_spri.c @@ -1,5 +1,5 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * Copyright (C) 2012-2020 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover * * This file is part of Project 16. * @@ -21,15 +21,256 @@ */ #include "src/lib/16_spri.h" +#include + +#define VRS_USECAMMPM + +void VRS_ReadVRS(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRS(filename, enti, 1, gvar); } +void VRS_LoadVRS(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRS(filename, enti, 0, gvar); } +void VRS_OpenVRS(char *filename, entity_t *enti, boolean rlsw, global_game_variables_t *gvar) +{ +#ifndef VRS_USECAMMPM + vrl1_vgax_offset_t **vrl_line_offsets; +#endif + uint16_t far *vrl_id_iter; + uint32_t far *vrl_headers_offsets; + struct vrl1_vgax_header far *curr_vrl; + uint16_t vrl_size; + int num_of_vrl,i; + + switch(rlsw) + { + case 1: +//TODO ++++ CA_ReadFile(filename, &gvar->ca.spribuff, gvar); + CA_ReadFile(filename, MEMPTRCONV enti->spri.spritesheet.spribuff, gvar); + break; + case 0: +//TODO ++++ CA_LoadFile(filename, &gvar->ca.spribuff, gvar); + CA_LoadFile(filename, MEMPTRCONV enti->spri.spritesheet.spribuff, gvar); + break; + } + + // Insert sanity cheks later +//TODO ++++ enti->spri.spritesheet.buffer = gvar->ca.spribuff; + enti->spri.spritesheet.buffer = enti->spri.spritesheet.spribuff; //TODO: merge these 2 vars into 1 + enti->spri.spritesheet.data_size = sizeof(enti->spri.spritesheet.buffer) - sizeof(struct vrl1_vgax_header); + num_of_vrl = 0; + vrl_id_iter = (uint16_t far *)(enti->spri.spritesheet.buffer + enti->spri.spritesheet.vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST]); + while(vrl_id_iter[num_of_vrl]){ + num_of_vrl++; + } + + // Allocate memory for vrl line offsets table +#ifndef VRS_USECAMMPM + vrl_line_offsets = malloc(sizeof(vrl1_vgax_offset_t *)*num_of_vrl);//TODO: USE MM_ CA_ AND PM_ +#else + switch(rlsw) + { + case 0: +#ifdef __DEBUG_MM__ + dbg_debugmm=0; +#endif +// MM_GetPtr(MEMPTRCONV gvar->ca.grsegs, sizeof(vrl1_vgax_offset_t *)*num_of_vrl, gvar); +// enti->spri.spritesheet.vrl_line_offsets = (vrl1_vgax_offset_t **)gvar->ca.grsegs; + MM_GetPtr(gvar->ca.spribuff, sizeof(vrl1_vgax_offset_t *)*num_of_vrl, gvar); + enti->spri.spritesheet.vrl_line_offsets = (vrl1_vgax_offset_t **)(gvar->ca.spribuff); +// MM_GetPtr(spribuff, sizeof(vrl1_vgax_offset_t *)*num_of_vrl, gvar); +// enti->spri.spritesheet.vrl_line_offsets = (vrl1_vgax_offset_t **)spribuff; + break; + } +#endif + + vrl_headers_offsets = (uint32_t far *)(enti->spri.spritesheet.buffer + enti->spri.spritesheet.vrs_hdr->offset_table[VRS_HEADER_OFFSET_VRS_LIST]); + // Calculate line offsets for each vrl + for(i = 0; i < num_of_vrl; i++){ + curr_vrl = (struct vrl1_vgax_header far *)(enti->spri.spritesheet.buffer + vrl_headers_offsets[i]); + + // Calc. vrl size as (next_offset - curr_offset) + if (i != num_of_vrl - 1){ + vrl_size = vrl_headers_offsets[i+1] - vrl_headers_offsets[i] - sizeof(struct vrl1_vgax_header); + } + // If it's the last vrl, size is (next_vrs_struct_offset - curr_offset) + else{ + vrl_size = enti->spri.spritesheet.vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST] - vrl_headers_offsets[i] - sizeof(struct vrl1_vgax_header); + } +#ifndef VRS_USECAMMPM + vrl_line_offsets[i] = vrl1_vgax_genlineoffsets(curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), vrl_size); +#else + enti->spri.spritesheet.vrl_line_offsets[i] = vrl1_vgax_genlineoffsets((struct vrl1_vgax_header *)curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), vrl_size); +#endif + } +#ifndef VRS_USECAMMPM + enti->spri.spritesheet.vrl_line_offsets = vrl_line_offsets; +#endif +// printf("VRS_OpenVRS\n"); +// printf(" vrl_size=%lu\n\n",vrl_size); +} + +#if 0 +// +void VRS_ReadVRL(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRL(filename, enti, 1, gvar); } +void VRS_LoadVRL(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRL(filename, enti, 0, gvar); } +void VRS_OpenVRL(char *filename, entity_t *enti, boolean rlsw, global_game_variables_t *gvar) +{ +#ifndef VRL_USECAMMPM + vrl1_vgax_offset_t *line_offsets; +#endif +// uint32_t far *vrl_headers_offsets; + struct vrl1_vgax_header far *curr_vrl; + + switch(rlsw) + { + case 1: + CA_ReadFile(filename, &enti->spri.spritesheet.spribuff, gvar); + break; + case 0: + CA_LoadFile(filename, &enti->spri.spritesheet.spribuff, gvar); + break; + } + + // Insert sanity cheks later + enti->spri.sprite_vrl_cont.buffer = enti->spri.spritesheet.spribuff; + enti->spri.sprite_vrl_cont.data_size = sizeof(enti->spri.spritesheet.buffer) - sizeof(struct vrl1_vgax_header); + + // Allocate memory for vrl line offsets table +#ifndef VRL_USECAMMPM + line_offsets = malloc(sizeof(vrl1_vgax_offset_t *));//TODO: USE MM_ CA_ AND PM_ +#else + MM_GetPtr(MEMPTRCONV gvar->ca.grsegs[0], sizeof(vrl1_vgax_offset_t *), gvar); + enti->spri.sprite_vrl_cont.line_offsets = (vrl1_vgax_offset_t *)gvar->ca.grsegs[0]; +#endif + + //vrl_headers_offsets = (uint32_t far *)(enti->spri.sprite_vrl_cont.buffer + enti->spri.sprite_vrl_cont.vrs_hdr->offset_table[VRL_HEADER_OFFSET_VRL_LIST]); + // Calculate line offsets for each vrl + curr_vrl = (struct vrl1_vgax_header far *)(enti->spri.sprite_vrl_cont.buffer);// + vrl_headers_offsets); + +#ifndef VRL_USECAMMPM + line_offsets = vrl1_vgax_genlineoffsets(curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), sizeof(enti->spri.spritesheet.buffer)); +#else + enti->spri.sprite_vrl_cont.line_offsets = vrl1_vgax_genlineoffsets(curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), sizeof(enti->spri.spritesheet.buffer)); +#endif + +#ifndef VRL_USECAMMPM + enti->spri.sprite_vrl_cont.line_offsets = line_offsets; +#endif + printf("VRS_OpenVRL\n"); + printf(" vrl_size=%lu\n\n",sizeof(enti->spri.spritesheet.buffer)); +} +// +#endif + +// Seek and return a specified .vrl blob from .vrs blob in far memory +int get_vrl_by_id(struct vrs_container far *vrs_cont, uint16_t id, struct vrl_container *vrl_cont){ + uint16_t far *ids; + uint32_t far *vrl_offs_list; + int counter = 0; + + // If id is invalid, return -1 + if(id == 0){ + // Probably add an error message? + return -1; + } + + // Get id list from .vrs blob (base + offset) + ids = (uint16_t far*)(vrs_cont->buffer + + vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST]); + + // Loop through the id list until we found the right one or hit the end of the list + // Counter is keeping track of the offset(in ids/vrl blobs) + while(ids[counter] != id && ids[counter]){ + counter++; + } + // Return -2 if we couldn't find the requested id + if(!ids[counter]){ + // Error message? + return -2; + } + + // Get vrl offsets list from .vrs blob (base + offset) + vrl_offs_list = (uint32_t far *)(vrs_cont->buffer + + vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_VRS_LIST]); + + // Get vrl_header from .vrs (base + offset from vrl_list) + // Counter is number of vrls to skip (ids and vrls are aligned according to the .vrs specification) + vrl_cont->vrl_header = (struct vrl1_vgax_header far *)(vrs_cont->buffer + vrl_offs_list[counter]); + + // Get .vrl size by integer arithmetics (next vrl offset - current vrl offset) + if(ids[counter+1]){ + vrl_cont->data_size = vrl_offs_list[counter+1] - vrl_offs_list[counter] - sizeof(struct vrl1_vgax_header); + } + // If we are retriving the last vrl, size is ids_list offset - current vrl offset, as next vrl offs is 0 + else{ + vrl_cont->data_size = vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST] - vrl_offs_list[counter] - sizeof(struct vrl1_vgax_header); + } + + // Retrive line offsets form .vrs + vrl_cont->line_offsets = vrs_cont->vrl_line_offsets[counter]; + + return 0; +} + +//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 +280,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]); @@ -57,18 +294,14 @@ void init_anim(struct sprite *spri, int anim_index) spri->curr_spri_id = anim_list[0].sprite_id; spri->delay = anim_list[0].delay; - spri->curr_anim_list = anim_list; + spri->curr_anim_list = (struct vrs_animation_list_entry_t *)anim_list; } 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 +325,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 + @@ -164,11 +393,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 +401,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 +432,37 @@ 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) + { + { + delay(250); + // static struct glob_game_vars *ggvv; IN_Ack(ggvv); + // { 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 +475,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; }