!XT (BREAK-16) (Sandbox) Remove double-newlines at the end of files.
[CRYENGINE.git] / Code / Sandbox / Plugins / CryDesigner / Tools / Modify / BevelTool.h
blob1310b2248edbee6873179d12a774941f97ef44e3
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 #pragma once
5 #include "Tools/Select/SelectTool.h"
7 namespace Designer
9 class BevelTool : public SelectTool
11 public:
12 BevelTool(EDesignerTool tool) :
13 SelectTool(tool),
14 m_nMousePrevY(0),
15 m_fDelta(0)
17 m_bAllowSelectionUndo = false;
20 bool OnLButtonDown(CViewport* view, UINT nFlags, CPoint point) override;
21 bool OnMouseMove(CViewport* view, UINT nFlags, CPoint point) override;
22 bool OnKeyDown(CViewport* view, uint32 nKeycode, uint32 nRepCnt, uint32 nFlags) override;
23 void Display(SDisplayContext& dc) override;
25 void Enter() override;
26 void Leave() override;
28 private:
29 typedef std::vector<std::pair<BrushVec3, BrushVec3>> MapBewteenSpreadedVertexAndApex;
30 typedef std::map<int, std::vector<BrushEdge3D>> MapBetweenElementIndexAndEdges;
31 typedef std::map<int, PolygonPtr> MapBetweenElementIndexAndOrignialPolygon;
32 struct MappingInfo
34 void Reset()
36 mapSpreadedVertex2Apex.clear();
37 mapElementIdx2Edges.clear();
38 mapElementIdx2OriginalPolygon.clear();
39 vertexSetToMakePolygon.clear();
41 MapBewteenSpreadedVertexAndApex mapSpreadedVertex2Apex;
42 MapBetweenElementIndexAndEdges mapElementIdx2Edges;
43 MapBetweenElementIndexAndOrignialPolygon mapElementIdx2OriginalPolygon;
44 std::set<BrushVec3, Comparison::less_BrushVec3> vertexSetToMakePolygon;
47 // First - Polygon, Second - EdgeIndex
48 typedef std::pair<PolygonPtr, int> EdgeIdentifier;
49 struct ResultForNextPhase
51 void Reset()
53 mapBetweenEdgeIdToApex.clear();
54 mapBetweenEdgeIdToVertex.clear();
55 middlePhaseEdgePolygons.clear();
56 middlePhaseSidePolygons.clear();
57 middlePhaseBottomPolygons.clear();
58 middlePhaseApexPolygons.clear();
60 std::map<EdgeIdentifier, BrushVec3> mapBetweenEdgeIdToApex;
61 std::map<EdgeIdentifier, BrushVec3> mapBetweenEdgeIdToVertex;
62 std::vector<PolygonPtr> middlePhaseEdgePolygons;
63 std::vector<PolygonPtr> middlePhaseSidePolygons;
64 std::vector<PolygonPtr> middlePhaseBottomPolygons;
65 std::vector<PolygonPtr> middlePhaseApexPolygons;
67 ResultForNextPhase m_ResultForSecondPhase;
69 bool PP0_Initialize(bool bSpreadEdge = false);
71 void PP0_SpreadEdges(int offset, bool bSpreadEdge = true);
72 bool PP1_PushEdgesAndVerticesOut(ResultForNextPhase& outResultForNextPhase, MappingInfo& outMappingInfo);
73 void PP1_MakeEdgePolygons(const MappingInfo& mappingInfo, ResultForNextPhase& outResultForNextPhase);
74 void PP2_MapBetweenEdgeIdToApexPos(
75 const MappingInfo& mappingInfo,
76 PolygonPtr pEdgePolygon,
77 const BrushEdge3D& sideEdge0,
78 const BrushEdge3D& sideEdge1,
79 ResultForNextPhase& outResultForNextPhase);
80 void PP1_MakeApexPolygons(const MappingInfo& mappingInfo, ResultForNextPhase& outResultForNextPhase);
81 void PP0_SubdivideSpreadedEdge(int nSubdivideNum);
83 struct InfoForSubdivingApexPolygon
85 BrushEdge3D edge;
86 std::vector<std::pair<BrushVec3, BrushVec3>> vIntermediate;
88 void PP1_SubdivideApexPolygon(int nSubdivideNum, const std::vector<InfoForSubdivingApexPolygon>& infoForSubdividingApexPolygonList);
90 private:
91 int GetEdgeCountHavingVertexInElementList(const BrushVec3& vertex, const ElementSet& elementList) const;
92 int FindCorrespondingEdge(const BrushEdge3D& e, const std::vector<InfoForSubdivingApexPolygon>& infoForSubdividingApexPolygonList) const;
94 std::vector<PolygonPtr> CreateFirstOddSubdividedApexPolygons(const std::vector<const InfoForSubdivingApexPolygon*>& subdividedEdges);
95 std::vector<PolygonPtr> CreateFirstEvenSubdividedApexPolygons(const std::vector<const InfoForSubdivingApexPolygon*>& subdividedEdges);
97 enum EBevelMode
99 eBevelMode_Nothing,
100 eBevelMode_Spread,
101 eBevelMode_Divide,
102 eBevelMode_Done,
104 EBevelMode m_BevelMode;
106 _smart_ptr<Model> m_pOriginalModel;
107 ElementSet m_OriginalSelectedElements;
109 std::vector<PolygonPtr> m_OriginalPolygons;
111 int m_nMousePrevY;
112 BrushFloat m_fDelta;
113 int m_nDividedNumber;