summaryrefslogtreecommitdiff
path: root/rsProgramRaster.cpp
diff options
context:
space:
mode:
authorAlex Sakhartchouk <alexst@google.com>2010-07-12 15:50:32 -0700
committerAlex Sakhartchouk <alexst@google.com>2010-07-12 15:50:32 -0700
commitd18c744a37441311c9b65254a35db456835adad3 (patch)
treef9ce6492b3f97435c4bc28ed89f244d8e9f12837 /rsProgramRaster.cpp
parent479e2924807e1fff79de2e0bee2a67939d8659ee (diff)
downloadrs-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.cpp50
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);
+}
+
}
}