+
+ Effect *effect = instantiate_effect(chain, blueprint->effect_type);
+
+ // Set the parameters that were deferred earlier.
+ for (const auto &kv : blueprint->int_parameters) {
+ if (!effect->set_int(kv.first, kv.second)) {
+ luaL_error(L, "Effect refused set_int(\"%s\", %d) (invalid key?)", kv.first.c_str(), kv.second);
+ }
+ }
+ for (const auto &kv : blueprint->float_parameters) {
+ if (!effect->set_float(kv.first, kv.second)) {
+ luaL_error(L, "Effect refused set_float(\"%s\", %f) (invalid key?)", kv.first.c_str(), kv.second);
+ }
+ }
+ for (const auto &kv : blueprint->vec3_parameters) {
+ if (!effect->set_vec3(kv.first, kv.second.data())) {
+ luaL_error(L, "Effect refused set_vec3(\"%s\", %f, %f, %f) (invalid key?)", kv.first.c_str(),
+ kv.second[0], kv.second[1], kv.second[2]);
+ }
+ }
+ for (const auto &kv : blueprint->vec4_parameters) {
+ if (!effect->set_vec4(kv.first, kv.second.data())) {
+ luaL_error(L, "Effect refused set_vec4(\"%s\", %f, %f, %f, %f) (invalid key?)", kv.first.c_str(),
+ kv.second[0], kv.second[1], kv.second[2], kv.second[3]);
+ }
+ }
+ blueprint->effect = effect;
+ return effect;