• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_