godot-changes-noexcept.patch 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. diff --git a/thirdparty/embree/common/algorithms/parallel_for.h b/thirdparty/embree/common/algorithms/parallel_for.h
  2. index f2969a88f1..6d411e4852 100644
  3. --- a/thirdparty/embree/common/algorithms/parallel_for.h
  4. +++ b/thirdparty/embree/common/algorithms/parallel_for.h
  5. @@ -21,7 +21,10 @@ namespace embree
  6. func(r.begin());
  7. });
  8. if (!TaskScheduler::wait())
  9. - throw std::runtime_error("task cancelled");
  10. + // -- GODOT start --
  11. + // throw std::runtime_error("task cancelled");
  12. + abort();
  13. + // -- GODOT end --
  14. }
  15. #elif defined(TASKING_TBB)
  16. #if TBB_INTERFACE_VERSION >= 12002
  17. @@ -30,13 +33,19 @@ namespace embree
  18. func(i);
  19. },context);
  20. if (context.is_group_execution_cancelled())
  21. - throw std::runtime_error("task cancelled");
  22. + // -- GODOT start --
  23. + // throw std::runtime_error("task cancelled");
  24. + abort();
  25. + // -- GODOT end --
  26. #else
  27. tbb::parallel_for(Index(0),N,Index(1),[&](Index i) {
  28. func(i);
  29. });
  30. if (tbb::task::self().is_cancelled())
  31. - throw std::runtime_error("task cancelled");
  32. + // -- GODOT start --
  33. + // throw std::runtime_error("task cancelled");
  34. + abort();
  35. + // -- GODOT end --
  36. #endif
  37. #elif defined(TASKING_PPL)
  38. @@ -56,7 +65,10 @@ namespace embree
  39. #if defined(TASKING_INTERNAL)
  40. TaskScheduler::spawn(first,last,minStepSize,func);
  41. if (!TaskScheduler::wait())
  42. - throw std::runtime_error("task cancelled");
  43. + // -- GODOT start --
  44. + // throw std::runtime_error("task cancelled");
  45. + abort();
  46. + // -- GODOT end --
  47. #elif defined(TASKING_TBB)
  48. #if TBB_INTERFACE_VERSION >= 12002
  49. @@ -65,13 +77,19 @@ namespace embree
  50. func(range<Index>(r.begin(),r.end()));
  51. },context);
  52. if (context.is_group_execution_cancelled())
  53. - throw std::runtime_error("task cancelled");
  54. + // -- GODOT start --
  55. + // throw std::runtime_error("task cancelled");
  56. + abort();
  57. + // -- GODOT end --
  58. #else
  59. tbb::parallel_for(tbb::blocked_range<Index>(first,last,minStepSize),[&](const tbb::blocked_range<Index>& r) {
  60. func(range<Index>(r.begin(),r.end()));
  61. });
  62. if (tbb::task::self().is_cancelled())
  63. - throw std::runtime_error("task cancelled");
  64. + // -- GODOT start --
  65. + // throw std::runtime_error("task cancelled");
  66. + abort();
  67. + // -- GODOT end --
  68. #endif
  69. #elif defined(TASKING_PPL)
  70. @@ -103,13 +121,19 @@ namespace embree
  71. func(i);
  72. },tbb::simple_partitioner(),context);
  73. if (context.is_group_execution_cancelled())
  74. - throw std::runtime_error("task cancelled");
  75. + // -- GODOT start --
  76. + // throw std::runtime_error("task cancelled");
  77. + abort();
  78. + // -- GODOT end --
  79. #else
  80. tbb::parallel_for(Index(0),N,Index(1),[&](Index i) {
  81. func(i);
  82. },tbb::simple_partitioner());
  83. if (tbb::task::self().is_cancelled())
  84. - throw std::runtime_error("task cancelled");
  85. + // -- GODOT start --
  86. + // throw std::runtime_error("task cancelled");
  87. + abort();
  88. + // -- GODOT end --
  89. #endif
  90. }
  91. @@ -124,13 +148,19 @@ namespace embree
  92. func(i);
  93. },ap,context);
  94. if (context.is_group_execution_cancelled())
  95. - throw std::runtime_error("task cancelled");
  96. + // -- GODOT start --
  97. + // throw std::runtime_error("task cancelled");
  98. + abort();
  99. + // -- GODOT end --
  100. #else
  101. tbb::parallel_for(Index(0),N,Index(1),[&](Index i) {
  102. func(i);
  103. },ap);
  104. if (tbb::task::self().is_cancelled())
  105. - throw std::runtime_error("task cancelled");
  106. + // -- GODOT start --
  107. + // throw std::runtime_error("task cancelled");
  108. + abort();
  109. + // -- GODOT end --
  110. #endif
  111. }
  112. diff --git a/thirdparty/embree/common/algorithms/parallel_reduce.h b/thirdparty/embree/common/algorithms/parallel_reduce.h
  113. index 1a94aad8c4..cd0078f2e6 100644
  114. --- a/thirdparty/embree/common/algorithms/parallel_reduce.h
  115. +++ b/thirdparty/embree/common/algorithms/parallel_reduce.h
  116. @@ -58,15 +58,19 @@ namespace embree
  117. const Value v = tbb::parallel_reduce(tbb::blocked_range<Index>(first,last,minStepSize),identity,
  118. [&](const tbb::blocked_range<Index>& r, const Value& start) { return reduction(start,func(range<Index>(r.begin(),r.end()))); },
  119. reduction,context);
  120. - if (context.is_group_execution_cancelled())
  121. - throw std::runtime_error("task cancelled");
  122. + // -- GODOT start --
  123. + // if (context.is_group_execution_cancelled())
  124. + // throw std::runtime_error("task cancelled");
  125. + // -- GODOT end --
  126. return v;
  127. #else
  128. const Value v = tbb::parallel_reduce(tbb::blocked_range<Index>(first,last,minStepSize),identity,
  129. [&](const tbb::blocked_range<Index>& r, const Value& start) { return reduction(start,func(range<Index>(r.begin(),r.end()))); },
  130. reduction);
  131. - if (tbb::task::self().is_cancelled())
  132. - throw std::runtime_error("task cancelled");
  133. + // -- GODOT start --
  134. + // if (tbb::task::self().is_cancelled())
  135. + // throw std::runtime_error("task cancelled");
  136. + // -- GODOT end --
  137. return v;
  138. #endif
  139. #else // TASKING_PPL
  140. diff --git a/thirdparty/embree/common/lexers/stringstream.cpp b/thirdparty/embree/common/lexers/stringstream.cpp
  141. index 42ffb10176..a037869506 100644
  142. --- a/thirdparty/embree/common/lexers/stringstream.cpp
  143. +++ b/thirdparty/embree/common/lexers/stringstream.cpp
  144. @@ -39,7 +39,10 @@ namespace embree
  145. std::vector<char> str; str.reserve(64);
  146. while (cin->peek() != EOF && !isSeparator(cin->peek())) {
  147. int c = cin->get();
  148. - if (!isValidChar(c)) throw std::runtime_error("invalid character "+std::string(1,c)+" in input");
  149. + // -- GODOT start --
  150. + // if (!isValidChar(c)) throw std::runtime_error("invalid character "+std::string(1,c)+" in input");
  151. + if (!isValidChar(c)) abort();
  152. + // -- GODOT end --
  153. str.push_back((char)c);
  154. }
  155. str.push_back(0);
  156. diff --git a/thirdparty/embree/common/sys/alloc.cpp b/thirdparty/embree/common/sys/alloc.cpp
  157. index 1bc30fe9a5..abdd269069 100644
  158. --- a/thirdparty/embree/common/sys/alloc.cpp
  159. +++ b/thirdparty/embree/common/sys/alloc.cpp
  160. @@ -21,7 +21,10 @@ namespace embree
  161. void* ptr = _mm_malloc(size,align);
  162. if (size != 0 && ptr == nullptr)
  163. - throw std::bad_alloc();
  164. + // -- GODOT start --
  165. + // throw std::bad_alloc();
  166. + abort();
  167. + // -- GODOT end --
  168. return ptr;
  169. }
  170. @@ -128,7 +131,10 @@ namespace embree
  171. /* fall back to 4k pages */
  172. int flags = MEM_COMMIT | MEM_RESERVE;
  173. char* ptr = (char*) VirtualAlloc(nullptr,bytes,flags,PAGE_READWRITE);
  174. - if (ptr == nullptr) throw std::bad_alloc();
  175. + // -- GODOT start --
  176. + // if (ptr == nullptr) throw std::bad_alloc();
  177. + if (ptr == nullptr) abort();
  178. + // -- GODOT end --
  179. hugepages = false;
  180. return ptr;
  181. }
  182. @@ -145,7 +151,10 @@ namespace embree
  183. return bytesOld;
  184. if (!VirtualFree((char*)ptr+bytesNew,bytesOld-bytesNew,MEM_DECOMMIT))
  185. - throw std::bad_alloc();
  186. + // -- GODOT start --
  187. + // throw std::bad_alloc();
  188. + abort();
  189. + // -- GODOT end --
  190. return bytesNew;
  191. }
  192. @@ -156,7 +165,10 @@ namespace embree
  193. return;
  194. if (!VirtualFree(ptr,0,MEM_RELEASE))
  195. - throw std::bad_alloc();
  196. + // -- GODOT start --
  197. + // throw std::bad_alloc();
  198. + abort();
  199. + // -- GODOT end --
  200. }
  201. void os_advise(void *ptr, size_t bytes)
  202. @@ -260,7 +272,10 @@ namespace embree
  203. /* fallback to 4k pages */
  204. void* ptr = (char*) mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
  205. - if (ptr == MAP_FAILED) throw std::bad_alloc();
  206. + // -- GODOT start --
  207. + // if (ptr == MAP_FAILED) throw std::bad_alloc();
  208. + if (ptr == MAP_FAILED) abort();
  209. + // -- GODOT end --
  210. hugepages = false;
  211. /* advise huge page hint for THP */
  212. @@ -277,7 +292,10 @@ namespace embree
  213. return bytesOld;
  214. if (munmap((char*)ptr+bytesNew,bytesOld-bytesNew) == -1)
  215. - throw std::bad_alloc();
  216. + // -- GODOT start --
  217. + // throw std::bad_alloc();
  218. + abort();
  219. + // -- GODOT end --
  220. return bytesNew;
  221. }
  222. @@ -291,7 +309,10 @@ namespace embree
  223. const size_t pageSize = hugepages ? PAGE_SIZE_2M : PAGE_SIZE_4K;
  224. bytes = (bytes+pageSize-1) & ~(pageSize-1);
  225. if (munmap(ptr,bytes) == -1)
  226. - throw std::bad_alloc();
  227. + // -- GODOT start --
  228. + // throw std::bad_alloc();
  229. + abort();
  230. + // -- GODOT end --
  231. }
  232. /* hint for transparent huge pages (THP) */
  233. diff --git a/thirdparty/embree/common/sys/platform.h b/thirdparty/embree/common/sys/platform.h
  234. index be3ec36436..728bf6ed7d 100644
  235. --- a/thirdparty/embree/common/sys/platform.h
  236. +++ b/thirdparty/embree/common/sys/platform.h
  237. @@ -178,11 +178,19 @@
  238. #define PRINT4(x,y,z,w) embree_cout << STRING(x) << " = " << (x) << ", " << STRING(y) << " = " << (y) << ", " << STRING(z) << " = " << (z) << ", " << STRING(w) << " = " << (w) << embree_endl
  239. #if defined(DEBUG) // only report file and line in debug mode
  240. + // -- GODOT start --
  241. + // #define THROW_RUNTIME_ERROR(str)
  242. + // throw std::runtime_error(std::string(__FILE__) + " (" + toString(__LINE__) + "): " + std::string(str));
  243. #define THROW_RUNTIME_ERROR(str) \
  244. - throw std::runtime_error(std::string(__FILE__) + " (" + toString(__LINE__) + "): " + std::string(str));
  245. + printf("%s (%d): %s", __FILE__, __LINE__, std::string(str).c_str()), abort();
  246. + // -- GODOT end --
  247. #else
  248. + // -- GODOT start --
  249. + // #define THROW_RUNTIME_ERROR(str)
  250. + // throw std::runtime_error(str);
  251. #define THROW_RUNTIME_ERROR(str) \
  252. - throw std::runtime_error(str);
  253. + abort();
  254. + // -- GODOT end --
  255. #endif
  256. #define FATAL(x) THROW_RUNTIME_ERROR(x)
  257. diff --git a/thirdparty/embree/common/tasking/taskschedulerinternal.cpp b/thirdparty/embree/common/tasking/taskschedulerinternal.cpp
  258. index dca835a716..ad438588a3 100644
  259. --- a/thirdparty/embree/common/tasking/taskschedulerinternal.cpp
  260. +++ b/thirdparty/embree/common/tasking/taskschedulerinternal.cpp
  261. @@ -48,13 +48,15 @@ namespace embree
  262. {
  263. Task* prevTask = thread.task;
  264. thread.task = this;
  265. - try {
  266. - if (thread.scheduler->cancellingException == nullptr)
  267. + // -- GODOT start --
  268. + // try {
  269. + // if (thread.scheduler->cancellingException == nullptr)
  270. closure->execute();
  271. - } catch (...) {
  272. - if (thread.scheduler->cancellingException == nullptr)
  273. - thread.scheduler->cancellingException = std::current_exception();
  274. - }
  275. + // } catch (...) {
  276. + // if (thread.scheduler->cancellingException == nullptr)
  277. + // thread.scheduler->cancellingException = std::current_exception();
  278. + // }
  279. + // -- GODOT end --
  280. thread.task = prevTask;
  281. add_dependencies(-1);
  282. }
  283. @@ -291,8 +293,11 @@ namespace embree
  284. size_t threadIndex = allocThreadIndex();
  285. condition.wait(mutex, [&] () { return hasRootTask.load(); });
  286. mutex.unlock();
  287. - std::exception_ptr except = thread_loop(threadIndex);
  288. - if (except != nullptr) std::rethrow_exception(except);
  289. + // -- GODOT start --
  290. + // std::exception_ptr except = thread_loop(threadIndex);
  291. + // if (except != nullptr) std::rethrow_exception(except);
  292. + thread_loop(threadIndex);
  293. + // -- GODOT end --
  294. }
  295. void TaskScheduler::reset() {
  296. @@ -324,7 +329,10 @@ namespace embree
  297. return thread->scheduler->cancellingException == nullptr;
  298. }
  299. - std::exception_ptr TaskScheduler::thread_loop(size_t threadIndex)
  300. +// -- GODOT start --
  301. +// std::exception_ptr TaskScheduler::thread_loop(size_t threadIndex)
  302. + void TaskScheduler::thread_loop(size_t threadIndex)
  303. +// -- GODOT end --
  304. {
  305. /* allocate thread structure */
  306. std::unique_ptr<Thread> mthread(new Thread(threadIndex,this)); // too large for stack allocation
  307. @@ -347,9 +355,10 @@ namespace embree
  308. swapThread(oldThread);
  309. /* remember exception to throw */
  310. - std::exception_ptr except = nullptr;
  311. - if (cancellingException != nullptr) except = cancellingException;
  312. -
  313. + // -- GODOT start --
  314. + // std::exception_ptr except = nullptr;
  315. + // if (cancellingException != nullptr) except = cancellingException;
  316. + // -- GODOT end --
  317. /* wait for all threads to terminate */
  318. threadCounter--;
  319. #if defined(__WIN32__)
  320. @@ -367,7 +376,10 @@ namespace embree
  321. yield();
  322. #endif
  323. }
  324. - return except;
  325. + // -- GODOT start --
  326. + // return except;
  327. + return;
  328. + // -- GODOT end --
  329. }
  330. bool TaskScheduler::steal_from_other_threads(Thread& thread)
  331. diff --git a/thirdparty/embree/common/tasking/taskschedulerinternal.h b/thirdparty/embree/common/tasking/taskschedulerinternal.h
  332. index 61a0e57c5b..6cc2495195 100644
  333. --- a/thirdparty/embree/common/tasking/taskschedulerinternal.h
  334. +++ b/thirdparty/embree/common/tasking/taskschedulerinternal.h
  335. @@ -123,7 +123,10 @@ namespace embree
  336. {
  337. size_t ofs = bytes + ((align - stackPtr) & (align-1));
  338. if (stackPtr + ofs > CLOSURE_STACK_SIZE)
  339. - throw std::runtime_error("closure stack overflow");
  340. + // -- GODOT start --
  341. + // throw std::runtime_error("closure stack overflow");
  342. + abort();
  343. + // -- GODOT end --
  344. stackPtr += ofs;
  345. return &stack[stackPtr-bytes];
  346. }
  347. @@ -132,7 +135,10 @@ namespace embree
  348. __forceinline void push_right(Thread& thread, const size_t size, const Closure& closure)
  349. {
  350. if (right >= TASK_STACK_SIZE)
  351. - throw std::runtime_error("task stack overflow");
  352. + // -- GODOT start --
  353. + // throw std::runtime_error("task stack overflow");
  354. + abort();
  355. + // -- GODOT end --
  356. /* allocate new task on right side of stack */
  357. size_t oldStackPtr = stackPtr;
  358. @@ -238,7 +244,10 @@ namespace embree
  359. void wait_for_threads(size_t threadCount);
  360. /*! thread loop for all worker threads */
  361. - std::exception_ptr thread_loop(size_t threadIndex);
  362. + // -- GODOT start --
  363. + // std::exception_ptr thread_loop(size_t threadIndex);
  364. + void thread_loop(size_t threadIndex);
  365. + // -- GODOT end --
  366. /*! steals a task from a different thread */
  367. bool steal_from_other_threads(Thread& thread);
  368. diff --git a/thirdparty/embree/kernels/bvh/bvh_statistics.cpp b/thirdparty/embree/kernels/bvh/bvh_statistics.cpp
  369. index 40f9043736..57f75bfd7e 100644
  370. --- a/thirdparty/embree/kernels/bvh/bvh_statistics.cpp
  371. +++ b/thirdparty/embree/kernels/bvh/bvh_statistics.cpp
  372. @@ -150,7 +150,10 @@ namespace embree
  373. }
  374. }
  375. else {
  376. - throw std::runtime_error("not supported node type in bvh_statistics");
  377. + // -- GODOT start --
  378. + // throw std::runtime_error("not supported node type in bvh_statistics");
  379. + abort();
  380. + // -- GODOT end --
  381. }
  382. return s;
  383. }
  384. diff --git a/thirdparty/embree/kernels/common/rtcore.cpp b/thirdparty/embree/kernels/common/rtcore.cpp
  385. index 95a94319ec..a6ea55bfc4 100644
  386. --- a/thirdparty/embree/kernels/common/rtcore.cpp
  387. +++ b/thirdparty/embree/kernels/common/rtcore.cpp
  388. @@ -198,7 +198,10 @@ RTC_NAMESPACE_BEGIN;
  389. if (quality != RTC_BUILD_QUALITY_LOW &&
  390. quality != RTC_BUILD_QUALITY_MEDIUM &&
  391. quality != RTC_BUILD_QUALITY_HIGH)
  392. - throw std::runtime_error("invalid build quality");
  393. + // -- GODOT start --
  394. + // throw std::runtime_error("invalid build quality");
  395. + abort();
  396. + // -- GODOT end --
  397. scene->setBuildQuality(quality);
  398. RTC_CATCH_END2(scene);
  399. }
  400. @@ -1351,7 +1354,10 @@ RTC_NAMESPACE_BEGIN;
  401. quality != RTC_BUILD_QUALITY_MEDIUM &&
  402. quality != RTC_BUILD_QUALITY_HIGH &&
  403. quality != RTC_BUILD_QUALITY_REFIT)
  404. - throw std::runtime_error("invalid build quality");
  405. + // -- GODOT start --
  406. + // throw std::runtime_error("invalid build quality");
  407. + abort();
  408. + // -- GODOT end --
  409. geometry->setBuildQuality(quality);
  410. RTC_CATCH_END2(geometry);
  411. }
  412. diff --git a/thirdparty/embree/kernels/common/rtcore.h b/thirdparty/embree/kernels/common/rtcore.h
  413. index 4e4b24e9c2..ac58a84d6f 100644
  414. --- a/thirdparty/embree/kernels/common/rtcore.h
  415. +++ b/thirdparty/embree/kernels/common/rtcore.h
  416. @@ -25,6 +25,13 @@ namespace embree
  417. #endif
  418. /*! Macros used in the rtcore API implementation */
  419. +// -- GODOT start --
  420. +#define RTC_CATCH_BEGIN
  421. +#define RTC_CATCH_END(device)
  422. +#define RTC_CATCH_END2(scene)
  423. +#define RTC_CATCH_END2_FALSE(scene) return false;
  424. +
  425. +#if 0
  426. #define RTC_CATCH_BEGIN try {
  427. #define RTC_CATCH_END(device) \
  428. @@ -71,6 +78,8 @@ namespace embree
  429. Device::process_error(device,RTC_ERROR_UNKNOWN,"unknown exception caught"); \
  430. return false; \
  431. }
  432. +#endif
  433. +// -- GODOT end --
  434. #define RTC_VERIFY_HANDLE(handle) \
  435. if (handle == nullptr) { \
  436. @@ -97,6 +106,8 @@ namespace embree
  437. #define RTC_TRACE(x)
  438. #endif
  439. +// -- GODOT start --
  440. +#if 0
  441. /*! used to throw embree API errors */
  442. struct rtcore_error : public std::exception
  443. {
  444. @@ -112,14 +123,18 @@ namespace embree
  445. RTCError error;
  446. std::string str;
  447. };
  448. +#endif
  449. #if defined(DEBUG) // only report file and line in debug mode
  450. #define throw_RTCError(error,str) \
  451. - throw rtcore_error(error,std::string(__FILE__) + " (" + toString(__LINE__) + "): " + std::string(str));
  452. + printf("%s (%d): %s", __FILE__, __LINE__, std::string(str).c_str()), abort();
  453. + // throw rtcore_error(error,std::string(__FILE__) + " (" + toString(__LINE__) + "): " + std::string(str));
  454. #else
  455. #define throw_RTCError(error,str) \
  456. - throw rtcore_error(error,str);
  457. + abort();
  458. + // throw rtcore_error(error,str);
  459. #endif
  460. +// -- GODOT end --
  461. #define RTC_BUILD_ARGUMENTS_HAS(settings,member) \
  462. (settings.byteSize > (offsetof(RTCBuildArguments,member)+sizeof(settings.member)))
  463. diff --git a/thirdparty/embree/kernels/common/scene.cpp b/thirdparty/embree/kernels/common/scene.cpp
  464. index ad1916c54e..65d31d0f81 100644
  465. --- a/thirdparty/embree/kernels/common/scene.cpp
  466. +++ b/thirdparty/embree/kernels/common/scene.cpp
  467. @@ -790,16 +790,18 @@ namespace embree
  468. }
  469. /* initiate build */
  470. - try {
  471. + // -- GODOT start --
  472. + // try {
  473. scheduler->spawn_root([&]() { commit_task(); Lock<MutexSys> lock(schedulerMutex); this->scheduler = nullptr; }, 1, !join);
  474. - }
  475. - catch (...) {
  476. - accels_clear();
  477. - updateInterface();
  478. - Lock<MutexSys> lock(schedulerMutex);
  479. - this->scheduler = nullptr;
  480. - throw;
  481. - }
  482. + // }
  483. + // catch (...) {
  484. + // accels_clear();
  485. + // updateInterface();
  486. + // Lock<MutexSys> lock(schedulerMutex);
  487. + // this->scheduler = nullptr;
  488. + // throw;
  489. + // }
  490. + // -- GODOT end --
  491. }
  492. #endif