diff options
Diffstat (limited to 'libs/rs/rsProgramRaster.cpp')
-rw-r--r-- | libs/rs/rsProgramRaster.cpp | 76 |
1 files changed, 61 insertions, 15 deletions
diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp index 13887d1..5b69370 100644 --- a/libs/rs/rsProgramRaster.cpp +++ b/libs/rs/rsProgramRaster.cpp @@ -14,11 +14,17 @@ * limitations under the License. */ +#ifndef ANDROID_RS_BUILD_FOR_HOST #include "rsContext.h" -#include "rsProgramRaster.h" - #include <GLES/gl.h> #include <GLES/glext.h> +#else +#include "rsContextHostStub.h" +#include <OpenGL/gl.h> +#include <OpenGl/glext.h> +#endif //ANDROID_RS_BUILD_FOR_HOST + +#include "rsProgramRaster.h" using namespace android; using namespace android::renderscript; @@ -35,9 +41,8 @@ ProgramRaster::ProgramRaster(Context *rsc, mPointSmooth = pointSmooth; mLineSmooth = lineSmooth; mPointSprite = pointSprite; - - mPointSize = 1.0f; mLineWidth = 1.0f; + mCull = RS_CULL_BACK; } ProgramRaster::~ProgramRaster() @@ -47,21 +52,23 @@ ProgramRaster::~ProgramRaster() void ProgramRaster::setLineWidth(float s) { mLineWidth = s; + mDirty = true; } -void ProgramRaster::setPointSize(float s) +void ProgramRaster::setCullMode(RsCullMode mode) { - mPointSize = s; + 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; - glPointSize(mPointSize); if (mPointSmooth) { glEnable(GL_POINT_SMOOTH); } else { @@ -76,23 +83,62 @@ void ProgramRaster::setupGL(const Context *rsc, ProgramRasterState *state) } if (rsc->checkVersion1_1()) { +#ifndef ANDROID_RS_BUILD_FOR_HOST if (mPointSprite) { glEnable(GL_POINT_SPRITE_OES); } else { glDisable(GL_POINT_SPRITE_OES); } +#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 +{ +} + +ProgramRaster *ProgramRaster::createFromStream(Context *rsc, IStream *stream) +{ + return NULL; +} ProgramRasterState::ProgramRasterState() { @@ -102,7 +148,7 @@ ProgramRasterState::~ProgramRasterState() { } -void ProgramRasterState::init(Context *rsc, int32_t w, int32_t h) +void ProgramRasterState::init(Context *rsc) { ProgramRaster *pr = new ProgramRaster(rsc, false, false, false); mDefault.set(pr); @@ -118,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) @@ -131,16 +177,16 @@ RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, RsElement in, RsElement o return pr; } -void rsi_ProgramRasterSetPointSize(Context * rsc, RsProgramRaster vpr, float s) +void rsi_ProgramRasterSetLineWidth(Context * rsc, RsProgramRaster vpr, float s) { ProgramRaster *pr = static_cast<ProgramRaster *>(vpr); - pr->setPointSize(s); + pr->setLineWidth(s); } -void rsi_ProgramRasterSetLineWidth(Context * rsc, RsProgramRaster vpr, float s) +void rsi_ProgramRasterSetCullMode(Context * rsc, RsProgramRaster vpr, RsCullMode mode) { ProgramRaster *pr = static_cast<ProgramRaster *>(vpr); - pr->setLineWidth(s); + pr->setCullMode(mode); } |