Loading tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/FragmentShader.java +5 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,11 @@ public class FragmentShader extends Shader { return this; } public Builder setShader(String code) { mBuilder.setShader(code); return this; } public Builder setObjectConst(Type type) { mShader.mPerObjConstants = type; return this; Loading tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Renderable.java +3 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,9 @@ public class Renderable extends RenderableBase { } void updateFieldItem(RenderScriptGL rs) { if (mRenderState == null) { mRenderState = SceneManager.getDefaultState(); } updateVertexConstants(rs); updateFragmentConstants(rs); Loading tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Scene.java +24 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,9 @@ public class Scene extends SceneGraphBase { } public void appendTransform(Transform t) { if (t == null) { throw new RuntimeException("Adding null object"); } mRootTransforms.appendChild(t); } Loading @@ -88,6 +91,9 @@ public class Scene extends SceneGraphBase { } public void appendRenderPass(RenderPass p) { if (p == null) { throw new RuntimeException("Adding null object"); } mRenderPasses.add(p); } Loading @@ -96,18 +102,30 @@ public class Scene extends SceneGraphBase { } public void appendLight(LightBase l) { if (l == null) { throw new RuntimeException("Adding null object"); } mLights.add(l); } public void appendCamera(Camera c) { if (c == null) { throw new RuntimeException("Adding null object"); } mCameras.add(c); } public void appendShader(FragmentShader f) { if (f == null) { throw new RuntimeException("Adding null object"); } mFragmentShaders.add(f); } public void appendShader(VertexShader v) { if (v == null) { throw new RuntimeException("Adding null object"); } mVertexShaders.add(v); } Loading @@ -120,6 +138,9 @@ public class Scene extends SceneGraphBase { } public void appendRenderable(RenderableBase d) { if (d == null) { throw new RuntimeException("Adding null object"); } mRenderables.add(d); mRenderableMap.put(d.getName(), d); } Loading @@ -133,6 +154,9 @@ public class Scene extends SceneGraphBase { } public void appendTextures(Texture2D tex) { if (tex == null) { throw new RuntimeException("Adding null object"); } mTextures.add(tex); } Loading tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneManager.java +134 −3 Original line number Diff line number Diff line Loading @@ -29,8 +29,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import com.android.scenegraph.Camera; import com.android.scenegraph.FragmentShader; import com.android.scenegraph.MatrixTransform; import com.android.scenegraph.Scene; import com.android.scenegraph.VertexShader; import com.android.testapp.R; import android.content.res.Resources; Loading @@ -41,7 +43,6 @@ import android.renderscript.*; import android.renderscript.Allocation.MipmapControl; import android.renderscript.Mesh; import android.renderscript.RenderScriptGL; import android.renderscript.Type.Builder; import android.util.Log; import android.view.SurfaceHolder; Loading Loading @@ -74,6 +75,12 @@ public class SceneManager extends SceneGraphBase { private Allocation mDefault2D; private Allocation mDefaultCube; private FragmentShader mColor; private FragmentShader mTexture; private VertexShader mDefaultVertex; private RenderState mDefaultState; private static Allocation getDefault(boolean isCube) { final int dimension = 4; final int bytesPerPixel = 4; Loading Loading @@ -101,6 +108,9 @@ public class SceneManager extends SceneGraphBase { if (sSceneManager == null) { return null; } if (sSceneManager.mDefault2D == null) { sSceneManager.mDefault2D = getDefault(false); } return sSceneManager.mDefault2D; } Loading @@ -108,6 +118,9 @@ public class SceneManager extends SceneGraphBase { if (sSceneManager == null) { return null; } if (sSceneManager.mDefaultCube == null) { sSceneManager.mDefaultCube = getDefault(true); } return sSceneManager.mDefaultCube; } Loading Loading @@ -229,6 +242,10 @@ public class SceneManager extends SceneGraphBase { public void setActiveScene(Scene s) { mActiveScene = s; if (mActiveScene == null) { return; } // Do some sanity checking if (mActiveScene.getCameras().size() == 0) { Matrix4f camPos = new Matrix4f(); Loading @@ -242,6 +259,8 @@ public class SceneManager extends SceneGraphBase { cam.setTransform(cameraTransform); mActiveScene.appendCamera(cam); } mActiveScene.appendShader(getDefaultVS()); } static RenderScriptGL getRS() { Loading @@ -258,6 +277,114 @@ public class SceneManager extends SceneGraphBase { return sSceneManager.mRes; } // Provides the folowing inputs to fragment shader // Assigned by default if nothing is present // vec3 varWorldPos; // vec3 varWorldNormal; // vec2 varTex0; public static VertexShader getDefaultVS() { if (sSceneManager == null) { return null; } if (sSceneManager.mDefaultVertex == null) { RenderScriptGL rs = getRS(); Element.Builder b = new Element.Builder(rs); b.add(Element.MATRIX_4X4(rs), "model"); Type.Builder objConstBuilder = new Type.Builder(rs, b.create()); b = new Element.Builder(rs); b.add(Element.MATRIX_4X4(rs), "viewProj"); Type.Builder shaderConstBuilder = new Type.Builder(rs, b.create()); b = new Element.Builder(rs); b.add(Element.F32_4(rs), "position"); b.add(Element.F32_2(rs), "texture0"); b.add(Element.F32_3(rs), "normal"); Element defaultIn = b.create(); final String code = "\n" + "varying vec3 varWorldPos;\n" + "varying vec3 varWorldNormal;\n" + "varying vec2 varTex0;\n" + "void main() {" + " vec4 objPos = ATTRIB_position;\n" + " vec4 worldPos = UNI_model * objPos;\n" + " gl_Position = UNI_viewProj * worldPos;\n" + " mat3 model3 = mat3(UNI_model[0].xyz, UNI_model[1].xyz, UNI_model[2].xyz);\n" + " vec3 worldNorm = model3 * ATTRIB_normal;\n" + " varWorldPos = worldPos.xyz;\n" + " varWorldNormal = worldNorm;\n" + " varTex0 = ATTRIB_texture0;\n" + "}\n"; VertexShader.Builder sb = new VertexShader.Builder(rs); sb.addInput(defaultIn); sb.setObjectConst(objConstBuilder.setX(1).create()); sb.setShaderConst(shaderConstBuilder.setX(1).create()); sb.setShader(code); sSceneManager.mDefaultVertex = sb.create(); } return sSceneManager.mDefaultVertex; } public static FragmentShader getColorFS() { if (sSceneManager == null) { return null; } if (sSceneManager.mColor == null) { RenderScriptGL rs = getRS(); Element.Builder b = new Element.Builder(rs); b.add(Element.F32_4(rs), "color"); Type.Builder objConstBuilder = new Type.Builder(rs, b.create()); final String code = "\n" + "varying vec2 varTex0;\n" + "void main() {\n" + " lowp vec4 col = texture2D(UNI_Tex0, varTex0).rgba;\n" + " gl_FragColor = col;\n" + "}\n"; FragmentShader.Builder fb = new FragmentShader.Builder(rs); fb.setShader(code); fb.setObjectConst(objConstBuilder.create()); sSceneManager.mColor = fb.create(); } return sSceneManager.mColor; } public static FragmentShader getTextureFS() { if (sSceneManager == null) { return null; } if (sSceneManager.mTexture == null) { RenderScriptGL rs = getRS(); final String code = "\n" + "varying vec2 varTex0;\n" + "void main() {\n" + " lowp vec4 col = UNI_color;\n" + " gl_FragColor = col;\n" + "}\n"; FragmentShader.Builder fb = new FragmentShader.Builder(rs); fb.setShader(code); fb.addTexture(Program.TextureType.TEXTURE_2D, "Tex0"); sSceneManager.mTexture = fb.create(); } return sSceneManager.mTexture; } static RenderState getDefaultState() { if (sSceneManager == null) { return null; } if (sSceneManager.mDefaultState == null) { sSceneManager.mDefaultState = new RenderState(getDefaultVS(), getColorFS(), null, null); } return sSceneManager.mDefaultState; } public static SceneManager getInstance() { if (sSceneManager == null) { sSceneManager = new SceneManager(); Loading Loading @@ -316,8 +443,12 @@ public class SceneManager extends SceneGraphBase { mAllocationMap = new HashMap<String, Allocation>(); mQuad = null; mDefault2D = getDefault(false); mDefaultCube = getDefault(true); mDefault2D = null; mDefaultCube = null; mDefaultVertex = null; mColor = null; mTexture = null; mDefaultState = null; mExportScript = new ScriptC_export(rs, res, R.raw.export); Loading tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/ShaderParam.java +1 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,7 @@ public abstract class ShaderParam extends SceneGraphBase { // Make one if it's not there if (matchingParam == null) { if (subElem.getDataType() == Element.DataType.FLOAT_32) { matchingParam = new Float4Param(inputName); matchingParam = new Float4Param(inputName, 0.5f, 0.5f, 0.5f, 0.5f); } else if (subElem.getDataType() == Element.DataType.MATRIX_4X4) { TransformParam trParam = new TransformParam(inputName); trParam.setTransform(transform); Loading Loading
tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/FragmentShader.java +5 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,11 @@ public class FragmentShader extends Shader { return this; } public Builder setShader(String code) { mBuilder.setShader(code); return this; } public Builder setObjectConst(Type type) { mShader.mPerObjConstants = type; return this; Loading
tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Renderable.java +3 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,9 @@ public class Renderable extends RenderableBase { } void updateFieldItem(RenderScriptGL rs) { if (mRenderState == null) { mRenderState = SceneManager.getDefaultState(); } updateVertexConstants(rs); updateFragmentConstants(rs); Loading
tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Scene.java +24 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,9 @@ public class Scene extends SceneGraphBase { } public void appendTransform(Transform t) { if (t == null) { throw new RuntimeException("Adding null object"); } mRootTransforms.appendChild(t); } Loading @@ -88,6 +91,9 @@ public class Scene extends SceneGraphBase { } public void appendRenderPass(RenderPass p) { if (p == null) { throw new RuntimeException("Adding null object"); } mRenderPasses.add(p); } Loading @@ -96,18 +102,30 @@ public class Scene extends SceneGraphBase { } public void appendLight(LightBase l) { if (l == null) { throw new RuntimeException("Adding null object"); } mLights.add(l); } public void appendCamera(Camera c) { if (c == null) { throw new RuntimeException("Adding null object"); } mCameras.add(c); } public void appendShader(FragmentShader f) { if (f == null) { throw new RuntimeException("Adding null object"); } mFragmentShaders.add(f); } public void appendShader(VertexShader v) { if (v == null) { throw new RuntimeException("Adding null object"); } mVertexShaders.add(v); } Loading @@ -120,6 +138,9 @@ public class Scene extends SceneGraphBase { } public void appendRenderable(RenderableBase d) { if (d == null) { throw new RuntimeException("Adding null object"); } mRenderables.add(d); mRenderableMap.put(d.getName(), d); } Loading @@ -133,6 +154,9 @@ public class Scene extends SceneGraphBase { } public void appendTextures(Texture2D tex) { if (tex == null) { throw new RuntimeException("Adding null object"); } mTextures.add(tex); } Loading
tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneManager.java +134 −3 Original line number Diff line number Diff line Loading @@ -29,8 +29,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import com.android.scenegraph.Camera; import com.android.scenegraph.FragmentShader; import com.android.scenegraph.MatrixTransform; import com.android.scenegraph.Scene; import com.android.scenegraph.VertexShader; import com.android.testapp.R; import android.content.res.Resources; Loading @@ -41,7 +43,6 @@ import android.renderscript.*; import android.renderscript.Allocation.MipmapControl; import android.renderscript.Mesh; import android.renderscript.RenderScriptGL; import android.renderscript.Type.Builder; import android.util.Log; import android.view.SurfaceHolder; Loading Loading @@ -74,6 +75,12 @@ public class SceneManager extends SceneGraphBase { private Allocation mDefault2D; private Allocation mDefaultCube; private FragmentShader mColor; private FragmentShader mTexture; private VertexShader mDefaultVertex; private RenderState mDefaultState; private static Allocation getDefault(boolean isCube) { final int dimension = 4; final int bytesPerPixel = 4; Loading Loading @@ -101,6 +108,9 @@ public class SceneManager extends SceneGraphBase { if (sSceneManager == null) { return null; } if (sSceneManager.mDefault2D == null) { sSceneManager.mDefault2D = getDefault(false); } return sSceneManager.mDefault2D; } Loading @@ -108,6 +118,9 @@ public class SceneManager extends SceneGraphBase { if (sSceneManager == null) { return null; } if (sSceneManager.mDefaultCube == null) { sSceneManager.mDefaultCube = getDefault(true); } return sSceneManager.mDefaultCube; } Loading Loading @@ -229,6 +242,10 @@ public class SceneManager extends SceneGraphBase { public void setActiveScene(Scene s) { mActiveScene = s; if (mActiveScene == null) { return; } // Do some sanity checking if (mActiveScene.getCameras().size() == 0) { Matrix4f camPos = new Matrix4f(); Loading @@ -242,6 +259,8 @@ public class SceneManager extends SceneGraphBase { cam.setTransform(cameraTransform); mActiveScene.appendCamera(cam); } mActiveScene.appendShader(getDefaultVS()); } static RenderScriptGL getRS() { Loading @@ -258,6 +277,114 @@ public class SceneManager extends SceneGraphBase { return sSceneManager.mRes; } // Provides the folowing inputs to fragment shader // Assigned by default if nothing is present // vec3 varWorldPos; // vec3 varWorldNormal; // vec2 varTex0; public static VertexShader getDefaultVS() { if (sSceneManager == null) { return null; } if (sSceneManager.mDefaultVertex == null) { RenderScriptGL rs = getRS(); Element.Builder b = new Element.Builder(rs); b.add(Element.MATRIX_4X4(rs), "model"); Type.Builder objConstBuilder = new Type.Builder(rs, b.create()); b = new Element.Builder(rs); b.add(Element.MATRIX_4X4(rs), "viewProj"); Type.Builder shaderConstBuilder = new Type.Builder(rs, b.create()); b = new Element.Builder(rs); b.add(Element.F32_4(rs), "position"); b.add(Element.F32_2(rs), "texture0"); b.add(Element.F32_3(rs), "normal"); Element defaultIn = b.create(); final String code = "\n" + "varying vec3 varWorldPos;\n" + "varying vec3 varWorldNormal;\n" + "varying vec2 varTex0;\n" + "void main() {" + " vec4 objPos = ATTRIB_position;\n" + " vec4 worldPos = UNI_model * objPos;\n" + " gl_Position = UNI_viewProj * worldPos;\n" + " mat3 model3 = mat3(UNI_model[0].xyz, UNI_model[1].xyz, UNI_model[2].xyz);\n" + " vec3 worldNorm = model3 * ATTRIB_normal;\n" + " varWorldPos = worldPos.xyz;\n" + " varWorldNormal = worldNorm;\n" + " varTex0 = ATTRIB_texture0;\n" + "}\n"; VertexShader.Builder sb = new VertexShader.Builder(rs); sb.addInput(defaultIn); sb.setObjectConst(objConstBuilder.setX(1).create()); sb.setShaderConst(shaderConstBuilder.setX(1).create()); sb.setShader(code); sSceneManager.mDefaultVertex = sb.create(); } return sSceneManager.mDefaultVertex; } public static FragmentShader getColorFS() { if (sSceneManager == null) { return null; } if (sSceneManager.mColor == null) { RenderScriptGL rs = getRS(); Element.Builder b = new Element.Builder(rs); b.add(Element.F32_4(rs), "color"); Type.Builder objConstBuilder = new Type.Builder(rs, b.create()); final String code = "\n" + "varying vec2 varTex0;\n" + "void main() {\n" + " lowp vec4 col = texture2D(UNI_Tex0, varTex0).rgba;\n" + " gl_FragColor = col;\n" + "}\n"; FragmentShader.Builder fb = new FragmentShader.Builder(rs); fb.setShader(code); fb.setObjectConst(objConstBuilder.create()); sSceneManager.mColor = fb.create(); } return sSceneManager.mColor; } public static FragmentShader getTextureFS() { if (sSceneManager == null) { return null; } if (sSceneManager.mTexture == null) { RenderScriptGL rs = getRS(); final String code = "\n" + "varying vec2 varTex0;\n" + "void main() {\n" + " lowp vec4 col = UNI_color;\n" + " gl_FragColor = col;\n" + "}\n"; FragmentShader.Builder fb = new FragmentShader.Builder(rs); fb.setShader(code); fb.addTexture(Program.TextureType.TEXTURE_2D, "Tex0"); sSceneManager.mTexture = fb.create(); } return sSceneManager.mTexture; } static RenderState getDefaultState() { if (sSceneManager == null) { return null; } if (sSceneManager.mDefaultState == null) { sSceneManager.mDefaultState = new RenderState(getDefaultVS(), getColorFS(), null, null); } return sSceneManager.mDefaultState; } public static SceneManager getInstance() { if (sSceneManager == null) { sSceneManager = new SceneManager(); Loading Loading @@ -316,8 +443,12 @@ public class SceneManager extends SceneGraphBase { mAllocationMap = new HashMap<String, Allocation>(); mQuad = null; mDefault2D = getDefault(false); mDefaultCube = getDefault(true); mDefault2D = null; mDefaultCube = null; mDefaultVertex = null; mColor = null; mTexture = null; mDefaultState = null; mExportScript = new ScriptC_export(rs, res, R.raw.export); Loading
tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/ShaderParam.java +1 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,7 @@ public abstract class ShaderParam extends SceneGraphBase { // Make one if it's not there if (matchingParam == null) { if (subElem.getDataType() == Element.DataType.FLOAT_32) { matchingParam = new Float4Param(inputName); matchingParam = new Float4Param(inputName, 0.5f, 0.5f, 0.5f, 0.5f); } else if (subElem.getDataType() == Element.DataType.MATRIX_4X4) { TransformParam trParam = new TransformParam(inputName); trParam.setTransform(transform); Loading