static fcl::CollisionGeometry * cl_init_mesh( const struct aa_rx_mesh *mesh ) { //printf("mesh\n"); //printf("n_verts: %u\n",mesh->n_vertices ); //printf("n_indices: %u\n",mesh->n_indices ); /* TODO: FCL should be able to reference external arrays for mesh * vertices and indices so that we don't have to copy the mesh. */ std::vector<fcl::Vec3f> vertices; std::vector<fcl::Triangle> triangles; /* fill vertices */ { const float *v = mesh->vertices; for( unsigned i = 0, j=0; i < mesh->n_vertices; i++ ) { unsigned x=j++; unsigned y=j++; unsigned z=j++; vertices.push_back( fcl::Vec3f(v[x], v[y], v[z]) ); } } //printf("filled verts\n"); /* fill faces*/ { const unsigned *f = mesh->indices; //printf("n_indices: %u\n",mesh->n_indices ); for( unsigned i=0, j=0; i < mesh->n_indices; i++ ) { unsigned x=j++; unsigned y=j++; unsigned z=j++; //printf("tri: %u, %u, %u, (%u)\n", x,y,z, 3*mesh->n_indices); triangles.push_back( fcl::Triangle(f[x], f[y], f[z]) ); } } //printf("filled tris\n"); auto model = new(fcl::BVHModel<fcl::OBBRSS>); model->beginModel(); model->addSubModel(vertices, triangles); model->endModel(); return model; }
void CompositeModel::updateSubModel(int id, std::string name, std::shared_ptr<AbstractModel> subModel){ subModels.erase(id); addSubModel(id, name, subModel); }
bool LDModelParser::parseModel( LDLModelLine *modelLine, TREModel *treModel, bool bfc, int activeColorNumber) { LDLModel *ldlModel = modelLine->getModel(); bool invert = modelLine->getBFCInvert(); if (bfc) { bfc = modelLine->getBFCOn(); } activeColorNumber = getActiveColorNumber(modelLine, activeColorNumber); if (ldlModel) { TREModel *model = NULL; std::string nameKey = modelNameKey(ldlModel, activeColorNumber); model = m_mainTREModel->modelNamed(nameKey.c_str(), bfc); if (model) { return addSubModel(modelLine, treModel, model, bfc && invert, activeColorNumber); } else { model = new TREModel; model->setMainModel(treModel->getMainModel()); model->setName(nameKey.c_str()); model->setPartFlag(ldlModel->isPart()); model->setNoShrinkFlag(ldlModel->getNoShrinkFlag()); if (m_flags.boundingBoxesOnly && ldlModel->isPart()) { TCVector minMax[2]; m_mainTREModel->registerModel(model, bfc); model->release(); ldlModel->getBoundingBox(minMax[0], minMax[1]); for (int i = 0; i < 6; i++) { addBoundingQuad(model, minMax, i); } return addSubModel(modelLine, treModel, model, bfc && invert, activeColorNumber); } else if (parseModel(ldlModel, model, bfc, activeColorNumber)) { m_mainTREModel->registerModel(model, bfc); model->release(); return addSubModel(modelLine, treModel, model, bfc && invert, activeColorNumber); } else { model->release(); return false; } } } else { return false; } }