Skip to content

Commit 7826b96

Browse files
authored
QtFRED Cleanup and parity pass on view and object menus (scp-fs2open#7348)
* Cleanup and parity pass on view and object menus * some more view menu cleanup * fix outline rendering for ships * clang
1 parent 7039889 commit 7826b96

18 files changed

Lines changed: 653 additions & 288 deletions

code/model/model.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ constexpr uint64_t MR_NO_INSIGNIA = static_cast<uint64_t>(1) << static_cast<uint
10701070
#define MR_DEBUG_PATHS (1<<1) // Show the paths associated with a model
10711071
#define MR_DEBUG_RADIUS (1<<2) // Show the radius around the object
10721072
#define MR_DEBUG_SHIELDS (1<<3) // Show the shield mesh
1073-
#define MR_DEBUG_BAY_PATHS (1<<4) // draw bay paths
1073+
#define MR_DEBUG_BAY_PATHS (1<<4) // draw fighter bay paths
10741074
#define MR_DEBUG_NO_DIFFUSE (1<<5)
10751075
#define MR_DEBUG_NO_SPEC (1<<6)
10761076
#define MR_DEBUG_NO_NORMAL (1<<7)
@@ -1080,6 +1080,7 @@ constexpr uint64_t MR_NO_INSIGNIA = static_cast<uint64_t>(1) << static_cast<uint
10801080
#define MR_DEBUG_NO_AMBIENT (1<<11)
10811081
#define MR_DEBUG_NO_MISC (1<<12)
10821082
#define MR_DEBUG_NO_REFLECT (1<<13)
1083+
#define MR_DEBUG_DOCK_POINTS (1<<14) // draw docking bay slot positions and normals
10831084

10841085
//Defines for the render parameter of model_render, model_really_render and model_render_buffers
10851086
#define MODEL_RENDER_OPAQUE 1
@@ -1471,6 +1472,8 @@ void model_draw_paths_htl( int model_num, uint64_t flags );
14711472

14721473
void model_draw_bay_paths_htl(int model_num);
14731474

1475+
void model_draw_dock_points_htl(int model_num);
1476+
14741477
bool model_interp_config_buffer(indexed_vertex_source *vert_src, vertex_buffer *vb, bool update_ibuffer_only);
14751478
bool model_interp_pack_buffer(indexed_vertex_source *vert_src, vertex_buffer *vb);
14761479
void model_interp_submit_buffers(indexed_vertex_source *vert_src, size_t vertex_stride);

code/model/modelinterp.cpp

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ void model_draw_paths_htl( int model_num, uint64_t flags )
671671
}
672672

673673
/**
674-
* Docking bay and fighter bay paths
674+
* Fighter bay approach/departure paths (paths named $bayN)
675675
*/
676676
void model_draw_bay_paths_htl(int model_num)
677677
{
@@ -684,6 +684,40 @@ void model_draw_bay_paths_htl(int model_num)
684684
}
685685

686686
int cull = gr_set_cull(0);
687+
688+
// render fighter bay paths
689+
gr_set_color(0, 255, 255);
690+
691+
// iterate through the paths that exist in the polymodel, searching for $bayN pathnames
692+
for (idx = 0; idx<pm->n_paths; idx++) {
693+
if ( !strnicmp(pm->paths[idx].name, NOX("$bay"), 4) ) {
694+
for(s_idx=0; s_idx<pm->paths[idx].nverts-1; s_idx++){
695+
v1 = pm->paths[idx].verts[s_idx].pos;
696+
v2 = pm->paths[idx].verts[s_idx+1].pos;
697+
698+
g3_render_line_3d(true, &v1, &v2);
699+
}
700+
}
701+
}
702+
703+
gr_set_cull(cull);
704+
}
705+
706+
/**
707+
* Docking bay slot positions and normals
708+
*/
709+
void model_draw_dock_points_htl(int model_num)
710+
{
711+
int idx, s_idx;
712+
vec3d v1, v2;
713+
714+
polymodel *pm = model_get(model_num);
715+
if(pm == nullptr){
716+
return;
717+
}
718+
719+
int cull = gr_set_cull(0);
720+
687721
// render docking bay normals
688722
gr_set_color(0, 255, 0);
689723
for(idx=0; idx<pm->n_docks; idx++){
@@ -693,27 +727,10 @@ void model_draw_bay_paths_htl(int model_num)
693727

694728
// draw the point and normal
695729
g3_render_sphere(&v1, 2.0);
696-
//g3_draw_htl_line(&v1, &v2);
697730
g3_render_line_3d(true, &v1, &v2);
698731
}
699732
}
700733

