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 22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*; 23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Matrix4f; 24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log; 25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/** 27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide 28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */ 29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic abstract class Transform extends SceneGraphBase { 30dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk Transform mParent; 31dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk ArrayList<Transform> mChildren; 32dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk 33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ScriptField_SgTransform mField; 34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ScriptField_SgTransform.Item mTransformData; 35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public Transform() { 37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mChildren = new ArrayList<Transform>(); 38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mParent = null; 39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void appendChild(Transform t) { 42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mChildren.add(t); 43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk t.mParent = this; 44e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk updateRSChildData(true); 45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk abstract void initLocalData(); 48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 49e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk void updateRSChildData(boolean copyData) { 50e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk if (mField == null) { 51e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk return; 52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 53e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk RenderScriptGL rs = SceneManager.getRS(); 54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk if (mChildren.size() != 0) { 554bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk Allocation childRSData = Allocation.createSized(rs, Element.ALLOCATION(rs), 56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mChildren.size()); 57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTransformData.children = childRSData; 58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk Allocation[] childrenAllocs = new Allocation[mChildren.size()]; 60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk for (int i = 0; i < mChildren.size(); i ++) { 61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk Transform child = mChildren.get(i); 62e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk childrenAllocs[i] = child.getRSData().getAllocation(); 63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk childRSData.copyFrom(childrenAllocs); 65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 66e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk if (copyData) { 67e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk mField.set(mTransformData, 0, true); 68e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk } 69e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk } 70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 71e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk ScriptField_SgTransform getRSData() { 72e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk if (mField != null) { 73e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk return mField; 74e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk } 75e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk 76e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk RenderScriptGL rs = SceneManager.getRS(); 77e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk if (rs == null) { 78e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk return null; 79e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk } 80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mField = new ScriptField_SgTransform(rs, 1); 81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 82e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk mTransformData = new ScriptField_SgTransform.Item(); 83e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk mTransformData.name = getNameAlloc(rs); 84e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk mTransformData.isDirty = 1; 85e92c78ccd095ae1cb47198afb664f98571ce2148Alex Sakhartchouk mTransformData.timestamp = 1; 86e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk 87e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk initLocalData(); 88e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk updateRSChildData(false); 89e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk 90e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk mField.set(mTransformData, 0, true); 91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk return mField; 92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk} 94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 99