Merge "Adding bounding box computation."
This commit is contained in:
committed by
Android (Google) Code Review
commit
aece2d0ca0
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
};
|
||||
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user