VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
scriptRegistry.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3//
4// Created by Arnis Lektauers on 12.10.2025.
5//
6#pragma once
7
8#include <functional>
9#include <memory>
10
11#include "script.h"
12
13// Helper macros to generate unique names using __LINE__
14// Extra level of indirection needed to expand __LINE__ before concatenation
15#define REGISTER_SCRIPT_IMPL2(Type, Name, Line) \
16 namespace { \
17 struct ScriptReg_##Line { \
18 ScriptReg_##Line() { \
19 ::visutwin::canvas::ScriptFactories::instance().registerFactory( \
20 Name, [] { return std::make_unique<Type>(); } \
21 ); \
22 } \
23 }; \
24 static ScriptReg_##Line reg_instance_##Line; \
25 }
26
27#define REGISTER_SCRIPT_IMPL(Type, Name, Line) \
28 REGISTER_SCRIPT_IMPL2(Type, Name, Line)
29
30#define REGISTER_SCRIPT(Type, Name) \
31 REGISTER_SCRIPT_IMPL(Type, Name, __LINE__)
32
33namespace visutwin::canvas
34{
35 class Engine;
36
37 using ScriptFactory = std::function<std::unique_ptr<Script>()>;
38
39 // Global factory storage (separate from per-Engine registry)
41 public:
43 static ScriptFactories factories;
44 return factories;
45 }
46
47 void registerFactory(const std::string& name, ScriptFactory factory) {
48 _factories[name] = std::move(factory);
49 }
50
51 ScriptFactory getFactory(const std::string& name) const {
52 auto it = _factories.find(name);
53 return (it != _factories.end()) ? it->second : nullptr;
54 }
55
56 private:
57 std::unordered_map<std::string, ScriptFactory> _factories;
58 };
59
64 {
65 public:
66 explicit ScriptRegistry(std::shared_ptr<Engine> engine): _engine(std::move(engine)) {}
67
68 void registerType(const std::string& name, ScriptFactory factory);
69
70 std::unique_ptr<Script> create(const std::string& name) const;
71
72 template<typename T>
73 void registerType() {
74 registerType(T::scriptName(), [] { return std::make_unique<T>(); });
75 }
76
77 private:
78 std::shared_ptr<Engine> _engine;
79
80 std::unordered_map<std::string, ScriptFactory> _types;
81 };
82}
static ScriptFactories & instance()
ScriptFactory getFactory(const std::string &name) const
void registerFactory(const std::string &name, ScriptFactory factory)
ScriptRegistry(std::shared_ptr< Engine > engine)
std::unique_ptr< Script > create(const std::string &name) const
std::function< std::unique_ptr< Script >()> ScriptFactory