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) {
114 std::swap(portNumber, options.portNumber);
115 std::swap(numThreads, options.numThreads);
116 remoteScenePath.swap(options.remoteScenePath);
118 includePaths.swap(options.includePaths);
119 std::swap(flags, options.flags);
120 std::swap(cachedAssetsLimitType, options.cachedAssetsLimitType);
122 std::swap(dr2Flags, options.dr2Flags);
123 dr2HttpProxy.swap(options.dr2HttpProxy);
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) {
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
219 ExternalString& operator=(const ExternalString &image);
220
221 public:
222 const char* getData() const {
223 return reinterpret_cast<const char*>(this);
224 }
225 char* getData() {
226 return reinterpret_cast<char*>(this);
227 }
228 void operator delete(void* p) {
229 Internal::C_memory_free(p);
230 }
231 };
232
233#if !defined(VRAY_RUNTIME_LOAD_PRIMARY) && !defined(VRAY_RUNTIME_LOAD_SECONDARY)
234
236 VRayServerInit(VRayServerInit&); // copy construction disabled
237
238 public:
239 VRayServerInit() {}
240
242 Internal::VRay_LicenseManager_releaseLicense();
243 }
244 };
245
246#elif defined(VRAY_RUNTIME_LOAD_PRIMARY)
247
248#ifdef _MSC_VER
249# pragma warning(push)
250# pragma warning(disable: 4706) // "assignment within conditional expression" - for VRayServerInit::importFunctions()
251#endif // _MSC_VER
252
253 class VRayServerInit {
254 VRayServerInit(VRayServerInit&); // copy construction disabled
255
256 public:
257 explicit VRayServerInit(const char* const libraryFileName) {
258 initialize(libraryFileName);
259 }
260
261 ~VRayServerInit() {
262 if (Internal::VRay_LicenseManager_releaseLicense)
263 Internal::VRay_LicenseManager_releaseLicense();
264 release();
265 }
266
267 operator bool() const {
268 return !!hLib;
269 }
270
271 protected:
272 VRayServerInit() {}
273
274 Internal::HModule hLib;
275 std::string errString;
276
277#ifdef VRAY_NOTHROW
278 void makeError(const std::string &errMsg) {
279 errString = errMsg;
280 hLib = nullptr;
281 }
282#endif // VRAY_NOTHROW
283
284 void initialize(const char* libraryFileName) {
285 if (!libraryFileName) {
286 if ((hLib = LoadUtils::tryPreloadSDKLibraryFromEnvVar(VRAY_XSTRING(APPSDK_ENV_VAR_BIN_FOLDER), false))) {
287 importFunctions();
288 return;
289 }
290 if ((hLib = LoadUtils::tryPreloadSDKLibraryFromEnvVar(VRAY_XSTRING(VRAY_SDK_ENV_VAR), true))) {
291 importFunctions();
292 return;
293 }
294 }
295 hLib = LoadUtils::loadLibrary(libraryFileName);
296 importFunctions();
297 }
298
299 void importFunctions() {
300# ifdef VRAY_NOTHROW
301# define PROC_IMPORT_FAIL(message) return makeError(LoadUtils::getLoaderError(message))
302# else
303# define PROC_IMPORT_FAIL(message) throw InitErr( (errString = LoadUtils::getLoaderError(message)) )
304# endif
305
306 if (!hLib)
307 PROC_IMPORT_FAIL("Cannot load V-Ray SDK Library file.");
308
309# define VRAY_INTERNAL_GENERATE_IMPORT_CODE
310# include "_vraysrv_import.hpp"
311# undef VRAY_INTERNAL_GENERATE_IMPORT_CODE
312 }
313
314#ifdef _MSC_VER
315# pragma warning(pop)
316#endif // _MSC_VER
317
318 void release() {
319 if (hLib)
320#ifdef _WIN32
321 Internal::FreeLibrary(hLib);
322#else
323 Internal::dlclose(hLib);
324#endif // _WIN32
325 }
326 };
327
328#endif // #if !defined(VRAY_RUNTIME_LOAD_PRIMARY) && !defined(VRAY_RUNTIME_LOAD_SECONDARY)
329
330
332 VRayServer(const VRayServer&);
333 VRayServer& operator=(const VRayServer&);
334
335 VRayServerNative* serverNative;
336 LicenseError licErr;
337
338 static VRayServer* getVRayServer(void* serverNative) {
339 return static_cast<VRayServer*>(Internal::VRay_VRayServer_getUserData(static_cast<VRayServerNative*>(serverNative), 0));
340 }
341
342 void createInstance(const Internal::ServerOptions_Internal* options) {
343 serverNative = Internal::VRay_VRayServer_create(options, &licErr.errs);
344 if (serverNative) Internal::VRay_VRayServer_setUserData(serverNative, 0, this);
345#ifndef VRAY_NOTHROW
346 if (licErr.error())
347 throw InstantiationErr(licErr.toString());
348 if (!serverNative)
349 throw InstantiationErr();
350#endif
351 }
352
353 static void serverStartCallback(const Internal::CallbackParamsBase* params) {
354 VRayServer* server = getVRayServer(params->self);
355 auto fn = (void(*)(VRayServer&, double, void*))params->userObject;
356 fn(*server, params->instant, params->userData);
357 }
358
359 template<class T, void (T::*TMethod)(VRayServer&, double instant, void* userData)>
360 static void serverStartCallbackT(const Internal::CallbackParamsBase* params) {
361 VRayServer* server = getVRayServer(params->self);
362 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->instant, params->userData);
363 }
364
365 static void hostConnectedCallback(const Internal::ConnectParams* params) {
366 VRayServer* server = getVRayServer(params->self);
367 auto fn = (void(*)(VRayServer&, const char*, double, void*))params->userObject;
368 fn(*server, params->hostname, params->instant, params->userData);
369 }
370
371 template<class T, void (T::*TMethod)(VRayServer&, const char* hostName, double instant, void* userData)>
372 static void hostConnectedCallbackT(const Internal::ConnectParams* params) {
373 VRayServer* server = getVRayServer(params->self);
374 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->hostname, params->instant, params->userData);
375 }
376
377 static void logMessageCallback(const Internal::LogMessageParams* params) {
378 VRayServer* server = getVRayServer(params->self);
379 auto fn = (void(*)(VRayServer&, const char*, MessageLevel, double, void*))params->userObject;
380 fn(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
381 }
382
383 template<class T, void (T::*TMethod)(VRayServer& renderer, const char* msg, MessageLevel level, double instant, void* userData)>
384 static void logMessageCallbackT(const Internal::LogMessageParams* params) {
385 VRayServer* server = getVRayServer(params->self);
386 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
387 }
388
389 static void progressCallback(const Internal::ProgressParams* params) {
390 VRayServer* server = getVRayServer(params->self);
391 auto fn = (void(*)(VRayServer&, const char*, int, int, double, void*))params->userObject;
392 fn(*server, params->message, params->progress, params->total, params->instant, params->userData);
393 }
394
395 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double, void* userData)>
396 static void progressCallbackT(const Internal::ProgressParams* params) {
397 VRayServer* server = getVRayServer(params->self);
398 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, params->progress, params->total, params->instant, params->userData);
399 }
400
401 static void sceneUpdateCallback(const Internal::SceneUpdateParams* params) {
402 VRayServer* server = getVRayServer(params->self);
403 auto fn = (void(*)(VRayServer&, int, uint64_t, uint64_t, const char*, double, void*))params->userObject;
404 fn(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
405 }
406
407 template<class T, void (T::*TMethod)(VRayServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
408 static void sceneUpdateCallbackT(const Internal::SceneUpdateParams* params) {
409 VRayServer* server = getVRayServer(params->self);
410 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
411 }
412
413 public:
414 VRayServer() {
415 createInstance(NULL);
416 }
417
418 VRayServer(const ServerOptions &serverOptions) {
419 Internal::ServerOptions_Internal optionsInternal(serverOptions);
420 createInstance(&optionsInternal);
421 }
422
423 ~VRayServer() {
424 if (serverNative) {
425 Internal::VRay_VRayServer_release(serverNative);
426 }
427 }
428
431 operator bool () const {
432 return !!serverNative;
433 }
434
435 LicenseError getLicenseError() const {
436 return licErr;
437 }
438
439 void setOnServerStart(void (*callback)(VRayServer&, double instant, void*), const void* userData = NULL) {
440 Internal::CallbackData<Internal::OnServerStart> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
441 Internal::VRay_VRayServer_setServerStartCallback(serverNative, callback ? &callbackData : nullptr);
442 }
443
444 template<class T, void (T::*TMethod)(VRayServer&, double, void*)>
445 void setOnServerStart(T& object, const void* userData = NULL) {
446 Internal::CallbackData<Internal::OnServerStart> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
447 Internal::VRay_VRayServer_setServerStartCallback(serverNative, &callbackData);
448 }
449
450 void setOnServerClose(void (*callback)(VRayServer&, double instant, void*), const void* userData = NULL) {
451 Internal::CallbackData<Internal::OnServerClose> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
452 Internal::VRay_VRayServer_setServerCloseCallback(serverNative, callback ? &callbackData : nullptr);
453 }
454
455 template<class T, void (T::*TMethod)(VRayServer&, double, void*)>
456 void setOnServerClose(T& object, const void* userData = NULL) {
457 Internal::CallbackData<Internal::OnServerClose> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
458 Internal::VRay_VRayServer_setServerCloseCallback(serverNative, &callbackData);
459 }
460
461 void setOnConnect(void (*callback)(VRayServer&, const char* msg, double instant, void*), const void* userData = NULL) {
462 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
463 Internal::VRay_VRayServer_setConnectCallback(serverNative, callback ? &callbackData : nullptr);
464 }
465
466 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, double, void*)>
467 void setOnDisconnect(T& object, const void* userData = NULL) {
468 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
469 Internal::VRay_VRayServer_setDisconnectCallback(serverNative, &callbackData);
470 }
471
472 void setOnDisconnect(void (*callback)(VRayServer&, const char* msg, double instant, void*), const void* userData = NULL) {
473 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
474 Internal::VRay_VRayServer_setDisconnectCallback(serverNative, callback ? &callbackData : nullptr);
475 }
476
477 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, double, void*)>
478 void setOnConnect(T& object, const void* userData = NULL) {
479 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
480 Internal::VRay_VRayServer_setConnectCallback(serverNative, &callbackData);
481 }
482
483 void setOnLogMessage(void (*callback)(VRayServer&, const char* msg, MessageLevel level, double instant, void*), MessageLevel minLevel = MessageInfo, const void* userData = NULL) {
484 Internal::CallbackData<Internal::OnLogMessage> callbackData = { logMessageCallback, serverNative, (void*)callback, userData };
485 Internal::VRay_VRayServer_setDumpMessageCallback(serverNative, callback ? &callbackData : nullptr, (int)minLevel);
486 }
487
488 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, MessageLevel level, double, void*)>
489 void setOnLogMessage(T& object, MessageLevel minLevel = MessageInfo, const void* userData = NULL) {
490 Internal::CallbackData<Internal::OnLogMessage> callbackData = { &logMessageCallbackT<T, TMethod>, serverNative, &object, userData };
491 Internal::VRay_VRayServer_setDumpMessageCallback(serverNative, &callbackData, (int)minLevel);
492 }
493
494 void setOnProgress(void (*callback)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double instant, void*), const void* userData = NULL) {
495 Internal::CallbackData<Internal::OnProgress> callbackData = { progressCallback, serverNative, (void*)callback, userData };
496 Internal::VRay_VRayServer_setProgressCallback(serverNative, callback ? &callbackData : nullptr);
497 }
498
499 template<class T, void (T::*TMethod)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double instant, void* userData)>
500 void setOnProgress(T& object, const void* userData = NULL) {
501 Internal::CallbackData<Internal::OnProgress> callbackData = { &progressCallbackT<T, TMethod>, serverNative, &object, userData };
502 Internal::VRay_VRayServer_setProgressCallback(serverNative, &callbackData);
503 }
504
513 void setOnSceneUpdate(void (*callback)(VRayServer& vray, int action, uint64_t changeIndex, uint64_t pluginId, const char* name, double instant, void*), const void* userData = NULL) {
514 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { sceneUpdateCallback, serverNative, (void*)callback, userData };
515 Internal::VRay_VRayServer_setSceneUpdateCallback(serverNative, callback ? &callbackData : nullptr);
516 }
517
519 template<class T, void (T::*TMethod)(VRayServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
520 void setOnSceneUpdate(T& object, const void* userData = NULL) {
521 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { &sceneUpdateCallbackT<T, TMethod>, serverNative, &object, userData };
522 Internal::VRay_VRayServer_setSceneUpdateCallback(serverNative, &callbackData);
523 }
524
526 int run() {
527 return Internal::VRay_VRayServer_run(serverNative);
528 }
529
531 int start() {
532 return Internal::VRay_VRayServer_start(serverNative);
533 }
534
536 void stop() {
537 Internal::VRay_VRayServer_stop(serverNative);
538 }
539
544 std::string exportSceneBuffer(int flags) const {
545 size_t len = 0;
546 char* data = Internal::VRay_VRayServer_exportSceneBuffer(serverNative, len, flags);
547 std::string buf;
548 if (data && len > 0) {
549 buf.assign(data, len);
550 Internal::C_memory_free(data);
551 }
552 return buf;
553 }
554
559 ExternalString* exportSceneBufferFast(size_t& length, int flags) const {
560 return reinterpret_cast<ExternalString*>(Internal::VRay_VRayServer_exportSceneBuffer(serverNative, length, flags));
561 }
562
563 int addHosts(const char* hosts) {
564 if (Internal::VRay_isDR2())
565 return Internal::VRay_VRayServer_addHosts(serverNative, hosts);
566 else
567#ifndef VRAY_NOTHROW
568 throw NotSupportedErr();
569#else
570 return -1;
571#endif
572 }
573
574 int removeHosts(const char* hosts) {
575 if (Internal::VRay_isDR2())
576 return Internal::VRay_VRayServer_removeHosts(serverNative, hosts);
577 else
578#ifndef VRAY_NOTHROW
579 throw NotSupportedErr();
580#else
581 return -1;
582#endif
583 }
584
585 int resetHosts(const char* hosts) {
586 if (Internal::VRay_isDR2())
587 return Internal::VRay_VRayServer_resetHosts(serverNative, hosts);
588 else
589#ifndef VRAY_NOTHROW
590 throw NotSupportedErr();
591#else
592 return -1;
593#endif
594 }
595
596 char* getAllHosts(int* size) const {
597 if (Internal::VRay_isDR2())
598 return Internal::VRay_VRayServer_getAllHosts(serverNative, size);
599 else
600#ifndef VRAY_NOTHROW
601 throw NotSupportedErr();
602#else
603 return nullptr;
604#endif
605 }
606
607 char* getActiveHosts(int* size) const {
608 if (Internal::VRay_isDR2())
609 return Internal::VRay_VRayServer_getActiveHosts(serverNative, size);
610 else
611#ifndef VRAY_NOTHROW
612 throw NotSupportedErr();
613#else
614 return nullptr;
615#endif
616 }
617
618 char* getInactiveHosts(int* size) const {
619 if (Internal::VRay_isDR2())
620 return Internal::VRay_VRayServer_getInactiveHosts(serverNative, size);
621 else
622#ifndef VRAY_NOTHROW
623 throw NotSupportedErr();
624#else
625 return nullptr;
626#endif
627 }
628 };
629
632 VRayLiveLinkServer& operator=(const VRayLiveLinkServer&);
633
634 VRayLiveLinkServerNative* serverNative;
635 LicenseError licErr;
636
637 static VRayLiveLinkServer* getVRayLiveLinkServer(void* serverNative) {
638 if (Internal::VRay_isDR2())
639 return static_cast<VRayLiveLinkServer*>(Internal::VRay_VRayLiveLinkServer_getUserData(static_cast<VRayLiveLinkServerNative*>(serverNative), 0));
640 else
641 return nullptr;
642 }
643
644 void createInstance(const Internal::LiveLinkServerOptions_Internal* options) {
645 if (Internal::VRay_isDR2()) {
646 serverNative = Internal::VRay_VRayLiveLinkServer_create(options, &licErr.errs);
647 if (serverNative) Internal::VRay_VRayLiveLinkServer_setUserData(serverNative, 0, this);
648#ifndef VRAY_NOTHROW
649 if (licErr.error())
650 throw InstantiationErr(licErr.toString());
651 if (!serverNative)
652 throw InstantiationErr();
653#endif
654 }
655 }
656
657 static void serverStartCallback(const Internal::CallbackParamsBase* params) {
658 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
659 auto fn = (void(*)(VRayLiveLinkServer&, double, void*))params->userObject;
660 fn(*server, params->instant, params->userData);
661 }
662
663 template<class T, void (T::* TMethod)(VRayServer&, double instant, void* userData)>
664 static void serverStartCallbackT(const Internal::CallbackParamsBase* params) {
665 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
666 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->instant, params->userData);
667 }
668
669 static void hostConnectedCallback(const Internal::ConnectParams* params) {
670 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
671 auto fn = (void(*)(VRayLiveLinkServer&, const char*, double, void*))params->userObject;
672 fn(*server, params->hostname, params->instant, params->userData);
673 }
674
675 template<class T, void (T::* TMethod)(VRayServer&, const char* hostName, double instant, void* userData)>
676 static void hostConnectedCallbackT(const Internal::ConnectParams* params) {
677 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
678 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->hostname, params->instant, params->userData);
679 }
680
681 static void logMessageCallback(const Internal::LogMessageParams* params) {
682 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
683 auto fn = (void(*)(VRayLiveLinkServer&, const char*, MessageLevel, double, void*))params->userObject;
684 fn(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
685 }
686
687 template<class T, void (T::* TMethod)(VRayLiveLinkServer& renderer, const char* msg, MessageLevel level, double instant, void* userData)>
688 static void logMessageCallbackT(const Internal::LogMessageParams* params) {
689 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
690 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, static_cast<MessageLevel>(params->level), params->instant, params->userData);
691 }
692
693 static void progressCallback(const Internal::ProgressParams* params) {
694 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
695 auto fn = (void(*)(VRayLiveLinkServer&, const char*, int, int, double, void*))params->userObject;
696 fn(*server, params->message, params->progress, params->total, params->instant, params->userData);
697 }
698
699 template<class T, void (T::* TMethod)(VRayServer&, const char* msg, int elementNumber, int elementsCount, double, void* userData)>
700 static void progressCallbackT(const Internal::ProgressParams* params) {
701 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
702 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->message, params->progress, params->total, params->instant, params->userData);
703 }
704
705 static void sceneUpdateCallback(const Internal::SceneUpdateParams* params) {
706 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
707 auto fn = (void(*)(VRayLiveLinkServer&, int, uint64_t, uint64_t, const char*, double, void*))params->userObject;
708 fn(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
709 }
710
711 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
712 static void sceneUpdateCallbackT(const Internal::SceneUpdateParams* params) {
713 VRayLiveLinkServer* server = getVRayLiveLinkServer(params->self);
714 (static_cast<T*>(params->userObject)->*TMethod)(*server, params->action, params->changeIndex, params->pluginId, params->name, params->instant, params->userData);
715 }
716
717 public:
719 createInstance(NULL);
720 }
721
722 VRayLiveLinkServer(const LiveLinkServerOptions& serverOptions) {
723 Internal::LiveLinkServerOptions_Internal optionsInternal(serverOptions);
724 createInstance(&optionsInternal);
725 }
726
728 if (serverNative) {
729 Internal::VRay_VRayLiveLinkServer_release(serverNative);
730 }
731 }
732
735 operator bool() const {
736 return !!serverNative;
737 }
738
739 LicenseError getLicenseError() const {
740 return licErr;
741 }
742
743 void setOnServerStart(void (*callback)(VRayLiveLinkServer&, double instant, void*), const void* userData = NULL) {
744 Internal::CallbackData<Internal::OnServerStart> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
745 Internal::VRay_VRayLiveLinkServer_setServerStartCallback(serverNative, callback ? &callbackData : nullptr);
746 }
747
748 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, double, void*)>
749 void setOnServerStart(T& object, const void* userData = NULL) {
750 Internal::CallbackData<Internal::OnServerStart> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
751 Internal::VRay_VRayLiveLinkServer_setServerStartCallback(serverNative, &callbackData);
752 }
753
754 void setOnServerClose(void (*callback)(VRayLiveLinkServer&, double instant, void*), const void* userData = NULL) {
755 Internal::CallbackData<Internal::OnServerClose> callbackData = { serverStartCallback, serverNative, (void*)callback, userData };
756 Internal::VRay_VRayLiveLinkServer_setServerCloseCallback(serverNative, callback ? &callbackData : nullptr);
757 }
758
759 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, double, void*)>
760 void setOnServerClose(T& object, const void* userData = NULL) {
761 Internal::CallbackData<Internal::OnServerClose> callbackData = { &serverStartCallbackT<T, TMethod>, serverNative, &object, userData };
762 Internal::VRay_VRayLiveLinkServer_setServerCloseCallback(serverNative, &callbackData);
763 }
764
765 void setOnConnect(void (*callback)(VRayLiveLinkServer&, const char* msg, double instant, void*), const void* userData = NULL) {
766 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
767 Internal::VRay_VRayLiveLinkServer_setConnectCallback(serverNative, callback ? &callbackData : nullptr);
768 }
769
770 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, double, void*)>
771 void setOnDisconnect(T& object, const void* userData = NULL) {
772 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
773 Internal::VRay_VRayLiveLinkServer_setDisconnectCallback(serverNative, &callbackData);
774 }
775
776 void setOnDisconnect(void (*callback)(VRayLiveLinkServer&, const char* msg, double instant, void*), const void* userData = NULL) {
777 Internal::CallbackData<Internal::OnConnect> callbackData = { hostConnectedCallback, serverNative, (void*)callback, userData };
778 Internal::VRay_VRayLiveLinkServer_setDisconnectCallback(serverNative, callback ? &callbackData : nullptr);
779 }
780
781 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, double, void*)>
782 void setOnConnect(T& object, const void* userData = NULL) {
783 Internal::CallbackData<Internal::OnConnect> callbackData = { &hostConnectedCallbackT<T, TMethod>, serverNative, &object, userData };
784 Internal::VRay_VRayLiveLinkServer_setConnectCallback(serverNative, &callbackData);
785 }
786
787 void setOnLogMessage(void (*callback)(VRayLiveLinkServer&, const char* msg, MessageLevel level, double instant, void*), MessageLevel minLevel = MessageInfo, const void* userData = NULL) {
788 Internal::CallbackData<Internal::OnLogMessage> callbackData = { logMessageCallback, serverNative, (void*)callback, userData };
789 Internal::VRay_VRayLiveLinkServer_setDumpMessageCallback(serverNative, callback ? &callbackData : nullptr, (int)minLevel);
790 }
791
792 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, MessageLevel level, double, void*)>
793 void setOnLogMessage(T& object, MessageLevel minLevel = MessageInfo, const void* userData = NULL) {
794 Internal::CallbackData<Internal::OnLogMessage> callbackData = { &logMessageCallbackT<T, TMethod>, serverNative, &object, userData };
795 Internal::VRay_VRayLiveLinkServer_setDumpMessageCallback(serverNative, &callbackData, (int)minLevel);
796 }
797
798 void setOnProgress(void (*callback)(VRayLiveLinkServer&, const char* msg, int elementNumber, int elementsCount, double instant, void*), const void* userData = NULL) {
799 Internal::CallbackData<Internal::OnProgress> callbackData = { progressCallback, serverNative, (void*)callback, userData };
800 Internal::VRay_VRayLiveLinkServer_setProgressCallback(serverNative, callback ? &callbackData : nullptr);
801 }
802
803 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, const char* msg, int elementNumber, int elementsCount, double instant, void* userData)>
804 void setOnProgress(T& object, const void* userData = NULL) {
805 Internal::CallbackData<Internal::OnProgress> callbackData = { &progressCallbackT<T, TMethod>, serverNative, &object, userData };
806 Internal::VRay_VRayLiveLinkServer_setProgressCallback(serverNative, &callbackData);
807 }
808
817 void setOnSceneUpdate(void (*callback)(VRayLiveLinkServer& vray, int action, uint64_t changeIndex, uint64_t pluginId, const char* name, double instant, void*), const void* userData = NULL) {
818 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { sceneUpdateCallback, serverNative, (void*)callback, userData };
819 Internal::VRay_VRayLiveLinkServer_setSceneUpdateCallback(serverNative, callback ? &callbackData : nullptr);
820 }
821
823 template<class T, void (T::* TMethod)(VRayLiveLinkServer&, int, uint64_t, uint64_t, const char* name, double instant, void* userData)>
824 void setOnSceneUpdate(T& object, const void* userData = NULL) {
825 Internal::CallbackData<Internal::OnSceneUpdate> callbackData = { &sceneUpdateCallbackT<T, TMethod>, serverNative, &object, userData };
826 Internal::VRay_VRayLiveLinkServer_setSceneUpdateCallback(serverNative, &callbackData);
827 }
828
830 int run() {
831 return Internal::VRay_VRayLiveLinkServer_run(serverNative);
832 }
833
835 int start() {
836 return Internal::VRay_VRayLiveLinkServer_start(serverNative);
837 }
838
840 void stop() {
841 Internal::VRay_VRayLiveLinkServer_stop(serverNative);
842 }
843
848 std::string exportSceneBuffer(int flags) const {
849 size_t len = 0;
850 char* data = Internal::VRay_VRayLiveLinkServer_exportSceneBuffer(serverNative, len, flags);
851 std::string buf;
852 if (data && len > 0) {
853 buf.assign(data, len);
854 Internal::C_memory_free(data);
855 }
856 return buf;
857 }
858
863 ExternalString* exportSceneBufferFast(size_t& length, int flags) const {
864 return reinterpret_cast<ExternalString*>(Internal::VRay_VRayLiveLinkServer_exportSceneBuffer(serverNative, length, flags));
865 }
866
867 };
868
869}
870
871#endif // _VRAY_SRV_HPP_
Definition: vraysrv.hpp:331
std::string exportSceneBuffer(int flags) const
Definition: vraysrv.hpp:544
ExternalString * exportSceneBufferFast(size_t &length, int flags) const
Definition: vraysrv.hpp:559
void setOnSceneUpdate(void(*callback)(VRayServer &vray, int action, uint64_t changeIndex, uint64_t pluginId, const char *name, double instant, void *), const void *userData=NULL)
Definition: vraysrv.hpp:513
int run()
Starts V-Ray Server. Blocking call.
Definition: vraysrv.hpp:526
int start()
Starts V-Ray Server in a separate thread. Non-blocking call.
Definition: vraysrv.hpp:531
void setOnSceneUpdate(T &object, const void *userData=NULL)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: vraysrv.hpp:520
void stop()
Terminates the server started by 'start' in a separate thread.
Definition: vraysrv.hpp:536
Definition: vraysrv.hpp:235
@ Internal
No UI should be created in its "Properties" UI.
Definition: vraysdk.hpp:349
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