size_t BVH::FlattenTree(LinkedNode* current, size_t parent, size_t* offset) { LinearNode* node = &_nodes[*offset]; size_t my_offset = (*offset)++; node->bounds = current->bounds; node->parent = parent; if (current->children[0] == nullptr) { // Create leaf node. node->leaf = 1; node->index = current->index; } else { // Create interior node. node->leaf = 0; node->axis = current->split; FlattenTree(current->children[0], my_offset, offset); node->right = FlattenTree(current->children[1], my_offset, offset); } return my_offset; }
void CLogThread::addLogInfo(IArrayOf<IEspLogInfo>& valueArray,IPropertyTree& logInfo) { StringBuffer dataStr,nameStr,valueStr; Owned<IPropertyTreeIterator> itr = logInfo.getElements("*"); itr->first(); while(itr->isValid()) { IPropertyTree &node = itr->query(); const char* name = node.queryName(); if (getTreeFlattening()==true && node.hasChildren() == true) { if(IsArray(node)==true) { FlattenArray(valueArray,node,nameStr); } else { FlattenTree(valueArray,node,nameStr); } // logElement.setName(node.queryName()); // dataStr.clear(); /*toXML(&node,dataStr); //DOM temporary work about for the lack of XML decoding in esp arrays StringBuffer encodedData; JBASE64_Encode(dataStr.str(), dataStr.length() , encodedData); logElement.setData(encodedData.str()); */ } else if (getTreeFlattening()==false && node.hasChildren() == true) { IClientLogInfo& logElement = addLogInfoElement(valueArray); logElement.setName(node.queryName()); dataStr.clear(); toXML(&node,dataStr); //DOM temporary work about for the lack of XML decoding in esp arrays StringBuffer encodedData; JBASE64_Encode(dataStr.str(), dataStr.length() , encodedData); logElement.setData(encodedData.str()); } else if (node.queryProp("") != 0 && ( strcmp(node.queryProp(""),"0") != 0 )) { IClientLogInfo& logElement = addLogInfoElement(valueArray); logElement.setName(node.queryName()); logElement.setValue(node.queryProp("")); } itr->next(); } }
void BVH::Build(vector<PrimitiveInfo>& build_data) { // Recursively build the BVH tree. size_t total_nodes = 0; LinkedNode* root = RecursiveBuild(build_data, 0, build_data.size(), &total_nodes); // Flatten the tree into a linear representation. _nodes.reserve(total_nodes); for (size_t i = 0; i < total_nodes; i++) { _nodes.emplace_back(); } size_t offset = 0; FlattenTree(root, -1, &offset); assert(offset == total_nodes); // Release memory consumed by the linked tree. DeleteLinked(root); }
bool CLogThread::FlattenTree(IArrayOf<IEspLogInfo>& valueArray,IPropertyTree& tree,StringBuffer& RootName) { StringBuffer Value,Name; if (tree.hasChildren() == true) { Owned<IPropertyTreeIterator> itr = tree.getElements("*"); itr->first(); while(itr->isValid()) { IPropertyTree &node = itr->query(); if(RootName.length() > 0) Name.appendf("%s_",RootName.str()); Name.appendf("%s",node.queryName()); if (node.hasChildren() == true) { if(IsArray(node)==true) FlattenArray(valueArray,node,Name); else FlattenTree(valueArray,node,Name); } else { const char* _value = tree.queryProp(node.queryName()); if(tree.hasProp(node.queryName())==true && _value!=0 && _value!='\0') { Value.appendf("%s",tree.queryProp(node.queryName())); IClientLogInfo& logElement = addLogInfoElement(valueArray); logElement.setName(Name.str()); logElement.setValue(Value.str()); //DBGLOG("Add log element: %s, %s", Name.str(), Value.str()); Value.clear(); } } Name.clear(); itr->next(); } } else { return false; } return true; }