mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-07 08:15:59 -10:00
147 lines
5.7 KiB
C++
147 lines
5.7 KiB
C++
#pragma once
|
|
|
|
#include "globalincs/vmallocator.h"
|
|
#include "model/model.h"
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <variant>
|
|
|
|
bool model_exists(const SCP_string& filename);
|
|
bool read_virtual_model_file(polymodel* pm, const SCP_string& filename, model_parse_depth depth, int ferror, model_read_deferred_tasks& deferredTasks);
|
|
void virtual_pof_purge_cache();
|
|
|
|
void virtual_pof_init();
|
|
|
|
|
|
struct VirtualPOFDefinition;
|
|
|
|
class VirtualPOFOperation {
|
|
public:
|
|
virtual ~VirtualPOFOperation() = default;
|
|
virtual void process(polymodel* pm, model_read_deferred_tasks& subsysList, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const = 0;
|
|
};
|
|
|
|
struct VirtualPOFDefinition {
|
|
SCP_string name, basePOF;
|
|
SCP_vector<std::unique_ptr<VirtualPOFOperation>> operationList;
|
|
};
|
|
|
|
using VirtualPOFNameReplacementMap = SCP_unordered_map<SCP_string, SCP_string, SCP_string_lcase_hash, SCP_string_lcase_equal_to>;
|
|
|
|
class VirtualPOFOperationRenameSubobjects : public VirtualPOFOperation {
|
|
VirtualPOFNameReplacementMap replacements;
|
|
friend class VirtualPOFOperationAddSubmodel;
|
|
friend class VirtualPOFOperationAddTurret;
|
|
public:
|
|
VirtualPOFOperationRenameSubobjects();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddSubmodel : public VirtualPOFOperation {
|
|
SCP_string subobjNameSrc, subobjNameDest;
|
|
SCP_string appendingPOF;
|
|
std::unique_ptr<VirtualPOFOperationRenameSubobjects> rename = nullptr;
|
|
bool copyChildren = true;
|
|
bool copyTurrets = false;
|
|
bool copyGlowpoints = false;
|
|
public:
|
|
VirtualPOFOperationAddSubmodel();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddTurret : public VirtualPOFOperation {
|
|
SCP_string baseNameSrc, baseNameDest;
|
|
std::optional<SCP_string> barrelNameDest;
|
|
SCP_string appendingPOF;
|
|
std::unique_ptr<VirtualPOFOperationRenameSubobjects> rename = nullptr;
|
|
public:
|
|
VirtualPOFOperationAddTurret();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddEngine : public VirtualPOFOperation {
|
|
std::variant<SCP_string, int> sourceId;
|
|
std::optional<SCP_string> renameSubsystem;
|
|
std::optional<vec3d> moveEngine;
|
|
SCP_string appendingPOF;
|
|
public:
|
|
VirtualPOFOperationAddEngine();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddGlowpoint : public VirtualPOFOperation {
|
|
int sourceId;
|
|
SCP_string renameSubmodel;
|
|
std::optional<vec3d> moveGlowpoint;
|
|
SCP_string appendingPOF;
|
|
public:
|
|
VirtualPOFOperationAddGlowpoint();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddSpecialSubsystem : public VirtualPOFOperation {
|
|
SCP_string sourceSubsystem;
|
|
std::optional<SCP_string> renameSubsystem;
|
|
SCP_string appendingPOF;
|
|
public:
|
|
VirtualPOFOperationAddSpecialSubsystem();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddWeapons : public VirtualPOFOperation {
|
|
int sourcebank, destbank = -1;
|
|
bool primary;
|
|
SCP_string appendingPOF;
|
|
public:
|
|
VirtualPOFOperationAddWeapons();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddDockPoint : public VirtualPOFOperation {
|
|
SCP_string sourcedock;
|
|
std::optional<SCP_string> renameDock;
|
|
SCP_unordered_map<SCP_string, SCP_string> renamePaths;
|
|
std::optional<SCP_string> targetParentSubsystem;
|
|
SCP_string appendingPOF;
|
|
public:
|
|
VirtualPOFOperationAddDockPoint();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationAddPath : public VirtualPOFOperation {
|
|
SCP_string sourcepath;
|
|
std::optional<SCP_string> renamePath;
|
|
std::optional<SCP_string> targetParentSubsystem;
|
|
SCP_string appendingPOF;
|
|
public:
|
|
VirtualPOFOperationAddPath();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationChangeData : public VirtualPOFOperation {
|
|
SCP_string submodel;
|
|
std::optional<vec3d> setOffset = std::nullopt;
|
|
public:
|
|
VirtualPOFOperationChangeData();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationChangeSubsystemData : public VirtualPOFOperation {
|
|
SCP_string subsystem;
|
|
std::optional<vec3d> setPosition = std::nullopt;
|
|
std::optional<float> setRadius = std::nullopt;
|
|
std::optional<SCP_string> setProperties = std::nullopt;
|
|
bool propertyReplace = true;
|
|
public:
|
|
VirtualPOFOperationChangeSubsystemData();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
};
|
|
|
|
class VirtualPOFOperationHeaderData : public VirtualPOFOperation {
|
|
std::optional<float> radius = std::nullopt;
|
|
std::optional<std::pair<vec3d, vec3d>> boundingbox = std::nullopt;
|
|
public:
|
|
VirtualPOFOperationHeaderData();
|
|
void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
|
|
}; |