mirror of
https://github.com/godotengine/godot.git
synced 2024-12-21 10:25:24 +08:00
5823b5d77d
Modified both MeshInstance tools as well as importer to use it instead of QuickHull.
161 lines
4.0 KiB
C++
161 lines
4.0 KiB
C++
#pragma once
|
|
#ifndef HACD_CIRCULAR_LIST_INL
|
|
#define HACD_CIRCULAR_LIST_INL
|
|
namespace VHACD
|
|
{
|
|
template < typename T >
|
|
inline bool CircularList<T>::Delete(CircularListElement<T> * element)
|
|
{
|
|
if (!element)
|
|
{
|
|
return false;
|
|
}
|
|
if (m_size > 1)
|
|
{
|
|
CircularListElement<T> * next = element->GetNext();
|
|
CircularListElement<T> * prev = element->GetPrev();
|
|
delete element;
|
|
m_size--;
|
|
if (element == m_head)
|
|
{
|
|
m_head = next;
|
|
}
|
|
next->GetPrev() = prev;
|
|
prev->GetNext() = next;
|
|
return true;
|
|
}
|
|
else if (m_size == 1)
|
|
{
|
|
delete m_head;
|
|
m_size--;
|
|
m_head = 0;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
template < typename T >
|
|
inline bool CircularList<T>::Delete()
|
|
{
|
|
if (m_size > 1)
|
|
{
|
|
CircularListElement<T> * next = m_head->GetNext();
|
|
CircularListElement<T> * prev = m_head->GetPrev();
|
|
delete m_head;
|
|
m_size--;
|
|
m_head = next;
|
|
next->GetPrev() = prev;
|
|
prev->GetNext() = next;
|
|
return true;
|
|
}
|
|
else if (m_size == 1)
|
|
{
|
|
delete m_head;
|
|
m_size--;
|
|
m_head = 0;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
template < typename T >
|
|
inline CircularListElement<T> * CircularList<T>::Add(const T * data)
|
|
{
|
|
if (m_size == 0)
|
|
{
|
|
if (data)
|
|
{
|
|
m_head = new CircularListElement<T>(*data);
|
|
}
|
|
else
|
|
{
|
|
m_head = new CircularListElement<T>();
|
|
}
|
|
m_head->GetNext() = m_head->GetPrev() = m_head;
|
|
}
|
|
else
|
|
{
|
|
CircularListElement<T> * next = m_head->GetNext();
|
|
CircularListElement<T> * element = m_head;
|
|
if (data)
|
|
{
|
|
m_head = new CircularListElement<T>(*data);
|
|
}
|
|
else
|
|
{
|
|
m_head = new CircularListElement<T>();
|
|
}
|
|
m_head->GetNext() = next;
|
|
m_head->GetPrev() = element;
|
|
element->GetNext() = m_head;
|
|
next->GetPrev() = m_head;
|
|
}
|
|
m_size++;
|
|
return m_head;
|
|
}
|
|
template < typename T >
|
|
inline CircularListElement<T> * CircularList<T>::Add(const T & data)
|
|
{
|
|
const T * pData = &data;
|
|
return Add(pData);
|
|
}
|
|
template < typename T >
|
|
inline bool CircularList<T>::Next()
|
|
{
|
|
if (m_size == 0)
|
|
{
|
|
return false;
|
|
}
|
|
m_head = m_head->GetNext();
|
|
return true;
|
|
}
|
|
template < typename T >
|
|
inline bool CircularList<T>::Prev()
|
|
{
|
|
if (m_size == 0)
|
|
{
|
|
return false;
|
|
}
|
|
m_head = m_head->GetPrev();
|
|
return true;
|
|
}
|
|
template < typename T >
|
|
inline CircularList<T>::CircularList(const CircularList& rhs)
|
|
{
|
|
if (rhs.m_size > 0)
|
|
{
|
|
CircularListElement<T> * current = rhs.m_head;
|
|
do
|
|
{
|
|
current = current->GetNext();
|
|
Add(current->GetData());
|
|
}
|
|
while ( current != rhs.m_head );
|
|
}
|
|
}
|
|
template < typename T >
|
|
inline const CircularList<T>& CircularList<T>::operator=(const CircularList& rhs)
|
|
{
|
|
if (&rhs != this)
|
|
{
|
|
Clear();
|
|
if (rhs.m_size > 0)
|
|
{
|
|
CircularListElement<T> * current = rhs.m_head;
|
|
do
|
|
{
|
|
current = current->GetNext();
|
|
Add(current->GetData());
|
|
}
|
|
while ( current != rhs.m_head );
|
|
}
|
|
}
|
|
return (*this);
|
|
}
|
|
}
|
|
#endif |