1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
5 #include "Tools/Select/SelectTool.h"
9 class BevelTool
: public SelectTool
12 BevelTool(EDesignerTool tool
) :
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
;
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
;
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
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
86 std::vector
<std::pair
<BrushVec3
, BrushVec3
>> vIntermediate
;
88 void PP1_SubdivideApexPolygon(int nSubdivideNum
, const std::vector
<InfoForSubdivingApexPolygon
>& infoForSubdividingApexPolygonList
);
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
);
104 EBevelMode m_BevelMode
;
106 _smart_ptr
<Model
> m_pOriginalModel
;
107 ElementSet m_OriginalSelectedElements
;
109 std::vector
<PolygonPtr
> m_OriginalPolygons
;
113 int m_nDividedNumber
;