summaryrefslogtreecommitdiff
path: root/libs/rs/rsProgramRaster.cpp
diff options
context:
space:
mode:
author Alex Sakhartchouk <alexst@google.com> 2010-07-12 15:50:32 -0700
committer Alex Sakhartchouk <alexst@google.com> 2010-07-12 15:50:32 -0700
commit80a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41ae (patch)
tree1add64a0dee5bf0ac1c98b63bd3b43648ca7af50 /libs/rs/rsProgramRaster.cpp
parentcefd8d9588230577356d24597acc04ce1e276582 (diff)
Work on synchronizing a3d created files and java layer.
Adding culling to ProgramRaster Change-Id: I58ccc82d37edc9539289d5eba44ea0e720874af5
Diffstat (limited to 'libs/rs/rsProgramRaster.cpp')
-rw-r--r--libs/rs/rsProgramRaster.cpp50
1 files changed, 47 insertions, 3 deletions
diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp
index 76638409aa09..5b6937017294 100644
--- a/libs/rs/rsProgramRaster.cpp
+++ b/libs/rs/rsProgramRaster.cpp
@@ -42,6 +42,7 @@ ProgramRaster::ProgramRaster(Context *rsc,
mLineSmooth = lineSmooth;
mPointSprite = pointSprite;
mLineWidth = 1.0f;
+ mCull = RS_CULL_BACK;
}
ProgramRaster::~ProgramRaster()
@@ -51,14 +52,22 @@ ProgramRaster::~ProgramRaster()
void ProgramRaster::setLineWidth(float s)
{
mLineWidth = s;
+ mDirty = true;
+}
+
+void ProgramRaster::setCullMode(RsCullMode mode)
+{
+ mCull = mode;
+ mDirty = true;
}
void ProgramRaster::setupGL(const Context *rsc, ProgramRasterState *state)
{
- if (state->mLast.get() == this) {
+ if (state->mLast.get() == this && !mDirty) {
return;
}
state->mLast.set(this);
+ mDirty = false;
if (mPointSmooth) {
glEnable(GL_POINT_SMOOTH);
@@ -82,14 +91,43 @@ void ProgramRaster::setupGL(const Context *rsc, ProgramRasterState *state)
}
#endif //ANDROID_RS_BUILD_FOR_HOST
}
+
+ switch(mCull) {
+ case RS_CULL_BACK:
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ break;
+ case RS_CULL_FRONT:
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ break;
+ case RS_CULL_NONE:
+ glDisable(GL_CULL_FACE);
+ break;
+ }
}
void ProgramRaster::setupGL2(const Context *rsc, ProgramRasterState *state)
{
- if (state->mLast.get() == this) {
+ if (state->mLast.get() == this && !mDirty) {
return;
}
state->mLast.set(this);
+ mDirty = false;
+
+ switch(mCull) {
+ case RS_CULL_BACK:
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ break;
+ case RS_CULL_FRONT:
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ break;
+ case RS_CULL_NONE:
+ glDisable(GL_CULL_FACE);
+ break;
+ }
}
void ProgramRaster::serialize(OStream *stream) const
@@ -126,7 +164,7 @@ void ProgramRasterState::deinit(Context *rsc)
namespace android {
namespace renderscript {
-RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, RsElement in, RsElement out,
+RsProgramRaster rsi_ProgramRasterCreate(Context * rsc,
bool pointSmooth,
bool lineSmooth,
bool pointSprite)
@@ -145,6 +183,12 @@ void rsi_ProgramRasterSetLineWidth(Context * rsc, RsProgramRaster vpr, float s)
pr->setLineWidth(s);
}
+void rsi_ProgramRasterSetCullMode(Context * rsc, RsProgramRaster vpr, RsCullMode mode)
+{
+ ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
+ pr->setCullMode(mode);
+}
+
}
}