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