Esempio n. 1
0
Color shadeWithMaterial(struct Scene* scene, struct HitRecord* record, Ray ray, int depth) {
    Color result = {0,0,0};
    Material material = *record->triangle->material;
    struct HitRecord temp_record = createHitRecord();
    Vector position = record->point;
    Vector new_direction;

    if(depth == scene->max_depth) {
        return result;
    }

    if(material.is_light) {
        return material.color;
    }

    Vector normal = record->triangle->normal;
    float costheta = dotVector(normal, ray.direction);

    if(costheta > 0) {
        normal = negateVector(normal);
    }

    float path = (double)rand()/(double)RAND_MAX;

    // diffuse BRDF
    if(path < .33) {
        new_direction = getDiffuseDirection(normal);
    }
    // BRDF (which is also diffuse)
    else if(path < .66) {
        new_direction = getDiffuseDirection(normal);
    }
    // point to light
    else {
        new_direction = getLightDirection(scene, position);
    }

    Ray new_ray = {position, new_direction};
    resetHitRecord(&temp_record);
    float cosphi = dotVector(normal, new_direction);

    if(cosphi > 0) {
        result = addColors(result, multiplyColorByNumber(hitScene(scene, &temp_record, new_ray, depth + 1), cosphi));
    }

    return multiplyColors(result, material.color);
}
  bool SemanticLabelsVisualization::visualize(const grid_map::GridMap& mapMsg)
  {
    if (!isActive()) return true;

    grid_map::GridMap map = mapMsg;

    if (!map.exists(elevationLayer_)) {
      ROS_WARN_STREAM("SemanticLabelsVisualization::visualize: No grid map layer with name '" << elevationLayer_ << "' found.");
      return false;
    }
    if (!map.exists(labelLayer_)) {
      ROS_WARN_STREAM("SemanticLabelsVisualization::visualize: No grid map layer with name '" << labelLayer_ << "' found.");
      return false;
    }

    float path_color;
    grid_map::colorVectorToValue(Eigen::Vector3i(255, 0, 0), path_color);

    for (grid_map::GridMapIterator iterator(map); !iterator.isPastEnd(); ++iterator)
    {
      // skip points without elevation (if set)
      if (!map.isValid(*iterator, elevationLayer_) && onlyShowElevation_)
      {
        continue;
      }



      auto& colorVal = map.at("color", *iterator);
      Eigen::Vector3i rgbVec;
      if (!map.isValid(*iterator, elevationLayer_))
      {
        rgbVec = Eigen::Vector3i(255, 255, 255);
      }
      else
      {
        rgbVec = colorVectorFromFloat(colorVal);
      }

      if(map.isValid(*iterator, labelLayer_))
      {
        auto labelIndex = static_cast<int>(map.at(labelLayer_, *iterator));
        if(labelIndex >= 0 && labelIndex < labelColors_.size())
        {
          multiplyColors(rgbVec, labelColors_.at(labelIndex));
          grid_map::colorVectorToValue(rgbVec, colorVal);
        }
      }

      if (!map.isValid(*iterator, elevationLayer_))
      {
        map.at(elevationLayer_, *iterator) = 0.0;
      }

      // add path in red above terrain
      if (map.isValid(*iterator, "path"))
      {
        map.at("color", *iterator) = path_color;
      }
    }
    sensor_msgs::PointCloud2 pointCloud;
    grid_map::GridMapRosConverter::toPointCloud(map, elevationLayer_, pointCloud);
    publisher_.publish(pointCloud);
    return true;
  }