14fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk/*
24fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
34fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk *
44fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
54fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * you may not use this file except in compliance with the License.
64fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * You may obtain a copy of the License at
74fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk *
84fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
94fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk *
104fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
124fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * See the License for the specific language governing permissions and
144fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * limitations under the License.
154fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk */
164fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
174fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukpackage com.android.scenegraph;
184fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
194fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport java.lang.Math;
204fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport java.util.ArrayList;
214fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
224fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.content.res.Resources;
234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.renderscript.*;
244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.util.Log;
254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk/**
274fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk * @hide
284fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk */
294fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukpublic class VertexShader extends Shader {
304fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ProgramVertex mProgram;
314fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ScriptField_VertexShader_s mField;
324fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
334fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public static class Builder {
344fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        VertexShader mShader;
354fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        ProgramVertex.Builder mBuilder;
364fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
374fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        public Builder(RenderScriptGL rs) {
384fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mShader = new VertexShader();
394fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mBuilder = new ProgramVertex.Builder(rs);
404fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
414fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
424fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        public Builder setShader(Resources resources, int resourceID) {
434fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mBuilder.setShader(resources, resourceID);
444fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            return this;
454fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
47c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        public Builder setShader(String code) {
48c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            mBuilder.setShader(code);
49c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            return this;
50c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
51c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk
524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        public Builder setObjectConst(Type type) {
534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mShader.mPerObjConstants = type;
544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            return this;
554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        public Builder setShaderConst(Type type) {
584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mShader.mPerShaderConstants = type;
594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            return this;
604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
614fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
624fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        public Builder addInput(Element e) {
634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mBuilder.addInput(e);
644fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            return this;
654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
67d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        public VertexShader create() {
684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            if (mShader.mPerShaderConstants != null) {
694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                mBuilder.addConstant(mShader.mPerShaderConstants);
704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            }
714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            if (mShader.mPerObjConstants != null) {
724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                mBuilder.addConstant(mShader.mPerObjConstants);
734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            }
744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mShader.mProgram = mBuilder.create();
754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            return mShader;
764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
784fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
79d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk    public ProgramVertex getProgram() {
80d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        return mProgram;
81d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk    }
82d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk
83e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    ScriptField_VertexShader_s getRSData() {
844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        if (mField != null) {
854fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            return mField;
864fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
874fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
88e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        RenderScriptGL rs = SceneManager.getRS();
89e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        Resources res = SceneManager.getRes();
90e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        if (rs == null || res == null) {
91e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            return null;
92e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        }
93e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
944fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        ScriptField_VertexShader_s.Item item = new ScriptField_VertexShader_s.Item();
954fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        item.program = mProgram;
964fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
97e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        linkConstants(rs);
984fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        if (mPerShaderConstants != null) {
994fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            item.shaderConst = mConstantBuffer;
1000c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk            item.shaderConstParams = mConstantBufferParams.getAllocation();
1014fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            mProgram.bindConstants(item.shaderConst, 0);
1024fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
1034fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
1044fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        item.objectConstIndex = -1;
1054fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        if (mPerObjConstants != null) {
1064fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            item.objectConstIndex = mPerShaderConstants != null ? 1 : 0;
1074fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
1084fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
1094fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mField = new ScriptField_VertexShader_s(rs, 1);
1104fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mField.set(item, 0, true);
1114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        return mField;
1124fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1134fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk}
114