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
17d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukpackage com.android.testapp;
18a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
19a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
204bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.Float3;
21d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukimport com.android.scenegraph.*;
224bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport com.android.scenegraph.CompoundTransform.RotateComponent;
234bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport com.android.scenegraph.CompoundTransform.TranslateComponent;
24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class TouchHandler {
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private static String TAG = "TouchHandler";
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    float mLastX;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    float mLastY;
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
314bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    float mRotateXValue;
324bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    float mRotateYValue;
334bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    Float3 mDistValue;
346f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    Float3 mPosValue;
356f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk
366f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    CompoundTransform mCameraRig;
376f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    RotateComponent mRotateX;
386f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    RotateComponent mRotateY;
396f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    TranslateComponent mDist;
406f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    TranslateComponent mPosition;
416f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    Camera mCamera;
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
434bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    public void init(Scene scene) {
446f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        // Some initial values for camera position
456f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mRotateXValue = -20;
46b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        mRotateYValue = 0;
476f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mDistValue = new Float3(0, 0, 45);
486f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mPosValue = new Float3(0, 4, 0);
496f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk
506f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        // Make a camera transform we can manipulate
51d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        mCameraRig = scene.appendNewCompoundTransform();
526f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mCameraRig.setName("CameraRig");
5357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
5457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mPosition = mCameraRig.addTranslate("Position", mPosValue);
5557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRotateY  = mCameraRig.addRotate("RotateY", new Float3(0, 1, 0), mRotateYValue);
5657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRotateX  = mCameraRig.addRotate("RotateX", new Float3(1, 0, 0), mRotateXValue);
5757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mDist     = mCameraRig.addTranslate("Distance", mDistValue);
5857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
59d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        mCamera = scene.appendNewCamera();
606f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mCamera.setTransform(mCameraRig);
616f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    }
626f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk
636f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk    public Camera getCamera() {
646f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        return mCamera;
654bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    }
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionDown(float x, float y) {
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLastX = x;
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLastY = y;
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionScale(float scale) {
734bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        if (mDist == null) {
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return;
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
764bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mDistValue.z *= 1.0f / scale;
776f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mDistValue.z = Math.max(10.0f, Math.min(mDistValue.z, 150.0f));
784bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mDist.setValue(mDistValue);
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionMove(float x, float y) {
824bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        if (mRotateX == null) {
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return;
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float dx = mLastX - x;
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float dy = mLastY - y;
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (Math.abs(dy) <= 2.0f) {
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            dy = 0.0f;
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (Math.abs(dx) <= 2.0f) {
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            dx = 0.0f;
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
964bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mRotateYValue += dx * 0.25f;
974bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mRotateYValue %= 360.0f;
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
994bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mRotateXValue  += dy * 0.25f;
1004bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mRotateXValue  = Math.max(mRotateXValue , -80.0f);
1014bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mRotateXValue  = Math.min(mRotateXValue , 0.0f);
1024bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk
1034bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mRotateX.setAngle(mRotateXValue);
1044bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mRotateY.setAngle(mRotateYValue);
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLastX = x;
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLastY = y;
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
110