1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.scenegraph; 18 19 import java.lang.Math; 20 import java.util.ArrayList; 21 import java.util.HashMap; 22 23 import com.android.scenegraph.SceneManager; 24 import com.android.scenegraph.Transform; 25 26 import android.renderscript.Element; 27 import android.renderscript.Matrix4f; 28 import android.renderscript.ProgramFragment; 29 import android.renderscript.ProgramStore; 30 import android.renderscript.ProgramVertex; 31 import android.renderscript.RenderScriptGL; 32 import android.util.Log; 33 34 /** 35 * @hide 36 */ 37 public abstract class ShaderParam extends SceneGraphBase { 38 39 static final String cameraPos = "cameraPos"; 40 static final String cameraDir = "cameraDir"; 41 42 static final String lightColor = "lightColor"; 43 static final String lightPos = "lightPos"; 44 static final String lightDir = "lightDir"; 45 46 static final String view = "view"; 47 static final String proj = "proj"; 48 static final String viewProj = "viewProj"; 49 static final String model = "model"; 50 static final String modelView = "modelView"; 51 static final String modelViewProj = "modelViewProj"; 52 53 static final long sMaxTimeStamp = 0xffffffffL; 54 55 ScriptField_ShaderParamData_s.Item mData; 56 ScriptField_ShaderParamData_s mField; 57 58 String mParamName; 59 Camera mCamera; 60 61 static ScriptField_ShaderParam_s fillInParams(Element constantElem, 62 HashMap<String, ShaderParam> sourceParams, 63 Transform transform) { 64 RenderScriptGL rs = SceneManager.getRS(); 65 ArrayList<ScriptField_ShaderParam_s.Item> paramList; 66 paramList = new ArrayList<ScriptField_ShaderParam_s.Item>(); 67 68 int subElemCount = constantElem.getSubElementCount(); 69 for (int i = 0; i < subElemCount; i ++) { 70 String inputName = constantElem.getSubElementName(i); 71 int offset = constantElem.getSubElementOffsetBytes(i); 72 73 ShaderParam matchingParam = sourceParams.get(inputName); 74 Element subElem = constantElem.getSubElement(i); 75 // Make one if it's not there 76 if (matchingParam == null) { 77 if (subElem.getDataType() == Element.DataType.FLOAT_32) { 78 matchingParam = new Float4Param(inputName, 0.5f, 0.5f, 0.5f, 0.5f); 79 } else if (subElem.getDataType() == Element.DataType.MATRIX_4X4) { 80 TransformParam trParam = new TransformParam(inputName); 81 trParam.setTransform(transform); 82 matchingParam = trParam; 83 } 84 } 85 ScriptField_ShaderParam_s.Item paramRS = new ScriptField_ShaderParam_s.Item(); 86 paramRS.bufferOffset = offset; 87 paramRS.transformTimestamp = 0; 88 paramRS.dataTimestamp = 0; 89 paramRS.data = matchingParam.getRSData().getAllocation(); 90 if (subElem.getDataType() == Element.DataType.FLOAT_32) { 91 paramRS.float_vecSize = subElem.getVectorSize(); 92 } 93 94 paramList.add(paramRS); 95 } 96 97 ScriptField_ShaderParam_s rsParams = null; 98 int paramCount = paramList.size(); 99 if (paramCount != 0) { 100 rsParams = new ScriptField_ShaderParam_s(rs, paramCount); 101 for (int i = 0; i < paramCount; i++) { 102 rsParams.set(paramList.get(i), i, false); 103 } 104 rsParams.copyAll(); 105 } 106 return rsParams; 107 } 108 109 public ShaderParam(String name) { 110 mParamName = name; 111 mData = new ScriptField_ShaderParamData_s.Item(); 112 } 113 114 public String getParamName() { 115 return mParamName; 116 } 117 118 public void setCamera(Camera c) { 119 mCamera = c; 120 if (mField != null) { 121 mData.camera = mCamera.getRSData().getAllocation(); 122 mField.set_camera(0, mData.camera, true); 123 } 124 } 125 126 protected void incTimestamp() { 127 if (mField != null) { 128 mData.timestamp ++; 129 mData.timestamp %= sMaxTimeStamp; 130 mField.set_timestamp(0, mData.timestamp, true); 131 } 132 } 133 134 abstract void initLocalData(); 135 136 public ScriptField_ShaderParamData_s getRSData() { 137 if (mField != null) { 138 return mField; 139 } 140 141 RenderScriptGL rs = SceneManager.getRS(); 142 mField = new ScriptField_ShaderParamData_s(rs, 1); 143 144 if (mParamName != null) { 145 mData.paramName = SceneManager.getCachedAlloc(mParamName); 146 if (mData.paramName == null) { 147 mData.paramName = SceneManager.getStringAsAllocation(rs, mParamName); 148 SceneManager.cacheAlloc(mParamName, mData.paramName); 149 } 150 } 151 initLocalData(); 152 mData.timestamp = 1; 153 154 mField.set(mData, 0, true); 155 return mField; 156 } 157 } 158 159 160 161 162 163