Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7359dfe authored by Alex Sakhartchouk's avatar Alex Sakhartchouk Committed by Android (Google) Code Review
Browse files

Merge "Adding better default behaviour for programmatically created objects."

parents aa4ee423 c71343ac
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -196,6 +196,9 @@ public class Renderable extends RenderableBase {
    }

    void updateFieldItem(RenderScriptGL rs) {
        if (mRenderState == null) {
            mRenderState = SceneManager.getDefaultState();
        }
        updateVertexConstants(rs);
        updateFragmentConstants(rs);

+24 −0
Original line number Diff line number Diff line
@@ -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);
    }

@@ -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);
    }

@@ -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);
    }

@@ -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);
    }
@@ -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);
    }

+134 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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;
@@ -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;
    }

@@ -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;
    }

@@ -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();
@@ -242,6 +259,8 @@ public class SceneManager extends SceneGraphBase {
            cam.setTransform(cameraTransform);
            mActiveScene.appendCamera(cam);
        }

        mActiveScene.appendShader(getDefaultVS());
    }

    static RenderScriptGL getRS() {
@@ -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();
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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