summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rsMesh.cpp43
-rw-r--r--rsMesh.h5
-rw-r--r--rsScriptC_LibGL.cpp15
-rw-r--r--scriptc/rs_graphics.rsh17
4 files changed, 80 insertions, 0 deletions
diff --git a/rsMesh.cpp b/rsMesh.cpp
index 90265781..810e4ff9 100644
--- a/rsMesh.cpp
+++ b/rsMesh.cpp
@@ -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()
{
diff --git a/rsMesh.h b/rsMesh.h
index 765a971b..ed01c384 100644
--- a/rsMesh.h
+++ b/rsMesh.h
@@ -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