void ColladaParser::ReadGeometry(XmlElement* e) { Geometry g; g.id = e->Attribute("id"); g.name = e->Attribute("name"); { auto v = e->Child("mesh")->Childs("source"); for (int ia = 0; ia < v.size(); ia++) g.ReadSource(v[ia]); } { auto v = e->Child("mesh")->Childs("vertices"); for (int ia = 0; ia < v.size(); ia++) { Geometry::Vertices vert; vert.id = v[ia]->Attribute("id"); vert.positionSourceId = ReadId(v[ia]->Child("input", "semantic", "POSITION")->Attribute("source")); vert.normalSourceId = ReadId(v[ia]->Child("input", "semantic", "NORMAL")->Attribute("source")); vert.texcoordSourceId = ReadId(v[ia]->Child("input", "semantic", "TEXCOORD")->Attribute("source")); g.vertices.emplace(vert.id, vert); } } auto t = e->Child("mesh")->Child("triangles"); auto count = ReadInt(t->Attribute("count")); g.triangleVerticesId = ReadId(t->Child("input")->Attribute("source")); g.triangleIndices = ReadInts(t->Child("p")->content, count * 3); geometries.emplace(g.id, g); }
void ColladaParser::Scene::ReadNode(XmlElement* e) { if (e->HasAttribute("type", "JOINT")) return; Scene::Node n; n.id = e->Attribute("id"); n.name = e->Attribute("name"); n.matrix = ReadFloats(e->Child("matrix")->content, 16); n.geometryId = ReadId(e->Child("instance_geometry")->Attribute("url")); this->nodes.emplace(n.id, n); }
void ColladaParser::Parse(const char* colladaFileData) { XmlParser p; p.Parse(colladaFileData); if (p.root.tagName != "COLLADA") throw "expected COLLADA as root element"; if (!p.root.HasAttribute("xmlns", "http://www.collada.org/2005/11/COLLADASchema") || !p.root.HasAttribute("version", "1.4.1")) throw "expected COLLADA as root element"; XmlElement* root = &p.root; { auto v = root->Child("library_geometries")->Childs("geometry"); for (int ia = 0; ia < v.size(); ia++) ReadGeometry(v[ia]); } if (root->HasChild("library_animations")) { auto v = root->Child("library_animations")->Childs("animation"); for (int ia = 0; ia < v.size(); ia++) ReadAnimations(v[ia]); } { auto v = root->Child("library_visual_scenes")->Childs("visual_scene"); for (int ia = 0; ia < v.size(); ia++) { ReadScene(v[ia]); } } auto sceneId = ReadId(root->Child("scene")->Child("instance_visual_scene")->Attribute("url")); currentScene = &scenes[sceneId]; int x = 2; }
Vector<String> PreprocessSchFile(const char *fn) { String s = LoadFile(fn); CParser p(s); String r = "using namespace Upp;"; String rr = "using namespace Upp;"; String S_name; int line; while(!p.IsEof()) try { line = p.GetLine(); if(p.Id("TABLE") || p.Id("TABLE_") || p.Id("TYPE") || p.Id("TYPE_")) { S_name = "S_" + SchId(p, rr); r << "struct " << S_name << " {"; } else if(p.Id("TABLE_I") || p.Id("TABLE_I_") || p.Id("TYPE_I") || p.Id("TYPE_I_")) { S_name = "S_" + SchId(p, rr); p.Char(','); String S_base = "S_" + p.ReadId(); r << "struct " << S_name << " : " << S_base << " {"; } else if(p.Id("TABLE_II") || p.Id("TABLE_II_") || p.Id("TYPE_II") || p.Id("TYPE_II_")) { S_name = "S_" + SchId(p, rr); p.Char(','); String S_base = "S_" + p.ReadId(); p.Char(','); String S_base2 = "S_" + p.ReadId(); r << "struct " << S_name << " : " << S_base << ", " << S_base2 << " {"; } else if(p.Id("TABLE_III") || p.Id("TABLE_III_") || p.Id("TYPE_III") || p.Id("TYPE_III_")) { S_name = "S_" + SchId(p, rr); p.Char(','); String S_base = "S_" + p.ReadId(); p.Char(','); String S_base2 = "S_" + p.ReadId(); p.Char(','); String S_base3 = "S_" + p.ReadId(); r << "struct " << S_name << " : " << S_base << ", " << S_base2 << ", " << S_base3 << " {"; } else if(p.Id("END_TABLE") || p.Id("END_TYPE")) r << "\t" "static const char TableName[];" "static const SqlSet& ColumnSet();" "static SqlSet ColumnSet(const String& prefix);" "static SqlSet Of(SqlId table);" "static const Vector<SqlId>& GetColumnIds();" "" "void Clear();" "" "void FieldLayoutRaw(FieldOperator& f, const String& prefix = String());" "void FieldLayout(FieldOperator& f);" "operator Fields();" "" "bool operator==(const " << S_name << "& x) const;" "bool operator!=(const " << S_name << "& x) const;" "String ToString() const;" "" "int GetCount() const;" "SqlId GetId(int i) const;" "Ref GetRef(int i);" "Ref GetRef(const SqlId& id);" "Value Get(const SqlId& id) const;" "Value Get(int i) const;" "ValueMap Get() const;" "void Set(int i, const Value& v);" "void Set(const SqlId& id, const Value& v);" "void Set(const ValueMap& m);" << S_name << "();" << S_name << "(const ValueMap& m);" "};"; else if(p.Id("LONGRAW") || p.Id("LONGRAW_") || p.Id("BLOB") || p.Id("BLOB_") || p.Id("STRING_") || p.Id("STRING") || p.Id("CLOB") || p.Id("CLOB_")) r << "\tString " << ReadId(p, rr) << ";"; else if(p.Id("INT") || p.Id("INT_") || p.Id("SERIAL") || p.Id("ISERIAL")) r << "\tint " << ReadId(p, rr) << ";"; else if(p.Id("DOUBLE") || p.Id("DOUBLE_")) r << "\tdouble " << ReadId(p, rr) << ";"; else if(p.Id("TIME") || p.Id("TIME_")) r << "\tTime " << ReadId(p, rr) << ";"; else if(p.Id("DATE") || p.Id("DATE_")) r << "\tDate " << ReadId(p, rr) << ";"; else if(p.Id("BIT") || p.Id("BIT_") || p.Id("BOOL") || p.Id("BOOL_")) r << "\tbool " << ReadId(p, rr) << ";"; else if(p.Id("INT_ARRAY") || p.Id("INT_ARRAY_")) r << "\tint " << ReadId(p, rr) << "[1];"; else if(p.Id("DOUBLE_ARRAY") || p.Id("DOUBLE_ARRAY_")) r << "\tdouble " << ReadId(p, rr) << "[1];"; else if(p.Id("TIME_ARRAY") || p.Id("TIME_ARRAY_")) r << "\tTime " << ReadId(p, rr) << "[1];"; else if(p.Id("DATE_ARRAY") || p.Id("DATE_ARRAY_")) r << "\tDate " << ReadId(p, rr) << "[1];"; else if(p.Id("BOOL_ARRAY") || p.Id("BOOL_ARRAY_") || p.Id("BIT_ARRAY") || p.Id("BIT_ARRAY_")) r << "\tbool " << ReadId(p, rr) << "[1];"; else if(p.Id("SEQUENCE") || p.Id("SEQUENCE_")) ReadId(p, rr); else p.SkipTerm(); line = p.GetLine() - line; for(int i = 0; i < line; ++i) { r << '\n'; rr << '\n'; } } catch(CParser::Error) {} return pick(Vector<String>() << r << rr); }
void GetRead(int64_t id) { GetRead ( ReadId ( id ) ); }