701-
// render figher bay paths
702-
gr_set_color(0, 255, 255);
703-
704-
// iterate through the paths that exist in the polymodel, searching for $bayN pathnames
705-
for (idx = 0; idx<pm->n_paths; idx++) {
706-
if ( !strnicmp(pm->paths[idx].name, NOX("$bay"), 4) ) {
707-
for(s_idx=0; s_idx<pm->paths[idx].nverts-1; s_idx++){
708-
v1 = pm->paths[idx].verts[s_idx].pos;
709-
v2 = pm->paths[idx].verts[s_idx+1].pos;
710-
711-
//g3_draw_htl_line(&v1, &v2);
712-
g3_render_line_3d(true, &v1, &v2);
713-
}
714-
}
715-
}
716-
717734
gr_set_cull(cull);
718735
}
719736

code/model/modelrender.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2618,6 +2618,10 @@ void model_render_debug(int model_num, const matrix *orient, const vec3d *pos, u
26182618
model_draw_bay_paths_htl(model_num);
26192619
}
26202620

2621+
if ( debug_flags & MR_DEBUG_DOCK_POINTS ) {
2622+
model_draw_dock_points_htl(model_num);
2623+
}
2624+
26212625
if ( (flags & MR_AUTOCENTER) && (set_autocen) ) {
26222626
g3_done_instance(true);
26232627
}

