Merge "Adding bounding box computation."

This commit is contained in:
Alex Sakhartchouk
2010-08-13 14:39:01 -07:00
committed by Android (Google) Code Review
4 changed files with 80 additions and 0 deletions

View File

@@ -224,6 +224,49 @@ Mesh *Mesh::createFromStream(Context *rsc, IStream *stream)
return mesh;
}
void Mesh::computeBBox() {
float *posPtr = NULL;
uint32_t vectorSize = 0;
uint32_t stride = 0;
uint32_t numVerts = 0;
// First we need to find the position ptr and stride
for (uint32_t ct=0; ct < mVertexBufferCount; ct++) {
const Type *bufferType = mVertexBuffers[ct]->getType();
const Element *bufferElem = bufferType->getElement();
for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) {
if(strcmp(bufferElem->getFieldName(ct), "position") == 0) {
vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize();
stride = bufferElem->getSizeBytes() / sizeof(float);
uint32_t offset = bufferElem->getFieldOffsetBytes(ct);
posPtr = (float*)((uint8_t*)mVertexBuffers[ct]->getPtr() + offset);
numVerts = bufferType->getDimX();
break;
}
}
if(posPtr) {
break;
}
}
mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6;
mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6;
if(!posPtr) {
LOGE("Unable to compute bounding box");
mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f;
mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f;
return;
}
for(uint32_t i = 0; i < numVerts; i ++) {
for(uint32_t v = 0; v < vectorSize; v ++) {
mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]);
mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]);
}
posPtr += stride;
}
}
MeshContext::MeshContext()
{

View File

@@ -61,6 +61,11 @@ public:
virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
static Mesh *createFromStream(Context *rsc, IStream *stream);
// Bounding volumes
float mBBoxMin[3];
float mBBoxMax[3];
void computeBBox();
protected:
};

View File

@@ -251,6 +251,20 @@ static void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t s
sm->renderPrimitiveRange(rsc, primIndex, start, len);
}
static void SC_meshComputeBoundingBox(RsMesh vsm, float *minX, float *minY, float *minZ,
float *maxX, float *maxY, float *maxZ)
{
GET_TLS();
Mesh *sm = static_cast<Mesh *>(vsm);
sm->computeBBox();
*minX = sm->mBBoxMin[0];
*minY = sm->mBBoxMin[1];
*minZ = sm->mBBoxMin[2];
*maxX = sm->mBBoxMax[0];
*maxY = sm->mBBoxMax[1];
*maxZ = sm->mBBoxMax[2];
}
//////////////////////////////////////////////////////////////////////////////
//
@@ -390,6 +404,7 @@ static ScriptCState::SymbolTable_t gSyms[] = {
{ "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh },
{ "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive },
{ "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange },
{ "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox },
{ "_Z13rsgClearColorffff", (void *)&SC_ClearColor },
{ "_Z13rsgClearDepthf", (void *)&SC_ClearDepth },

View File

@@ -77,6 +77,23 @@ extern void __attribute__((overloadable))
extern void __attribute__((overloadable))
rsgFontColor(float, float, float, float);
extern void __attribute__((overloadable))
rsgMeshComputeBoundingBox(rs_mesh mesh, float *minX, float *minY, float *minZ,
float *maxX, float *maxY, float *maxZ);
void __attribute__((overloadable))
rsgMeshComputeBoundingBox(rs_mesh mesh, float3 *bBoxMin, float3 *bBoxMax) {
float x1, y1, z1, x2, y2, z2;
rsgMeshComputeBoundingBox(mesh, &x1, &y1, &z1, &x2, &y2, &z2);
bBoxMin->x = x1;
bBoxMin->y = y1;
bBoxMin->z = z1;
bBoxMax->x = x2;
bBoxMax->y = y2;
bBoxMax->z = z2;
}
///////////////////////////////////////////////////////
// misc