float PointCloudRenderer::getProtoScale(Renderable & renderable) { float factor = 1.0; if(renderable.pointcloud().has_units()) { factor = 1000.0/renderable.pointcloud().units(); } return factor; }
int PointCloudRenderer::fillPointList(Renderable & renderable, std::vector<SbVec3f> &points, std::vector<SbColor> &colors) { //Unpack the pointcloud just for future code berevity const PointCloudXYZRGB & pc(renderable.pointcloud()); int pointNum = pc.points_size(); points.reserve(pointNum); colors.reserve(pointNum); for(int i = 0; i < pointNum; ++i) { //Unpack the data from the nested data structures const PointXYZRGB & pc_colored_point(pc.points(i)); const PointXYZ & pc_point(pc_colored_point.point()); const ColorRGB & pc_color(pc_colored_point.color()); if (std::isnan(pc_point.x())) continue; //Put the data in the data structures points.push_back(SbVec3f(pc_point.x(), pc_point.y(), pc_point.z())); colors.push_back(SbColor(pc_color.red(), pc_color.green(), pc_color.blue())); } return pointNum; }
void PointCloudRenderer::setScale(SoSeparator *ivRoot, Renderable &renderable) { float factor = 1.0; factor = getProtoScale(renderable); if(renderable.pointcloud().has_units()) { factor = 1000.0/renderable.pointcloud().units(); } if (ivRoot->getNumChildren() < 2 || ivRoot->getChild(1)->getTypeId() != SoScale::getClassTypeId()) { ivRoot->insertChild(new SoScale(),1); } SoScale * cloudScale = static_cast<SoScale *>(ivRoot->getChild(1)); cloudScale->setName("PointCloudScale"); cloudScale->scaleFactor.setValue(factor, factor, factor); }