diff --git a/TrackRender/src/main.cpp b/TrackRender/src/main.cpp index 9c82166..e3cd868 100644 --- a/TrackRender/src/main.cpp +++ b/TrackRender/src/main.cpp @@ -58,7 +58,8 @@ int load_groups(json_t* json,uint64_t* out) else if(strcmp(json_string_value(group_name),"diagonal_brakes") ==0)groups|=TRACK_GROUP_DIAGONAL_BRAKES; else if(strcmp(json_string_value(group_name),"sloped_brakes") ==0)groups|=TRACK_GROUP_SLOPED_BRAKES; else if(strcmp(json_string_value(group_name),"magnetic_brakes") ==0)groups|=TRACK_GROUP_MAGNETIC_BRAKES; - else if(strcmp(json_string_value(group_name),"turns") ==0)groups|=TRACK_GROUP_TURNS; + else if (strcmp(json_string_value(group_name), "very_small_turns") == 0)groups |= TRACK_GROUP_VERY_SMALL_TURNS; + else if(strcmp(json_string_value(group_name),"turns") ==0)groups|=TRACK_GROUP_TURNS; else if(strcmp(json_string_value(group_name),"gentle_slopes") ==0)groups|=TRACK_GROUP_GENTLE_SLOPES; else if(strcmp(json_string_value(group_name),"steep_slopes") ==0)groups|=TRACK_GROUP_STEEP_SLOPES; else if(strcmp(json_string_value(group_name),"vertical_slopes") ==0)groups|=TRACK_GROUP_VERTICAL_SLOPES; diff --git a/TrackRender/src/track.cpp b/TrackRender/src/track.cpp index b4c7208..94f0301 100644 --- a/TrackRender/src/track.cpp +++ b/TrackRender/src/track.cpp @@ -927,6 +927,15 @@ uint64_t groups=0; write_track_section(context,&(track_list.large_turn_right_to_diag),track_type,base_dir,output_path,sprites,subtype,NULL); } + + //very_small_Turns + if (groups & TRACK_GROUP_VERY_SMALL_TURNS) + { + sprintf(output_path, "%.255svery_small_turn_left%s", output_dir, suffix); + write_track_section(context, &(track_list.very_small_turn_left), track_type, base_dir, output_path, sprites, subtype, NULL); + } + + //Diagonals if(groups&TRACK_GROUP_DIAGONALS) { diff --git a/TrackRender/src/track.h b/TrackRender/src/track.h index 100fdcf..320ef1d 100644 --- a/TrackRender/src/track.h +++ b/TrackRender/src/track.h @@ -90,45 +90,47 @@ enum track_subtypes TRACK_SUBTYPE_LIFT=1, }; -enum track_groups +enum track_groups : uint64_t { - TRACK_GROUP_FLAT=0x1, - TRACK_GROUP_BRAKES=0x2, - TRACK_GROUP_GENTLE_SLOPES=0x4, - TRACK_GROUP_STEEP_SLOPES=0x8, - TRACK_GROUP_VERTICAL_SLOPES=0x10, - TRACK_GROUP_TURNS=0x20, - TRACK_GROUP_SLOPED_TURNS=0x40, - TRACK_GROUP_DIAGONALS=0x80, - TRACK_GROUP_BANKED_TURNS=0x100, - TRACK_GROUP_BANKED_SLOPED_TURNS=0x200, - TRACK_GROUP_S_BENDS=0x400, - TRACK_GROUP_HELICES=0x800, - TRACK_GROUP_LARGE_SLOPE_TRANSITIONS=0x1000, - TRACK_GROUP_BARREL_ROLLS=0x2000, - TRACK_GROUP_INLINE_TWISTS=0x4000, - TRACK_GROUP_HALF_LOOPS=0x8000, - TRACK_GROUP_QUARTER_LOOPS=0x10000, - TRACK_GROUP_CORKSCREWS=0x20000, - TRACK_GROUP_LARGE_CORKSCREWS=0x40000, - TRACK_GROUP_BOOSTERS=0x80000, - TRACK_GROUP_LAUNCHED_LIFTS=0x100000, - TRACK_GROUP_TURN_BANK_TRANSITIONS=0x200000, - TRACK_GROUP_MEDIUM_HALF_LOOPS=0x400000, - TRACK_GROUP_LARGE_HALF_LOOPS=0x800000, - TRACK_GROUP_ZERO_G_ROLLS=0x1000000, - TRACK_GROUP_SMALL_SLOPE_TRANSITIONS=0x2000000, - TRACK_GROUP_STEEP_SLOPED_TURNS=0x4000000, - TRACK_GROUP_LARGE_SLOPED_TURNS=0x8000000, - TRACK_GROUP_LARGE_BANKED_SLOPED_TURNS=0x10000000, - TRACK_GROUP_VERTICAL_LOOPS=0x20000000, - TRACK_GROUP_VERTICAL_BOOSTERS=0x40000000, - TRACK_GROUP_DIAGONAL_BRAKES=0x80000000, - TRACK_GROUP_SLOPED_BRAKES=0x100000000, - TRACK_GROUP_MAGNETIC_BRAKES=0x200000000, - TRACK_GROUP_DIAGONAL_VERTICALS=0x400000000, - TRACK_GROUP_BANKED_S_BENDS=0x800000000, - TRACK_GROUP_BLOCK_BRAKES=0x1000000000, + TRACK_GROUP_FLAT = 0x1, + TRACK_GROUP_BRAKES = 0x2, + TRACK_GROUP_GENTLE_SLOPES = 0x4, + TRACK_GROUP_STEEP_SLOPES = 0x8, + TRACK_GROUP_VERTICAL_SLOPES = 0x10, + TRACK_GROUP_TURNS = 0x20, + TRACK_GROUP_SLOPED_TURNS = 0x40, + TRACK_GROUP_DIAGONALS = 0x80, + TRACK_GROUP_BANKED_TURNS = 0x100, + TRACK_GROUP_BANKED_SLOPED_TURNS = 0x200, + TRACK_GROUP_S_BENDS = 0x400, + TRACK_GROUP_HELICES = 0x800, + TRACK_GROUP_LARGE_SLOPE_TRANSITIONS = 0x1000, + TRACK_GROUP_BARREL_ROLLS = 0x2000, + TRACK_GROUP_INLINE_TWISTS = 0x4000, + TRACK_GROUP_HALF_LOOPS = 0x8000, + TRACK_GROUP_QUARTER_LOOPS = 0x10000, + TRACK_GROUP_CORKSCREWS = 0x20000, + TRACK_GROUP_LARGE_CORKSCREWS = 0x40000, + TRACK_GROUP_BOOSTERS = 0x80000, + TRACK_GROUP_LAUNCHED_LIFTS = 0x100000, + TRACK_GROUP_TURN_BANK_TRANSITIONS = 0x200000, + TRACK_GROUP_MEDIUM_HALF_LOOPS = 0x400000, + TRACK_GROUP_LARGE_HALF_LOOPS = 0x800000, + TRACK_GROUP_ZERO_G_ROLLS = 0x1000000, + TRACK_GROUP_SMALL_SLOPE_TRANSITIONS = 0x2000000, + TRACK_GROUP_STEEP_SLOPED_TURNS = 0x4000000, + TRACK_GROUP_LARGE_SLOPED_TURNS = 0x8000000, + TRACK_GROUP_LARGE_BANKED_SLOPED_TURNS = 0x10000000, + TRACK_GROUP_VERTICAL_LOOPS = 0x20000000, + TRACK_GROUP_VERTICAL_BOOSTERS = 0x40000000, + TRACK_GROUP_DIAGONAL_BRAKES = 0x80000000, + TRACK_GROUP_SLOPED_BRAKES = 0x100000000, + TRACK_GROUP_MAGNETIC_BRAKES = 0x200000000, + TRACK_GROUP_DIAGONAL_VERTICALS = 0x400000000, + TRACK_GROUP_BANKED_S_BENDS = 0x800000000, + TRACK_GROUP_BLOCK_BRAKES = 0x1000000000, + TRACK_GROUP_VERY_SMALL_TURNS = 0x2000000000 + }; enum models @@ -241,6 +243,7 @@ typedef struct track_section_t steep_to_vertical_up; track_section_t vertical_to_steep_up; track_section_t vertical; + track_section_t very_small_turn_left; track_section_t small_turn_left; track_section_t medium_turn_left; track_section_t large_turn_left_to_diag; @@ -368,8 +371,10 @@ typedef struct track_section_t vertical_twist_right_to_orthogonal_up; track_section_t vertical_booster; - -}track_list_t; + + +} +track_list_t; extern track_list_t track_list_default; extern track_list_t track_list_semi_split; diff --git a/TrackRender/src/track_sections.cpp b/TrackRender/src/track_sections.cpp index 241dc30..a5ab60d 100644 --- a/TrackRender/src/track_sections.cpp +++ b/TrackRender/src/track_sections.cpp @@ -402,6 +402,31 @@ track_point_t large_turn_right_to_diag_bank_curve(float distance) return banked_curve(large_turn_right_to_diag_curve(distance),-BANK_ANGLE); } +track_point_t very_small_turn_left_curve(float distance) +{ + float angle = distance / (0.5 * TILE_SIZE); + track_point_t point; + point.position = vector3(0.5 * TILE_SIZE * (1.0 - cos(angle)), 0, 0.5 * TILE_SIZE * sin(angle)); + point.tangent = vector3(sin(angle), 0.0, cos(angle)); + point.normal = vector3(0.0, 1.0, 0.0); + point.binormal = vector3_cross(point.tangent, point.normal); + return point; +} +track_point_t very_small_turn_right_curve(float distance) +{ + float angle = distance / (0.5 * TILE_SIZE); + track_point_t point; + point.position = vector3(0.5 * TILE_SIZE * (cos(angle) - 1.0), 0, 0.5 * TILE_SIZE * sin(angle)); + point.tangent = vector3(-sin(angle), 0.0, cos(angle)); + point.normal = vector3(0.0, 1.0, 0.0); + point.binormal = vector3_cross(point.normal, point.tangent); + return point; +} + + + + + track_point_t sloped_turn_left_curve(float radius,float gradient,float distance) { float arclength=radius*sqrt(1.0+gradient*gradient); @@ -9319,6 +9344,11 @@ const track_section_t vertical_to_steep_up={TRACK_VERTICAL|TRACK_NO_SUPPORTS|TRA const track_section_t vertical={TRACK_VERTICAL|TRACK_NO_SUPPORTS|TRACK_SPECIAL_VERTICAL,vertical_curve,VERTICAL_LENGTH,{{0,1,NULL},{0,1,NULL},{0,1,NULL},{0,1,NULL}}}; const track_section_t vertical_booster={TRACK_VERTICAL|TRACK_NO_SUPPORTS|TRACK_SPECIAL_VERTICAL_BOOSTER,vertical_curve,VERTICAL_LENGTH,{{0,1,NULL},{0,1,NULL},{0,1,NULL},{0,1,NULL}}}; + + +//very small Turns + +const track_section_t very_small_turn_left = { TRACK_EXIT_90_DEG_LEFT,very_small_turn_left_curve,VERY_SMALL_TURN_LENGTH,{{0,1,NULL},{0,1,NULL},{0,1,NULL},{0,1,NULL}} }; //Turns rect_t small_turn_left_rects[165]={ {INT32_MIN,-1,INT32_MAX,INT32_MAX}, @@ -18851,6 +18881,7 @@ track_list_t track_list_default={ steep_to_vertical_up, vertical_to_steep_up, vertical, + very_small_turn_left, small_turn_left, medium_turn_left, large_turn_left_to_diag, @@ -19000,6 +19031,7 @@ track_list_t track_list_semi_split={ steep_to_vertical_up, vertical_to_steep_up, vertical, + very_small_turn_left, small_turn_left, medium_turn_left, large_turn_left_to_diag,