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 |