• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.scenegraph;
18 
19 import java.lang.Math;
20 import java.util.ArrayList;
21 
22 import com.android.scenegraph.SceneManager;
23 
24 import android.renderscript.*;
25 import android.renderscript.Float3;
26 import android.renderscript.Matrix4f;
27 import android.util.Log;
28 
29 /**
30  * @hide
31  */
32 public class CompoundTransform extends Transform {
33 
34     public static abstract class Component {
35         String mName;
36         CompoundTransform mParent;
37         int mParentIndex;
38         protected ScriptField_TransformComponent_s.Item mData;
39 
Component(int type, String name)40         Component(int type, String name) {
41             mData = new ScriptField_TransformComponent_s.Item();
42             mData.type = type;
43             mName = name;
44         }
45 
setNameAlloc()46         void setNameAlloc() {
47             RenderScriptGL rs = SceneManager.getRS();
48             if (mData.name != null)  {
49                 return;
50             }
51             mData.name = SceneManager.getCachedAlloc(getName());
52             if (mData.name == null) {
53                 mData.name = SceneManager.getStringAsAllocation(rs, getName());
54                 SceneManager.cacheAlloc(getName(), mData.name);
55             }
56         }
57 
getRSData()58         ScriptField_TransformComponent_s.Item getRSData() {
59             setNameAlloc();
60             return mData;
61         }
62 
update()63         protected void update() {
64             if (mParent != null) {
65                 mParent.updateRSComponent(this);
66             }
67         }
68 
getName()69         public String getName() {
70             return mName;
71         }
72     }
73 
74     public static class TranslateComponent extends Component {
TranslateComponent(String name, Float3 translate)75         public TranslateComponent(String name, Float3 translate) {
76             super(ScriptC_export.const_Transform_TRANSLATE, name);
77             setValue(translate);
78         }
getValue()79         public Float3 getValue() {
80             return new Float3(mData.value.x, mData.value.y, mData.value.z);
81         }
setValue(Float3 val)82         public void setValue(Float3 val) {
83             mData.value.x = val.x;
84             mData.value.y = val.y;
85             mData.value.z = val.z;
86             update();
87         }
88     }
89 
90     public static class RotateComponent extends Component {
RotateComponent(String name, Float3 axis, float angle)91         public RotateComponent(String name, Float3 axis, float angle) {
92             super(ScriptC_export.const_Transform_ROTATE, name);
93             setAxis(axis);
94             setAngle(angle);
95         }
getAxis()96         public Float3 getAxis() {
97             return new Float3(mData.value.x, mData.value.y, mData.value.z);
98         }
getAngle()99         public float getAngle() {
100             return mData.value.w;
101         }
setAxis(Float3 val)102         public void setAxis(Float3 val) {
103             mData.value.x = val.x;
104             mData.value.y = val.y;
105             mData.value.z = val.z;
106             update();
107         }
setAngle(float val)108         public void setAngle(float val) {
109             mData.value.w = val;
110             update();
111         }
112     }
113 
114     public static class ScaleComponent extends Component {
ScaleComponent(String name, Float3 scale)115         public ScaleComponent(String name, Float3 scale) {
116             super(ScriptC_export.const_Transform_SCALE, name);
117             setValue(scale);
118         }
getValue()119         public Float3 getValue() {
120             return new Float3(mData.value.x, mData.value.y, mData.value.z);
121         }
setValue(Float3 val)122         public void setValue(Float3 val) {
123             mData.value.x = val.x;
124             mData.value.y = val.y;
125             mData.value.z = val.z;
126             update();
127         }
128     }
129 
130     ScriptField_TransformComponent_s mComponentField;
131     public ArrayList<Component> mTransformComponents;
132 
CompoundTransform()133     public CompoundTransform() {
134         mTransformComponents = new ArrayList<Component>();
135     }
136 
addTranslate(String name, Float3 translate)137     public TranslateComponent addTranslate(String name, Float3 translate) {
138         TranslateComponent c = new TranslateComponent(name, translate);
139         addComponent(c);
140         return c;
141     }
142 
addRotate(String name, Float3 axis, float angle)143     public RotateComponent addRotate(String name, Float3 axis, float angle) {
144         RotateComponent c = new RotateComponent(name, axis, angle);
145         addComponent(c);
146         return c;
147     }
148 
addScale(String name, Float3 scale)149     public ScaleComponent addScale(String name, Float3 scale) {
150         ScaleComponent c = new ScaleComponent(name, scale);
151         addComponent(c);
152         return c;
153     }
154 
addComponent(Component c)155     public void addComponent(Component c) {
156         if (c.mParent != null) {
157             throw new IllegalArgumentException("Transform components may not be shared");
158         }
159         c.mParent = this;
160         c.mParentIndex = mTransformComponents.size();
161         mTransformComponents.add(c);
162         updateRSComponentAllocation();
163     }
164 
setComponent(int index, Component c)165     public void setComponent(int index, Component c) {
166         if (c.mParent != null) {
167             throw new IllegalArgumentException("Transform components may not be shared");
168         }
169         if (index >= mTransformComponents.size()) {
170             throw new IllegalArgumentException("Invalid component index");
171         }
172         c.mParent = this;
173         c.mParentIndex = index;
174         mTransformComponents.set(index, c);
175         updateRSComponent(c);
176     }
177 
updateRSComponent(Component c)178     void updateRSComponent(Component c) {
179         if (mField == null || mComponentField == null) {
180             return;
181         }
182         mComponentField.set(c.getRSData(), c.mParentIndex, true);
183         mField.set_isDirty(0, 1, true);
184     }
185 
updateRSComponentAllocation()186     void updateRSComponentAllocation() {
187         if (mField == null) {
188             return;
189         }
190         initLocalData();
191 
192         mField.set_components(0, mTransformData.components, false);
193         mField.set_isDirty(0, 1, true);
194     }
195 
initLocalData()196     void initLocalData() {
197         RenderScriptGL rs = SceneManager.getRS();
198         int numComponenets = mTransformComponents.size();
199         if (numComponenets > 0) {
200             mComponentField = new ScriptField_TransformComponent_s(rs, numComponenets);
201             for (int i = 0; i < numComponenets; i ++) {
202                 Component ith = mTransformComponents.get(i);
203                 mComponentField.set(ith.getRSData(), i, false);
204             }
205             mComponentField.copyAll();
206 
207             mTransformData.components = mComponentField.getAllocation();
208         }
209     }
210 }
211 
212 
213 
214 
215 
216