Skip to content

Commit b09f7a2

Browse files
authored
Qtfred props support (#7240)
* Add props support and dialogs * Enable prop navigation when no prop is selected * no lint * clang * oops
1 parent ca1634b commit b09f7a2

14 files changed

Lines changed: 817 additions & 24 deletions

qtfred/source_groups.cmake

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ add_file_folder("Source/Mission/Dialogs"
7272
src/mission/dialogs/MusicTBLViewerModel.h
7373
src/mission/dialogs/ObjectOrientEditorDialogModel.cpp
7474
src/mission/dialogs/ObjectOrientEditorDialogModel.h
75+
src/mission/dialogs/PropEditorDialogModel.cpp
76+
src/mission/dialogs/PropEditorDialogModel.h
7577
src/mission/dialogs/ReinforcementsEditorDialogModel.cpp
7678
src/mission/dialogs/ReinforcementsEditorDialogModel.h
7779
src/mission/dialogs/RelativeCoordinatesDialogModel.cpp
@@ -172,6 +174,8 @@ add_file_folder("Source/UI/Dialogs"
172174
src/ui/dialogs/MusicTBLViewer.h
173175
src/ui/dialogs/ObjectOrientEditorDialog.cpp
174176
src/ui/dialogs/ObjectOrientEditorDialog.h
177+
src/ui/dialogs/PropEditorDialog.cpp
178+
src/ui/dialogs/PropEditorDialog.h
175179
src/ui/dialogs/ReinforcementsEditorDialog.cpp
176180
src/ui/dialogs/ReinforcementsEditorDialog.h
177181
src/ui/dialogs/RelativeCoordinatesDialog.cpp
@@ -250,6 +254,8 @@ add_file_folder("Source/UI/Widgets"
250254
src/ui/widgets/CampaignMissionGraph.h
251255
src/ui/widgets/ColorComboBox.cpp
252256
src/ui/widgets/ColorComboBox.h
257+
src/ui/widgets/PropComboBox.cpp
258+
src/ui/widgets/PropComboBox.h
253259
src/ui/widgets/LineEditDelegate.cpp
254260
src/ui/widgets/LineEditDelegate.h
255261
src/ui/widgets/FlagList.cpp
@@ -298,6 +304,7 @@ add_file_folder("UI"
298304
ui/MissionSpecDialog.ui
299305
ui/MusicPlayerDialog.ui
300306
ui/ObjectOrientationDialog.ui
307+
ui/PropEditorDialog.ui
301308
ui/ReinforcementsDialog.ui
302309
ui/RelativeCoordinatesDialog.ui
303310
ui/SelectionDialog.ui

qtfred/src/mission/EditorViewport.cpp

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "EditorViewport.h"
1414
#include <math/fvi.h>
1515
#include <jumpnode/jumpnode.h>
16+
#include <prop/prop.h>
1617
#include <FredApplication.h>
1718

1819
namespace {
@@ -880,6 +881,10 @@ void EditorViewport::drag_rotate_save_backup() {
880881
}
881882

882883
int EditorViewport::create_object_on_grid(int x, int y, int waypoint_instance) {
884+
return create_object_on_grid(x, y, waypoint_instance, false);
885+
}
886+
887+
int EditorViewport::create_object_on_grid(int x, int y, int waypoint_instance, bool create_prop) {
883888
int obj = -1;
884889
float rval;
885890
vec3d dir, pos;
@@ -890,7 +895,7 @@ int EditorViewport::create_object_on_grid(int x, int y, int waypoint_instance) {
890895

891896
if (rval >= 0.0f) {
892897
editor->unmark_all();
893-
obj = create_object(&pos, waypoint_instance);
898+
obj = create_object(&pos, waypoint_instance, create_prop);
894899
if (obj >= 0) {
895900
editor->markObject(obj);
896901

@@ -904,27 +909,38 @@ int EditorViewport::create_object_on_grid(int x, int y, int waypoint_instance) {
904909

905910
return obj;
906911
}
907-
int EditorViewport::create_object(vec3d* pos, int waypoint_instance) {
912+
int EditorViewport::create_object(vec3d* pos, int waypoint_instance, bool create_prop) {
908913

909914
int obj, n;
915+
if (create_prop) {
916+
if (cur_prop_index < 0 || cur_prop_index >= prop_info_size()) {
917+
return -1;
918+
}
910919

911-
if (cur_model_index == editor->Id_select_type_waypoint) {
912-
obj = editor->create_waypoint(pos, waypoint_instance);
913-
} else if (cur_model_index == editor->Id_select_type_jump_node) {
914-
CJumpNode jnp(pos);
915-
obj = jnp.GetSCPObjectNumber();
916-
Jump_nodes.push_back(std::move(jnp));
917-
} else if(Ship_info[cur_model_index].flags[Ship::Info_Flags::No_fred]){
918-
obj = -1;
919-
} else { // creating a ship
920-
obj = editor->create_ship(NULL, pos, cur_model_index);
921-
if (obj == -1)
920+
obj = prop_create(nullptr, pos, cur_prop_index);
921+
if (obj == -1) {
922922
return -1;
923+
}
924+
} else {
923925

924-
n = Objects[obj].instance;
925-
Ships[n].arrival_cue = alloc_sexp("true", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
926-
Ships[n].departure_cue = alloc_sexp("false", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
927-
Ships[n].cargo1 = 0;
926+
if (cur_model_index == editor->Id_select_type_waypoint) {
927+
obj = editor->create_waypoint(pos, waypoint_instance);
928+
} else if (cur_model_index == editor->Id_select_type_jump_node) {
929+
CJumpNode jnp(pos);
930+
obj = jnp.GetSCPObjectNumber();
931+
Jump_nodes.push_back(std::move(jnp));
932+
} else if(Ship_info[cur_model_index].flags[Ship::Info_Flags::No_fred]){
933+
obj = -1;
934+
} else { // creating a ship
935+
obj = editor->create_ship(nullptr, pos, cur_model_index);
936+
if (obj == -1)
937+
return -1;
938+
939+
n = Objects[obj].instance;
940+
Ships[n].arrival_cue = alloc_sexp("true", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
941+
Ships[n].departure_cue = alloc_sexp("false", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
942+
Ships[n].cargo1 = 0;
943+
}
928944
}
929945

930946
if (obj < 0)
@@ -937,6 +953,12 @@ int EditorViewport::create_object(vec3d* pos, int waypoint_instance) {
937953
}
938954
void EditorViewport::initialSetup() {
939955
cur_model_index = get_default_player_ship_index();
956+
for (int i = 0; i < prop_info_size(); ++i) {
957+
if (!Prop_info[i].flags[Prop::Info_Flags::No_fred]) {
958+
cur_prop_index = i;
959+
break;
960+
}
961+
}
940962
}
941963

942964
int EditorViewport::duplicate_marked_objects()

qtfred/src/mission/EditorViewport.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,9 @@ class EditorViewport {
9797
void drag_rotate_save_backup();
9898

9999
int create_object_on_grid(int x, int y, int waypoint_instance);
100+
int create_object_on_grid(int x, int y, int waypoint_instance, bool create_prop);
100101

101-
int create_object(vec3d *pos, int waypoint_instance = -1);
102+
int create_object(vec3d *pos, int waypoint_instance = -1, bool create_prop = false);
102103

103104
int duplicate_marked_objects();
104105
int drag_objects(int x, int y);
@@ -146,6 +147,7 @@ class EditorViewport {
146147
int Dup_drag = 0;
147148

148149
int cur_model_index = 0;
150+
int cur_prop_index = -1;
149151

150152
bool Bg_bitmap_dialog = false;
151153

@@ -176,4 +178,3 @@ class EditorViewport {
176178
}
177179

178180

179-

qtfred/src/mission/FredRenderer.cpp

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <ship/shipfx.h>
2222
#include <jumpnode/jumpnode.h>
2323
#include <asteroid/asteroid.h>
24+
#include <prop/prop.h>
2425
#include <iff_defs/iff_defs.h>
2526
#include <math/fvi.h>
2627
#include <graphics/light.h>
@@ -509,6 +510,11 @@ void FredRenderer::display_ship_info(int cur_object_index) {
509510
} else if (objp->type == OBJ_JUMP_NODE) {
510511
CJumpNode* jnp = jumpnode_get_by_objnum(OBJ_INDEX(objp));
511512
sprintf(buf, "%s\n%s", jnp->GetName(), jnp->GetDisplayName());
513+
} else if (objp->type == OBJ_PROP) {
514+
auto propp = prop_id_lookup(objp->instance);
515+
if (propp != nullptr) {
516+
sprintf(buf, "%s\n", propp->prop_name);
517+
}
512518
} else
513519
Assert(0);
514520
}
@@ -846,7 +852,42 @@ void FredRenderer::render_one_model_htl(object* objp,
846852
}
847853

848854
// build flags
849-
if ((view().Show_ship_models || view().Show_outlines) && ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START))) {
855+
if ((objp->type == OBJ_PROP) && (view().Show_ship_models || view().Show_outlines)) {
856+
uint64_t flags = MR_NORMAL;
857+
858+
if (!view().Lighting_on) {
859+
flags |= MR_NO_LIGHTING;
860+
}
861+
862+
if (view().FullDetail) {
863+
flags |= MR_FULL_DETAIL;
864+
}
865+
866+
auto propp = prop_id_lookup(objp->instance);
867+
if (propp == nullptr || !SCP_vector_inbounds(Prop_info, propp->prop_info_index)) {
868+
return;
869+
}
870+
871+
model_render_params render_info;
872+
render_info.set_debug_flags(0);
873+
874+
if (Fred_outline) {
875+
render_info.set_color(Fred_outline >> 16, (Fred_outline >> 8) & 0xff, Fred_outline & 0xff);
876+
render_info.set_flags(flags | MR_SHOW_OUTLINE_HTL | MR_NO_LIGHTING | MR_NO_POLYS | MR_NO_TEXTURING);
877+
model_render_immediate(&render_info,
878+
Prop_info[propp->prop_info_index].model_num,
879+
propp->model_instance_num,
880+
&objp->orient,
881+
&objp->pos);
882+
}
883+
884+
render_info.set_flags(flags);
885+
model_render_immediate(&render_info,
886+
Prop_info[propp->prop_info_index].model_num,
887+
propp->model_instance_num,
888+
&objp->orient,
889+
&objp->pos);
890+
} else if ((view().Show_ship_models || view().Show_outlines) && ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START))) {
850891
uint64_t flags = 0;
851892

852893
g3_start_instance_matrix(&Eye_position, &Eye_matrix, 0);
@@ -940,6 +981,10 @@ void FredRenderer::render_one_model_htl(object* objp,
940981
r = 196;
941982
g = 32;
942983
b = 196;
984+
} else if (objp->type == OBJ_PROP) {
985+
r = 255;
986+
g = 255;
987+
b = 255;
943988
} else
944989
Assert(0);
945990

0 commit comments

Comments
 (0)