+#include <float.h>
#include <algorithm>
#include "exman.h"
#include "exhibit.h"
continue;
}
+ const char *desc = ts_get_attr_str(node, "description");
+ const char *voice = ts_get_attr_str(node, "voiceover");
+ if(desc || voice) {
+ ExData exd;
+
+ if(desc) {
+ exd.text = std::string(desc);
+ }
+ if(voice) {
+ exd.voice = new OggVorbisStream;
+ if(!exd.voice->open(voice)) {
+ error_log("failed to open voiceover: %s\n", voice);
+ delete exd.voice;
+ exd.voice = 0;
+ }
+ }
+ ex->data.push_back(exd);
+ }
+
ex->set_node(snode);
items.push_back(ex);
}
ExSelection ExhibitManager::select(const Ray &ray) const
{
- ExSelection sel;
- if(!items.empty()) {
- sel.ex = items[0];
- sel.selray = ray;
- sel.validmask = EXSEL_RAY;
+ ExSelection nearest;
+ nearest.dist = FLT_MAX;
+
+ int nitems = items.size();
+ for(int i=0; i<nitems; i++) {
+ ExSelection sel = items[i]->select(ray);
+ if(sel && sel.dist < nearest.dist) {
+ nearest = sel;
+ }
}
- return sel; // TODO
+
+ return nearest;
}
ExSelection ExhibitManager::select(const Sphere &sph) const