diff options
-rw-r--r-- | rsMesh.cpp | 43 | ||||
-rw-r--r-- | rsMesh.h | 5 | ||||
-rw-r--r-- | rsScriptC_LibGL.cpp | 15 | ||||
-rw-r--r-- | scriptc/rs_graphics.rsh | 17 |
4 files changed, 80 insertions, 0 deletions
@@ -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: }; diff --git a/rsScriptC_LibGL.cpp b/rsScriptC_LibGL.cpp index f5e59534..4b8de765 100644 --- a/rsScriptC_LibGL.cpp +++ b/rsScriptC_LibGL.cpp @@ -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 }, diff --git a/scriptc/rs_graphics.rsh b/scriptc/rs_graphics.rsh index fd0491c3..63bd9d74 100644 --- a/scriptc/rs_graphics.rsh +++ b/scriptc/rs_graphics.rsh @@ -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 |