namespace cv::viz

namespace viz {

// enums

enum RenderingProperties;
enum RepresentationValues;
enum ShadingValues;

// structs

struct WidgetAccessor;

// classes

class Camera;
class Color;
class KeyboardEvent;
class Mesh;
class MouseEvent;
class Viz3d;
class WArrow;
class WCameraPosition;
class WCircle;
class WCloud;
class WCloudCollection;
class WCloudNormals;
class WCone;
class WCoordinateSystem;
class WCube;
class WCylinder;
class WGrid;
class WImage3D;
class WImageOverlay;
class WLine;
class WMesh;
class WPaintedCloud;
class WPlane;
class WPolyLine;
class WSphere;
class WText;
class WText3D;
class WTrajectory;
class WTrajectoryFrustums;
class WTrajectorySpheres;
class WWidgetMerger;
class Widget;
class Widget2D;
class Widget3D;

// global functions

void
computeNormals(
    const Mesh& mesh,
    OutputArray normals
    );

Viz3d
getWindowByName(const String& window_name);

Viz3d
imshow(
    const String& window_name,
    InputArray image,
    const Size& window_size = Size(-1, -1)
    );

bool
isNan(float x);

bool
isNan(double x);

template <
    typename _Tp,
    int cn
    >
bool
isNan(const Vec<_Tp, cn>& v);

template <typename _Tp>
bool
isNan(const Point3_<_Tp>& p);

Affine3d
makeCameraPose(
    const Vec3d& position,
    const Vec3d& focal_point,
    const Vec3d& y_dir
    );

Affine3d
makeTransformToGlobal(
    const Vec3d& axis_x,
    const Vec3d& axis_y,
    const Vec3d& axis_z,
    const Vec3d& origin = Vec3d::all(0)
    );

Mat
readCloud(
    const String& file,
    OutputArray colors = noArray(),
    OutputArray normals = noArray()
    );

Mesh
readMesh(const String& file);

bool
readPose(
    const String& file,
    Affine3d& pose,
    const String& tag = "pose"
    );

void
readTrajectory(
    OutputArray traj,
    const String& files_format = "pose%05d.xml",
    int start = 0,
    int end = INT_MAX,
    const String& tag = "pose"
    );

void
unregisterAllWindows();

void
writeCloud(
    const String& file,
    InputArray cloud,
    InputArray colors = noArray(),
    InputArray normals = noArray(),
    bool binary = false
    );

void
writePose(
    const String& file,
    const Affine3d& pose,
    const String& tag = "pose"
    );

void
writeTrajectory(
    InputArray traj,
    const String& files_format = "pose%05d.xml",
    int start = 0,
    const String& tag = "pose"
    );

} // namespace viz