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