Пример #1
0
void rtbuild_add(RTBuilder *b, RayObject *o)
{
	float bb[6];

	assert( b->primitives.begin + b->primitives.maxsize != b->primitives.end );

	INIT_MINMAX(bb, bb+3);
	RE_rayobject_merge_bb(o, bb, bb+3);

	/* skip objects with invalid bounding boxes, nan causes DO_MINMAX
	   to do nothing, so we get these invalid values. this shouldn't
	   happen usually, but bugs earlier in the pipeline can cause it. */
	if(bb[0] > bb[3] || bb[1] > bb[4] || bb[2] > bb[5])
		return;
	/* skip objects with inf bounding boxes */
	if(!finite(bb[0]) || !finite(bb[1]) || !finite(bb[2]))
		return;
	if(!finite(bb[3]) || !finite(bb[4]) || !finite(bb[5]))
		return;
	/* skip objects with zero bounding box, they are of no use, and
	   will give problems in rtbuild_heuristic_object_split later */
	if(bb[0] == bb[3] && bb[1] == bb[4] && bb[2] == bb[5])
		return;
	
	copy_v3_v3(b->primitives.end->bb, bb);
	copy_v3_v3(b->primitives.end->bb+3, bb+3);
	b->primitives.end->obj = o;
	b->primitives.end->cost = RE_rayobject_cost(o);
	
	for(int i=0; i<3; i++)
	{
		*(b->sorted_end[i]) = b->primitives.end;
		b->sorted_end[i]++;
	}
	b->primitives.end++;
}
static float RE_rayobject_instance_cost(RayObject *o)
{
    InstanceRayObject *obj = (InstanceRayObject *)o;
    return RE_rayobject_cost(obj->target) + RE_COST_INSTANCE;
}