SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
FGD.h
Go to the documentation of this file.
1#pragma once
2
3#include <list>
4#include <string>
5#include <string_view>
6#include <unordered_map>
7#include <vector>
8
9#include <BufferStream.h>
10#include <sourcepp/Math.h>
11
12namespace toolpp {
13
14class FGD {
15public:
16 struct Entity {
18 std::string_view name;
19 std::string_view arguments;
20 };
21
22 struct Field {
23 std::string_view name;
24 std::string_view valueType;
27 std::string_view displayName;
28 std::string_view valueDefault;
29 std::string_view description;
30 };
31
32 struct FieldChoices {
33 struct Choice {
34 std::string_view value;
35 std::string_view displayName;
36 };
37
38 std::string_view name;
41 std::string_view displayName;
42 std::string_view valueDefault;
43 std::string_view description;
44 std::vector<Choice> choices;
45 };
46
47 struct FieldFlags {
48 struct Flag {
49 uint64_t value;
50 std::string_view displayName;
52 std::string_view description;
53 };
54
55 std::string_view name;
58 std::string_view displayName;
59 std::string_view description;
60 std::vector<Flag> flags;
61 };
62
63 struct IO {
64 std::string_view name;
65 std::string_view valueType;
66 std::string_view description;
67 };
68
69 std::string_view classType;
70 std::vector<ClassProperty> classProperties;
71
72 std::string_view description;
73 std::string_view docsURL;
74
75 std::vector<Field> fields;
76 std::vector<FieldChoices> fieldsWithChoices;
77 std::vector<FieldFlags> fieldsWithFlags;
78 std::vector<IO> inputs;
79 std::vector<IO> outputs;
80 };
81
82 struct AutoVisGroup {
83 std::string_view parentName;
84 std::string_view name;
85 std::vector<std::string_view> entities;
86 };
87
88 FGD() = default;
89
90 explicit FGD(const std::string& fgdPath);
91
97 void load(const std::string& fgdPath);
98
99 [[nodiscard]] int getVersion() const;
100
101 [[nodiscard]] sourcepp::math::Vec2i getMapSize() const;
102
103 [[nodiscard]] const std::unordered_map<std::string_view, Entity>& getEntities() const;
104
105 [[nodiscard]] const std::vector<std::string_view>& getMaterialExclusionDirs() const;
106
107 [[nodiscard]] const std::vector<AutoVisGroup>& getAutoVisGroups() const;
108
109protected:
110 void readEntities(BufferStreamReadOnly& stream, const std::string& path, std::vector<std::string>& seenPaths);
111
112 std::list<std::string> backingData;
113
114 int version = 0;
115 sourcepp::math::Vec2i mapSize{};
116 std::unordered_map<std::string_view, Entity> entities;
117 std::vector<std::string_view> materialExclusionDirs;
118 std::vector<AutoVisGroup> autoVisGroups;
119};
120
122public:
124 public:
125 explicit AutoVisGroupWriter(FGDWriter& parent_);
126
127 AutoVisGroupWriter& visGroup(const std::string& name, const std::vector<std::string>& entities);
128
129 FGDWriter& endAutoVisGroup() const; // NOLINT(*-use-nodiscard)
130
131 private:
132 FGDWriter& parent;
133 };
134
136 public:
138 public:
139 explicit KeyValueChoicesWriter(EntityWriter& parent_);
140
141 KeyValueChoicesWriter& choice(const std::string& value, const std::string& displayName);
142
143 EntityWriter& endKeyValueChoices() const; // NOLINT(*-use-nodiscard)
144
145 private:
146 EntityWriter& parent;
147 };
148
150 public:
151 explicit KeyValueFlagsWriter(EntityWriter& parent_);
152
153 KeyValueFlagsWriter& flag(uint64_t value, const std::string& displayName, bool enabledByDefault, const std::string& description = "");
154
155 EntityWriter& endKeyValueFlags() const; // NOLINT(*-use-nodiscard)
156
157 private:
158 EntityWriter& parent;
159 };
160
161 explicit EntityWriter(FGDWriter& parent_);
162
163 EntityWriter& keyValue(const std::string& name, const std::string& valueType, const std::string& displayName = "", const std::string& valueDefault = "", const std::string& description = "", bool readOnly = false, bool report = false);
164
165 KeyValueChoicesWriter beginKeyValueChoices(const std::string& name, const std::string& displayName = "", const std::string& valueDefault = "", const std::string& description = "", bool readOnly = false, bool report = false);
166
167 KeyValueFlagsWriter beginKeyValueFlags(const std::string& name, const std::string& displayName = "", const std::string& description = "", bool readOnly = false, bool report = false);
168
169 EntityWriter& input(const std::string& name, const std::string& valueType, const std::string& description = "");
170
171 EntityWriter& output(const std::string& name, const std::string& valueType, const std::string& description = "");
172
173 FGDWriter& endEntity() const; // NOLINT(*-use-nodiscard)
174
175 private:
176 FGDWriter& parent;
177 };
178
179 [[nodiscard]] static FGDWriter begin();
180
181 FGDWriter& include(const std::string& fgdPath);
182
184
185 FGDWriter& mapSize(sourcepp::math::Vec2i mapSize);
186
187 FGDWriter& materialExclusionDirs(const std::vector<std::string>& dirs);
188
189 AutoVisGroupWriter beginAutoVisGroup(const std::string& parentName);
190
191 EntityWriter beginEntity(const std::string& classType, const std::vector<std::string>& classProperties, const std::string& name, const std::string& description = "", const std::string& docsURL = "");
192
193 [[nodiscard]] std::string bake() const;
194
195 bool bake(const std::string& fgdPath) const; // NOLINT(*-use-nodiscard)
196
197protected:
198 FGDWriter();
199
200 std::string backingData;
201 BufferStream writer;
202};
203
204} // namespace fgdpp
AutoVisGroupWriter & visGroup(const std::string &name, const std::vector< std::string > &entities)
Definition: FGD.cpp:663
FGDWriter & endAutoVisGroup() const
Definition: FGD.cpp:678
KeyValueChoicesWriter & choice(const std::string &value, const std::string &displayName)
Definition: FGD.cpp:757
KeyValueFlagsWriter & flag(uint64_t value, const std::string &displayName, bool enabledByDefault, const std::string &description="")
Definition: FGD.cpp:788
KeyValueChoicesWriter beginKeyValueChoices(const std::string &name, const std::string &displayName="", const std::string &valueDefault="", const std::string &description="", bool readOnly=false, bool report=false)
Definition: FGD.cpp:741
EntityWriter & keyValue(const std::string &name, const std::string &valueType, const std::string &displayName="", const std::string &valueDefault="", const std::string &description="", bool readOnly=false, bool report=false)
Definition: FGD.cpp:723
FGDWriter & endEntity() const
Definition: FGD.cpp:847
EntityWriter & input(const std::string &name, const std::string &valueType, const std::string &description="")
Definition: FGD.cpp:811
EntityWriter & output(const std::string &name, const std::string &valueType, const std::string &description="")
Definition: FGD.cpp:829
KeyValueFlagsWriter beginKeyValueFlags(const std::string &name, const std::string &displayName="", const std::string &description="", bool readOnly=false, bool report=false)
Definition: FGD.cpp:772
std::string backingData
Definition: FGD.h:200
BufferStream writer
Definition: FGD.h:201
static FGDWriter begin()
Definition: FGD.cpp:614
FGDWriter & version(int version)
Definition: FGD.cpp:626
FGDWriter & mapSize(sourcepp::math::Vec2i mapSize)
Definition: FGD.cpp:634
AutoVisGroupWriter beginAutoVisGroup(const std::string &parentName)
Definition: FGD.cpp:655
FGDWriter & include(const std::string &fgdPath)
Definition: FGD.cpp:618
std::string bake() const
Definition: FGD.cpp:852
FGDWriter & materialExclusionDirs(const std::vector< std::string > &dirs)
Definition: FGD.cpp:644
EntityWriter beginEntity(const std::string &classType, const std::vector< std::string > &classProperties, const std::string &name, const std::string &description="", const std::string &docsURL="")
Definition: FGD.cpp:683
std::vector< AutoVisGroup > autoVisGroups
Definition: FGD.h:118
sourcepp::math::Vec2i getMapSize() const
Definition: FGD.cpp:524
std::vector< std::string_view > materialExclusionDirs
Definition: FGD.h:117
FGD()=default
std::unordered_map< std::string_view, Entity > entities
Definition: FGD.h:116
const std::vector< AutoVisGroup > & getAutoVisGroups() const
Definition: FGD.cpp:536
const std::unordered_map< std::string_view, Entity > & getEntities() const
Definition: FGD.cpp:528
int getVersion() const
Definition: FGD.cpp:520
void load(const std::string &fgdPath)
Can be called multiple times in succession to load multiple FGD files.
Definition: FGD.cpp:506
sourcepp::math::Vec2i mapSize
Definition: FGD.h:115
void readEntities(BufferStreamReadOnly &stream, const std::string &path, std::vector< std::string > &seenPaths)
Definition: FGD.cpp:541
const std::vector< std::string_view > & getMaterialExclusionDirs() const
Definition: FGD.cpp:532
std::list< std::string > backingData
Definition: FGD.h:112
int version
Definition: FGD.h:114
Definition: CmdSeq.h:9
std::vector< std::string_view > entities
Definition: FGD.h:85
std::string_view name
Definition: FGD.h:84
std::string_view parentName
Definition: FGD.h:83
std::string_view name
Definition: FGD.h:18
std::string_view arguments
Definition: FGD.h:19
std::string_view name
Definition: FGD.h:38
std::string_view displayName
Definition: FGD.h:41
std::string_view valueDefault
Definition: FGD.h:42
std::string_view description
Definition: FGD.h:43
std::vector< Choice > choices
Definition: FGD.h:44
std::string_view displayName
Definition: FGD.h:50
std::string_view description
Definition: FGD.h:52
std::vector< Flag > flags
Definition: FGD.h:60
std::string_view name
Definition: FGD.h:55
std::string_view displayName
Definition: FGD.h:58
std::string_view description
Definition: FGD.h:59
std::string_view valueDefault
Definition: FGD.h:28
std::string_view description
Definition: FGD.h:29
std::string_view name
Definition: FGD.h:23
std::string_view displayName
Definition: FGD.h:27
std::string_view valueType
Definition: FGD.h:24
std::string_view name
Definition: FGD.h:64
std::string_view valueType
Definition: FGD.h:65
std::string_view description
Definition: FGD.h:66
std::vector< ClassProperty > classProperties
Definition: FGD.h:70
std::vector< IO > inputs
Definition: FGD.h:78
std::vector< FieldFlags > fieldsWithFlags
Definition: FGD.h:77
std::vector< FieldChoices > fieldsWithChoices
Definition: FGD.h:76
std::vector< IO > outputs
Definition: FGD.h:79
std::string_view description
Definition: FGD.h:72
std::vector< Field > fields
Definition: FGD.h:75
std::string_view classType
Definition: FGD.h:69
std::string_view docsURL
Definition: FGD.h:73