diff --git a/osufs/osufs/osu_object_analyze/osu_object_includes.h b/osufs/osufs/osu_object_analyze/osu_object_includes.h new file mode 100644 index 0000000000000000000000000000000000000000..62e97acd6204b55ce50077bce72629d85d03145a --- /dev/null +++ b/osufs/osufs/osu_object_analyze/osu_object_includes.h @@ -0,0 +1,53 @@ +#ifndef OSU_OBJECT_INCLUDES_H_ + +#define OSU_OBJECT_INCLUDES_H_ + +#include<inttypes> + +typedef struct __attribute__((__packed__)) hit_circle_t{ + //32 Byte + char type, + uint_16t x,y, + uint_32t start_timing, + uint_32t check_timing, + uint_32t disappear_timing, + //uint_32t end_timing, + uint_16t hit_radius, + uint_16t approach_radius, + uint_16t gradient_color1, + uint_16t gradient_color2, + uint_16t stroke_color, + uint_8t gradient_direction, + uint_32t reserved + +}elem_hit_circle; + +typedef struct __attribute__((__packed__)) hit_circle_t{ + //32 Byte + char type, + uint_16t x,y, + uint_32t start_timing, + uint_32t disappear_timing, + uint_16t radius, + uint_16t gradient_color1, + uint_16t gradient_color2, + uint_16t stroke_color, + uint_8t gradient_direction, + char padding[10] + +}elem_spinner; + +/*typedef struct __attribute__((__packed__)) rect_slider_t{ + char type; + uint_32t start_timing, + uint_32t check_timing, + uint_32t disappear_timing, + //uint_32t end_timing, + uint_16t hit_radius, + uint_16t approach_radius, + uint_16t x1,y1,x2,y2,x3,y3,x4,y4, + uint_8t gradient_direction, + uint_32t reserved +}elem_rect_slider;*/ + +#endif \ No newline at end of file diff --git a/osufs/osufs/osu_object_analyze/osu_object_parser.cpp b/osufs/osufs/osu_object_analyze/osu_object_parser.cpp index 22df33a2461cf504de23de5e9f9b831bf6e1318c..2ed38e875739679afbaab619a38af3934cb05aaf 100644 --- a/osufs/osufs/osu_object_analyze/osu_object_parser.cpp +++ b/osufs/osufs/osu_object_analyze/osu_object_parser.cpp @@ -102,8 +102,11 @@ int osu_parse_hit_circle(vector<string>& v, elem_hit_circle* elemn,osu_song* son sscanf(v[2],"%ld",&(elemn -> check_timing)); elemn -> start_timing = check_timing - ((osu_song->approach_rate*(-140))+1800); elemn -> disappear_timing = check_timing + (200-(osu_song->difficulty)*10); + //TBD + //elemn -> end_timing elemn -> hit_radius = 100 - (osu_song ->difficulty) * 4; elemn -> approach_radius = 3*(elemn->hit_radius); + elemn -> approach_rate = (elemn->approach_radius-elemn->hit_radius)/(elemn->check_timing-elemn->start_timing); elemn -> stroke_color = 0xFFFF; } diff --git a/software/osu_main_process/osu_draw.c b/software/osu_main_process/osu_draw.c index cbae0efca2d6d362ed93fc7aa08f9ca6be983363..257139fa596a8ede231b38727804ff6235f87975 100644 --- a/software/osu_main_process/osu_draw.c +++ b/software/osu_main_process/osu_draw.c @@ -13,12 +13,13 @@ void osu_draw_frame(osu_session* global){ case 'h': // hit circle osu_draw_hit_circle((global->draw_dynamic_queue)[temp_queue_end],global->current_time); break; + case 's': + osu_draw_spin(draw_dynamic_queue[temp_queue_end]); + break; /* case 'l': // slider osu_draw_slider(draw_dynamic_queue[temp_queue_end]); break; - case 's': - osu_draw_spin(draw_dynamic_queue[temp_queue_end]); - break;*/ + */ } --temp_queue_end; temp_queue_end &= DRAW_QUEUE_SIZE_MODE; @@ -35,6 +36,7 @@ void osu_draw_hit_circle(elem_hit_circle* circle,clock_t current_time){ circle->x, circle->y, circle->approach_radius, + 4, circle->gradient_color1 ); gl_circle( @@ -46,11 +48,16 @@ void osu_draw_hit_circle(elem_hit_circle* circle,clock_t current_time){ circle->stroke_color, circle->gradient_direction ); - + gl_ring( + circle->x, + circle->y, + circle->hit_radius, + 3, + 0xFFFFFFFF + ); circle->approach_radius -= circle->approach_rate; - if (circle->approach_radius<0) - circle->approach_radius=0; - } else if (current_time < disappear_timing){ + + } else if (current_time < end_timing){ gl_circle( circle->x, circle->y, diff --git a/software/osu_main_process/osu_process.c b/software/osu_main_process/osu_process.c index 50f1709b05b755d56adf0cf95ed9e625873bc49f..81a9f27a2e29a51129f39013383fe294eeb61218 100644 --- a/software/osu_main_process/osu_process.c +++ b/software/osu_main_process/osu_process.c @@ -1,7 +1,7 @@ #include "osu_process.h" void init_process(osu_session* global){ - \ + global->draw_queue = malloc(sizeof(void*)*DRAW_QUEUE_SIZE); global->buff = malloc(512); global->play_timeline = malloc(65536); @@ -26,20 +26,21 @@ void loading_process(osu_session* global){ *(global->play_timeline)); //beat map parsing uint32_t* p_temp = *(global->play_timeline); - - global->play_timeline_count = *((uint32_t*)p_temp); - global->play_timeline = malloc(4*(global->play_timeline_count)); - //locate the real data address - ++p_temp; if ((*p_temp)!= 0b01110010011001010110000101101100){ printf("parsing magic failed!"); return; } + ++p_temp; + global->play_timeline_count = *((uint32_t*)p_temp); + global->play_timeline = malloc(4*(global->play_timeline_count)); + //locate the real data address + + ++p_temp; for (i=0;i<global->play_timeline_count;++i){ global->play_timeline[i] = p_temp; //jump 32 bytes - p_temp+=((void*)p_temp + ELEMENT_LENGTH); + p_temp =((void*)p_temp + ELEMENT_LENGTH); } } @@ -99,7 +100,7 @@ void osu_draw_queue_update(osu_session* global){ queue_temp_start = global->draw_dynamic_queue_start; elem_hit_circle* element_temp_p = (global->draw_dynamic_queue)[queue_temp_start]; while (queue_temp_start!=global->draw_dynamic_queue_end){ - if (global->current_time >= (element_temp_p->end_timing)){ + if (global->current_time >= (element_temp_p->disappear_timing)){ //pop draw element from front (global->draw_dynamic_queue)[queue_temp_start] = NULL; ++(global->draw_dynamic_queue_start);