// Returns whether the node is changed.
private bool AddInternal(IntVector3 coords, T obj, OctreeNode <T> node, int level, IntVector3 corner)
{
if (node.isFilled)
{
return(false);
}
else if (level == 0)
{
node.obj = obj;
node.objCount = 1;
return(true);
}
int childSize = 1 << (level - 1);
IntVector3 childIndex = (coords - corner) / childSize;
var childNode = node.GetChild(childIndex);
if (childNode == null)
{
childNode = node.CreateChild(childIndex);
}
long oldChildObjCount = childNode.objCount;
bool changed = AddInternal(coords, obj, childNode, level - 1, corner + childIndex * childSize);
if (changed)
{
node.objCount += childNode.objCount - oldChildObjCount;
if (childNode.isFilled)
{
node.MergeIfPossible(obj);
}
}
return(changed);
}