File: modelreplace.h

package info (click to toggle)
freespace2 24.2.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,716 kB
  • sloc: cpp: 595,001; ansic: 21,741; python: 1,174; sh: 457; makefile: 248; xml: 181
file content (148 lines) | stat: -rw-r--r-- 5,827 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma once

#include "globalincs/vmallocator.h"
#include "model/model.h"

#include <memory>

#include <tl/optional.hpp>
#include <mpark/variant.hpp>

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;
	tl::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 {
	mpark::variant<SCP_string, int> sourceId;
	tl::optional<SCP_string> renameSubsystem;
	tl::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;
	tl::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;
	tl::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;
	tl::optional<SCP_string> renameDock;
	SCP_unordered_map<SCP_string, SCP_string> renamePaths;
	tl::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;
	tl::optional<SCP_string> renamePath;
	tl::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;
	tl::optional<vec3d> setOffset = tl::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;
	tl::optional<vec3d> setPosition = tl::nullopt;
	tl::optional<float> setRadius = tl::nullopt;
	tl::optional<SCP_string> setProperties = tl::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 {
	tl::optional<float> radius = tl::nullopt;
	tl::optional<std::pair<vec3d, vec3d>> boundingbox = tl::nullopt;
public:
	VirtualPOFOperationHeaderData();
	void process(polymodel* pm, model_read_deferred_tasks& deferredTasks, model_parse_depth depth, const VirtualPOFDefinition& virtualPof) const override;
};