144 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Copyright (c) 2016-2018 Kiwano - Nomango
 | |
| //
 | |
| // Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
| // of this software and associated documentation files (the "Software"), to deal
 | |
| // in the Software without restriction, including without limitation the rights
 | |
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
| // copies of the Software, and to permit persons to whom the Software is
 | |
| // furnished to do so, subject to the following conditions:
 | |
| //
 | |
| // The above copyright notice and this permission notice shall be included in
 | |
| // all copies or substantial portions of the Software.
 | |
| //
 | |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | |
| // THE SOFTWARE.
 | |
| 
 | |
| #pragma once
 | |
| #include <kiwano/render/Shape.h>
 | |
| 
 | |
| namespace kiwano
 | |
| {
 | |
| 
 | |
| KGE_DECLARE_SMART_PTR(ShapeMaker);
 | |
| 
 | |
| /**
 | |
|  * \addtogroup Render
 | |
|  * @{
 | |
|  */
 | |
| 
 | |
| /// \~chinese
 | |
| /// @brief 形状合并方式
 | |
| enum class CombineMode
 | |
| {
 | |
|     Union,      ///< 并集 (A + B)
 | |
|     Intersect,  ///< 交集 (A + B)
 | |
|     Xor,        ///< 对称差集 ((A - B) + (B - A))
 | |
|     Exclude     ///< 差集 (A - B)
 | |
| };
 | |
| 
 | |
| /// \~chinese
 | |
| /// @brief 形状生成器
 | |
| class KGE_API ShapeMaker : public NativeObject
 | |
| {
 | |
| public:
 | |
|     /// \~chinese
 | |
|     /// @brief 创建形状生成器
 | |
|     static ShapeMakerPtr Create();
 | |
| 
 | |
|     ShapeMaker();
 | |
| 
 | |
|     ~ShapeMaker();
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 获取生成的形状
 | |
|     ShapePtr GetShape();
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 清空图形
 | |
|     void Clear();
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 开始添加路径并打开输入流
 | |
|     /// @param begin_pos 路径起始点
 | |
|     void BeginPath(const Point& begin_pos = Point());
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 结束路径并关闭输入流
 | |
|     /// @param closed 路径是否闭合
 | |
|     void EndPath(bool closed = false);
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 添加一条线段
 | |
|     /// @param point 端点
 | |
|     void AddLine(const Point& point);
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 添加多条线段
 | |
|     /// @param points 端点集合
 | |
|     void AddLines(const Vector<Point>& points);
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 添加多条线段
 | |
|     /// @param points 端点数组
 | |
|     /// @param count 端点数量
 | |
|     void AddLines(const Point* points, size_t count);
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 添加一条三次方贝塞尔曲线
 | |
|     /// @param point1 贝塞尔曲线的第一个控制点
 | |
|     /// @param point2 贝塞尔曲线的第二个控制点
 | |
|     /// @param point3 贝塞尔曲线的终点
 | |
|     void AddBezier(const Point& point1, const Point& point2, const Point& point3);
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 添加弧线
 | |
|     /// @param point 终点
 | |
|     /// @param radius 椭圆半径
 | |
|     /// @param rotation 椭圆旋转角度
 | |
|     /// @param clockwise 顺时针 or 逆时针
 | |
|     /// @param is_small 是否取小于 180° 的弧
 | |
|     void AddArc(const Point& point, const Size& radius, float rotation, bool clockwise = true, bool is_small = true);
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 合并形状
 | |
|     /// @param shape_a 输入的形状A
 | |
|     /// @param shape_b 输入的形状B
 | |
|     /// @param mode 合并方式
 | |
|     /// @param matrix 应用到输入形状B上的二维变换
 | |
|     /// @return 返回合并后的形状
 | |
|     static ShapePtr Combine(ShapePtr shape_a, ShapePtr shape_b, CombineMode mode, const Matrix3x2* matrix = nullptr);
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 设置生成的形状
 | |
|     /// @note 应由系统调用该函数
 | |
|     void SetShape(ShapePtr shape);
 | |
| 
 | |
| private:
 | |
|     /// \~chinese
 | |
|     /// @brief 打开输入流
 | |
|     /// @note 应由系统调用该函数
 | |
|     void OpenStream();
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 关闭输入流
 | |
|     /// @note 应由系统调用该函数
 | |
|     void CloseStream();
 | |
| 
 | |
|     /// \~chinese
 | |
|     /// @brief 输入流是否已经打开
 | |
|     /// @note 应由系统调用该函数
 | |
|     bool IsStreamOpened() const;
 | |
| 
 | |
| private:
 | |
|     ShapePtr shape_;
 | |
| };
 | |
| 
 | |
| /** @} */
 | |
| 
 | |
| }  // namespace kiwano
 |