/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.scenegraph; import java.lang.Math; import java.util.ArrayList; import java.util.HashMap; import com.android.scenegraph.SceneManager; import com.android.scenegraph.Transform; import android.renderscript.Element; import android.renderscript.Matrix4f; import android.renderscript.ProgramFragment; import android.renderscript.ProgramStore; import android.renderscript.ProgramVertex; import android.renderscript.RenderScriptGL; import android.util.Log; /** * @hide */ public abstract class ShaderParam extends SceneGraphBase { static final String cameraPos = "cameraPos"; static final String cameraDir = "cameraDir"; static final String lightColor = "lightColor"; static final String lightPos = "lightPos"; static final String lightDir = "lightDir"; static final String view = "view"; static final String proj = "proj"; static final String viewProj = "viewProj"; static final String model = "model"; static final String modelView = "modelView"; static final String modelViewProj = "modelViewProj"; static final long sMaxTimeStamp = 0xffffffffL; ScriptField_ShaderParamData_s.Item mData; ScriptField_ShaderParamData_s mField; String mParamName; Camera mCamera; static ScriptField_ShaderParam_s fillInParams(Element constantElem, HashMap sourceParams, Transform transform) { RenderScriptGL rs = SceneManager.getRS(); ArrayList paramList; paramList = new ArrayList(); int subElemCount = constantElem.getSubElementCount(); for (int i = 0; i < subElemCount; i ++) { String inputName = constantElem.getSubElementName(i); int offset = constantElem.getSubElementOffsetBytes(i); ShaderParam matchingParam = sourceParams.get(inputName); Element subElem = constantElem.getSubElement(i); // Make one if it's not there if (matchingParam == null) { if (subElem.getDataType() == Element.DataType.FLOAT_32) { matchingParam = new Float4Param(inputName, 0.5f, 0.5f, 0.5f, 0.5f); } else if (subElem.getDataType() == Element.DataType.MATRIX_4X4) { TransformParam trParam = new TransformParam(inputName); trParam.setTransform(transform); matchingParam = trParam; } } ScriptField_ShaderParam_s.Item paramRS = new ScriptField_ShaderParam_s.Item(); paramRS.bufferOffset = offset; paramRS.transformTimestamp = 0; paramRS.dataTimestamp = 0; paramRS.data = matchingParam.getRSData().getAllocation(); if (subElem.getDataType() == Element.DataType.FLOAT_32) { paramRS.float_vecSize = subElem.getVectorSize(); } paramList.add(paramRS); } ScriptField_ShaderParam_s rsParams = null; int paramCount = paramList.size(); if (paramCount != 0) { rsParams = new ScriptField_ShaderParam_s(rs, paramCount); for (int i = 0; i < paramCount; i++) { rsParams.set(paramList.get(i), i, false); } rsParams.copyAll(); } return rsParams; } public ShaderParam(String name) { mParamName = name; mData = new ScriptField_ShaderParamData_s.Item(); } public String getParamName() { return mParamName; } public void setCamera(Camera c) { mCamera = c; if (mField != null) { mData.camera = mCamera.getRSData().getAllocation(); mField.set_camera(0, mData.camera, true); } } protected void incTimestamp() { if (mField != null) { mData.timestamp ++; mData.timestamp %= sMaxTimeStamp; mField.set_timestamp(0, mData.timestamp, true); } } abstract void initLocalData(); public ScriptField_ShaderParamData_s getRSData() { if (mField != null) { return mField; } RenderScriptGL rs = SceneManager.getRS(); mField = new ScriptField_ShaderParamData_s(rs, 1); if (mParamName != null) { mData.paramName = SceneManager.getCachedAlloc(mParamName); if (mData.paramName == null) { mData.paramName = SceneManager.getStringAsAllocation(rs, mParamName); SceneManager.cacheAlloc(mParamName, mData.paramName); } } initLocalData(); mData.timestamp = 1; mField.set(mData, 0, true); return mField; } }