| 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 |