diff DPF-Prymula-audioplugins/dpf/dgl/Geometry.hpp @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DPF-Prymula-audioplugins/dpf/dgl/Geometry.hpp	Mon Oct 16 21:53:34 2023 +0200
@@ -0,0 +1,839 @@
+/*
+ * DISTRHO Plugin Framework (DPF)
+ * Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any purpose with
+ * or without fee is hereby granted, provided that the above copyright notice and this
+ * permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
+ * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef DGL_GEOMETRY_HPP_INCLUDED
+#define DGL_GEOMETRY_HPP_INCLUDED
+
+#include "Base.hpp"
+
+START_NAMESPACE_DGL
+
+// --------------------------------------------------------------------------------------------------------------------
+// Forward class names
+
+template<typename> class Line;
+template<typename> class Circle;
+template<typename> class Triangle;
+template<typename> class Rectangle;
+
+// --------------------------------------------------------------------------------------------------------------------
+
+/**
+   DGL Point class.
+
+   This class describes a single point in space, defined by an X and Y value.
+ */
+template<typename T>
+class Point
+{
+public:
+   /**
+      Constructor for (0, 0) point.
+    */
+    Point() noexcept;
+
+   /**
+      Constructor using custom X and Y values.
+    */
+    Point(const T& x, const T& y) noexcept;
+
+   /**
+      Constructor using another Point class values.
+    */
+    Point(const Point<T>& pos) noexcept;
+
+   /**
+      Get X value.
+    */
+    const T& getX() const noexcept;
+
+   /**
+      Get Y value.
+    */
+    const T& getY() const noexcept;
+
+   /**
+      Set X value to @a x.
+    */
+    void setX(const T& x) noexcept;
+
+   /**
+      Set Y value to @a y.
+    */
+    void setY(const T& y) noexcept;
+
+   /**
+      Set X and Y values to @a x and @a y respectively.
+    */
+    void setPos(const T& x, const T& y) noexcept;
+
+   /**
+      Set X and Y values according to @a pos.
+    */
+    void setPos(const Point<T>& pos) noexcept;
+
+   /**
+      Move this point by @a x and @a y values.
+    */
+    void moveBy(const T& x, const T& y) noexcept;
+
+   /**
+      Move this point by @a pos.
+    */
+    void moveBy(const Point<T>& pos) noexcept;
+
+   /**
+      Return true if point is (0, 0).
+    */
+    bool isZero() const noexcept;
+
+   /**
+      Return true if point is not (0, 0).
+    */
+    bool isNotZero() const noexcept;
+
+    Point<T> operator+(const Point<T>& pos) noexcept;
+    Point<T> operator-(const Point<T>& pos) noexcept;
+    Point<T>& operator=(const Point<T>& pos) noexcept;
+    Point<T>& operator+=(const Point<T>& pos) noexcept;
+    Point<T>& operator-=(const Point<T>& pos) noexcept;
+    bool operator==(const Point<T>& pos) const noexcept;
+    bool operator!=(const Point<T>& pos) const noexcept;
+
+private:
+    T x, y;
+    template<typename> friend class Line;
+    template<typename> friend class Circle;
+    template<typename> friend class Triangle;
+    template<typename> friend class Rectangle;
+};
+
+// --------------------------------------------------------------------------------------------------------------------
+
+/**
+   DGL Size class.
+
+   This class describes a size, defined by a width and height value.
+ */
+template<typename T>
+class Size
+{
+public:
+   /**
+      Constructor for null size (0x0).
+    */
+    Size() noexcept;
+
+   /**
+      Constructor using custom width and height values.
+    */
+    Size(const T& width, const T& height) noexcept;
+
+   /**
+      Constructor using another Size class values.
+    */
+    Size(const Size<T>& size) noexcept;
+
+   /**
+      Get width.
+    */
+    const T& getWidth() const noexcept;
+
+   /**
+      Get height.
+    */
+    const T& getHeight() const noexcept;
+
+   /**
+      Set width.
+    */
+    void setWidth(const T& width) noexcept;
+
+   /**
+      Set height.
+    */
+    void setHeight(const T& height) noexcept;
+
+   /**
+      Set size to @a width and @a height.
+    */
+    void setSize(const T& width, const T& height) noexcept;
+
+   /**
+      Set size.
+    */
+    void setSize(const Size<T>& size) noexcept;
+
+   /**
+      Grow size by @a multiplier.
+    */
+    void growBy(double multiplier) noexcept;
+
+   /**
+      Shrink size by @a divider.
+    */
+    void shrinkBy(double divider) noexcept;
+
+   /**
+      Return true if size is null (0x0).
+      An null size is also invalid.
+    */
+    bool isNull() const noexcept;
+
+   /**
+      Return true if size is not null (0x0).
+      A non-null size is still invalid if its width or height are negative.
+    */
+    bool isNotNull() const noexcept;
+
+   /**
+      Return true if size is valid (width and height are higher than zero).
+    */
+    bool isValid() const noexcept;
+
+   /**
+      Return true if size is invalid (width or height are lower or equal to zero).
+      An invalid size might not be null under some circumstances.
+    */
+    bool isInvalid() const noexcept;
+
+    Size<int> toInt() const noexcept;
+
+    Size<T> operator+(const Size<T>& size) noexcept;
+    Size<T> operator-(const Size<T>& size) noexcept;
+    Size<T>& operator=(const Size<T>& size) noexcept;
+    Size<T>& operator+=(const Size<T>& size) noexcept;
+    Size<T>& operator-=(const Size<T>& size) noexcept;
+    Size<T>& operator*=(double m) noexcept;
+    Size<T>& operator/=(double d) noexcept;
+    Size<T> operator*(double m) const noexcept;
+    Size<T> operator/(double m) const noexcept;
+    bool operator==(const Size<T>& size) const noexcept;
+    bool operator!=(const Size<T>& size) const noexcept;
+
+private:
+    T fWidth, fHeight;
+    template<typename> friend class Rectangle;
+};
+
+// -----------------------------------------------------------------------
+
+/**
+   DGL Line class.
+
+   This class describes a line, defined by two points.
+ */
+template<typename T>
+class Line
+{
+public:
+   /**
+      Constructor for a null line ([0,0] to [0,0]).
+    */
+    Line() noexcept;
+
+   /**
+      Constructor using custom start X, start Y, end X and end Y values.
+    */
+    Line(const T& startX, const T& startY, const T& endX, const T& endY) noexcept;
+
+   /**
+      Constructor using custom start X, start Y and end pos values.
+    */
+    Line(const T& startX, const T& startY, const Point<T>& endPos) noexcept;
+
+   /**
+      Constructor using custom start pos, end X and end Y values.
+    */
+    Line(const Point<T>& startPos, const T& endX, const T& endY) noexcept;
+
+   /**
+      Constructor using custom start and end pos values.
+    */
+    Line(const Point<T>& startPos, const Point<T>& endPos) noexcept;
+
+   /**
+      Constructor using another Line class values.
+    */
+    Line(const Line<T>& line) noexcept;
+
+   /**
+      Get start X value.
+    */
+    const T& getStartX() const noexcept;
+
+   /**
+      Get start Y value.
+    */
+    const T& getStartY() const noexcept;
+
+   /**
+      Get end X value.
+    */
+    const T& getEndX() const noexcept;
+
+   /**
+      Get end Y value.
+    */
+    const T& getEndY() const noexcept;
+
+   /**
+      Get start position.
+    */
+    const Point<T>& getStartPos() const noexcept;
+
+   /**
+      Get end position.
+    */
+    const Point<T>& getEndPos() const noexcept;
+
+   /**
+      Set start X value to @a x.
+    */
+    void setStartX(const T& x) noexcept;
+
+   /**
+      Set start Y value to @a y.
+    */
+    void setStartY(const T& y) noexcept;
+
+   /**
+      Set start X and Y values to @a x and @a y respectively.
+    */
+    void setStartPos(const T& x, const T& y) noexcept;
+
+   /**
+      Set start X and Y values according to @a pos.
+    */
+    void setStartPos(const Point<T>& pos) noexcept;
+
+   /**
+      Set end X value to @a x.
+    */
+    void setEndX(const T& x) noexcept;
+
+   /**
+      Set end Y value to @a y.
+    */
+    void setEndY(const T& y) noexcept;
+
+   /**
+      Set end X and Y values to @a x and @a y respectively.
+    */
+    void setEndPos(const T& x, const T& y) noexcept;
+
+   /**
+      Set end X and Y values according to @a pos.
+    */
+    void setEndPos(const Point<T>& pos) noexcept;
+
+   /**
+      Move this line by @a x and @a y values.
+    */
+    void moveBy(const T& x, const T& y) noexcept;
+
+   /**
+      Move this line by @a pos.
+    */
+    void moveBy(const Point<T>& pos) noexcept;
+
+   /**
+      Return true if line is null (start and end pos are equal).
+    */
+    bool isNull() const noexcept;
+
+   /**
+      Return true if line is not null (start and end pos are different).
+    */
+    bool isNotNull() const noexcept;
+
+#ifndef DPF_TEST_POINT_CPP
+   /**
+      Draw this line using the provided graphics context, optionally specifying line width.
+    */
+    void draw(const GraphicsContext& context, T width = 1);
+#endif
+
+    Line<T>& operator=(const Line<T>& line) noexcept;
+    bool operator==(const Line<T>& line) const noexcept;
+    bool operator!=(const Line<T>& line) const noexcept;
+
+#ifndef DPF_TEST_POINT_CPP
+   /**
+      Draw this line using the current OpenGL state.@n
+      DEPRECATED Please use draw(const GraphicsContext&) instead.
+    */
+    DISTRHO_DEPRECATED_BY("draw(const GraphicsContext&)")
+    void draw();
+#endif
+
+private:
+    Point<T> posStart, posEnd;
+};
+
+// -----------------------------------------------------------------------
+
+/**
+   DGL Circle class.
+
+   This class describes a circle, defined by position, size and a minimum of 3 segments.
+
+   TODO: report if circle starts at top-left, bottom-right or center.
+         and size grows from which point?
+ */
+template<typename T>
+class Circle
+{
+public:
+   /**
+      Constructor for a null circle.
+    */
+    Circle() noexcept;
+
+   /**
+      Constructor using custom X, Y and size values.
+    */
+    Circle(const T& x, const T& y, const float size, const uint numSegments = 300);
+
+   /**
+      Constructor using custom position and size values.
+    */
+    Circle(const Point<T>& pos, const float size, const uint numSegments = 300);
+
+   /**
+      Constructor using another Circle class values.
+    */
+    Circle(const Circle<T>& cir) noexcept;
+
+   /**
+      Get X value.
+    */
+    const T& getX() const noexcept;
+
+   /**
+      Get Y value.
+    */
+    const T& getY() const noexcept;
+
+   /**
+      Get position.
+    */
+    const Point<T>& getPos() const noexcept;
+
+   /**
+      Set X value to @a x.
+    */
+    void setX(const T& x) noexcept;
+
+   /**
+      Set Y value to @a y.
+    */
+    void setY(const T& y) noexcept;
+
+   /**
+      Set X and Y values to @a x and @a y respectively.
+    */
+    void setPos(const T& x, const T& y) noexcept;
+
+   /**
+      Set X and Y values according to @a pos.
+    */
+    void setPos(const Point<T>& pos) noexcept;
+
+   /**
+      Get size.
+    */
+    float getSize() const noexcept;
+
+   /**
+      Set size.
+      @note Must always be > 0
+    */
+    void setSize(const float size) noexcept;
+
+   /**
+      Get the current number of line segments that make this circle.
+    */
+    uint getNumSegments() const noexcept;
+
+   /**
+      Set the number of line segments that will make this circle.
+      @note Must always be >= 3
+    */
+    void setNumSegments(const uint num);
+
+   /**
+      Draw this circle using the provided graphics context.
+    */
+    void draw(const GraphicsContext& context);
+
+   /**
+      Draw lines (outline of this circle) using the provided graphics context, optionally specifying line width.
+    */
+    void drawOutline(const GraphicsContext& context, T lineWidth = 1);
+
+    Circle<T>& operator=(const Circle<T>& cir) noexcept;
+    bool operator==(const Circle<T>& cir) const noexcept;
+    bool operator!=(const Circle<T>& cir) const noexcept;
+
+#ifndef DPF_TEST_POINT_CPP
+   /**
+      Draw this circle using the current OpenGL state.@n
+      DEPRECATED Please use draw(const GraphicsContext&) instead.
+    */
+    DISTRHO_DEPRECATED_BY("draw(const GraphicsContext&)")
+    void draw();
+
+   /**
+      Draw lines (outline of this circle) using the current OpenGL state.@n
+      DEPRECATED Please use drawOutline(const GraphicsContext&,T) instead.
+    */
+    DISTRHO_DEPRECATED_BY("drawOutline(const GraphicsContext&)")
+    void drawOutline();
+#endif
+
+private:
+    Point<T> fPos;
+    float    fSize;
+    uint     fNumSegments;
+
+    // cached values
+    float fTheta, fCos, fSin;
+};
+
+// -----------------------------------------------------------------------
+
+/**
+   DGL Triangle class.
+
+   This class describes a triangle, defined by 3 points.
+ */
+template<typename T>
+class Triangle
+{
+public:
+   /**
+      Constructor for a null triangle.
+    */
+    Triangle() noexcept;
+
+   /**
+      Constructor using custom X and Y values.
+    */
+    Triangle(const T& x1, const T& y1, const T& x2, const T& y2, const T& x3, const T& y3) noexcept;
+
+   /**
+      Constructor using custom position values.
+    */
+    Triangle(const Point<T>& pos1, const Point<T>& pos2, const Point<T>& pos3) noexcept;
+
+   /**
+      Constructor using another Triangle class values.
+    */
+    Triangle(const Triangle<T>& tri) noexcept;
+
+   /**
+      Return true if triangle is null (all its points are equal).
+      An null triangle is also invalid.
+    */
+    bool isNull() const noexcept;
+
+   /**
+      Return true if triangle is not null (one its points is different from the others).
+      A non-null triangle is still invalid if two of its points are equal.
+    */
+    bool isNotNull() const noexcept;
+
+   /**
+      Return true if triangle is valid (all its points are different).
+    */
+    bool isValid() const noexcept;
+
+   /**
+      Return true if triangle is invalid (one or two of its points are equal).
+      An invalid triangle might not be null under some circumstances.
+    */
+    bool isInvalid() const noexcept;
+
+   /**
+      Draw this triangle using the provided graphics context.
+    */
+    void draw(const GraphicsContext& context);
+
+   /**
+      Draw lines (outline of this triangle) using the provided graphics context, optionally specifying line width.
+    */
+    void drawOutline(const GraphicsContext& context, T lineWidth = 1);
+
+    Triangle<T>& operator=(const Triangle<T>& tri) noexcept;
+    bool operator==(const Triangle<T>& tri) const noexcept;
+    bool operator!=(const Triangle<T>& tri) const noexcept;
+
+#ifndef DPF_TEST_POINT_CPP
+   /**
+      Draw this triangle using the current OpenGL state.@n
+      DEPRECATED Please use draw(const GraphicsContext&) instead.
+    */
+    DISTRHO_DEPRECATED_BY("draw(const GraphicsContext&)")
+    void draw();
+
+   /**
+      Draw lines (outline of this triangle) using the current OpenGL state.@n
+      DEPRECATED Please use drawOutline(const GraphicsContext&,T) instead.
+    */
+    DISTRHO_DEPRECATED_BY("drawOutline(const GraphicsContext&)")
+    void drawOutline();
+#endif
+
+private:
+    Point<T> pos1, pos2, pos3;
+};
+
+// -----------------------------------------------------------------------
+
+/**
+   DGL Rectangle class.
+
+   This class describes a rectangle, defined by a starting point and a size.
+ */
+template<typename T>
+class Rectangle
+{
+public:
+   /**
+      Constructor for a null rectangle.
+    */
+    Rectangle() noexcept;
+
+   /**
+      Constructor using custom X, Y, width and height values.
+    */
+    Rectangle(const T& x, const T& y, const T& width, const T& height) noexcept;
+
+   /**
+      Constructor using custom X, Y and size values.
+    */
+    Rectangle(const T& x, const T& y, const Size<T>& size) noexcept;
+
+   /**
+      Constructor using custom pos, width and height values.
+    */
+    Rectangle(const Point<T>& pos, const T& width, const T& height) noexcept;
+
+   /**
+      Constructor using custom position and size.
+    */
+    Rectangle(const Point<T>& pos, const Size<T>& size) noexcept;
+
+   /**
+      Constructor using another Rectangle class values.
+    */
+    Rectangle(const Rectangle<T>& rect) noexcept;
+
+   /**
+      Get X value.
+    */
+    const T& getX() const noexcept;
+
+   /**
+      Get Y value.
+    */
+    const T& getY() const noexcept;
+
+   /**
+      Get width.
+    */
+    const T& getWidth() const noexcept;
+
+   /**
+      Get height.
+    */
+    const T& getHeight() const noexcept;
+
+   /**
+      Get position.
+    */
+    const Point<T>& getPos() const noexcept;
+
+   /**
+      Get size.
+    */
+    const Size<T>& getSize() const noexcept;
+
+   /**
+      Set X value as @a x.
+    */
+    void setX(const T& x) noexcept;
+
+   /**
+      Set Y value as @a y.
+    */
+    void setY(const T& y) noexcept;
+
+   /**
+      Set X and Y values as @a x and @a y respectively.
+    */
+    void setPos(const T& x, const T& y) noexcept;
+
+   /**
+      Set X and Y values according to @a pos.
+    */
+    void setPos(const Point<T>& pos) noexcept;
+
+   /**
+      Move this rectangle by @a x and @a y values.
+    */
+    void moveBy(const T& x, const T& y) noexcept;
+
+   /**
+      Move this rectangle by @a pos.
+    */
+    void moveBy(const Point<T>& pos) noexcept;
+
+   /**
+      Set width.
+    */
+    void setWidth(const T& width) noexcept;
+
+   /**
+      Set height.
+    */
+    void setHeight(const T& height) noexcept;
+
+   /**
+      Set size using @a width and @a height.
+    */
+    void setSize(const T& width, const T& height) noexcept;
+
+   /**
+      Set size.
+    */
+    void setSize(const Size<T>& size) noexcept;
+
+   /**
+      Grow size by @a multiplier.
+    */
+    void growBy(double multiplier) noexcept;
+
+   /**
+      Shrink size by @a divider.
+    */
+    void shrinkBy(double divider) noexcept;
+
+   /**
+      Set rectangle using @a pos and @a size.
+    */
+    void setRectangle(const Point<T>& pos, const Size<T>& size) noexcept;
+
+   /**
+      Set rectangle.
+    */
+    void setRectangle(const Rectangle<T>& rect) noexcept;
+
+   /**
+      Check if this rectangle contains the point defined by @a X and @a Y.
+    */
+    bool contains(const T& x, const T& y) const noexcept;
+
+   /**
+      Check if this rectangle contains the point @a pos.
+    */
+    bool contains(const Point<T>& pos) const noexcept;
+
+   /**
+      Check if this rectangle contains the point @a pos affected by a custom scale.
+    */
+    bool containsAfterScaling(const Point<T>& pos, double scaling) const noexcept;
+
+   /**
+      Check if this rectangle contains the point @a pos of another type.
+    */
+    template<typename T2>
+    bool contains(const Point<T2>& pos) const noexcept;
+
+   /**
+      Check if this rectangle contains X.
+    */
+    bool containsX(const T& x) const noexcept;
+
+   /**
+      Check if this rectangle contains Y.
+    */
+    bool containsY(const T& y) const noexcept;
+
+   /**
+      Return true if size is null (0x0).
+      An null size is also invalid.
+    */
+    bool isNull() const noexcept;
+
+   /**
+      Return true if size is not null (0x0).
+      A non-null size is still invalid if its width or height are negative.
+    */
+    bool isNotNull() const noexcept;
+
+   /**
+      Return true if size is valid (width and height are higher than zero).
+    */
+    bool isValid() const noexcept;
+
+   /**
+      Return true if size is invalid (width or height are lower or equal to zero).
+      An invalid size might not be null under some circumstances.
+    */
+    bool isInvalid() const noexcept;
+
+   /**
+      Draw this rectangle using the provided graphics context.
+    */
+    void draw(const GraphicsContext& context);
+
+   /**
+      Draw lines (outline of this rectangle) using the provided graphics context, optionally specifying line width.
+    */
+    void drawOutline(const GraphicsContext& context, T lineWidth = 1);
+
+    Rectangle<T>& operator=(const Rectangle<T>& rect) noexcept;
+    Rectangle<T>& operator*=(double m) noexcept;
+    Rectangle<T>& operator/=(double d) noexcept;
+    bool operator==(const Rectangle<T>& size) const noexcept;
+    bool operator!=(const Rectangle<T>& size) const noexcept;
+
+   /**
+      Draw this rectangle using the current OpenGL state.@n
+      DEPRECATED Please use draw(const GraphicsContext&) instead.
+    */
+    DISTRHO_DEPRECATED_BY("draw(const GraphicsContext&)")
+    void draw();
+
+   /**
+      Draw lines (outline of this rectangle) using the current OpenGL state.@n
+      DEPRECATED Please use drawOutline(const GraphicsContext&,T) instead.
+    */
+    DISTRHO_DEPRECATED_BY("drawOutline(const GraphicsContext&)")
+    void drawOutline();
+
+private:
+    Point<T> pos;
+    Size<T> size;
+};
+
+// -----------------------------------------------------------------------
+
+END_NAMESPACE_DGL
+
+#endif // DGL_GEOMETRY_HPP_INCLUDED