Index: remoting/ios/ui/scene_view.h |
diff --git a/remoting/ios/ui/scene_view.h b/remoting/ios/ui/scene_view.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8f082ff9910b0edd5053de660a00b5bbd43d4e84 |
--- /dev/null |
+++ b/remoting/ios/ui/scene_view.h |
@@ -0,0 +1,171 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef REMOTING_IOS_UI_SCENE_VIEW_H_ |
+#define REMOTING_IOS_UI_SCENE_VIEW_H_ |
+ |
+#import <Foundation/Foundation.h> |
+#import <GLKit/GLKit.h> |
+ |
+#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" |
+ |
+typedef struct { |
+ bool left; |
+ bool right; |
+ bool top; |
+ bool bottom; |
+} AnchorPosition; |
+ |
+typedef struct { |
+ int left; |
+ int right; |
+ int top; |
+ int bottom; |
+} MarginQuad; |
+ |
+typedef struct { |
+ CGPoint geometryVertex; |
+ CGPoint textureVertex; |
+} TexturedVertex; |
+ |
+typedef struct { |
+ TexturedVertex bl; |
+ TexturedVertex br; |
+ TexturedVertex tl; |
+ TexturedVertex tr; |
+} TexturedQuad; |
+ |
+@interface SceneView : NSObject { |
+ @private |
+ |
+ // GL name |
+ GLuint _textureId; |
+ |
+ GLKMatrix4 _projectionMatrix; |
+ GLKMatrix4 _modelViewMatrix; |
+ |
+ // The draw surface is a triangle strip (triangles defined by the intersecting |
+ // vertexes) to create a rectangle surface. |
+ // 1****3 |
+ // | / | |
+ // | / | |
+ // 2****4 |
+ // This also determines the resolution of our surface, being a unit (NxN) grid |
+ // with finite divisions. For our surface N = 1, and the number of divisions |
+ // respects the CLIENT's desktop resolution. |
+ TexturedQuad _glQuad; |
+ |
+ // Cache of the CLIENT's desktop resolution. |
+ webrtc::DesktopSize _contentSize; |
+ // Cache of the HOST's desktop resolution. |
+ webrtc::DesktopSize _frameSize; |
+ |
+ // Location of the mouse according to the CLIENT in the prospective of the |
+ // HOST resolution |
+ webrtc::DesktopVector _mousePosition; |
+ |
+ // When a user pans they expect the view to experience acceleration after |
+ // they release the pan gesture. We track that velocity vector as a position |
+ // delta factored over the frame rate of the GL Context. Velocity is |
+ // accounted as a float. |
+ CGPoint _panVelocity; |
+} |
+ |
+// The position of the scene is tracked in the prospective of the CLIENT |
+// resolution. The Z-axis is used to track the scale of the render, our scene |
+// never changes position on the Z-axis. |
+@property(nonatomic, readonly) GLKVector3 position; |
+ |
+// Space around border consumed by non-scene elements, we can not draw here |
+@property(nonatomic, readonly) MarginQuad margin; |
+ |
+@property(nonatomic, readonly) AnchorPosition anchored; |
+ |
+- (const GLKMatrix4&)projectionMatrix; |
+ |
+// calculate and return the current model view matrix |
+- (const GLKMatrix4&)modelViewMatrix; |
+ |
+- (const webrtc::DesktopSize&)contentSize; |
+ |
+// Update the CLIENT resolution and draw scene size, accounting for margins |
+- (void)setContentSize:(const CGSize&)size; |
+ |
+- (const webrtc::DesktopSize&)frameSize; |
+ |
+// Update the HOST resolution and reinitialize the scene positioning |
+- (void)setFrameSize:(const webrtc::DesktopSize&)size; |
+ |
+- (const webrtc::DesktopVector&)mousePosition; |
+ |
+- (void)setPanVelocity:(const CGPoint&)delta; |
+ |
+- (void)setMarginsFromLeft:(int)left |
+ right:(int)right |
+ top:(int)top |
+ bottom:(int)bottom; |
+ |
+// Draws to a GL Context |
+- (void)draw; |
+ |
+- (BOOL)containsTouchPoint:(CGPoint)point; |
+ |
+// Applies translation and zoom. Translation is bounded to screen edges. |
+// Zooming is bounded on the lower side to the maximum of width and height, and |
+// on the upper side by a constant, experimentally chosen. |
+- (void)panAndZoom:(CGPoint)translation scaleBy:(float)scale; |
+ |
+// Mouse is tracked in the perspective of the HOST desktop, but the projection |
+// to the user is in the perspective of the CLIENT resolution. Find the HOST |
+// position that is the center of the current CLIENT view. If the mouse is in |
+// the half of the CLIENT screen that is closest to an anchor, then move the |
+// mouse, otherwise the mouse should be centered. |
+- (void)updateMousePositionAndAnchorsWithTranslation:(CGPoint)translation |
+ scale:(float)scale; |
+ |
+// When zoom is changed the scene is translated to keep an anchored point |
+// (an anchored edge, or the spot the user is touching) at the same place in the |
+// User's perspective. Return the delta of the position of the lower endpoint |
+// of the axis |
++ (float)positionDeltaFromScaling:(float)ratio |
+ position:(float)position |
+ length:(float)length |
+ anchor:(float)anchor; |
+ |
+// Return the delta of the position of the lower endpoint of the axis |
++ (int)positionDeltaFromTranslation:(int)translation |
+ position:(int)position |
+ freeSpace:(int)freeSpace |
+ scaleingPositionDelta:(int)scaleingPositionDelta |
+ isAnchoredLow:(BOOL)isAnchoredLow |
+ isAnchoredHigh:(BOOL)isAnchoredHigh; |
+ |
+// |position + delta| is snapped to the bounds, return the delta in respect to |
+// the bounding. |
++ (int)boundDeltaFromPosition:(float)position |
+ delta:(int)delta |
+ lowerBound:(int)lowerBound |
+ upperBound:(int)upperBound; |
+ |
+// Return |nextPosition| when it is anchored and still in the respective 1/2 of |
+// the screen. When |nextPosition| is outside scene's edge, snap to edge. |
+// Otherwise return |centerPosition| |
++ (int)boundMouseGivenNextPosition:(int)nextPosition |
+ maxPosition:(int)maxPosition |
+ centerPosition:(int)centerPosition |
+ isAnchoredLow:(BOOL)isAnchoredLow |
+ isAnchoredHigh:(BOOL)isAnchoredHigh; |
+ |
+// If the mouse is at an edge return zero, otherwise return |velocity| |
++ (float)boundVelocity:(float)velocity |
+ axisLength:(int)axisLength |
+ mousePosition:(int)mousePosition; |
+ |
+// Update the scene acceleration vector. |
+// Returns true if velocity before 'ticking' is non-zero. |
+- (BOOL)tickPanVelocity; |
+ |
+@end |
+ |
+#endif // REMOTING_IOS_UI_SCENE_VIEW_H_ |