// MakeLeaf void KDBuildJob::MakeLeaf(kdbuffer_t *kdb) { int n = kdb->node; leaves[curleaf] = n; nodes[n].left = KD_LEAF; nodes[n].leafid = curleaf; curleaf++; nodes[n].numpolys = kdb->size; numleafpolys += kdb->size; if(kdb->size > 0) { nodes[n].polys = (kdpoly_t*)BufferAllocate(polybuffer, nodes[n].numpolys); for(int i=0; i < kdb->size; i++) { aabb_t *a = &kdb->aabb[i]; memcpy(&nodes[n].polys[i].triangle, a->poly->triangle, sizeof(triangle_t)); memcpy(&nodes[n].polys[i].normal, a->poly->normal, sizeof(normal_t)); memcpy(&nodes[n].polys[i].color, a->poly->color, sizeof(float[4])); } } }
/*----------------------------------------------------------------------*/ static void BufferUpdate(Widget w) { assert( _XfeBufferType(w) != XmBUFFER_NONE ); BufferFree(w); BufferAllocate(w); }
void MakeLeaf(kdbuffer_t *kdb) { int n = kdb->node; if(curleaf > 0 && (curleaf % 4) == 0) { memcpy_ea(&arg.pleaves[curleaf-4], &leaves, sizeof(int[4])); } leaves[ curleaf % 4 ] = n; kdnode_t node ALIGNED(16); node.left = KD_LEAF; node.leafid = curleaf; curleaf++; node.numpolys = kdb->size; numleafpolys += kdb->size; if(kdb->size > 0) { node.polys = (kdpoly_t*)BufferAllocate(&arg.polybuffer, node.numpolys); memcpy_ea(&arg.nodes[n], &node, sizeof(kdnode_t)); int i; aabb_t a ALIGNED(16); kdpolyp_t poly ALIGNED(16); for(i=0; i < kdb->size; i++) { memcpy_ls(&a, &kdb->aabb[i], sizeof(aabb_t)); memcpy_ls(&poly, a.poly, sizeof(kdpolyp_t)); memcpy_ppe(&node.polys[i].triangle, poly.triangle, sizeof(triangle_t)); memcpy_ppe(&node.polys[i].normal, poly.normal, sizeof(normal_t)); memcpy_ppe(&node.polys[i].color, poly.color, sizeof(float[4])); } } else { memcpy_ea(&arg.nodes[n], &node, sizeof(kdnode_t)); } }