OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef REMOTING_IOS_UI_SCENE_VIEW_H_ |
| 6 #define REMOTING_IOS_UI_SCENE_VIEW_H_ |
| 7 |
| 8 #import <Foundation/Foundation.h> |
| 9 #import <GLKit/GLKit.h> |
| 10 |
| 11 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" |
| 12 |
| 13 typedef struct { |
| 14 bool left; |
| 15 bool right; |
| 16 bool top; |
| 17 bool bottom; |
| 18 } AnchorPosition; |
| 19 |
| 20 typedef struct { |
| 21 int left; |
| 22 int right; |
| 23 int top; |
| 24 int bottom; |
| 25 } MarginQuad; |
| 26 |
| 27 typedef struct { |
| 28 CGPoint geometryVertex; |
| 29 CGPoint textureVertex; |
| 30 } TexturedVertex; |
| 31 |
| 32 typedef struct { |
| 33 TexturedVertex bl; |
| 34 TexturedVertex br; |
| 35 TexturedVertex tl; |
| 36 TexturedVertex tr; |
| 37 } TexturedQuad; |
| 38 |
| 39 @interface SceneView : NSObject { |
| 40 @private |
| 41 |
| 42 // GL name |
| 43 GLuint _textureId; |
| 44 |
| 45 GLKMatrix4 _projectionMatrix; |
| 46 GLKMatrix4 _modelViewMatrix; |
| 47 |
| 48 // The draw surface is a triangle strip (triangles defined by the intersecting |
| 49 // vertexes) to create a rectangle surface. |
| 50 // 1****3 |
| 51 // | / | |
| 52 // | / | |
| 53 // 2****4 |
| 54 // This also determines the resolution of our surface, being a unit (NxN) grid |
| 55 // with finite divisions. For our surface N = 1, and the number of divisions |
| 56 // respects the CLIENT's desktop resolution. |
| 57 TexturedQuad _glQuad; |
| 58 |
| 59 // Cache of the CLIENT's desktop resolution. |
| 60 webrtc::DesktopSize _contentSize; |
| 61 // Cache of the HOST's desktop resolution. |
| 62 webrtc::DesktopSize _frameSize; |
| 63 |
| 64 // Location of the mouse according to the CLIENT in the prospective of the |
| 65 // HOST resolution |
| 66 webrtc::DesktopVector _mousePosition; |
| 67 |
| 68 // When a user pans they expect the view to experience acceleration after |
| 69 // they release the pan gesture. We track that velocity vector as a position |
| 70 // delta factored over the frame rate of the GL Context. Velocity is |
| 71 // accounted as a float. |
| 72 CGPoint _panVelocity; |
| 73 } |
| 74 |
| 75 // The position of the scene is tracked in the prospective of the CLIENT |
| 76 // resolution. The Z-axis is used to track the scale of the render, our scene |
| 77 // never changes position on the Z-axis. |
| 78 @property(nonatomic, readonly) GLKVector3 position; |
| 79 |
| 80 // Space around border consumed by non-scene elements, we can not draw here |
| 81 @property(nonatomic, readonly) MarginQuad margin; |
| 82 |
| 83 @property(nonatomic, readonly) AnchorPosition anchored; |
| 84 |
| 85 - (const GLKMatrix4&)projectionMatrix; |
| 86 |
| 87 // calculate and return the current model view matrix |
| 88 - (const GLKMatrix4&)modelViewMatrix; |
| 89 |
| 90 - (const webrtc::DesktopSize&)contentSize; |
| 91 |
| 92 // Update the CLIENT resolution and draw scene size, accounting for margins |
| 93 - (void)setContentSize:(const CGSize&)size; |
| 94 |
| 95 - (const webrtc::DesktopSize&)frameSize; |
| 96 |
| 97 // Update the HOST resolution and reinitialize the scene positioning |
| 98 - (void)setFrameSize:(const webrtc::DesktopSize&)size; |
| 99 |
| 100 - (const webrtc::DesktopVector&)mousePosition; |
| 101 |
| 102 - (void)setPanVelocity:(const CGPoint&)delta; |
| 103 |
| 104 - (void)setMarginsFromLeft:(int)left |
| 105 right:(int)right |
| 106 top:(int)top |
| 107 bottom:(int)bottom; |
| 108 |
| 109 // Draws to a GL Context |
| 110 - (void)draw; |
| 111 |
| 112 - (BOOL)containsTouchPoint:(CGPoint)point; |
| 113 |
| 114 // Applies translation and zoom. Translation is bounded to screen edges. |
| 115 // Zooming is bounded on the lower side to the maximum of width and height, and |
| 116 // on the upper side by a constant, experimentally chosen. |
| 117 - (void)panAndZoom:(CGPoint)translation scaleBy:(float)scale; |
| 118 |
| 119 // Mouse is tracked in the perspective of the HOST desktop, but the projection |
| 120 // to the user is in the perspective of the CLIENT resolution. Find the HOST |
| 121 // position that is the center of the current CLIENT view. If the mouse is in |
| 122 // the half of the CLIENT screen that is closest to an anchor, then move the |
| 123 // mouse, otherwise the mouse should be centered. |
| 124 - (void)updateMousePositionAndAnchorsWithTranslation:(CGPoint)translation |
| 125 scale:(float)scale; |
| 126 |
| 127 // When zoom is changed the scene is translated to keep an anchored point |
| 128 // (an anchored edge, or the spot the user is touching) at the same place in the |
| 129 // User's perspective. Return the delta of the position of the lower endpoint |
| 130 // of the axis |
| 131 + (float)positionDeltaFromScaling:(float)ratio |
| 132 position:(float)position |
| 133 length:(float)length |
| 134 anchor:(float)anchor; |
| 135 |
| 136 // Return the delta of the position of the lower endpoint of the axis |
| 137 + (int)positionDeltaFromTranslation:(int)translation |
| 138 position:(int)position |
| 139 freeSpace:(int)freeSpace |
| 140 scaleingPositionDelta:(int)scaleingPositionDelta |
| 141 isAnchoredLow:(BOOL)isAnchoredLow |
| 142 isAnchoredHigh:(BOOL)isAnchoredHigh; |
| 143 |
| 144 // |position + delta| is snapped to the bounds, return the delta in respect to |
| 145 // the bounding. |
| 146 + (int)boundDeltaFromPosition:(float)position |
| 147 delta:(int)delta |
| 148 lowerBound:(int)lowerBound |
| 149 upperBound:(int)upperBound; |
| 150 |
| 151 // Return |nextPosition| when it is anchored and still in the respective 1/2 of |
| 152 // the screen. When |nextPosition| is outside scene's edge, snap to edge. |
| 153 // Otherwise return |centerPosition| |
| 154 + (int)boundMouseGivenNextPosition:(int)nextPosition |
| 155 maxPosition:(int)maxPosition |
| 156 centerPosition:(int)centerPosition |
| 157 isAnchoredLow:(BOOL)isAnchoredLow |
| 158 isAnchoredHigh:(BOOL)isAnchoredHigh; |
| 159 |
| 160 // If the mouse is at an edge return zero, otherwise return |velocity| |
| 161 + (float)boundVelocity:(float)velocity |
| 162 axisLength:(int)axisLength |
| 163 mousePosition:(int)mousePosition; |
| 164 |
| 165 // Update the scene acceleration vector. |
| 166 // Returns true if velocity before 'ticking' is non-zero. |
| 167 - (BOOL)tickPanVelocity; |
| 168 |
| 169 @end |
| 170 |
| 171 #endif // REMOTING_IOS_UI_SCENE_VIEW_H_ |
OLD | NEW |