static long prev_msec;
static ExhibitManager *exman;
-static BlobExhibit *blobs;
static bool show_blobs;
ExSelection exsel_active, exsel_hover;
}
*/
- blobs = new BlobExhibit;
- blobs->node = new SceneNode;
- blobs->init();
- blobs->node->set_position(Vec3(-680, 160, -100));
- blobs->node->set_scaling(Vec3(28, 28, 28));
- blobs->node->update(0);
-
- exman->add(blobs);
-
if(!(sdr_ltmap_notex = create_program_load("sdr/lightmap.v.glsl", "sdr/lightmap-notex.p.glsl"))) {
return false;
}
ExhibitManager::ExhibitManager()
{
+ own_scn = 0;
}
ExhibitManager::~ExhibitManager()
delete exslots[i];
}
exslots.clear();
+
+ delete own_scn; // this must be the last thing to destroy
}
void ExhibitManager::add(Exhibit *ex)
return false;
}
+ // create our own scene to manage all exhibits not already in an existing scene
+ // and add it to the metascene
+ if(!own_scn) {
+ own_scn = new Scene;
+ own_scn->name = "ad-hoc exhibits";
+ mscn->scenes.push_back(own_scn);
+ }
+
struct ts_node *iter = root->child_list;
while(iter) {
struct ts_node *node = iter;
iter = iter->next;
- if(strcmp(node->name, "item") == 0) {
- SceneNode *snode;
-
- const char *amatch = ts_get_attr_str(node, "match_node");
- if(!amatch || !(snode = mscn->match_node(amatch))) {
- error_log("ExhibitManager::load: regexp \"%s\" didn't match any nodes\n",
- amatch ? amatch : "");
- continue;
- }
+ SceneNode *snode = 0;
+ if(strcmp(node->name, "item") == 0) {
Exhibit *ex;
const char *atype = ts_get_attr_str(node, "type");
if(!atype || !(ex = create_exhibit(atype))) {
error_log("failed to create exhibit of type: %s\n", atype);
continue;
}
- ex->set_node(snode);
- items.push_back(ex);
-
const char *alabel = ts_get_attr_str(node, "label");
if(alabel) {
ex->set_name(alabel);
}
+ const char *amatch = ts_get_attr_str(node, "match_node");
+ if(amatch) {
+ if(!(snode = mscn->match_node(amatch))) {
+ error_log("ExhibitManager::load: regexp \"%s\" didn't match any nodes\n",
+ amatch ? amatch : "");
+ continue;
+ }
+ }
+
+ if(!snode) {
+ snode = new SceneNode;
+ snode->set_name(ex->get_name());
+ own_scn->add_node(snode);
+ }
+ ex->set_node(snode);
+
+ items.push_back(ex);
+
+ float *apos = ts_get_attr_vec(node, "pos");
+ if(apos) {
+ snode->set_position(Vec3(apos[0], apos[1], apos[2]));
+ }
+ float *arot_axis = ts_get_attr_vec(node, "rotaxis");
+ if(arot_axis) {
+ float arot_angle = ts_get_attr_num(node, "rotangle", 0.0f);
+ Vec3 axis = Vec3(arot_axis[0], arot_axis[1], arot_axis[2]);
+ Quat q;
+ q.set_rotation(axis, deg_to_rad(arot_angle));
+ snode->set_rotation(q);
+ }
+ struct ts_attr *ascale = ts_get_attr(node, "scale");
+ if(ascale) {
+ switch(ascale->val.type) {
+ case TS_NUMBER:
+ snode->set_scaling(Vec3(ascale->val.fnum, ascale->val.fnum, ascale->val.fnum));
+ break;
+ case TS_VECTOR:
+ snode->set_scaling(Vec3(ascale->val.vec[0], ascale->val.vec[1], ascale->val.vec[2]));
+ default:
+ break;
+ }
+ }
+
// create a new slot and attach the exhibit to it
ExhibitSlot *slot = new ExhibitSlot(ex);
exslots.push_back(slot);
int num = items.size();
for(int i=0; i<num; i++) {
// if the exhibit is not part of a scene graph, first call its
- // node's update function (otherwise it'll have been called recursively earlier)
- if(!items[i]->node->get_parent()) {
+ // node's update function (otherwise it would have been called recursively earlier)
+ if(items[i]->node && !items[i]->node->get_parent()) {
items[i]->node->update(dt);
}
items[i]->update(dt);
return new Exhibit;
} else if(strcmp(type, "blobs") == 0) {
debug_log("creating blobs exhibit\n");
- return new BlobExhibit;
+ BlobExhibit *b = new BlobExhibit;
+ if(!b->init()) {
+ delete b;
+ error_log("failed to initialize blobs exhibit\n");
+ return 0;
+ }
+ return b;
}
error_log("unknown exhibit type: %s\n", type);
return 0;