/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.scenegraph; import java.lang.Math; import java.util.ArrayList; import com.android.scenegraph.SceneManager; import android.renderscript.*; import android.renderscript.Float3; import android.renderscript.Matrix4f; import android.util.Log; /** * @hide */ public class CompoundTransform extends Transform { public static abstract class Component { String mName; CompoundTransform mParent; int mParentIndex; protected ScriptField_TransformComponent_s.Item mData; Component(int type, String name) { mData = new ScriptField_TransformComponent_s.Item(); mData.type = type; mName = name; } void setNameAlloc() { RenderScriptGL rs = SceneManager.getRS(); if (mData.name != null) { return; } mData.name = SceneManager.getCachedAlloc(getName()); if (mData.name == null) { mData.name = SceneManager.getStringAsAllocation(rs, getName()); SceneManager.cacheAlloc(getName(), mData.name); } } ScriptField_TransformComponent_s.Item getRSData() { setNameAlloc(); return mData; } protected void update() { if (mParent != null) { mParent.updateRSComponent(this); } } public String getName() { return mName; } } public static class TranslateComponent extends Component { public TranslateComponent(String name, Float3 translate) { super(ScriptC_export.const_Transform_TRANSLATE, name); setValue(translate); } public Float3 getValue() { return new Float3(mData.value.x, mData.value.y, mData.value.z); } public void setValue(Float3 val) { mData.value.x = val.x; mData.value.y = val.y; mData.value.z = val.z; update(); } } public static class RotateComponent extends Component { public RotateComponent(String name, Float3 axis, float angle) { super(ScriptC_export.const_Transform_ROTATE, name); setAxis(axis); setAngle(angle); } public Float3 getAxis() { return new Float3(mData.value.x, mData.value.y, mData.value.z); } public float getAngle() { return mData.value.w; } public void setAxis(Float3 val) { mData.value.x = val.x; mData.value.y = val.y; mData.value.z = val.z; update(); } public void setAngle(float val) { mData.value.w = val; update(); } } public static class ScaleComponent extends Component { public ScaleComponent(String name, Float3 scale) { super(ScriptC_export.const_Transform_SCALE, name); setValue(scale); } public Float3 getValue() { return new Float3(mData.value.x, mData.value.y, mData.value.z); } public void setValue(Float3 val) { mData.value.x = val.x; mData.value.y = val.y; mData.value.z = val.z; update(); } } ScriptField_TransformComponent_s mComponentField; public ArrayList mTransformComponents; public CompoundTransform() { mTransformComponents = new ArrayList(); } public TranslateComponent addTranslate(String name, Float3 translate) { TranslateComponent c = new TranslateComponent(name, translate); addComponent(c); return c; } public RotateComponent addRotate(String name, Float3 axis, float angle) { RotateComponent c = new RotateComponent(name, axis, angle); addComponent(c); return c; } public ScaleComponent addScale(String name, Float3 scale) { ScaleComponent c = new ScaleComponent(name, scale); addComponent(c); return c; } public void addComponent(Component c) { if (c.mParent != null) { throw new IllegalArgumentException("Transform components may not be shared"); } c.mParent = this; c.mParentIndex = mTransformComponents.size(); mTransformComponents.add(c); updateRSComponentAllocation(); } public void setComponent(int index, Component c) { if (c.mParent != null) { throw new IllegalArgumentException("Transform components may not be shared"); } if (index >= mTransformComponents.size()) { throw new IllegalArgumentException("Invalid component index"); } c.mParent = this; c.mParentIndex = index; mTransformComponents.set(index, c); updateRSComponent(c); } void updateRSComponent(Component c) { if (mField == null || mComponentField == null) { return; } mComponentField.set(c.getRSData(), c.mParentIndex, true); mField.set_isDirty(0, 1, true); } void updateRSComponentAllocation() { if (mField == null) { return; } initLocalData(); mField.set_components(0, mTransformData.components, false); mField.set_isDirty(0, 1, true); } void initLocalData() { RenderScriptGL rs = SceneManager.getRS(); int numComponenets = mTransformComponents.size(); if (numComponenets > 0) { mComponentField = new ScriptField_TransformComponent_s(rs, numComponenets); for (int i = 0; i < numComponenets; i ++) { Component ith = mTransformComponents.get(i); mComponentField.set(ith.getRSData(), i, false); } mComponentField.copyAll(); mTransformData.components = mComponentField.getAllocation(); } } }