ShaderParam.java revision 4fd35d8f49dbed174828da60b70c37e7a77a0d13
1a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/*
2a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
4a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * you may not use this file except in compliance with the License.
6a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * You may obtain a copy of the License at
7a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
8a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
10a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * See the License for the specific language governing permissions and
14a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * limitations under the License.
15a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
16a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
17a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpackage com.android.scenegraph;
18a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
19a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.lang.Math;
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
214fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport java.util.HashMap;
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport com.android.scenegraph.Transform;
244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.renderscript.Element;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Matrix4f;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramFragment;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramStore;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramVertex;
304fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
36dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchoukpublic abstract class ShaderParam extends SceneGraphBase {
37dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int FLOAT4_DATA = 0;
38dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int FLOAT4_CAMERA_POS = 1;
39dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int FLOAT4_CAMERA_DIR = 2;
40dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int FLOAT4_LIGHT_COLOR = 3;
41dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int FLOAT4_LIGHT_POS = 4;
42dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int FLOAT4_LIGHT_DIR = 5;
43dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
44dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TRANSFORM_DATA = 100;
45dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TRANSFORM_VIEW = 101;
46dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TRANSFORM_PROJ = 102;
47dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TRANSFORM_VIEW_PROJ = 103;
48dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TRANSFORM_MODEL = 104;
49dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TRANSFORM_MODEL_VIEW = 105;
50dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TRANSFORM_MODEL_VIEW_PROJ = 106;
51dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
52dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final int TEXTURE = 200;
53dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
54dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String cameraPos        = "cameraPos";
55dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String cameraDir        = "cameraDir";
56dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
57dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String lightColor       = "lightColor";
58dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String lightPos         = "lightPos";
59dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String lightDir         = "lightDir";
60dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
61dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String view             = "view";
62dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String proj             = "proj";
63dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String viewProj         = "viewProj";
64dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String model            = "model";
65dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String modelView        = "modelView";
66dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    static final String modelViewProj    = "modelViewProj";
67dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
68dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    ScriptField_ShaderParam_s.Item mRsFieldItem;
69dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    String mParamName;
71dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    int mOffset;
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    static void fillInParams(Element constantElem,
744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                             HashMap<String, ShaderParam> sourceParams,
754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                             Transform transform,
764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                             ArrayList<ShaderParam> paramList) {
774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        int subElemCount = constantElem.getSubElementCount();
784fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        for (int i = 0; i < subElemCount; i ++) {
794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            String inputName = constantElem.getSubElementName(i);
804fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            int offset = constantElem.getSubElementOffsetBytes(i);
814fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
824fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            ShaderParam matchingParam = sourceParams.get(inputName);
834fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            Element subElem = constantElem.getSubElement(i);
844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            // Make one if it's not there
854fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            if (matchingParam == null) {
864fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                if (subElem.getDataType() == Element.DataType.FLOAT_32) {
874fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                    matchingParam = new Float4Param(inputName);
884fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                } else if (subElem.getDataType() == Element.DataType.MATRIX_4X4) {
894fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                    TransformParam trParam = new TransformParam(inputName);
904fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                    trParam.setTransform(transform);
914fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                    matchingParam = trParam;
924fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                }
934fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            }
944fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            matchingParam.setOffset(offset);
954fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            if (subElem.getDataType() == Element.DataType.FLOAT_32) {
964fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                Float4Param fParam = (Float4Param)matchingParam;
974fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                fParam.setVecSize(subElem.getVectorSize());
984fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            }
994fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            paramList.add(matchingParam);
1004fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
1014fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1024fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ShaderParam(String name) {
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mParamName = name;
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public String getParamName() {
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mParamName;
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
110dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
111dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    void setOffset(int offset) {
112dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        mOffset = offset;
113dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    }
114dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
115dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    abstract void initLocalData(RenderScriptGL rs);
116dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
117dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    public ScriptField_ShaderParam_s.Item getRSData(RenderScriptGL rs) {
118dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        if (mRsFieldItem != null) {
119dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk            return mRsFieldItem;
120dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        }
121dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk
122dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        mRsFieldItem = new ScriptField_ShaderParam_s.Item();
123dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        initLocalData(rs);
124dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        return mRsFieldItem;
125dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    }
126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
128a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
129a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
131a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
132