VRay SDK for C++
Loading...
Searching...
No Matches
vraysrv.hpp
1#ifndef _VRAY_SRV_HPP_
2#define _VRAY_SRV_HPP_
3
4#ifndef VRAY_NOTHROW
5#include "vraythrow.hpp"
6#endif
7
8#include <cstdint>
9#include <cstdlib>
10#include <ostream>
11#include <cstring>
12#include <string>
13
14#include "_vraysdk_utils.hpp"
15
16namespace VRay {
17
18 class VRayServerNative;
19 class VRayServer;
20 class VRayLiveLinkServerNative;
21 class VRayLiveLinkServer;
22
24 enum MessageLevel {
25 MessageError = 0,
26 MessageWarning = 1,
27 MessageInfo = 2,
28 MessageDebug = 3
29 };
30
32 enum ExportSceneFlags {
33 ExportSceneFlags_Full = 0,
34 ExportSceneFlags_Changes = 1 << 0,
35 ExportSceneFlags_Deleted = 1 << 1,
36 };
37
39 enum SceneUpdateActionCode {
40 AC_PLUGIN_DELETED,
41 AC_PLUGIN_RESTORED, // deprecated, don't use
42 AC_NEW_PLUGIN,
43 AC_PARAMVALUE_CHANGED,
44 AC_RECOMPILE_GEOMETRY,
45 AC_CLEAR_SCENE,
46 AC_SCENE_SENT,
47 AC_PLUGIN_REPLACED,
48 AC_CHANGE_COMPLETE, // Completed a batch of changes to the scene; multiple AC_CHANGE_COMPLETE messages should be compressed into one.
49 AC_NOP, // Ignore this change.
50 AC_APPEND_FILE, // Read and append the plugins from the specified .vrscene file
51 AC_APPEND_STREAM, // Read and append the plugins from the specified stream(e.g .vrscene file, text)
52 AC_RENAME_PLUGIN,
53
54 AC_BEGIN_CHANGE = 100,
55 AC_PREAPPLY_CHANGE = 101,
56 AC_END_CHANGE = 102,
57 };
58
62 std::string remoteScenePath;
63 std::string pluginLibraryPath;
64 std::string includePaths;
65 union {
66 int flags;
67 struct {
72 bool runAsLiveLink : 1;
73 };
74 };
75 enum AssetCacheLimit {
76 CACHE_NO_LIMIT = 0,
77 CACHE_HOUR_LIMIT = 1,
78 CACHE_GB_LIMIT = 2,
79 } cachedAssetsLimitType;
81
82 // DR2 specific options
83 union {
84 int dr2Flags;
85 struct {
86 bool dr2AsDispatcher : 1;
89 bool dr2DisableUdp : 1;
90 bool dr2ListenOnIpv4 : 1;
91 bool dr2ListenOnIpv6 : 1;
93 };
94 };
95 std::string dr2HttpProxy;
99
100 ServerOptions() : portNumber(), numThreads(), flags(), cachedAssetsLimitType(), cachedAssetsLimitValue()
102 dr2ListenOnIpv4 = true;
103#ifndef __APPLE__
104 dr2ListenOnIpv6 = true;
105#endif
107 }
108 ServerOptions(const ServerOptions& options) = default;
109 ServerOptions(ServerOptions&& options) = default;
110 ServerOptions& operator=(const ServerOptions& options) = default;
111 ServerOptions& operator=(ServerOptions&& options) = default;
112
113 void swap(ServerOptions& options) noexcept {
114 std::swap(portNumber, options.portNumber);
115 std::swap(numThreads, options.numThreads);
116 remoteScenePath.swap(options.remoteScenePath);
117 pluginLibraryPath.swap(options.pluginLibraryPath);
118 includePaths.swap(options.includePaths);
119 std::swap(flags, options.flags);
120 std::swap(cachedAssetsLimitType, options.cachedAssetsLimitType);
121 std::swap(cachedAssetsLimitValue, options.cachedAssetsLimitValue);
122 std::swap(dr2Flags, options.dr2Flags);
123 dr2HttpProxy.swap(options.dr2HttpProxy);
124 std::swap(dr2WorkerThreadsPerServer, options.dr2WorkerThreadsPerServer);
125 std::swap(dr2ConnectTimeout, options.dr2ConnectTimeout);
126 std::swap(dr2UpstreamChannels, options.dr2UpstreamChannels);
127 }
128 };
129
132 union {
133 int flags;
134 struct {
136 };
137 };
138
139 LiveLinkServerOptions() : portNumber(0), flags() {
140 }
141 LiveLinkServerOptions(const LiveLinkServerOptions& options) = default;
142 LiveLinkServerOptions(LiveLinkServerOptions&& options) = default;
143 LiveLinkServerOptions& operator=(const LiveLinkServerOptions& options) = default;
144 LiveLinkServerOptions& operator=(LiveLinkServerOptions&& options) = default;
145
146 void swap(LiveLinkServerOptions& options) noexcept {
147 std::swap(portNumber, options.portNumber);
148 std::swap(flags, options.flags);
149 }
150 };
151
152 namespace Internal {
153
155 int portNumber;
156 int numThreads;
157 const char* remoteScenePath;
158 const char* pluginLibraryPath;
159 const char* includePaths;
160 int flags;
161 ServerOptions::AssetCacheLimit cachedAssetsLimitType;
162 float cachedAssetsLimitValue;
163 int dr2Flags;
164 const char* dr2HttpProxy;
165 int dr2WorkerThreadsPerServer;
166 int dr2ConnectTimeout;
167 int dr2UpstreamChannels;
168
170 portNumber = opts.portNumber;
171 numThreads = opts.numThreads;
172 remoteScenePath = (opts.remoteScenePath.empty()) ? nullptr : opts.remoteScenePath.c_str();
173 pluginLibraryPath = (opts.pluginLibraryPath.empty()) ? nullptr : opts.pluginLibraryPath.c_str();
174 includePaths = (opts.includePaths.empty()) ? nullptr : opts.includePaths.c_str();
175 flags = opts.flags;
176 cachedAssetsLimitType = opts.cachedAssetsLimitType;
177 cachedAssetsLimitValue = opts.cachedAssetsLimitValue;
178 dr2Flags = opts.dr2Flags;
179 dr2HttpProxy = (opts.dr2HttpProxy.empty()) ? nullptr : opts.dr2HttpProxy.c_str();
180 dr2WorkerThreadsPerServer = opts.dr2WorkerThreadsPerServer;
181 dr2ConnectTimeout = opts.dr2ConnectTimeout;
182 dr2UpstreamChannels = opts.dr2UpstreamChannels;
183 }
184 };
185
187 int portNumber;
188 int flags;
189
191 portNumber = opts.portNumber;
192 flags = opts.flags;
193 }
194 };
195 }
196}
197
198// internal function declarations
199#include "_vraysrv_import.hpp"
200
201namespace VRay {
202 inline std::string LicenseError::toString() const {
203 char* str = Internal::VRay_getLicenseErrorTextStringFromErrorCode(errs);
204 std::string res = str;
205 Internal::C_memory_free(str);
206 return res;
207 }
208
209 inline std::ostream& operator <<(std::ostream& stream, const LicenseError& err) {
210 char* str = Internal::VRay_getLicenseErrorTextStringFromErrorCode(err.errs);
211 stream << (str ? str : "");
212 Internal::C_memory_free(str);
213 return stream;
214 }
215
217 ExternalString() = delete;
218 ExternalString(const ExternalString&) = delete;
219 ExternalString& operator=(const ExternalString &image) = delete;
220
221 const char* getData() const {
222 return reinterpret_cast<const char*>(this);
223 }
224 char* getData() {
225 return reinterpret_cast<char*>(this);
226 }
227 static void operator delete(void* p) {
228 Internal::C_memory_free(p);
229 }
230 static void* operator new (size_t) = delete;
231 static void* operator new[](size_t) = delete;
232 static void operator delete[](void*) = delete;
233 };
234
235#if !defined(VRAY_RUNTIME_LOAD_PRIMARY) && !defined(VRAY_RUNTIME_LOAD_SECONDARY)
236
238 VRayServerInit(VRayServerInit&); // copy construction disabled
239
240 public:
241 VRayServerInit() {}
242
244 Internal::VRay_LicenseManager_releaseLicense();
245 }
246 };
247
248#elif defined(VRAY_RUNTIME_LOAD_PRIMARY)
249
250#ifdef _MSC_VER
251# pragma warning(push)
252# pragma warning(disable: 4706) // "assignment within conditional expression" - for VRayServerInit::importFunctions()
253#endif // _MSC_VER
254
255 class VRayServerInit {
256 VRayServerInit(VRayServerInit&); // copy construction disabled
257
258 public:
259 explicit VRayServerInit(const char* const libraryFileName) {
260 initialize(libraryFileName);
261 }
262
263 ~VRayServerInit() {
264 if (Internal::VRay_LicenseManager_releaseLicense)
265 Internal::VRay_LicenseManager_releaseLicense();
266 release();
267 }
268
269 operator bool() const {
270 return !!hLib;
271 }
272
273 protected:
274 VRayServerInit() {}
275
276 Internal::HModule hLib;
277 std::string errString;
278
279#ifdef VRAY_NOTHROW
280 void makeError(const std::string &errMsg) {
281 errString = errMsg;
282 hLib = nullptr;
283 }
284#endif // VRAY_NOTHROW
285
286 void initialize(const char* libraryFileName) {
287 if (!libraryFileName) {
288 if ((hLib = LoadUtils::tryPreloadSDKLibraryFromEnvVar(VRAY_XSTRING(APPSDK_ENV_VAR_BIN_FOLDER), false))) {
289 importFunctions();
290 return;
291 }
292 if ((hLib = LoadUtils::tryPreloadSDKLibraryFromEnvVar(VRAY_XSTRING(VRAY_SDK_ENV_VAR), true))) {
293 importFunctions();
294 return;
295 }
296 }
297 hLib = LoadUtils::loadLibrary(libraryFileName);
298 importFunctions();
299 }
300
301 void importFunctions() {
302# ifdef VRAY_NOTHROW
303# define PROC_IMPORT_FAIL(message) return makeError(LoadUtils::getLoaderError(message))
304# else
305# define PROC_IMPORT_FAIL(message) throw InitErr( (errString = LoadUtils::getLoaderError(message)) )
306# endif
307
308 if (!hLib)
309 PROC_IMPORT_FAIL("Cannot load V-Ray SDK Library file.");
310
311# define VRAY_INTERNAL_GENERATE_IMPORT_CODE
312# include "_vraysrv_import.hpp"
313# undef VRAY_INTERNAL_GENERATE_IMPORT_CODE
314 }
315
316#ifdef _MSC_VER
317# pragma warning(pop)
318#endif // _MSC_VER
319
320 void release() {
321 if (hLib)
322#ifdef _WIN32
323 Internal::FreeLibrary(hLib);
324#else
325 Internal::dlclose(hLib);
326#endif // _WIN32
327 }
328 };
329
330#endif // #if !defined(VRAY_RUNTIME_LOAD_PRIMARY) && !defined(VRAY_RUNTIME_LOAD_SECONDARY)
331
332
334 VRayServer(const VRayServer&);
335 VRayServer& operator=(const VRayServer&);
336
337 VRayServerNative* serverNative;
338 LicenseError licErr;
339
340 static VRayServer* getVRayServer(void* serverNative) {
341 return static_cast<VRayServer*>(Internal::VRay_VRayServer_getUserData(static_cast<VRayServerNative*>(serverNative), 0));
342 }
343
344 void createInstance(const Internal::ServerOptions_Internal* options) {
345 serverNative = Internal::VRay_VRayServer_create(options, &licErr.errs);
346 if (serverNative) Internal::VRay_VRayServer_setUserData(serverNative, 0, this);
347#ifndef VRAY_NOTHROW
348 if (licErr.error())
349 throw InstantiationErr(licErr.toString());
350 if (!serverNative)
351 throw InstantiationErr();
352#endif
353 }
354
355 static void serverStartCallback(const Internal::CallbackParamsBase* params) {
356 VRayServer* server = getVRayServer(params->self);
357 auto fn = (void(*)(VRayServer&, double, void*))params->userObject;
358 fn(*server, params->instant, params->userData);
359 }
360
361 template<class T, void (T::*TMethod)(VRayServer&, double instant, void* userData)>
362 static void serverStartCallbackT(const Internal::CallbackParamsBase* params) {
363 VRayServer* server = getVRayServer(params->self);
364 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->instant, params->userData);
365 }
366
367 static void hostConnectedCallback(const Internal::ConnectParams* params) {
368 VRayServer* server = getVRayServer(params->self);
369 auto fn = (void(*)(VRayServer&, const char*, double, void*))params->userObject;
370 fn(*server, params->hostname, params->instant, params->userData);
371 }
372
373 template<class T, void (T::*TMethod)(VRayServer&, const char* hostName, double instant, void* userData)>
374 static void hostConnectedCallbackT(const Internal::ConnectParams* params) {
375 VRayServer* server = getVRayServer(params->self);
376 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->hostname, params->instant, params->userData);
377 }
378
379 static void logMessageCallback(const Internal::LogMessageParams* params) {
380 VRayServer* server = getVRayServer(params->self);
381 auto fn = (void(*)(VRayServer&, const char*, MessageLevel, double, void*))params->userObject;
382 fn(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
383 }
384
385 template<class T, void (T::*TMethod)(VRayServer& renderer, const char* msg, MessageLevel level, double instant, void* userData)>
386 static void logMessageCallbackT(const Internal::LogMessageParams* params) {
387 VRayServer* server = getVRayServer(params->self);
388 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
389 }
390
391 static void progressCallback(const Internal::ProgressParams* params) {
392 VRayServer* server = getVRayServer(params->self);
393 auto fn = (void(*)(VRayServer&, const char*, int, int, double, void*))params->userObject;
394 fn(*server, params->message, params->progress, params->total, params->instant, params->userData);
395 }
396
397 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double, void* userData)>
398 static void progressCallbackT(const Internal::ProgressParams* params) {
399 VRayServer* server = getVRayServer(params->self);
400 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, params->progress, params->total, params->instant, params->userData);
401 }
402
403 static void sceneUpdateCallback(const Internal::SceneUpdateParams* params) {
404 VRayServer* server = getVRayServer(params->self);
405 auto fn = (void(*)(VRayServer&, int, uint64_t, uint64_t, const char*, double, void*))params->userObject;
406 fn(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
407 }
408
409 template<class T, void (T::*TMethod)(VRayServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
410 static void sceneUpdateCallbackT(const Internal::SceneUpdateParams* params) {
411 VRayServer* server = getVRayServer(params->self);
412 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
413 }
414
415 public:
416 VRayServer() {
417 createInstance(nullptr);
418 }
419
420 VRayServer(const ServerOptions &serverOptions) {
421 Internal::ServerOptions_Internal optionsInternal(serverOptions);
422 createInstance(&optionsInternal);
423 }
424
425 ~VRayServer() {
426 if (serverNative) {
427 Internal::VRay_VRayServer_release(serverNative);
428 }
429 }
430
433 operator bool () const {
434 return !!serverNative;
435 }
436
437 LicenseError getLicenseError() const {
438 return licErr;
439 }
440
441 void setOnServerStart(void (*callback)(VRayServer&, double instant, void*), const void* userData = nullptr) {
442 Internal::CallbackData<Internal::OnServerStart> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
443 Internal::VRay_VRayServer_setServerStartCallback(serverNative, callback ? &callbackData : nullptr);
444 }
445
446 template<class T, void (T::*TMethod)(VRayServer&, double, void*)>
447 void setOnServerStart(T& object, const void* userData = nullptr) {
448 Internal::CallbackData<Internal::OnServerStart> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
449 Internal::VRay_VRayServer_setServerStartCallback(serverNative, &callbackData);
450 }
451
452 void setOnServerClose(void (*callback)(VRayServer&, double instant, void*), const void* userData = nullptr) {
453 Internal::CallbackData<Internal::OnServerClose> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
454 Internal::VRay_VRayServer_setServerCloseCallback(serverNative, callback ? &callbackData : nullptr);
455 }
456
457 template<class T, void (T::*TMethod)(VRayServer&, double, void*)>
458 void setOnServerClose(T& object, const void* userData = nullptr) {
459 Internal::CallbackData<Internal::OnServerClose> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
460 Internal::VRay_VRayServer_setServerCloseCallback(serverNative, &callbackData);
461 }
462
463 void setOnConnect(void (*callback)(VRayServer&, const char* msg, double instant, void*), const void* userData = nullptr) {
464 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
465 Internal::VRay_VRayServer_setConnectCallback(serverNative, callback ? &callbackData : nullptr);
466 }
467
468 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, double, void*)>
469 void setOnDisconnect(T& object, const void* userData = nullptr) {
470 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
471 Internal::VRay_VRayServer_setDisconnectCallback(serverNative, &callbackData);
472 }
473
474 void setOnDisconnect(void (*callback)(VRayServer&, const char* msg, double instant, void*), const void* userData = nullptr) {
475 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
476 Internal::VRay_VRayServer_setDisconnectCallback(serverNative, callback ? &callbackData : nullptr);
477 }
478
479 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, double, void*)>
480 void setOnConnect(T& object, const void* userData = nullptr) {
481 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
482 Internal::VRay_VRayServer_setConnectCallback(serverNative, &callbackData);
483 }
484
485 void setOnLogMessage(void (*callback)(VRayServer&, const char* msg, MessageLevel level, double instant, void*), MessageLevel minLevel = MessageInfo, const void* userData = nullptr) {
486 Internal::CallbackData<Internal::OnLogMessage> callbackData = { logMessageCallback, serverNative, (void*)callback, userData };
487 Internal::VRay_VRayServer_setDumpMessageCallback(serverNative, callback ? &callbackData : nullptr, (int)minLevel);
488 }
489
490 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, MessageLevel level, double, void*)>
491 void setOnLogMessage(T& object, MessageLevel minLevel = MessageInfo, const void* userData = nullptr) {
492 Internal::CallbackData<Internal::OnLogMessage> callbackData = { &logMessageCallbackT<T, TMethod>, serverNative, &object, userData };
493 Internal::VRay_VRayServer_setDumpMessageCallback(serverNative, &callbackData, (int)minLevel);
494 }
495
496 void setOnProgress(void (*callback)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double instant, void*), const void* userData = nullptr) {
497 Internal::CallbackData<Internal::OnProgress> callbackData = { progressCallback, serverNative, (void*)callback, userData };
498 Internal::VRay_VRayServer_setProgressCallback(serverNative, callback ? &callbackData : nullptr);
499 }
500
501 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double instant, void* userData)>
502 void setOnProgress(T& object, const void* userData = nullptr) {
503 Internal::CallbackData<Internal::OnProgress> callbackData = { &progressCallbackT<T, TMethod>, serverNative, &object, userData };
504 Internal::VRay_VRayServer_setProgressCallback(serverNative, &callbackData);
505 }
506
515 void setOnSceneUpdate(void (*callback)(VRayServer& vray, int action, uint64_t changeIndex, uint64_t pluginId, const char* name, double instant, void*), const void* userData = nullptr) {
516 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { sceneUpdateCallback, serverNative, (void*)callback, userData };
517 Internal::VRay_VRayServer_setSceneUpdateCallback(serverNative, callback ? &callbackData : nullptr);
518 }
519
521 template<class T, void (T::*TMethod)(VRayServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
522 void setOnSceneUpdate(T& object, const void* userData = nullptr) {
523 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { &sceneUpdateCallbackT<T, TMethod>, serverNative, &object, userData };
524 Internal::VRay_VRayServer_setSceneUpdateCallback(serverNative, &callbackData);
525 }
526
528 int run() {
529 return Internal::VRay_VRayServer_run(serverNative);
530 }
531
533 int start() {
534 return Internal::VRay_VRayServer_start(serverNative);
535 }
536
538 void stop() {
539 Internal::VRay_VRayServer_stop(serverNative);
540 }
541
546 std::string exportSceneBuffer(int flags) const {
547 size_t len = 0;
548 char* data = Internal::VRay_VRayServer_exportSceneBuffer(serverNative, len, flags);
549 std::string buf;
550 if (data && len > 0) {
551 buf.assign(data, len);
552 Internal::C_memory_free(data);
553 }
554 return buf;
555 }
556
561 ExternalString* exportSceneBufferFast(size_t& length, int flags) const {
562 return reinterpret_cast<ExternalString*>(Internal::VRay_VRayServer_exportSceneBuffer(serverNative, length, flags));
563 }
564
565 int addHosts(const char* hosts) {
566 if (Internal::VRay_isDR2())
567 return Internal::VRay_VRayServer_addHosts(serverNative, hosts);
568 else
569#ifndef VRAY_NOTHROW
570 throw NotSupportedErr();
571#else
572 return -1;
573#endif
574 }
575
576 int removeHosts(const char* hosts) {
577 if (Internal::VRay_isDR2())
578 return Internal::VRay_VRayServer_removeHosts(serverNative, hosts);
579 else
580#ifndef VRAY_NOTHROW
581 throw NotSupportedErr();
582#else
583 return -1;
584#endif
585 }
586
587 int resetHosts(const char* hosts) {
588 if (Internal::VRay_isDR2())
589 return Internal::VRay_VRayServer_resetHosts(serverNative, hosts);
590 else
591#ifndef VRAY_NOTHROW
592 throw NotSupportedErr();
593#else
594 return -1;
595#endif
596 }
597
598 char* getAllHosts(int* size) const {
599 if (Internal::VRay_isDR2())
600 return Internal::VRay_VRayServer_getAllHosts(serverNative, size);
601 else
602#ifndef VRAY_NOTHROW
603 throw NotSupportedErr();
604#else
605 return nullptr;
606#endif
607 }
608
609 char* getActiveHosts(int* size) const {
610 if (Internal::VRay_isDR2())
611 return Internal::VRay_VRayServer_getActiveHosts(serverNative, size);
612 else
613#ifndef VRAY_NOTHROW
614 throw NotSupportedErr();
615#else
616 return nullptr;
617#endif
618 }
619
620 char* getInactiveHosts(int* size) const {
621 if (Internal::VRay_isDR2())
622 return Internal::VRay_VRayServer_getInactiveHosts(serverNative, size);
623 else
624#ifndef VRAY_NOTHROW
625 throw NotSupportedErr();
626#else
627 return nullptr;
628#endif
629 }
630 };
631
634 VRayLiveLinkServer& operator=(const VRayLiveLinkServer&);
635
636 VRayLiveLinkServerNative* serverNative;
637 LicenseError licErr;
638
639 static VRayLiveLinkServer* getVRayLiveLinkServer(void* serverNative) {
640 if (Internal::VRay_isDR2())
641 return static_cast<VRayLiveLinkServer*>(Internal::VRay_VRayLiveLinkServer_getUserData(static_cast<VRayLiveLinkServerNative*>(serverNative), 0));
642 else
643 return nullptr;
644 }
645
646 void createInstance(const Internal::LiveLinkServerOptions_Internal* options) {
647 if (Internal::VRay_isDR2()) {
648 serverNative = Internal::VRay_VRayLiveLinkServer_create(options, &licErr.errs);
649 if (serverNative) Internal::VRay_VRayLiveLinkServer_setUserData(serverNative, 0, this);
650#ifndef VRAY_NOTHROW
651 if (licErr.error())
652 throw InstantiationErr(licErr.toString());
653 if (!serverNative)
654 throw InstantiationErr();
655#endif
656 }
657 }
658
659 static void serverStartCallback(const Internal::CallbackParamsBase* params) {
660 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
661 auto fn = (void(*)(VRayLiveLinkServer&, double, void*))params->userObject;
662 fn(*server, params->instant, params->userData);
663 }
664
665 template<class T, void (T::* TMethod)(VRayServer&, double instant, void* userData)>
666 static void serverStartCallbackT(const Internal::CallbackParamsBase* params) {
667 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
668 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->instant, params->userData);
669 }
670
671 static void hostConnectedCallback(const Internal::ConnectParams* params) {
672 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
673 auto fn = (void(*)(VRayLiveLinkServer&, const char*, double, void*))params->userObject;
674 fn(*server, params->hostname, params->instant, params->userData);
675 }
676
677 template<class T, void (T::* TMethod)(VRayServer&, const char* hostName, double instant, void* userData)>
678 static void hostConnectedCallbackT(const Internal::ConnectParams* params) {
679 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
680 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->hostname, params->instant, params->userData);
681 }
682
683 static void logMessageCallback(const Internal::LogMessageParams* params) {
684 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
685 auto fn = (void(*)(VRayLiveLinkServer&, const char*, MessageLevel, double, void*))params->userObject;
686 fn(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
687 }
688
689 template<class T, void (T::* TMethod)(VRayLiveLinkServer& renderer, const char* msg, MessageLevel level, double instant, void* userData)>
690 static void logMessageCallbackT(const Internal::LogMessageParams* params) {
691 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
692 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
693 }
694
695 static void progressCallback(const Internal::ProgressParams* params) {
696 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
697 auto fn = (void(*)(VRayLiveLinkServer&, const char*, int, int, double, void*))params->userObject;
698 fn(*server, params->message, params->progress, params->total, params->instant, params->userData);
699 }
700
701 template<class T, void (T::* TMethod)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double, void* userData)>
702 static void progressCallbackT(const Internal::ProgressParams* params) {
703 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
704 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, params->progress, params->total, params->instant, params->userData);
705 }
706
707 static void sceneUpdateCallback(const Internal::SceneUpdateParams* params) {
708 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
709 auto fn = (void(*)(VRayLiveLinkServer&, int, uint64_t, uint64_t, const char*, double, void*))params->userObject;
710 fn(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
711 }
712
713 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
714 static void sceneUpdateCallbackT(const Internal::SceneUpdateParams* params) {
715 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
716 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
717 }
718
719 public:
721 createInstance(nullptr);
722 }
723
724 VRayLiveLinkServer(const LiveLinkServerOptions& serverOptions) {
725 Internal::LiveLinkServerOptions_Internal optionsInternal(serverOptions);
726 createInstance(&optionsInternal);
727 }
728
730 if (serverNative) {
731 Internal::VRay_VRayLiveLinkServer_release(serverNative);
732 }
733 }
734
737 operator bool() const {
738 return !!serverNative;
739 }
740
741 LicenseError getLicenseError() const {
742 return licErr;
743 }
744
745 void setOnServerStart(void (*callback)(VRayLiveLinkServer&, double instant, void*), const void* userData = nullptr) {
746 Internal::CallbackData<Internal::OnServerStart> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
747 Internal::VRay_VRayLiveLinkServer_setServerStartCallback(serverNative, callback ? &callbackData : nullptr);
748 }
749
750 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, double, void*)>
751 void setOnServerStart(T& object, const void* userData = nullptr) {
752 Internal::CallbackData<Internal::OnServerStart> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
753 Internal::VRay_VRayLiveLinkServer_setServerStartCallback(serverNative, &callbackData);
754 }
755
756 void setOnServerClose(void (*callback)(VRayLiveLinkServer&, double instant, void*), const void* userData = nullptr) {
757 Internal::CallbackData<Internal::OnServerClose> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
758 Internal::VRay_VRayLiveLinkServer_setServerCloseCallback(serverNative, callback ? &callbackData : nullptr);
759 }
760
761 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, double, void*)>
762 void setOnServerClose(T& object, const void* userData = nullptr) {
763 Internal::CallbackData<Internal::OnServerClose> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
764 Internal::VRay_VRayLiveLinkServer_setServerCloseCallback(serverNative, &callbackData);
765 }
766
767 void setOnConnect(void (*callback)(VRayLiveLinkServer&, const char* msg, double instant, void*), const void* userData = nullptr) {
768 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
769 Internal::VRay_VRayLiveLinkServer_setConnectCallback(serverNative, callback ? &callbackData : nullptr);
770 }
771
772 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, double, void*)>
773 void setOnDisconnect(T& object, const void* userData = nullptr) {
774 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
775 Internal::VRay_VRayLiveLinkServer_setDisconnectCallback(serverNative, &callbackData);
776 }
777
778 void setOnDisconnect(void (*callback)(VRayLiveLinkServer&, const char* msg, double instant, void*), const void* userData = nullptr) {
779 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
780 Internal::VRay_VRayLiveLinkServer_setDisconnectCallback(serverNative, callback ? &callbackData : nullptr);
781 }
782
783 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, double, void*)>
784 void setOnConnect(T& object, const void* userData = nullptr) {
785 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
786 Internal::VRay_VRayLiveLinkServer_setConnectCallback(serverNative, &callbackData);
787 }
788
789 void setOnLogMessage(void (*callback)(VRayLiveLinkServer&, const char* msg, MessageLevel level, double instant, void*), MessageLevel minLevel = MessageInfo, const void* userData = nullptr) {
790 Internal::CallbackData<Internal::OnLogMessage> callbackData = { logMessageCallback, serverNative, (void*)callback, userData };
791 Internal::VRay_VRayLiveLinkServer_setDumpMessageCallback(serverNative, callback ? &callbackData : nullptr, (int)minLevel);
792 }
793
794 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, MessageLevel level, double, void*)>
795 void setOnLogMessage(T& object, MessageLevel minLevel = MessageInfo, const void* userData = nullptr) {
796 Internal::CallbackData<Internal::OnLogMessage> callbackData = { &logMessageCallbackT<T, TMethod>, serverNative, &object, userData };
797 Internal::VRay_VRayLiveLinkServer_setDumpMessageCallback(serverNative, &callbackData, (int)minLevel);
798 }
799
800 void setOnProgress(void (*callback)(VRayLiveLinkServer&, const char* msg, int elementNumber, int elementsCount, double instant, void*), const void* userData = nullptr) {
801 Internal::CallbackData<Internal::OnProgress> callbackData = { progressCallback, serverNative, (void*)callback, userData };
802 Internal::VRay_VRayLiveLinkServer_setProgressCallback(serverNative, callback ? &callbackData : nullptr);
803 }
804
805 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, int elementNumber, int elementsCount, double instant, void* userData)>
806 void setOnProgress(T& object, const void* userData = nullptr) {
807 Internal::CallbackData<Internal::OnProgress> callbackData = { &progressCallbackT<T, TMethod>, serverNative, &object, userData };
808 Internal::VRay_VRayLiveLinkServer_setProgressCallback(serverNative, &callbackData);
809 }
810
819 void setOnSceneUpdate(void (*callback)(VRayLiveLinkServer& vray, int action, uint64_t changeIndex, uint64_t pluginId, const char* name, double instant, void*), const void* userData = nullptr) {
820 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { sceneUpdateCallback, serverNative, (void*)callback, userData };
821 Internal::VRay_VRayLiveLinkServer_setSceneUpdateCallback(serverNative, callback ? &callbackData : nullptr);
822 }
823
825 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
826 void setOnSceneUpdate(T& object, const void* userData = nullptr) {
827 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { &sceneUpdateCallbackT<T, TMethod>, serverNative, &object, userData };
828 Internal::VRay_VRayLiveLinkServer_setSceneUpdateCallback(serverNative, &callbackData);
829 }
830
832 int run() {
833 return Internal::VRay_VRayLiveLinkServer_run(serverNative);
834 }
835
837 int start() {
838 return Internal::VRay_VRayLiveLinkServer_start(serverNative);
839 }
840
842 void stop() {
843 Internal::VRay_VRayLiveLinkServer_stop(serverNative);
844 }
845
850 std::string exportSceneBuffer(int flags) const {
851 size_t len = 0;
852 char* data = Internal::VRay_VRayLiveLinkServer_exportSceneBuffer(serverNative, len, flags);
853 std::string buf;
854 if (data && len > 0) {
855 buf.assign(data, len);
856 Internal::C_memory_free(data);
857 }
858 return buf;
859 }
860
865 ExternalString* exportSceneBufferFast(size_t& length, int flags) const {
866 return reinterpret_cast<ExternalString*>(Internal::VRay_VRayLiveLinkServer_exportSceneBuffer(serverNative, length, flags));
867 }
868
869 };
870
871}
872
873#endif // _VRAY_SRV_HPP_
Definition: vraysrv.hpp:333
std::string exportSceneBuffer(int flags) const
Definition: vraysrv.hpp:546
ExternalString * exportSceneBufferFast(size_t &length, int flags) const
Definition: vraysrv.hpp:561
void setOnSceneUpdate(void(*callback)(VRayServer &vray, int action, uint64_t changeIndex, uint64_t pluginId, const char *name, double instant, void *), const void *userData=nullptr)
Definition: vraysrv.hpp:515
int run()
Starts V-Ray Server. Blocking call.
Definition: vraysrv.hpp:528
int start()
Starts V-Ray Server in a separate thread. Non-blocking call.
Definition: vraysrv.hpp:533
void setOnSceneUpdate(T &object, const void *userData=nullptr)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: vraysrv.hpp:522
void stop()
Terminates the server started by 'start' in a separate thread.
Definition: vraysrv.hpp:538
Definition: vraysrv.hpp:237
@ Internal
No UI should be created in its "Properties" UI.
Definition: vraysdk.hpp:350
Definition: vraysrv.hpp:216
This is thrown when a renderer instance can't be created. This is usually due to a license issue.
Definition: vraythrow.hpp:32
Definition: vraysrv.hpp:154
This is thrown when unsupported function is called, e.g. DR1 function in DR2 build.
Definition: vraythrow.hpp:86
Definition: vraysrv.hpp:59
bool dr2ListenOnIpv4
Whether to listen on IPv4 local sockets.
Definition: vraysrv.hpp:90
std::string pluginLibraryPath
Alternative path to folder containing V-Ray plugins.
Definition: vraysrv.hpp:63
bool dr2DisableUdp
Whether UDP discovery should be disabled.
Definition: vraysrv.hpp:89
float cachedAssetsLimitValue
Value for the cache limit (hours or GB).
Definition: vraysrv.hpp:80
bool keepSceneInMemory
Do not write a temporary vrscene-file, keep the scene data in memory only, default: false.
Definition: vraysrv.hpp:70
bool dr2ListenOnIpv6
Whether to listen on IPv6 local sockets.
Definition: vraysrv.hpp:91
bool dr2SecureConnection
Whether SSL/TSL should be enabled for connections from/to this dispatcher/server.
Definition: vraysrv.hpp:88
int dr2WorkerThreadsPerServer
Number of worker threads per each server instance we start.
Definition: vraysrv.hpp:96
int dr2ConnectTimeout
Initial connection timeout in seconds.
Definition: vraysrv.hpp:97
bool overwriteLocalCacheSettings
True to override any local cache settings on the render servers with the value from the client machin...
Definition: vraysrv.hpp:71
bool changeCurrentDirectory
Change the current folder to remoteScenePath, default: false.
Definition: vraysrv.hpp:69
bool dr2RunLocalRenderServer
(Dispatcher only) Whether the dispatcher should run a local render server
Definition: vraysrv.hpp:87
bool dr2AsDispatcher
Whether the instance will act as a Dedicated Dispatcher.
Definition: vraysrv.hpp:86
bool dr2PipelinedUpstream
Whether to use pipelining. Note pipelining will be disabled internally (even if requested),...
Definition: vraysrv.hpp:92
int portNumber
Which port to accept connections on (leave at 0 for default - 20207 (DR1) or 20209 (DR2))
Definition: vraysrv.hpp:60
bool runAsLiveLink
True to use the underlying renderer as a dr/live-link interface. Default: false.
Definition: vraysrv.hpp:72
std::string remoteScenePath
The folder in which the received vrscene-file will be written, default is the temp folder.
Definition: vraysrv.hpp:62
std::string includePaths
Semicolon separated list of file system paths to the folders containing scene include files.
Definition: vraysrv.hpp:64
bool noRenderLicensePreCheck
Do not check if RenderNode license is available when creating the server (it's always checked when re...
Definition: vraysrv.hpp:68
int numThreads
Number of threads to use for rendering (leave at 0 for all available).
Definition: vraysrv.hpp:61
int dr2UpstreamChannels
Number of upstream connections, which the client side will use, when pipelining is not enabled.
Definition: vraysrv.hpp:98
std::string dr2HttpProxy
server:port connection parameter for http connections via proxy
Definition: vraysrv.hpp:95