TouchHandler.java revision b23b58ad343ccbf8835c7067698a60fc6bc1a870
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