1 #include "builtin.h"
2 #include "function.h"
3 #include "module.h"
4 #include "expression.h"
5 
6 std::unordered_map<std::string, const std::vector<std::string>> Builtins::keywordList;
7 
instance(bool erase)8 Builtins *Builtins::instance(bool erase)
9 {
10 	static Builtins *builtins = new Builtins;
11 	if (erase) {
12 		delete builtins;
13 		builtins = nullptr;
14 	}
15 	return builtins;
16 }
17 
init(const std::string & name,class AbstractModule * module)18 void Builtins::init(const std::string &name, class AbstractModule *module)
19 {
20 #ifndef ENABLE_EXPERIMENTAL
21 	if (module->is_experimental()) return;
22 #endif
23 	Builtins::instance()->modules.emplace(name, module);
24 }
25 
init(const std::string & name,class AbstractModule * module,const std::vector<std::string> & calltipList)26 void Builtins::init(const std::string &name, class AbstractModule *module, const std::vector<std::string> &calltipList)
27 {
28 #ifndef ENABLE_EXPERIMENTAL
29 	if (module->is_experimental()) return;
30 #endif
31 	Builtins::instance()->modules.emplace(name, module);
32 	Builtins::keywordList.insert({name, calltipList});
33 }
34 
init(const std::string & name,class AbstractFunction * function,const std::vector<std::string> & calltipList)35 void Builtins::init(const std::string &name, class AbstractFunction *function, const std::vector<std::string> &calltipList)
36 {
37 #ifndef ENABLE_EXPERIMENTAL
38 	if (function->is_experimental()) return;
39 #endif
40 	Builtins::instance()->functions.emplace(name, function);
41 	Builtins::keywordList.insert({name, calltipList});
42 }
43 
44 extern void register_builtin_functions();
45 extern void register_builtin_group();
46 extern void register_builtin_csgops();
47 extern void register_builtin_transform();
48 extern void register_builtin_color();
49 extern void register_builtin_primitives();
50 extern void register_builtin_surface();
51 extern void register_builtin_control();
52 extern void register_builtin_render();
53 extern void register_builtin_import();
54 extern void register_builtin_projection();
55 extern void register_builtin_cgaladv();
56 extern void register_builtin_offset();
57 extern void register_builtin_dxf_linear_extrude();
58 extern void register_builtin_dxf_rotate_extrude();
59 extern void register_builtin_text();
60 extern void initialize_builtin_dxf_dim();
61 
62 /*!
63 	Registers all builtin functions.
64 	Call once for the whole app.
65 */
initialize()66 void Builtins::initialize()
67 {
68 	Builtins::initKeywordList();
69 
70 	register_builtin_functions();
71 	initialize_builtin_dxf_dim();
72 
73 	register_builtin_group();
74 	register_builtin_csgops();
75 	register_builtin_transform();
76 	register_builtin_color();
77 	register_builtin_primitives();
78 	register_builtin_surface();
79 	register_builtin_control();
80 	register_builtin_render();
81 	register_builtin_import();
82 	register_builtin_projection();
83 	register_builtin_cgaladv();
84 	register_builtin_offset();
85 	register_builtin_dxf_linear_extrude();
86 	register_builtin_dxf_rotate_extrude();
87 	register_builtin_text();
88 
89 	this->deprecations.emplace("dxf_linear_extrude", "linear_extrude()");
90 	this->deprecations.emplace("dxf_rotate_extrude", "rotate_extrude()");
91 	this->deprecations.emplace("import_stl", "import()");
92 	this->deprecations.emplace("import_dxf", "import()");
93 	this->deprecations.emplace("import_off", "import()");
94 	this->deprecations.emplace("assign", "a regular assignment");
95 }
96 
isDeprecated(const std::string & name) const97 std::string Builtins::isDeprecated(const std::string &name) const
98 {
99 	if (this->deprecations.find(name) != this->deprecations.end()) {
100 		return this->deprecations.at(name);
101 	}
102 	return {};
103 }
104 
Builtins()105 Builtins::Builtins()
106 {
107 	this->assignments.emplace_back(new Assignment("$fn", make_shared<Literal>(0.0)) );
108 	this->assignments.emplace_back(new Assignment("$fs", make_shared<Literal>(2.0)) );
109 	this->assignments.emplace_back(new Assignment("$fa", make_shared<Literal>(12.0)) );
110 	this->assignments.emplace_back(new Assignment("$t", make_shared<Literal>(0.0)) );
111 	this->assignments.emplace_back(new Assignment("$preview", make_shared<Literal>(Value::undefined.clone())) ); //undef as should always be overwritten.
112 	this->assignments.emplace_back(new Assignment("$vpt", make_shared<Literal>(VectorType(0.0, 0.0, 0.0))) );
113 	this->assignments.emplace_back(new Assignment("$vpr", make_shared<Literal>(VectorType(0.0, 0.0, 0.0))) );
114 	this->assignments.emplace_back(new Assignment("$vpd", make_shared<Literal>(500)) );
115 	this->assignments.emplace_back(new Assignment("$vpf", make_shared<Literal>(22.5)) );
116 }
117 
initKeywordList()118 void Builtins::initKeywordList()
119 {
120 	Builtins::keywordList.insert({"else", {}});
121 	Builtins::keywordList.insert({"each", {}});
122 	Builtins::keywordList.insert({"module", {}});
123 	Builtins::keywordList.insert({"function", {}});
124 	Builtins::keywordList.insert({"true", {}});
125 	Builtins::keywordList.insert({"false", {}});
126 	Builtins::keywordList.insert({"undef", {}});
127 	Builtins::keywordList.insert({"use", {}});
128 	Builtins::keywordList.insert({"include", {}});
129 }
130