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