+void AssetLoader::LoadModels(
+ const string &set_name,
+ ModelRegistry &models,
+ ResourceIndex &tex_index,
+ const ShapeRegistry &shapes
+) const {
+ string full = data + set_name + ".models";
+ std::ifstream file(full);
+ if (!file) {
+ throw std::runtime_error("failed to open model file " + full);
+ }
+ TokenStreamReader in(file);
+ string model_name;
+ string prop_name;
+ while (in.HasMore()) {
+ in.ReadIdentifier(model_name);
+ in.Skip(Token::EQUALS);
+ in.Skip(Token::ANGLE_BRACKET_OPEN);
+ Model &model = models.Add(model_name);
+ while (in.HasMore() && in.Peek().type != Token::ANGLE_BRACKET_CLOSE) {
+ in.ReadIdentifier(prop_name);
+ in.Skip(Token::EQUALS);
+ if (prop_name == "root") {
+ model.RootPart().Read(in, tex_index, shapes);
+ } else if (prop_name == "eyes") {
+ model.SetEyes(in.GetULong());
+ } else {
+ while (in.HasMore() && in.Peek().type != Token::SEMICOLON) {
+ in.Next();
+ }
+ }
+ in.Skip(Token::SEMICOLON);
+ }
+ model.Enumerate();
+ in.Skip(Token::ANGLE_BRACKET_CLOSE);
+ in.Skip(Token::SEMICOLON);
+ }
+}
+
+void AssetLoader::LoadShapes(const string &set_name, ShapeRegistry &shapes) const {
+ string full = data + set_name + ".shapes";
+ std::ifstream file(full);
+ if (!file) {
+ throw std::runtime_error("failed to open shape file " + full);
+ }
+ TokenStreamReader in(file);
+ string shape_name;
+ while (in.HasMore()) {
+ in.ReadIdentifier(shape_name);
+ in.Skip(Token::EQUALS);
+ Shape &shape = shapes.Add(shape_name);
+ shape.Read(in);
+ in.Skip(Token::SEMICOLON);
+ }
+}
+