diff options
-rw-r--r-- | rsProgramVertex.cpp | 6 | ||||
-rw-r--r-- | rsProgramVertex.h | 1 | ||||
-rw-r--r-- | rsScriptC_LibGL.cpp | 8 | ||||
-rw-r--r-- | scriptc/rs_core.rsh | 86 | ||||
-rw-r--r-- | scriptc/rs_graphics.rsh | 5 |
5 files changed, 104 insertions, 2 deletions
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp index 60de04a8..aee41333 100644 --- a/rsProgramVertex.cpp +++ b/rsProgramVertex.cpp @@ -318,6 +318,12 @@ void ProgramVertex::setTextureMatrix(const rsc_Matrix *m) const mDirty = true; } +void ProgramVertex::getProjectionMatrix(rsc_Matrix *m) const +{ + float *f = static_cast<float *>(mConstants[0]->getPtr()); + memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix)); +} + void ProgramVertex::transformToScreen(const Context *rsc, float *v4out, const float *v3in) const { float *f = static_cast<float *>(mConstants[0]->getPtr()); diff --git a/rsProgramVertex.h b/rsProgramVertex.h index 1c8b9c8d..a17c9ea1 100644 --- a/rsProgramVertex.h +++ b/rsProgramVertex.h @@ -43,6 +43,7 @@ public: void addLight(const Light *); void setProjectionMatrix(const rsc_Matrix *) const; + void getProjectionMatrix(rsc_Matrix *) const; void setModelviewMatrix(const rsc_Matrix *) const; void setTextureMatrix(const rsc_Matrix *) const; diff --git a/rsScriptC_LibGL.cpp b/rsScriptC_LibGL.cpp index 4b8de765..a7877cdb 100644 --- a/rsScriptC_LibGL.cpp +++ b/rsScriptC_LibGL.cpp @@ -117,6 +117,12 @@ static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, pf->setConstantColor(r, g, b, a); } +static void SC_vpGetProjectionMatrix(rsc_Matrix *m) +{ + GET_TLS(); + rsc->getVertex()->getProjectionMatrix(m); +} + ////////////////////////////////////////////////////////////////////////////// // Drawing @@ -387,6 +393,8 @@ static ScriptCState::SymbolTable_t gSyms[] = { { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix }, { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix }, + { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_vpGetProjectionMatrix }, + { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor }, { "_Z11rsgGetWidthv", (void *)&SC_getWidth }, diff --git a/scriptc/rs_core.rsh b/scriptc/rs_core.rsh index aa9aebca..0bfb3b92 100644 --- a/scriptc/rs_core.rsh +++ b/scriptc/rs_core.rsh @@ -767,6 +767,92 @@ static void rsQuaternionGetMatrixUnit(rs_matrix4x4 *m, const rs_quaternion *q) { m->m[15] = 1.0f; } +///////////////////////////////////////////////////// +// utility funcs +///////////////////////////////////////////////////// +void __attribute__((overloadable)) +rsExtractFrustumPlanes(const rs_matrix4x4 *modelViewProj, + float4 *left, float4 *right, + float4 *top, float4 *bottom, + float4 *near, float4 *far) { + // x y z w = a b c d in the plane equation + left->x = modelViewProj->m[3] + modelViewProj->m[0]; + left->y = modelViewProj->m[7] + modelViewProj->m[4]; + left->z = modelViewProj->m[11] + modelViewProj->m[8]; + left->w = modelViewProj->m[15] + modelViewProj->m[12]; + + right->x = modelViewProj->m[3] - modelViewProj->m[0]; + right->y = modelViewProj->m[7] - modelViewProj->m[4]; + right->z = modelViewProj->m[11] - modelViewProj->m[8]; + right->w = modelViewProj->m[15] - modelViewProj->m[12]; + + top->x = modelViewProj->m[3] - modelViewProj->m[1]; + top->y = modelViewProj->m[7] - modelViewProj->m[5]; + top->z = modelViewProj->m[11] - modelViewProj->m[9]; + top->w = modelViewProj->m[15] - modelViewProj->m[13]; + + bottom->x = modelViewProj->m[3] + modelViewProj->m[1]; + bottom->y = modelViewProj->m[7] + modelViewProj->m[5]; + bottom->z = modelViewProj->m[11] + modelViewProj->m[9]; + bottom->w = modelViewProj->m[15] + modelViewProj->m[13]; + + near->x = modelViewProj->m[3] + modelViewProj->m[2]; + near->y = modelViewProj->m[7] + modelViewProj->m[6]; + near->z = modelViewProj->m[11] + modelViewProj->m[10]; + near->w = modelViewProj->m[15] + modelViewProj->m[14]; + + far->x = modelViewProj->m[3] - modelViewProj->m[2]; + far->y = modelViewProj->m[7] - modelViewProj->m[6]; + far->z = modelViewProj->m[11] - modelViewProj->m[10]; + far->w = modelViewProj->m[15] - modelViewProj->m[14]; + + float len = length(left->xyz); + *left /= len; + len = length(right->xyz); + *right /= len; + len = length(top->xyz); + *top /= len; + len = length(bottom->xyz); + *bottom /= len; + len = length(near->xyz); + *near /= len; + len = length(far->xyz); + *far /= len; +} + +bool __attribute__((overloadable)) +rsIsSphereInFrustum(float4 *sphere, + float4 *left, float4 *right, + float4 *top, float4 *bottom, + float4 *near, float4 *far) { + + float distToCenter = dot(left->xyz, sphere->xyz) + left->w; + if(distToCenter < -sphere->w) { + return false; + } + distToCenter = dot(right->xyz, sphere->xyz) + right->w; + if(distToCenter < -sphere->w) { + return false; + } + distToCenter = dot(top->xyz, sphere->xyz) + top->w; + if(distToCenter < -sphere->w) { + return false; + } + distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w; + if(distToCenter < -sphere->w) { + return false; + } + distToCenter = dot(near->xyz, sphere->xyz) + near->w; + if(distToCenter < -sphere->w) { + return false; + } + distToCenter = dot(far->xyz, sphere->xyz) + far->w; + if(distToCenter < -sphere->w) { + return false; + } + return true; +} + ///////////////////////////////////////////////////// // int ops diff --git a/scriptc/rs_graphics.rsh b/scriptc/rs_graphics.rsh index 63bd9d74..c0b2d2d1 100644 --- a/scriptc/rs_graphics.rsh +++ b/scriptc/rs_graphics.rsh @@ -27,6 +27,9 @@ extern void __attribute__((overloadable)) rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *); extern void __attribute__((overloadable)) + rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *); + +extern void __attribute__((overloadable)) rsgProgramFragmentConstantColor(rs_program_fragment, float, float, float, float); extern uint __attribute__((overloadable)) @@ -92,8 +95,6 @@ rsgMeshComputeBoundingBox(rs_mesh mesh, float3 *bBoxMin, float3 *bBoxMax) { bBoxMax->z = z2; } - - /////////////////////////////////////////////////////// // misc |