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);
}