Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions qtfred/source_groups.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ add_file_folder("Source/Mission/Dialogs"
src/mission/dialogs/MusicTBLViewerModel.h
src/mission/dialogs/ObjectOrientEditorDialogModel.cpp
src/mission/dialogs/ObjectOrientEditorDialogModel.h
src/mission/dialogs/PropEditorDialogModel.cpp
src/mission/dialogs/PropEditorDialogModel.h
src/mission/dialogs/ReinforcementsEditorDialogModel.cpp
src/mission/dialogs/ReinforcementsEditorDialogModel.h
src/mission/dialogs/RelativeCoordinatesDialogModel.cpp
Expand Down Expand Up @@ -172,6 +174,8 @@ add_file_folder("Source/UI/Dialogs"
src/ui/dialogs/MusicTBLViewer.h
src/ui/dialogs/ObjectOrientEditorDialog.cpp
src/ui/dialogs/ObjectOrientEditorDialog.h
src/ui/dialogs/PropEditorDialog.cpp
src/ui/dialogs/PropEditorDialog.h
src/ui/dialogs/ReinforcementsEditorDialog.cpp
src/ui/dialogs/ReinforcementsEditorDialog.h
src/ui/dialogs/RelativeCoordinatesDialog.cpp
Expand Down Expand Up @@ -250,6 +254,8 @@ add_file_folder("Source/UI/Widgets"
src/ui/widgets/CampaignMissionGraph.h
src/ui/widgets/ColorComboBox.cpp
src/ui/widgets/ColorComboBox.h
src/ui/widgets/PropComboBox.cpp
src/ui/widgets/PropComboBox.h
src/ui/widgets/LineEditDelegate.cpp
src/ui/widgets/LineEditDelegate.h
src/ui/widgets/FlagList.cpp
Expand Down Expand Up @@ -298,6 +304,7 @@ add_file_folder("UI"
ui/MissionSpecDialog.ui
ui/MusicPlayerDialog.ui
ui/ObjectOrientationDialog.ui
ui/PropEditorDialog.ui
ui/ReinforcementsDialog.ui
ui/RelativeCoordinatesDialog.ui
ui/SelectionDialog.ui
Expand Down
56 changes: 39 additions & 17 deletions qtfred/src/mission/EditorViewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "EditorViewport.h"
#include <math/fvi.h>
#include <jumpnode/jumpnode.h>
#include <prop/prop.h>
#include <FredApplication.h>

namespace {
Expand Down Expand Up @@ -880,6 +881,10 @@ void EditorViewport::drag_rotate_save_backup() {
}

int EditorViewport::create_object_on_grid(int x, int y, int waypoint_instance) {
return create_object_on_grid(x, y, waypoint_instance, false);
}

int EditorViewport::create_object_on_grid(int x, int y, int waypoint_instance, bool create_prop) {
int obj = -1;
float rval;
vec3d dir, pos;
Expand All @@ -890,7 +895,7 @@ int EditorViewport::create_object_on_grid(int x, int y, int waypoint_instance) {

if (rval >= 0.0f) {
editor->unmark_all();
obj = create_object(&pos, waypoint_instance);
obj = create_object(&pos, waypoint_instance, create_prop);
if (obj >= 0) {
editor->markObject(obj);

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

return obj;
}
int EditorViewport::create_object(vec3d* pos, int waypoint_instance) {
int EditorViewport::create_object(vec3d* pos, int waypoint_instance, bool create_prop) {

int obj, n;
if (create_prop) {
if (cur_prop_index < 0 || cur_prop_index >= prop_info_size()) {
return -1;
}

if (cur_model_index == editor->Id_select_type_waypoint) {
obj = editor->create_waypoint(pos, waypoint_instance);
} else if (cur_model_index == editor->Id_select_type_jump_node) {
CJumpNode jnp(pos);
obj = jnp.GetSCPObjectNumber();
Jump_nodes.push_back(std::move(jnp));
} else if(Ship_info[cur_model_index].flags[Ship::Info_Flags::No_fred]){
obj = -1;
} else { // creating a ship
obj = editor->create_ship(NULL, pos, cur_model_index);
if (obj == -1)
obj = prop_create(nullptr, pos, cur_prop_index);
if (obj == -1) {
return -1;
}
} else {

n = Objects[obj].instance;
Ships[n].arrival_cue = alloc_sexp("true", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
Ships[n].departure_cue = alloc_sexp("false", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
Ships[n].cargo1 = 0;
if (cur_model_index == editor->Id_select_type_waypoint) {
obj = editor->create_waypoint(pos, waypoint_instance);
} else if (cur_model_index == editor->Id_select_type_jump_node) {
CJumpNode jnp(pos);
obj = jnp.GetSCPObjectNumber();
Jump_nodes.push_back(std::move(jnp));
} else if(Ship_info[cur_model_index].flags[Ship::Info_Flags::No_fred]){
obj = -1;
} else { // creating a ship
obj = editor->create_ship(nullptr, pos, cur_model_index);
if (obj == -1)
return -1;

n = Objects[obj].instance;
Ships[n].arrival_cue = alloc_sexp("true", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
Ships[n].departure_cue = alloc_sexp("false", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, -1);
Ships[n].cargo1 = 0;
}
}

if (obj < 0)
Expand All @@ -937,6 +953,12 @@ int EditorViewport::create_object(vec3d* pos, int waypoint_instance) {
}
void EditorViewport::initialSetup() {
cur_model_index = get_default_player_ship_index();
for (int i = 0; i < prop_info_size(); ++i) {
if (!Prop_info[i].flags[Prop::Info_Flags::No_fred]) {
cur_prop_index = i;
break;
}
}
}

int EditorViewport::duplicate_marked_objects()
Expand Down
5 changes: 3 additions & 2 deletions qtfred/src/mission/EditorViewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,9 @@ class EditorViewport {
void drag_rotate_save_backup();

int create_object_on_grid(int x, int y, int waypoint_instance);
int create_object_on_grid(int x, int y, int waypoint_instance, bool create_prop);

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

int duplicate_marked_objects();
int drag_objects(int x, int y);
Expand Down Expand Up @@ -146,6 +147,7 @@ class EditorViewport {
int Dup_drag = 0;

int cur_model_index = 0;
int cur_prop_index = -1;

bool Bg_bitmap_dialog = false;

Expand Down Expand Up @@ -176,4 +178,3 @@ class EditorViewport {
}



47 changes: 46 additions & 1 deletion qtfred/src/mission/FredRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <ship/shipfx.h>
#include <jumpnode/jumpnode.h>
#include <asteroid/asteroid.h>
#include <prop/prop.h>
#include <iff_defs/iff_defs.h>
#include <math/fvi.h>
#include <graphics/light.h>
Expand Down Expand Up @@ -508,6 +509,11 @@ void FredRenderer::display_ship_info(int cur_object_index) {
} else if (objp->type == OBJ_JUMP_NODE) {
CJumpNode* jnp = jumpnode_get_by_objnum(OBJ_INDEX(objp));
sprintf(buf, "%s\n%s", jnp->GetName(), jnp->GetDisplayName());
} else if (objp->type == OBJ_PROP) {
auto propp = prop_id_lookup(objp->instance);
if (propp != nullptr) {
sprintf(buf, "%s\n", propp->prop_name);
}
} else
Assert(0);
}
Expand Down Expand Up @@ -839,7 +845,42 @@ void FredRenderer::render_one_model_htl(object* objp,
}

// build flags
if ((view().Show_ship_models || view().Show_outlines) && ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START))) {
if ((objp->type == OBJ_PROP) && (view().Show_ship_models || view().Show_outlines)) {
uint64_t flags = MR_NORMAL;

if (!view().Lighting_on) {
flags |= MR_NO_LIGHTING;
}

if (view().FullDetail) {
flags |= MR_FULL_DETAIL;
}

auto propp = prop_id_lookup(objp->instance);
if (propp == nullptr || !SCP_vector_inbounds(Prop_info, propp->prop_info_index)) {
return;
}

model_render_params render_info;
render_info.set_debug_flags(0);

if (Fred_outline) {
render_info.set_color(Fred_outline >> 16, (Fred_outline >> 8) & 0xff, Fred_outline & 0xff);
render_info.set_flags(flags | MR_SHOW_OUTLINE_HTL | MR_NO_LIGHTING | MR_NO_POLYS | MR_NO_TEXTURING);
model_render_immediate(&render_info,
Prop_info[propp->prop_info_index].model_num,
propp->model_instance_num,
&objp->orient,
&objp->pos);
}

render_info.set_flags(flags);
model_render_immediate(&render_info,
Prop_info[propp->prop_info_index].model_num,
propp->model_instance_num,
&objp->orient,
&objp->pos);
} else if ((view().Show_ship_models || view().Show_outlines) && ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START))) {
uint64_t flags = 0;

g3_start_instance_matrix(&Eye_position, &Eye_matrix, 0);
Expand Down Expand Up @@ -933,6 +974,10 @@ void FredRenderer::render_one_model_htl(object* objp,
r = 196;
g = 32;
b = 196;
} else if (objp->type == OBJ_PROP) {
r = 255;
g = 255;
b = 255;
} else
Assert(0);

Expand Down
Loading