fred2/fredrender.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1905,7 +1905,7 @@ void render_one_model_htl(object *objp) {
19051905
uint64_t flags = MR_NORMAL;
19061906

19071907
if (Show_dock_points) {
1908-
debug_flags |= MR_DEBUG_BAY_PATHS;
1908+
debug_flags |= MR_DEBUG_BAY_PATHS | MR_DEBUG_DOCK_POINTS;
19091909
}
19101910

19111911
if (Show_paths_fred) {

qtfred/source_groups.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ add_file_folder("Source/Mission/Dialogs"
6060
src/mission/dialogs/GlobalShipFlagsDialogModel.h
6161
src/mission/dialogs/JumpNodeEditorDialogModel.cpp
6262
src/mission/dialogs/JumpNodeEditorDialogModel.h
63+
src/mission/dialogs/LayerManagerDialogModel.cpp
64+
src/mission/dialogs/LayerManagerDialogModel.h
6365
src/mission/dialogs/MissionCutscenesDialogModel.cpp
6466
src/mission/dialogs/MissionCutscenesDialogModel.h
6567
src/mission/dialogs/MissionEventsDialogModel.cpp
@@ -315,6 +317,7 @@ add_file_folder("UI"
315317
ui/FredView.ui
316318
ui/GlobalShipFlagsDialog.ui
317319
ui/JumpNodeEditorDialog.ui
320+
ui/LayerManagerDialog.ui
318321
ui/TeamLoadoutDialog.ui
319322
ui/MissionCutscenesDialog.ui
320323
ui/MissionEventsDialog.ui

qtfred/src/mission/Editor.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,6 +1978,74 @@ void Editor::cancel_select_subsystem() {
19781978
Render_subsys.cur_subsys = NULL;
19791979
updateAllViewports();
19801980
}
1981+
void Editor::select_next_object()
1982+
{
1983+
object* ptr;
1984+
1985+
if (EMPTY(&obj_used_list))
1986+
return;
1987+
1988+
if (query_valid_object(currentObject)) {
1989+
ptr = Objects[currentObject].next;
1990+
if (ptr == END_OF_LIST(&obj_used_list))
1991+
ptr = GET_NEXT(ptr);
1992+
} else {
1993+
ptr = GET_FIRST(&obj_used_list);
1994+
}
1995+
1996+
if (getNumMarked() > 1) {
1997+
// Cycle current object through marked objects only
1998+
while (!Objects[OBJ_INDEX(ptr)].flags[Object::Object_Flags::Marked]) {
1999+
ptr = GET_NEXT(ptr);
2000+
if (ptr == END_OF_LIST(&obj_used_list))
2001+
ptr = GET_NEXT(ptr);
2002+
}
2003+
setupCurrentObjectIndices(OBJ_INDEX(ptr));
2004+
} else {
2005+
if (getNumMarked())
2006+
unmarkObject(currentObject);
2007+
markObject(OBJ_INDEX(ptr));
2008+
}
2009+
}
2010+
void Editor::select_previous_object()
2011+
{
2012+
int arr[MAX_OBJECTS], i = 0, n = 0;
2013+
object* ptr;
2014+
2015+
if (EMPTY(&obj_used_list))
2016+
return;
2017+
2018+
ptr = GET_FIRST(&obj_used_list);
2019+
while (ptr != END_OF_LIST(&obj_used_list)) {
2020+
if (currentObject == OBJ_INDEX(ptr))
2021+
i = n;
2022+
arr[n++] = OBJ_INDEX(ptr);
2023+
ptr = GET_NEXT(ptr);
2024+
}
2025+
2026+
Assert(n);
2027+
if (query_valid_object(currentObject)) {
2028+
i--;
2029+
if (i < 0)
2030+
i = n - 1;
2031+
} else {
2032+
i = n - 1;
2033+
}
2034+
2035+
if (getNumMarked() > 1) {
2036+
// Cycle current object through marked objects only
2037+
while (!Objects[arr[i]].flags[Object::Object_Flags::Marked]) {
2038+
i--;
2039+
if (i < 0)
2040+
i = n - 1;
2041+
}
2042+
setupCurrentObjectIndices(arr[i]);
2043+
} else {
2044+
if (getNumMarked())
2045+
unmarkObject(currentObject);
2046+
markObject(arr[i]);
2047+
}
2048+
}
19812049
int Editor::get_visible_sub_system_count(ship * shipp) {
19822050
int count = 0;
19832051
ship_subsys* cur_subsys;

qtfred/src/mission/Editor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,9 @@ class Editor : public QObject {
230230
void select_previous_subsystem();
231231
void cancel_select_subsystem();
232232

233+
void select_next_object();
234+
void select_previous_object();
235+
233236
bool global_error_check();
234237

235238
SCP_vector<SCP_string> get_docking_list(int model_index);

qtfred/src/mission/EditorViewport.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,13 @@ struct ViewSettings {
1616
bool Show_horizon = false;
1717
bool Show_grid = true;
1818
bool Show_distances = true;
19-
bool Show_asteroid_field = true;
20-
bool Aa_gridlines = false;
2119
bool Show_coordinates = false;
2220
bool Show_outlines = false;
2321
bool Draw_outlines_on_selected_ships = true;
2422
bool Draw_outline_at_warpin_position = false;
2523
bool Show_grid_positions = true;
2624
bool Show_dock_points = false;
25+
bool Show_bay_paths = false;
2726
bool Show_starts = true;
2827
bool Show_ships = true;
2928
SCP_vector<bool> Show_iff;

qtfred/src/mission/FredRenderer.cpp

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ void init_fred_colors() {
7979
int grid_colors_inited = 0;
8080
color Fred_grid_bright;
8181
color Fred_grid_dark;
82-
color Fred_grid_bright_aa;
83-
color Fred_grid_dark_aa;
8482

8583
void draw_asteroid_field() {
8684
int i, j;
@@ -327,24 +325,13 @@ void FredRenderer::render_grid(grid* gridp) {
327325
if (!grid_colors_inited) {
328326
grid_colors_inited = 1;
329327

330-
gr_init_alphacolor(&Fred_grid_dark_aa, 64, 64, 64, 255);
331-
gr_init_alphacolor(&Fred_grid_bright_aa, 128, 128, 128, 255);
332328
gr_init_color(&Fred_grid_dark, 64, 64, 64);
333329
gr_init_color(&Fred_grid_bright, 128, 128, 128);
334330
}
335331

336332
ncols = gridp->ncols;
337333
nrows = gridp->nrows;
338-
if (double_fine_gridlines) {
339-
ncols *= 2;
340-
nrows *= 2;
341-
}
342-
343-
if (view().Aa_gridlines) {
344-
gr_set_color_fast(&Fred_grid_dark_aa);
345-
} else {
346-
gr_set_color_fast(&Fred_grid_dark);
347-
}
334+
gr_set_color_fast(&Fred_grid_dark);
348335

349336
// Draw the column lines.
350337
for (i = 0; i <= ncols; i++) {
@@ -359,11 +346,7 @@ void FredRenderer::render_grid(grid* gridp) {
359346
nrows = gridp->nrows / 2;
360347

361348
// now draw the larger, brighter gridlines that is x10 the scale of smaller one.
362-
if (view().Aa_gridlines) {
363-
gr_set_color_fast(&Fred_grid_bright_aa);
364-
} else {
365-
gr_set_color_fast(&Fred_grid_bright);
366-
}
349+
gr_set_color_fast(&Fred_grid_bright);
367350

368351
for (i = 0; i <= ncols; i++) {
369352
g3_draw_htl_line(&gridp->gpoints5[i], &gridp->gpoints6[i]);
@@ -905,6 +888,10 @@ void FredRenderer::render_one_model_htl(object* objp,
905888

906889
uint debug_flags = 0;
907890
if (view().Show_dock_points) {
891+
debug_flags |= MR_DEBUG_DOCK_POINTS;
892+
}
893+
894+
if (view().Show_bay_paths) {
908895
debug_flags |= MR_DEBUG_BAY_PATHS;
909896
}
910897

@@ -924,21 +911,27 @@ void FredRenderer::render_one_model_htl(object* objp,
924911
flags |= MR_FULL_DETAIL;
925912
}
926913

914+
g3_done_instance(false);
915+
916+
// Outline pass: use a dedicated pass with MR_NO_POLYS so is_outlines_only_htl fires
917+
// in the renderer. Modern HTL models don't have outline_buffer, so relying on
918+
// MR_SHOW_OUTLINE_HTL alone (without MR_NO_POLYS) silently does nothing.
927919
if (Fred_outline) {
928-
flags |= MR_SHOW_OUTLINE_HTL;
920+
model_render_params outline_info;
921+
outline_info.set_color(Fred_outline >> 16, (Fred_outline >> 8) & 0xff, Fred_outline & 0xff);
922+
outline_info.set_flags(flags | MR_SHOW_OUTLINE_HTL | MR_NO_POLYS | MR_NO_LIGHTING | MR_NO_TEXTURING);
923+
model_render_immediate(&outline_info, Ship_info[Ships[z].ship_info_index].model_num, Ships[z].model_instance_num, &objp->orient, &objp->pos);
929924
}
930925

931-
model_render_params render_info;
932-
render_info.set_debug_flags(debug_flags);
933-
render_info.set_color(Fred_outline >> 16, (Fred_outline >> 8) & 0xff, Fred_outline & 0xff);
934-
render_info.set_replacement_textures(model_get_instance(Ships[z].model_instance_num)->texture_replace);
935-
render_info.set_flags(flags);
936-
937-
g3_done_instance(0);
938-
939-
model_render_immediate(&render_info, Ship_info[Ships[z].ship_info_index].model_num, Ships[z].model_instance_num, &objp->orient, &objp->pos);
926+
if (view().Show_ship_models) {
927+
model_render_params render_info;
928+
render_info.set_debug_flags(debug_flags);
929+
render_info.set_replacement_textures(model_get_instance(Ships[z].model_instance_num)->texture_replace);
930+
render_info.set_flags(flags);
931+
model_render_immediate(&render_info, Ship_info[Ships[z].ship_info_index].model_num, Ships[z].model_instance_num, &objp->orient, &objp->pos);
932+
}
940933

941-
if (view().Draw_outline_at_warpin_position
934+
if (view().Draw_outline_at_warpin_position
942935
&& (Ships[z].arrival_cue != Locked_sexp_true || Ships[z].arrival_delay > 0)
943936
&& Ships[z].arrival_cue != Locked_sexp_false
944937
&& !Ships[z].flags[Ship::Ship_Flags::No_arrival_warp])
@@ -951,9 +944,10 @@ void FredRenderer::render_one_model_htl(object* objp,
951944
vec3d warpin_pos;
952945
vm_vec_scale_add(&warpin_pos, &objp->pos, &objp->orient.vec.fvec, warpin_dist);
953946

954-
render_info.set_color(65, 65, 65); // grey; see rgba_defaults
955-
render_info.set_flags(flags | MR_SHOW_OUTLINE_HTL | MR_NO_LIGHTING | MR_NO_POLYS | MR_NO_TEXTURING);
956-
model_render_immediate(&render_info, Ship_info[Ships[z].ship_info_index].model_num, Ships[z].model_instance_num, &objp->orient, &warpin_pos);
947+
model_render_params warpin_info;
948+
warpin_info.set_color(65, 65, 65); // grey; see rgba_defaults
949+
warpin_info.set_flags(flags | MR_SHOW_OUTLINE_HTL | MR_NO_LIGHTING | MR_NO_POLYS | MR_NO_TEXTURING);
950+
model_render_immediate(&warpin_info, Ship_info[Ships[z].ship_info_index].model_num, Ships[z].model_instance_num, &objp->orient, &warpin_pos);
957951
}
958952
}
959953
} else {
@@ -1146,10 +1140,8 @@ void FredRenderer::render_frame(int cur_object_index,
11461140
g3_draw_horizon_line();
11471141
}
11481142

1149-
if (view().Show_asteroid_field) {
1150-
gr_set_color(192, 96, 16);
1151-
draw_asteroid_field();
1152-
}
1143+
gr_set_color(192, 96, 16);
1144+
draw_asteroid_field();
11531145

11541146
if (view().Show_grid) {
11551147
render_grid(_viewport->The_grid);

qtfred/src/mission/FredRenderer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ class ship_subsys;
1515

1616
///! \fixme This does NOT belong here. Used for porting and testing purposes ONLY!
1717
struct subsys_to_render {
18-
bool do_render;
19-
object* ship_obj;
20-
ship_subsys* cur_subsys;
18+
bool do_render = false;
19+
object* ship_obj = nullptr;
20+
ship_subsys* cur_subsys = nullptr;
2121
};
2222

2323
///! \fixme does NOT belong here.

0 commit comments

Comments
 (0)