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; 21a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 2261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport com.android.scenegraph.Scene; 2361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport com.android.scenegraph.SceneManager; 2461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk 2561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport android.renderscript.Element; 26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Float4; 27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Matrix4f; 28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramFragment; 29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramStore; 30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramVertex; 3161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport android.renderscript.RenderScriptGL; 32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log; 33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/** 35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide 36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */ 37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class Float4Param extends ShaderParam { 3861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk private static String TAG = "Float4Param"; 39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk LightBase mLight; 41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public Float4Param(String name) { 43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk super(name); 44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 460c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk public Float4Param(String name, float x) { 47be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk super(name); 485c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk set(x, 0, 0, 0); 49be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 50be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 51be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk public Float4Param(String name, float x, float y) { 52be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk super(name); 535c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk set(x, y, 0, 0); 54be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 55be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 56be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk public Float4Param(String name, float x, float y, float z) { 57be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk super(name); 585c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk set(x, y, z, 0); 59be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 60be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 61be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk public Float4Param(String name, float x, float y, float z, float w) { 62be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk super(name); 635c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk set(x, y, z, w); 640c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk } 650c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk 665c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk void set(float x, float y, float z, float w) { 670c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.float_value.x = x; 680c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.float_value.y = y; 690c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.float_value.z = z; 700c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.float_value.w = w; 710c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk if (mField != null) { 72e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk mField.set_float_value(0, mData.float_value, true); 730c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk } 745c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk incTimestamp(); 75be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 76be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void setValue(Float4 v) { 785c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk set(v.x, v.y, v.z, v.w); 79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public Float4 getValue() { 820c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk return mData.float_value; 83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void setLight(LightBase l) { 86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mLight = l; 870c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk if (mField != null) { 880c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.light = mLight.getRSData().getAllocation(); 890c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mField.set_light(0, mData.light, true); 900c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk } 915c15b765fecca6b0ba2760d04c86798ff980fd53Alex Sakhartchouk incTimestamp(); 92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 93dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk 9461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk boolean findLight(String property) { 9561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk String indexStr = mParamName.substring(property.length() + 1); 9661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk if (indexStr == null) { 9761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk Log.e(TAG, "Invalid light index."); 9861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk return false; 9961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } 10061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk int index = Integer.parseInt(indexStr); 10161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk if (index == -1) { 10261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk return false; 10361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } 10461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk Scene parentScene = SceneManager.getInstance().getActiveScene(); 10561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk ArrayList<LightBase> allLights = parentScene.getLights(); 10661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk if (index >= allLights.size()) { 10761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk return false; 10861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } 10961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk mLight = allLights.get(index); 11061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk if (mLight == null) { 11161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk return false; 11261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } 11361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk return true; 11461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } 11561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk 116dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk int getTypeFromName() { 117e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk int paramType = ScriptC_export.const_ShaderParam_FLOAT4_DATA; 118dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk if (mParamName.equalsIgnoreCase(cameraPos)) { 119e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk paramType = ScriptC_export.const_ShaderParam_FLOAT4_CAMERA_POS; 120dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk } else if(mParamName.equalsIgnoreCase(cameraDir)) { 121e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk paramType = ScriptC_export.const_ShaderParam_FLOAT4_CAMERA_DIR; 12261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } else if(mParamName.startsWith(lightColor) && findLight(lightColor)) { 123e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk paramType = ScriptC_export.const_ShaderParam_FLOAT4_LIGHT_COLOR; 12461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } else if(mParamName.startsWith(lightPos) && findLight(lightPos)) { 125e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk paramType = ScriptC_export.const_ShaderParam_FLOAT4_LIGHT_POS; 12661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } else if(mParamName.startsWith(lightDir) && findLight(lightDir)) { 127e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk paramType = ScriptC_export.const_ShaderParam_FLOAT4_LIGHT_DIR; 128dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk } 129dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk return paramType; 130dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk } 131dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk 1320c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk void initLocalData() { 1330c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.type = getTypeFromName(); 134dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk if (mCamera != null) { 1350c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.camera = mCamera.getRSData().getAllocation(); 136dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk } 137dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk if (mLight != null) { 1380c9523357f48a26c8214ccff0b0d95c6927ac0d3Alex Sakhartchouk mData.light = mLight.getRSData().getAllocation(); 139dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk } 140dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk } 141a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk} 142a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 143a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 144a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 145a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 146a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 147