diff options
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 |
commit | d18c744a37441311c9b65254a35db456835adad3 (patch) | |
tree | f9ce6492b3f97435c4bc28ed89f244d8e9f12837 /rsProgramRaster.cpp | |
parent | 479e2924807e1fff79de2e0bee2a67939d8659ee (diff) | |
download | rs-d18c744a37441311c9b65254a35db456835adad3.tar.gz |
Work on synchronizing a3d created files and java layer.
Adding culling to ProgramRaster
Change-Id: I58ccc82d37edc9539289d5eba44ea0e720874af5
Diffstat (limited to 'rsProgramRaster.cpp')
-rw-r--r-- | rsProgramRaster.cpp | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/rsProgramRaster.cpp b/rsProgramRaster.cpp index 76638409..5b693701 100644 --- a/rsProgramRaster.cpp +++ b/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); +} + } } |