Exemple #1
0
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;
	}
}