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
22e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchoukimport com.android.scenegraph.SceneManager;
23e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
24e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchoukimport android.renderscript.*;
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Matrix4f;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class Camera extends SceneGraphBase {
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Transform mTransform;
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
36f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk    ScriptField_Camera_s.Item mData;
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_Camera_s mField;
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Camera() {
40f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData = new ScriptField_Camera_s.Item();
41f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.near = 0.1f;
426f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mData.far = 1000.0f;
43f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.horizontalFOV = 60.0f;
44f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.aspect = 0;
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setTransform(Transform t) {
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransform = t;
49f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        if (mField != null) {
50e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk            mField.set_transformMatrix(0, mTransform.getRSData().getAllocation(), true);
51f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk            mField.set_isDirty(0, 1, true);
52f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        }
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setFOV(float fov) {
55f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.horizontalFOV = fov;
56f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        if (mField != null) {
57e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk            mField.set_horizontalFOV(0, fov, true);
58f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk            mField.set_isDirty(0, 1, true);
59f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        }
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setNear(float n) {
63f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.near = n;
64f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        if (mField != null) {
65e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk            mField.set_near(0, n, true);
66f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk            mField.set_isDirty(0, 1, true);
67f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        }
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setFar(float f) {
71f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.far = f;
72f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        if (mField != null) {
73e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk            mField.set_far(0, f, true);
74f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk            mField.set_isDirty(0, 1, true);
75f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        }
76e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    }
77e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
78e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    public void setName(String n) {
79e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        super.setName(n);
80f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        if (mField != null) {
81f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk            RenderScriptGL rs = SceneManager.getRS();
82f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk            mData.name = getNameAlloc(rs);
83e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk            mField.set_name(0, mData.name, true);
84f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk            mField.set_isDirty(0, 1, true);
85f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        }
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
88e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    ScriptField_Camera_s getRSData() {
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mField != null) {
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return mField;
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
93e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        RenderScriptGL rs = SceneManager.getRS();
94e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        if (rs == null) {
95e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            return null;
96e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        }
97e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
98e92c78ccd095ae1cb47198afb664f98571ce2148Alex Sakhartchouk        if (mTransform == null) {
99e92c78ccd095ae1cb47198afb664f98571ce2148Alex Sakhartchouk            throw new RuntimeException("Cameras without transforms are invalid");
100e92c78ccd095ae1cb47198afb664f98571ce2148Alex Sakhartchouk        }
101e92c78ccd095ae1cb47198afb664f98571ce2148Alex Sakhartchouk
102f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mField = new ScriptField_Camera_s(rs, 1);
103f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk
104f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.transformMatrix = mTransform.getRSData().getAllocation();
105f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.transformTimestamp = 1;
106f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.timestamp = 1;
107f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.isDirty = 1;
108f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mData.name = getNameAlloc(rs);
109f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        mField.set(mData, 0, true);
110f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk
111f684c01b7af0229ac6d981c2ee3c14703ef64f76Alex Sakhartchouk        return mField;
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
119