1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/*
2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2011 The Android Open Source Project
3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License.
6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at
7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software
11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and
14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License.
15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
17a1db574036c9bc2d397b69f8200594027e1fff16Romain Guypackage com.android.scenegraph;
18a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
19e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport java.lang.Math;
20e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport java.util.ArrayList;
21e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
22deba785f122a47915756ffd991f5540d952cf937Romain Guyimport android.content.res.Resources;
23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.renderscript.*;
24ce0537b80087a6225273040a987414b1dd081aa0Romain Guyimport android.util.Log;
25c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
26f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy/**
27c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy * @hide
28079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy */
29a1db574036c9bc2d397b69f8200594027e1fff16Romain Guypublic class VertexShader extends Shader {
3085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy    ProgramVertex mProgram;
31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ScriptField_VertexShader_s mField;
3285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
3306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy    public static class Builder {
34db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        VertexShader mShader;
359d5316e3f56d138504565ff311145ac01621dff4Romain Guy        ProgramVertex.Builder mBuilder;
369d5316e3f56d138504565ff311145ac01621dff4Romain Guy
3785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy        public Builder(RenderScriptGL rs) {
38e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy            mShader = new VertexShader();
39e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy            mBuilder = new ProgramVertex.Builder(rs);
40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
429d5316e3f56d138504565ff311145ac01621dff4Romain Guy        public Builder setShader(Resources resources, int resourceID) {
439d5316e3f56d138504565ff311145ac01621dff4Romain Guy            mBuilder.setShader(resources, resourceID);
449d5316e3f56d138504565ff311145ac01621dff4Romain Guy            return this;
459d5316e3f56d138504565ff311145ac01621dff4Romain Guy        }
469d5316e3f56d138504565ff311145ac01621dff4Romain Guy
479d5316e3f56d138504565ff311145ac01621dff4Romain Guy        public Builder setShader(String code) {
489d5316e3f56d138504565ff311145ac01621dff4Romain Guy            mBuilder.setShader(code);
497ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy            return this;
507ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        }
519d5316e3f56d138504565ff311145ac01621dff4Romain Guy
529d5316e3f56d138504565ff311145ac01621dff4Romain Guy        public Builder setObjectConst(Type type) {
53e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            mShader.mPerObjConstants = type;
54e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            return this;
55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
57ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        public Builder setShaderConst(Type type) {
5885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy            mShader.mPerShaderConstants = type;
59e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            return this;
60e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
61ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
62f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        public Builder addInput(Element e) {
63f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy            mBuilder.addInput(e);
64e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            return this;
65e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
66e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
67e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        public VertexShader create() {
68e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            if (mShader.mPerShaderConstants != null) {
69e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy                mBuilder.addConstant(mShader.mPerShaderConstants);
70ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            }
71f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy            if (mShader.mPerObjConstants != null) {
72f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy                mBuilder.addConstant(mShader.mPerObjConstants);
73e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            }
74e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            mShader.mProgram = mBuilder.create();
75ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            return mShader;
76f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        }
77f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    }
78e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
79e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public ProgramVertex getProgram() {
80e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mProgram;
81bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    }
82bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
83bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    ScriptField_VertexShader_s getRSData() {
84ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        if (mField != null) {
85bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy            return mField;
86f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        }
87f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
88bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        RenderScriptGL rs = SceneManager.getRS();
89ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        Resources res = SceneManager.getRes();
90f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        if (rs == null || res == null) {
91f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy            return null;
92bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        }
93bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
94ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        ScriptField_VertexShader_s.Item item = new ScriptField_VertexShader_s.Item();
95f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        item.program = mProgram;
96f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
97bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        linkConstants(rs);
98bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        if (mPerShaderConstants != null) {
99ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            item.shaderConst = mConstantBuffer;
100f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy            item.shaderConstParams = mConstantBufferParams.getAllocation();
101f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy            mProgram.bindConstants(item.shaderConst, 0);
102bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        }
103bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
104f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        item.objectConstIndex = -1;
105bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        if (mPerObjConstants != null) {
106bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy            item.objectConstIndex = mPerShaderConstants != null ? 1 : 0;
107bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        }
108ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
109bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        mField = new ScriptField_VertexShader_s(rs, 1);
110bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        mField.set(item, 0, true);
111bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        return mField;
112bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    }
113bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy}
114ce0537b80087a6225273040a987414b1dd081aa0Romain Guy