1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
5 #include "DesignerEditor.h"
6 #include "Core/UVIslandManager.h"
7 #include "UVMappingEditor.h"
13 bool UVElement::IsEquivalentEdge(const UVElement
& element
) const
15 if (!IsEdge() || !element
.IsEdge())
18 if (m_pUVIsland
!= element
.m_pUVIsland
)
21 if (m_UVVertices
[0].pPolygon
== element
.m_UVVertices
[0].pPolygon
)
23 if (m_UVVertices
[0].vIndex
== element
.m_UVVertices
[0].vIndex
&& m_UVVertices
[1].vIndex
== element
.m_UVVertices
[1].vIndex
)
26 if (m_UVVertices
[0].vIndex
== element
.m_UVVertices
[1].vIndex
&& m_UVVertices
[1].vIndex
== element
.m_UVVertices
[0].vIndex
)
31 const Vec2
& uv00
= m_UVVertices
[0].GetUV();
32 const Vec2
& uv01
= m_UVVertices
[1].GetUV();
34 const Vec2
& uv10
= element
.m_UVVertices
[0].GetUV();
35 const Vec2
& uv11
= element
.m_UVVertices
[1].GetUV();
37 if (Comparison::IsEquivalent(uv00
, uv10
) && Comparison::IsEquivalent(uv01
, uv11
) || Comparison::IsEquivalent(uv00
, uv11
) && Comparison::IsEquivalent(uv01
, uv10
))
44 bool UVElement::HasEdge(const UVElement
& element
) const
46 if (!IsPolygon() || !element
.IsEdge())
49 for (int i
= 0, iCount(m_UVVertices
.size()); i
< iCount
; ++i
)
51 const UVVertex
& v0
= m_UVVertices
[i
];
52 const UVVertex
& v1
= m_UVVertices
[(i
+ 1) % iCount
];
54 if (v0
.pPolygon
== element
.m_UVVertices
[0].pPolygon
)
56 if ((v0
.vIndex
== element
.m_UVVertices
[0].vIndex
&& v1
.vIndex
== element
.m_UVVertices
[1].vIndex
) ||
57 (v0
.vIndex
== element
.m_UVVertices
[1].vIndex
&& v1
.vIndex
== element
.m_UVVertices
[0].vIndex
))
64 const Vec2
& uv0
= v0
.GetUV();
65 const Vec2
& uv1
= v1
.GetUV();
67 const Vec2
& element_uv0
= element
.m_UVVertices
[0].GetUV();
68 const Vec2
& element_uv1
= element
.m_UVVertices
[1].GetUV();
70 if ((Comparison::IsEquivalent(uv0
, element_uv0
) && Comparison::IsEquivalent(uv1
, element_uv1
)) || (Comparison::IsEquivalent(uv0
, element_uv1
) && Comparison::IsEquivalent(uv1
, element_uv0
)))
78 bool UVElementSet::AddElement(const UVElement
& element
)
80 const UVElement
* pElement
= FindElement(element
);
83 m_Elements
.push_back(element
);
87 bool UVElementSet::AddSharedOtherElements(const UVElement
& element
)
89 if (element
.m_UVVertices
.empty())
92 UVIslandManager
* pUVIslandMgr
= GetUVEditor()->GetUVIslandMgr();
94 for (int i
= 0, iCount(pUVIslandMgr
->GetCount()); i
< iCount
; ++i
)
96 UVIslandPtr pUVIsland
= pUVIslandMgr
->GetUVIsland(i
);
98 for (int k
= 0, iPolygonCount(pUVIsland
->GetCount()); k
< iPolygonCount
; ++k
)
100 PolygonPtr polygon
= pUVIsland
->GetPolygon(k
);
101 if (element
.m_UVVertices
[0].pPolygon
== polygon
)
104 if (element
.IsVertex())
107 if (polygon
->GetVertexIndex(element
.m_UVVertices
[0].GetPos(), vtxIdx
))
109 if (!Comparison::IsEquivalent(element
.m_UVVertices
[0].GetUV(), polygon
->GetUV(vtxIdx
)))
110 AddElement(UVElement(UVVertex(pUVIsland
, polygon
, vtxIdx
)));
113 else if (element
.IsEdge())
117 if (polygon
->GetVertexIndex(element
.m_UVVertices
[0].GetPos(), vtxIdx0
) && polygon
->GetVertexIndex(element
.m_UVVertices
[1].GetPos(), vtxIdx1
))
119 if (!(Comparison::IsEquivalent(element
.m_UVVertices
[1].GetUV(), polygon
->GetUV(vtxIdx0
)) && Comparison::IsEquivalent(element
.m_UVVertices
[0].GetUV(), polygon
->GetUV(vtxIdx1
))) &&
120 !(Comparison::IsEquivalent(element
.m_UVVertices
[0].GetUV(), polygon
->GetUV(vtxIdx0
)) && Comparison::IsEquivalent(element
.m_UVVertices
[1].GetUV(), polygon
->GetUV(vtxIdx1
))))
122 AddElement(UVElement(UVEdge(pUVIsland
, UVVertex(pUVIsland
, polygon
, vtxIdx1
), UVVertex(pUVIsland
, polygon
, vtxIdx0
))));
132 void UVElementSet::EraseAllElementWithIdenticalUVs(const UVElement
& element
)
134 auto ii
= m_Elements
.begin();
135 for (; ii
!= m_Elements
.end(); )
137 bool bErased
= false;
138 if (ii
->IsVertex() && element
.IsVertex())
140 if (Comparison::IsEquivalent(ii
->m_UVVertices
[0].GetUV(), element
.m_UVVertices
[0].GetUV()))
142 ii
= m_Elements
.erase(ii
);
146 else if (ii
->IsEdge() && element
.IsEdge())
148 if (Comparison::IsEquivalent(ii
->m_UVVertices
[0].GetUV(), element
.m_UVVertices
[0].GetUV()) && Comparison::IsEquivalent(ii
->m_UVVertices
[1].GetUV(), element
.m_UVVertices
[1].GetUV()) ||
149 Comparison::IsEquivalent(ii
->m_UVVertices
[0].GetUV(), element
.m_UVVertices
[1].GetUV()) && Comparison::IsEquivalent(ii
->m_UVVertices
[1].GetUV(), element
.m_UVVertices
[0].GetUV()))
151 ii
= m_Elements
.erase(ii
);
160 void UVElementSet::EraseElement(const UVElement
& element
)
162 for (auto ii
= m_Elements
.begin(); ii
!= m_Elements
.end(); )
165 ii
= m_Elements
.erase(ii
);
171 bool UVElementSet::HasElement(const UVElement
& element
)
173 for (auto ii
= m_Elements
.begin(); ii
!= m_Elements
.end(); ++ii
)
181 void UVElementSet::Clear()
186 const UVElement
* UVElementSet::FindElement(const UVElement
& element
) const
188 for (auto ii
= m_Elements
.begin(); ii
!= m_Elements
.end(); ++ii
)
190 if ((*ii
) == element
|| (*ii
).HasEdge(element
))
196 Vec3
UVElementSet::GetCenterPos() const
198 if (m_Elements
.empty())
199 return Vec3(0, 0, 0);
201 auto element
= m_Elements
.begin();
204 for (; element
!= m_Elements
.end(); ++element
)
206 if ((*element
).IsUVIsland())
208 aabb
.Add((*element
).m_pUVIsland
->GetUVBoundBox().GetCenter());
212 for (int i
= 0, iVertexCount((*element
).m_UVVertices
.size()); i
< iVertexCount
; ++i
)
213 aabb
.Add((*element
).m_UVVertices
[i
].GetUV());
217 return aabb
.GetCenter();
220 bool UVElementSet::AllOnlyVertices() const
222 auto iter
= m_Elements
.begin();
223 for (; iter
!= m_Elements
.end(); ++iter
)
225 if (!iter
->IsVertex())
231 bool UVElementSet::AllOnlyEdges() const
233 auto iter
= m_Elements
.begin();
234 for (; iter
!= m_Elements
.end(); ++iter
)
242 bool UVElementSet::AllOnlyPolygons() const
244 auto iter
= m_Elements
.begin();
245 for (; iter
!= m_Elements
.end(); ++iter
)
247 if (!iter
->IsPolygon())
253 bool UVElementSet::AllOnlyUVIslands() const
255 auto iter
= m_Elements
.begin();
256 for (; iter
!= m_Elements
.end(); ++iter
)
258 if (!iter
->IsUVIsland())
264 UVElementSet
& UVElementSet::operator=(const UVElementSet
& uvSet
)
266 m_Elements
= uvSet
.m_Elements
;
270 UVElementSet
* UVElementSet::Clone()
272 UVElementSet
* pClone
= new UVElementSet
;
273 for (int i
= 0, iCount(m_Elements
.size()); i
< iCount
; ++i
)
274 pClone
->AddElement(m_Elements
[i
]);
278 void UVElementSet::CopyFrom(UVElementSet
* pElementSet
)
280 *this = *pElementSet
;
281 for (int i
= 0, iCount(m_Elements
.size()); i
< iCount
; ++i
)
282 m_Elements
[i
].m_pUVIsland
->ResetPolygonsInModel(GetUVEditor()->GetModel());
285 void UVElementSet::Join(UVElementSet
* pElementSet
)
287 for (int i
= 0, iCount(pElementSet
->GetCount()); i
< iCount
; ++i
)
288 m_Elements
.push_back(pElementSet
->GetElement(i
));