-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathsyphon_cxx.hpp
146 lines (108 loc) · 2.76 KB
/
syphon_cxx.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef syphon_cxx_h
#define syphon_cxx_h
#include <OpenGL/OpenGL.h>
#include <functional>
#include <memory>
#include <string>
#include <vector>
namespace Wrapper {
struct Origin {
float x = 0;
float y = 0;
};
struct Size {
float width = 0;
float height = 0;
};
struct Rect {
Origin origin;
Size size;
};
// ---
struct _serverOpaquePtr;
struct _clientOpaquePtr;
struct _serverOptionsOpaquePtr;
struct _serverDescriptionOpaquePtr;
struct _imageOpaquePtr;
// ---
struct ServerOptions {
public:
ServerOptions(_serverOptionsOpaquePtr*);
bool isPrivate = false;
u_int8_t antialiasSampleCount = 0;
u_int8_t depthBufferResolution = 0;
u_int8_t stencilBufferResolution = 0;
};
// ---
class ServerDescription {
_serverDescriptionOpaquePtr* _ptr = nullptr;
public:
ServerDescription(_serverDescriptionOpaquePtr* d = nullptr);
ServerDescription(const ServerDescription& src);
std::string UUID;
std::string Name;
std::string AppName;
// not including icon yet
_serverDescriptionOpaquePtr* toDictionary();
};
// ---
class Server {
_serverOpaquePtr* _obj = 0;
bool _error = false;
CGLContextObj _context;
std::string _name;
public:
Server(std::string name);
Server(const Server& src);
~Server();
void publishFrameTexture(GLuint texID, Rect region, Size size, bool flipped);
inline bool errorState() { return _error; }
CGLContextObj& context() { return _context; };
std::string name() { return _name; };
ServerDescription serverDescription();
bool hasClients();
void stop();
};
// ---
class ServerDirectory {
public:
static std::vector<ServerDescription> servers();
static std::vector<ServerDescription> serversMatchingNameAppName(std::string name, std::string appName);
};
// ---
class Client;
using ClientPtr = std::shared_ptr<_clientOpaquePtr>;
using NewFrameHandlerFunc = std::function<void(ClientPtr)>;
const NewFrameHandlerFunc emptyFrameHandler = [](ClientPtr) {};
// ---
class Image {
_imageOpaquePtr *_obj = nullptr;
public:
Image(_imageOpaquePtr *i = nullptr);
Image(const Image& src);
~Image();
GLuint textureName();
Size textureSize();
};
// ---
class Client {
_clientOpaquePtr* _obj = 0;
bool _error = false;
CGLContextObj _context;
public:
Client(ServerDescription descr, NewFrameHandlerFunc handler = emptyFrameHandler);
Client(const Client& src);
~Client();
Image newFrameImage();
void stop();
CGLContextObj context() { return _context; };
bool isValid();
bool hasNewFrame();
ServerDescription serverDescription();
inline bool errorState() { return _error; }
};
};
namespace Utility {
void ConvertToTexture(GLuint src, GLuint texture, int width, int height);
}
#endif