void recursivelyRenderFact(Fact fact) { if (fact.type == "Section") { std::vector<Fact> facts = findChildFacts(fact.id); for (size_t i = 0; i < facts.size(); i++) { recursivelyRenderFact(facts[i]); } } else { std::cout << "Rendering fact " << fact.id << std::endl; renderFact(fact); std::vector<Proof> proofs = findProofsForFact(fact.id); for (size_t i = 0; i < proofs.size(); i++) { renderProof(proofs[i]); } } }
bool Terrain2FactorySaver::WriteDown (iBase *obj, iDocumentNode *parent, iStreamSource *ssource) { if (!parent) return false; //you never know... if (obj) { csRef<iDocumentNode> paramsNode = parent->CreateNodeBefore(CS_NODE_ELEMENT, 0); paramsNode->SetValue("params"); csRef<iTerrainFactory> tfact = scfQueryInterface<iTerrainFactory> (obj); if (!tfact) return false; { iTerrainRenderer* render (tfact->GetRenderer()); csRef<iFactory> renderFact (scfQueryInterfaceSafe<iFactory> (render)); if (renderFact.IsValid()) { csRef<iDocumentNode> node = paramsNode->CreateNodeBefore (CS_NODE_ELEMENT, 0); node->SetValue ("renderer"); node->CreateNodeBefore (CS_NODE_TEXT, 0) ->SetValue (renderFact->QueryClassID()); } } { iTerrainCollider* collide (tfact->GetCollider()); csRef<iFactory> collideFact (scfQueryInterfaceSafe<iFactory> (collide)); if (collideFact.IsValid()) { csRef<iDocumentNode> node = paramsNode->CreateNodeBefore (CS_NODE_ELEMENT, 0); node->SetValue ("collider"); node->CreateNodeBefore (CS_NODE_TEXT, 0) ->SetValue (collideFact->QueryClassID()); } } { iTerrainDataFeeder* feed (tfact->GetFeeder()); csRef<iFactory> feedFact (scfQueryInterfaceSafe<iFactory> (feed)); if (feedFact.IsValid()) { csRef<iDocumentNode> node = paramsNode->CreateNodeBefore (CS_NODE_ELEMENT, 0); node->SetValue ("feeder"); node->CreateNodeBefore (CS_NODE_TEXT, 0) ->SetValue (feedFact->QueryClassID()); } } { csRef<iDocumentNode> node = paramsNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("maxloadedcells"); node->CreateNodeBefore (CS_NODE_TEXT, 0) ->SetValueAsInt ((int)tfact->GetMaxLoadedCells()); } iTerrainFactoryCell* defaultCell = tfact->GetDefaultCell(); csRef<iDocumentNode> cellsNode = paramsNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); cellsNode->SetValue ("cells"); { csRef<iDocumentNode> defaultNode = cellsNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); defaultNode->SetValue ("celldefault"); { csRef<iDocumentNode> node = defaultNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("gridsize"); node->SetAttributeAsInt ("width", defaultCell->GetGridWidth()); node->SetAttributeAsInt ("height", defaultCell->GetGridHeight()); } { csRef<iDocumentNode> node = defaultNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("materialmapsize"); node->SetAttributeAsInt ("width", defaultCell->GetMaterialMapWidth()); node->SetAttributeAsInt ("height", defaultCell->GetMaterialMapHeight()); } { csRef<iDocumentNode> node = defaultNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("size"); synldr->WriteVector (node, defaultCell->GetSize()); } { iMaterialWrapper* basemat = defaultCell->GetBaseMaterial(); if (basemat) { csRef<iDocumentNode> node = defaultNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("basematerial"); node->CreateNodeBefore (CS_NODE_TEXT, 0) ->SetValue (basemat->QueryObject()->GetName()); } } synldr->WriteBool (defaultNode, "materialmappersistent", defaultCell->GetMaterialPersistent(), false); { iTerrainRenderer* render = tfact->GetRenderer(); csRef<iTerrainCellRenderProperties> defRenderProp = render ? render->CreateProperties () : 0; csRef<iDocumentNode> node = defaultNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("renderproperties"); if (!SaveRenderProperties (node, defaultCell->GetRenderProperties(), defRenderProp)) defaultNode->RemoveNode (node); } { iTerrainDataFeeder* feeder = tfact->GetFeeder(); csRef<iTerrainCellFeederProperties> defFeedProp = feeder ? feeder->CreateProperties () : 0; csRef<iDocumentNode> node = defaultNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("feederproperties"); if (!SaveFeederProperties (node, defaultCell->GetFeederProperties(), defFeedProp)) defaultNode->RemoveNode (node); } { iTerrainCollider* collider = tfact->GetCollider(); csRef<iTerrainCellCollisionProperties> defCollProp = collider ? collider->CreateProperties () : 0; csRef<iDocumentNode> node = defaultNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("colliderproperties"); if (!SaveProperties (node, defaultCell->GetCollisionProperties(), (iTerrainCellCollisionProperties*)defCollProp)) defaultNode->RemoveNode (node); } } size_t numCells = tfact->GetCellCount(); for (size_t c = 0; c < numCells; c++) { iTerrainFactoryCell* cell = tfact->GetCell (c); csRef<iDocumentNode> cellNode = cellsNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); cellNode->SetValue ("cell"); const char* name = cell->GetName(); if (name != 0) { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("name"); node->CreateNodeBefore (CS_NODE_TEXT, 0) ->SetValue (name); } { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("position"); synldr->WriteVector (node, cell->GetPosition()); } if ((defaultCell->GetGridWidth() != cell->GetGridWidth()) || (defaultCell->GetGridHeight() != cell->GetGridHeight())) { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("gridsize"); node->SetAttributeAsInt ("width", cell->GetGridWidth()); node->SetAttributeAsInt ("height", cell->GetGridHeight()); } if ((defaultCell->GetMaterialMapWidth() != cell->GetMaterialMapWidth()) || (defaultCell->GetMaterialMapHeight() != cell->GetMaterialMapHeight())) { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("materialmapsize"); node->SetAttributeAsInt ("width", cell->GetMaterialMapWidth()); node->SetAttributeAsInt ("height", cell->GetMaterialMapHeight()); } if (defaultCell->GetSize() != cell->GetSize()) { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("size"); synldr->WriteVector (node, cell->GetSize()); } if ((cell->GetBaseMaterial() != 0) && (defaultCell->GetBaseMaterial() != cell->GetBaseMaterial())) { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("basematerial"); node->CreateNodeBefore (CS_NODE_TEXT, 0) ->SetValue (cell->GetBaseMaterial()->QueryObject()->GetName()); } synldr->WriteBool (cellNode, "materialmappersistent", cell->GetMaterialPersistent(), defaultCell->GetMaterialPersistent()); { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("renderproperties"); if (!SaveRenderProperties (node, cell->GetRenderProperties(), defaultCell->GetRenderProperties())) cellNode->RemoveNode (node); } { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("feederproperties"); if (!SaveFeederProperties (node, cell->GetFeederProperties(), defaultCell->GetFeederProperties())) cellNode->RemoveNode (node); } { csRef<iDocumentNode> node = cellNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); node->SetValue ("colliderproperties"); if (!SaveProperties (node, cell->GetCollisionProperties(), defaultCell->GetCollisionProperties())) cellNode->RemoveNode (node); } } } return true; }