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