Add RS support for generic attribs as input to vertex programs.
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index fe628ca..b207558 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -116,12 +116,6 @@
{
mShader.setTo("");
- for (uint32_t ct=0; ct < mAttribCount; ct++) {
- mShader.append("attribute vec4 ");
- mShader.append(mAttribNames[ct]);
- mShader.append(";\n");
- }
-
for (uint32_t ct=0; ct < mUniformCount; ct++) {
mShader.append("uniform mat4 ");
mShader.append(mUniformNames[ct]);
@@ -132,8 +126,34 @@
mShader.append("varying vec4 varTex0;\n");
if (mUserShader.length() > 1) {
+ for (uint32_t ct=0; ct < mInputCount; ct++) {
+ const Element *e = mInputElements[ct].get();
+ for (uint32_t field=0; field < e->getFieldCount(); field++) {
+ const Element *f = e->getField(field);
+
+ // Cannot be complex
+ rsAssert(!f->getFieldCount());
+ switch(f->getComponent().getVectorSize()) {
+ case 1: mShader.append("attribute float ATTRIB_"); break;
+ case 2: mShader.append("attribute vec2 ATTRIB_"); break;
+ case 3: mShader.append("attribute vec3 ATTRIB_"); break;
+ case 4: mShader.append("attribute vec4 ATTRIB_"); break;
+ default:
+ rsAssert(0);
+ }
+
+ mShader.append(e->getFieldName(field));
+ mShader.append(";\n");
+ }
+ }
mShader.append(mUserShader);
} else {
+ for (uint32_t ct=0; ct < mAttribCount; ct++) {
+ mShader.append("attribute vec4 ");
+ mShader.append(mAttribNames[ct]);
+ mShader.append(";\n");
+ }
+
mShader.append("void main() {\n");
mShader.append(" gl_Position = uni_MVP * attrib_Position;\n");
mShader.append(" gl_PointSize = attrib_PointSize.x;\n");