Ok, I understand what you're saying now.
Here's my insert function:
Code:
extern index[3];
vector3d pos;
void octree::insert(int id, node *leaf)
{
for(int i=0; i<num_objects; i++)
{
if(objectP[i].pos.x <= leaf->pos.x && objectP[i].pos.y <= leaf->pos.y && objectP[i].pos.z <= leaf->pos.z)
{
leaf->BBLactive = true;
}
if(objectP[i].pos.x >= leaf->pos.x && objectP[i].pos.y <= leaf->pos.y && objectP[i].pos.z <= leaf->pos.z)
{
leaf->BBRactive = true;
}
if(objectP[i].pos.x <= leaf->pos.x && objectP[i].pos.y <= leaf->pos.y && objectP[i].pos.z >= leaf->pos.z)
{
leaf->BFLactive = true;
}
if(objectP[i].pos.x >= leaf->pos.x && objectP[i].pos.y <= leaf->pos.y && objectP[i].pos.z >= leaf->pos.z)
{
leaf->BFRactive = true;
}
if(objectP[i].pos.x <= leaf->pos.x && objectP[i].pos.y >= leaf->pos.y && objectP[i].pos.z <= leaf->pos.z)
{
leaf->TBLactive = true;
}
if(objectP[i].pos.x >= leaf->pos.x && objectP[i].pos.y >= leaf->pos.y && objectP[i].pos.z <= leaf->pos.z)
{
leaf->TBRactive = true;
}
if(objectP[i].pos.x <= leaf->pos.x && objectP[i].pos.y >= leaf->pos.y && objectP[i].pos.z >= leaf->pos.z)
{
leaf->TFLactive = true;
}
if(objectP[i].pos.x >= leaf->pos.x && objectP[i].pos.y >= leaf->pos.y && objectP[i].pos.z >= leaf->pos.z)
{
leaf->TFRactive = true;
}
}
if(leaf->BOTTOM_BACK_LEFT!=NULL)
insert(id, leaf->BOTTOM_BACK_LEFT);
else
{
if(leaf->BBLactive == true)
{
leaf->BOTTOM_BACK_LEFT=new node;
leaf->BOTTOM_BACK_LEFT->id=id-5;
leaf->BOTTOM_BACK_LEFT->pos.x = leaf->pos.x - (leaf->scale.x/4);
leaf->BOTTOM_BACK_LEFT->pos.y = leaf->pos.y - (leaf->scale.y/4);
leaf->BOTTOM_BACK_LEFT->pos.z = leaf->pos.z - (leaf->scale.z/4);
leaf->BOTTOM_BACK_LEFT->scale.x = leaf->scale.x/2;
leaf->BOTTOM_BACK_LEFT->scale.y = leaf->scale.y/2;
leaf->BOTTOM_BACK_LEFT->scale.z = leaf->scale.z/2;
leaf->BOTTOM_BACK_LEFT->BOTTOM_BACK_LEFT=NULL;
leaf->BOTTOM_BACK_LEFT->BOTTOM_BACK_RIGHT=NULL;
leaf->BOTTOM_BACK_LEFT->BOTTOM_FRONT_LEFT=NULL;
leaf->BOTTOM_BACK_LEFT->BOTTOM_FRONT_RIGHT=NULL;
leaf->BOTTOM_BACK_LEFT->TOP_BACK_LEFT=NULL;
leaf->BOTTOM_BACK_LEFT->TOP_BACK_RIGHT=NULL;
leaf->BOTTOM_BACK_LEFT->TOP_FRONT_LEFT=NULL;
leaf->BOTTOM_BACK_LEFT->TOP_FRONT_RIGHT=NULL;
}
}
if(leaf->BOTTOM_BACK_RIGHT!=NULL)
insert(id, leaf->BOTTOM_BACK_LEFT);
else
{
if(leaf->BBRactive==true)
{
leaf->BOTTOM_BACK_RIGHT=new node;
leaf->BOTTOM_BACK_RIGHT->id=id+5;
leaf->BOTTOM_BACK_RIGHT->pos.x = leaf->pos.x + (leaf->scale.x/4);
leaf->BOTTOM_BACK_RIGHT->pos.y = leaf->pos.y - (leaf->scale.y/4);
leaf->BOTTOM_BACK_RIGHT->pos.z = leaf->pos.z - (leaf->scale.z/4);
leaf->BOTTOM_BACK_RIGHT->scale.x = leaf->scale.x/2;
leaf->BOTTOM_BACK_RIGHT->scale.y = leaf->scale.y/2;
leaf->BOTTOM_BACK_RIGHT->scale.z = leaf->scale.z/2;
leaf->BOTTOM_BACK_RIGHT->BOTTOM_BACK_LEFT=NULL;
leaf->BOTTOM_BACK_RIGHT->BOTTOM_BACK_RIGHT=NULL;
leaf->BOTTOM_BACK_RIGHT->BOTTOM_FRONT_LEFT=NULL;
leaf->BOTTOM_BACK_RIGHT->BOTTOM_FRONT_RIGHT=NULL;
leaf->BOTTOM_BACK_RIGHT->TOP_BACK_LEFT=NULL;
leaf->BOTTOM_BACK_RIGHT->TOP_BACK_RIGHT=NULL;
leaf->BOTTOM_BACK_RIGHT->TOP_FRONT_LEFT=NULL;
leaf->BOTTOM_BACK_RIGHT->TOP_FRONT_RIGHT=NULL;
}
}
if(leaf->BOTTOM_FRONT_LEFT!=NULL)
insert(id, leaf->BOTTOM_FRONT_LEFT);
else
{
if(leaf->BFLactive==true)
{
leaf->BOTTOM_FRONT_LEFT=new node;
leaf->BOTTOM_FRONT_LEFT->id=id-10;
leaf->BOTTOM_FRONT_LEFT->pos.x = leaf->pos.x - (leaf->scale.x/4);
leaf->BOTTOM_FRONT_LEFT->pos.y = leaf->pos.y - (leaf->scale.y/4);
leaf->BOTTOM_FRONT_LEFT->pos.z = leaf->pos.z + (leaf->scale.z/4);
leaf->BOTTOM_FRONT_LEFT->scale.x = leaf->scale.x/2;
leaf->BOTTOM_FRONT_LEFT->scale.y = leaf->scale.y/2;
leaf->BOTTOM_FRONT_LEFT->scale.z = leaf->scale.z/2;
leaf->BOTTOM_FRONT_LEFT->BOTTOM_BACK_LEFT=NULL;
leaf->BOTTOM_FRONT_LEFT->BOTTOM_BACK_RIGHT=NULL;
leaf->BOTTOM_FRONT_LEFT->BOTTOM_FRONT_LEFT=NULL;
leaf->BOTTOM_FRONT_LEFT->BOTTOM_FRONT_RIGHT=NULL;
leaf->BOTTOM_FRONT_LEFT->TOP_BACK_LEFT=NULL;
leaf->BOTTOM_FRONT_LEFT->TOP_BACK_RIGHT=NULL;
leaf->BOTTOM_FRONT_LEFT->TOP_FRONT_LEFT=NULL;
leaf->BOTTOM_FRONT_LEFT->TOP_FRONT_RIGHT=NULL;
}
}
if(leaf->BOTTOM_FRONT_RIGHT!=NULL)
insert(id, leaf->BOTTOM_FRONT_RIGHT);
else
{
if(leaf->BFRactive==true)
{
leaf->BOTTOM_FRONT_RIGHT=new node;
leaf->BOTTOM_FRONT_RIGHT->id=id+10;
leaf->BOTTOM_FRONT_RIGHT->pos.x = leaf->pos.x + (leaf->scale.x/4);
leaf->BOTTOM_FRONT_RIGHT->pos.y = leaf->pos.y - (leaf->scale.y/4);
leaf->BOTTOM_FRONT_RIGHT->pos.z = leaf->pos.z + (leaf->scale.z/4);
leaf->BOTTOM_FRONT_RIGHT->scale.x = leaf->scale.x/2;
leaf->BOTTOM_FRONT_RIGHT->scale.y = leaf->scale.y/2;
leaf->BOTTOM_FRONT_RIGHT->scale.z = leaf->scale.z/2;
leaf->BOTTOM_FRONT_RIGHT->BOTTOM_BACK_LEFT=NULL;
leaf->BOTTOM_FRONT_RIGHT->BOTTOM_BACK_RIGHT=NULL;
leaf->BOTTOM_FRONT_RIGHT->BOTTOM_FRONT_LEFT=NULL;
leaf->BOTTOM_FRONT_RIGHT->BOTTOM_FRONT_RIGHT=NULL;
leaf->BOTTOM_FRONT_RIGHT->TOP_BACK_LEFT=NULL;
leaf->BOTTOM_FRONT_RIGHT->TOP_BACK_RIGHT=NULL;
leaf->BOTTOM_FRONT_RIGHT->TOP_FRONT_LEFT=NULL;
leaf->BOTTOM_FRONT_RIGHT->TOP_FRONT_RIGHT=NULL;
}
}
if(leaf->TOP_BACK_LEFT!=NULL)
insert(id, leaf->TOP_BACK_LEFT);
else
{
if(leaf->TBLactive==true)
{
leaf->TOP_BACK_LEFT=new node;
leaf->TOP_BACK_LEFT->id=id-15;
leaf->TOP_BACK_LEFT->pos.x = leaf->pos.x - (leaf->scale.x/4);
leaf->TOP_BACK_LEFT->pos.y = leaf->pos.y + (leaf->scale.y/4);
leaf->TOP_BACK_LEFT->pos.z = leaf->pos.z - (leaf->scale.z/4);
leaf->TOP_BACK_LEFT->scale.x = leaf->scale.x/2;
leaf->TOP_BACK_LEFT->scale.y = leaf->scale.y/2;
leaf->TOP_BACK_LEFT->scale.z = leaf->scale.z/2;
leaf->TOP_BACK_LEFT->BOTTOM_BACK_LEFT=NULL;
leaf->TOP_BACK_LEFT->BOTTOM_BACK_RIGHT=NULL;
leaf->TOP_BACK_LEFT->BOTTOM_FRONT_LEFT=NULL;
leaf->TOP_BACK_LEFT->BOTTOM_FRONT_RIGHT=NULL;
leaf->TOP_BACK_LEFT->TOP_BACK_LEFT=NULL;
leaf->TOP_BACK_LEFT->TOP_BACK_RIGHT=NULL;
leaf->TOP_BACK_LEFT->TOP_FRONT_LEFT=NULL;
leaf->TOP_BACK_LEFT->TOP_FRONT_RIGHT=NULL;
}
}
if(leaf->TOP_BACK_RIGHT!=NULL)
insert(id, leaf->TOP_BACK_RIGHT);
else
{
if(leaf->TBRactive==true)
{
leaf->TOP_BACK_RIGHT=new node;
leaf->TOP_BACK_RIGHT->id=id+15;
leaf->TOP_BACK_RIGHT->pos.x = leaf->pos.x + (leaf->scale.x/4);
leaf->TOP_BACK_RIGHT->pos.y = leaf->pos.y + (leaf->scale.y/4);
leaf->TOP_BACK_RIGHT->pos.z = leaf->pos.z - (leaf->scale.z/4);
leaf->TOP_BACK_RIGHT->scale.x = leaf->scale.x/2;
leaf->TOP_BACK_RIGHT->scale.y = leaf->scale.y/2;
leaf->TOP_BACK_RIGHT->scale.z = leaf->scale.z/2;
leaf->TOP_BACK_RIGHT->BOTTOM_BACK_LEFT=NULL;
leaf->TOP_BACK_RIGHT->BOTTOM_BACK_RIGHT=NULL;
leaf->TOP_BACK_RIGHT->BOTTOM_FRONT_LEFT=NULL;
leaf->TOP_BACK_RIGHT->BOTTOM_FRONT_RIGHT=NULL;
leaf->TOP_BACK_RIGHT->TOP_BACK_LEFT=NULL;
leaf->TOP_BACK_RIGHT->TOP_BACK_RIGHT=NULL;
leaf->TOP_BACK_RIGHT->TOP_FRONT_LEFT=NULL;
leaf->TOP_BACK_RIGHT->TOP_FRONT_RIGHT=NULL;
}
}
if(leaf->TOP_FRONT_LEFT!=NULL)
insert(id, leaf->TOP_FRONT_LEFT);
else
{
if(leaf->TFLactive==true)
{
leaf->TOP_FRONT_LEFT=new node;
leaf->TOP_FRONT_LEFT->id=id-20;
leaf->TOP_FRONT_LEFT->pos.x = leaf->pos.x - (leaf->scale.x/4);
leaf->TOP_FRONT_LEFT->pos.y = leaf->pos.y + (leaf->scale.y/4);
leaf->TOP_FRONT_LEFT->pos.z = leaf->pos.z + (leaf->scale.z/4);
leaf->TOP_FRONT_LEFT->scale.x = leaf->scale.x/2;
leaf->TOP_FRONT_LEFT->scale.y = leaf->scale.y/2;
leaf->TOP_FRONT_LEFT->scale.z = leaf->scale.z/2;
leaf->TOP_FRONT_LEFT->BOTTOM_BACK_LEFT=NULL;
leaf->TOP_FRONT_LEFT->BOTTOM_BACK_RIGHT=NULL;
leaf->TOP_FRONT_LEFT->BOTTOM_FRONT_LEFT=NULL;
leaf->TOP_FRONT_LEFT->BOTTOM_FRONT_RIGHT=NULL;
leaf->TOP_FRONT_LEFT->TOP_BACK_LEFT=NULL;
leaf->TOP_FRONT_LEFT->TOP_BACK_RIGHT=NULL;
leaf->TOP_FRONT_LEFT->TOP_FRONT_LEFT=NULL;
leaf->TOP_FRONT_LEFT->TOP_FRONT_RIGHT=NULL;
}
}
if(leaf->TOP_FRONT_RIGHT!=NULL)
insert(id, leaf->TOP_FRONT_RIGHT);
else
{
if(leaf->TFRactive==true)
{
leaf->TOP_FRONT_RIGHT=new node;
leaf->TOP_FRONT_RIGHT->id=id+20;
leaf->TOP_FRONT_RIGHT->pos.x = leaf->pos.x + (leaf->scale.x/4);
leaf->TOP_FRONT_RIGHT->pos.y = leaf->pos.y + (leaf->scale.y/4);
leaf->TOP_FRONT_RIGHT->pos.z = leaf->pos.z + (leaf->scale.z/4);
leaf->TOP_FRONT_RIGHT->scale.x = leaf->scale.x/2;
leaf->TOP_FRONT_RIGHT->scale.y = leaf->scale.y/2;
leaf->TOP_FRONT_RIGHT->scale.z = leaf->scale.z/2;
leaf->TOP_FRONT_RIGHT->BOTTOM_BACK_LEFT=NULL;
leaf->TOP_FRONT_RIGHT->BOTTOM_BACK_RIGHT=NULL;
leaf->TOP_FRONT_RIGHT->BOTTOM_FRONT_LEFT=NULL;
leaf->TOP_FRONT_RIGHT->BOTTOM_FRONT_RIGHT=NULL;
leaf->TOP_FRONT_RIGHT->TOP_BACK_LEFT=NULL;
leaf->TOP_FRONT_RIGHT->TOP_BACK_RIGHT=NULL;
leaf->TOP_FRONT_RIGHT->TOP_FRONT_LEFT=NULL;
leaf->TOP_FRONT_RIGHT->TOP_FRONT_RIGHT=NULL;
}
}
}
What this code is supposed to do, is create nodes based on the location of objects, relative to the current parent nodes centre.
Eventually, I'm going to modify this to create nodes based on polygon location, rather than object location.
-psychopath