From e6f07a7b2fd002483cba3ea989a40f1138e5dac8 Mon Sep 17 00:00:00 2001 From: ziplantil Date: Mon, 29 Jul 2019 00:43:04 +0300 Subject: [PATCH 1/2] add black shape to cover 'mine' after exit hatch blows up --- similar/main/endlevel.cpp | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/similar/main/endlevel.cpp b/similar/main/endlevel.cpp index 0aa27d2b5..4fa5d51a7 100644 --- a/similar/main/endlevel.cpp +++ b/similar/main/endlevel.cpp @@ -139,6 +139,7 @@ static void draw_stars(grs_canvas &, const d_unique_endlevel_state::starfield_ty static int find_exit_side(const object_base &obj); static void generate_starfield(d_unique_endlevel_state::starfield_type &stars); static void start_endlevel_flythrough(flythrough_data *flydata,const vmobjptr_t obj,fix speed); +static void draw_mine_exit_cover(grs_canvas &); #if defined(DXX_BUILD_DESCENT_II) constexpr array movie_table{{ @@ -897,11 +898,52 @@ static int find_exit_side(const object_base &obj) return best_side; } +void draw_mine_exit_cover(grs_canvas &canvas) +{ + int of=10; + fix u=i2f(6),d=i2f(9),ur=i2f(14),dr=i2f(17); + const uint8_t color = BM_XRGB(0, 0, 0); + array pointlist; + vms_vector v, v0, v1, v2, v3; + g3s_point p0, p1, p2, p3; + + vm_vec_scale_add(v,mine_exit_point,mine_exit_orient.fvec,i2f(of)); + + vm_vec_scale_add(v0,v,mine_exit_orient.uvec,+u); + vm_vec_scale_add2(v0,mine_exit_orient.rvec,+ur); + p0 = g3_rotate_point(v0); + + vm_vec_scale_add(v1,v,mine_exit_orient.uvec,+u); + vm_vec_scale_add2(v1,mine_exit_orient.rvec,-ur); + p1 = g3_rotate_point(v1); + + vm_vec_scale_add(v2,v,mine_exit_orient.uvec,-d); + vm_vec_scale_add2(v2,mine_exit_orient.rvec,-dr); + p2 = g3_rotate_point(v2); + + vm_vec_scale_add(v3,v,mine_exit_orient.uvec,-d); + vm_vec_scale_add2(v3,mine_exit_orient.rvec,+dr); + p3 = g3_rotate_point(v3); + + pointlist[0] = &p0; + pointlist[1] = &p1; + pointlist[2] = &p2; + pointlist[3] = &p3; + + g3_draw_poly(canvas, pointlist.size(), pointlist, color); +} + void draw_exit_model(grs_canvas &canvas) { int f=15,u=0; //21; g3s_lrgb lrgb = { f1_0, f1_0, f1_0 }; + if (mine_destroyed) + { + // draw black shape to mask out terrain in exit hatch + draw_mine_exit_cover(canvas); + } + auto model_pos = vm_vec_scale_add(mine_exit_point,mine_exit_orient.fvec,i2f(f)); vm_vec_scale_add2(model_pos,mine_exit_orient.uvec,i2f(u)); draw_polygon_model(canvas, model_pos, mine_exit_orient, nullptr, mine_destroyed ? destroyed_exit_modelnum : exit_modelnum, 0, lrgb, nullptr, nullptr); From bea2eaaec92ed7ce45686158ad0cd6b11fee8fe1 Mon Sep 17 00:00:00 2001 From: ziplantil Date: Mon, 29 Jul 2019 00:57:55 +0300 Subject: [PATCH 2/2] exit tunnel cover shape: make code neater --- similar/main/endlevel.cpp | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/similar/main/endlevel.cpp b/similar/main/endlevel.cpp index 4fa5d51a7..815e18249 100644 --- a/similar/main/endlevel.cpp +++ b/similar/main/endlevel.cpp @@ -898,32 +898,29 @@ static int find_exit_side(const object_base &obj) return best_side; } +inline void prepare_mine_exit_cover_point(g3s_point& p, const vms_vector &v, fix u, fix r) +{ + vms_vector tv; + vm_vec_scale_add(tv,v,mine_exit_orient.uvec,u); + vm_vec_scale_add2(tv,mine_exit_orient.rvec,r); + p = g3_rotate_point(tv); +} + void draw_mine_exit_cover(grs_canvas &canvas) { int of=10; fix u=i2f(6),d=i2f(9),ur=i2f(14),dr=i2f(17); const uint8_t color = BM_XRGB(0, 0, 0); array pointlist; - vms_vector v, v0, v1, v2, v3; + vms_vector v; g3s_point p0, p1, p2, p3; vm_vec_scale_add(v,mine_exit_point,mine_exit_orient.fvec,i2f(of)); - vm_vec_scale_add(v0,v,mine_exit_orient.uvec,+u); - vm_vec_scale_add2(v0,mine_exit_orient.rvec,+ur); - p0 = g3_rotate_point(v0); - - vm_vec_scale_add(v1,v,mine_exit_orient.uvec,+u); - vm_vec_scale_add2(v1,mine_exit_orient.rvec,-ur); - p1 = g3_rotate_point(v1); - - vm_vec_scale_add(v2,v,mine_exit_orient.uvec,-d); - vm_vec_scale_add2(v2,mine_exit_orient.rvec,-dr); - p2 = g3_rotate_point(v2); - - vm_vec_scale_add(v3,v,mine_exit_orient.uvec,-d); - vm_vec_scale_add2(v3,mine_exit_orient.rvec,+dr); - p3 = g3_rotate_point(v3); + prepare_mine_exit_cover_point(p0,v,+u,+ur); + prepare_mine_exit_cover_point(p1,v,+u,-ur); + prepare_mine_exit_cover_point(p2,v,-d,-dr); + prepare_mine_exit_cover_point(p3,v,-d,+dr); pointlist[0] = &p0; pointlist[1] = &p1;