nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "scene.h" nuclear@0: #include "texture.h" nuclear@0: nuclear@0: bool load_scene_file(Scene *scn, const char *fname); nuclear@0: bool save_scene_file(const Scene *scn, const char *fname); nuclear@0: nuclear@0: nuclear@0: // default camera nuclear@0: TargetCamera Scene::def_cam(Vector3(0, 0, -10), Vector3(0, 0, 0)); nuclear@0: nuclear@0: Scene::Scene() nuclear@0: { nuclear@0: camera = &def_cam; nuclear@0: bgcolor = Color(0, 0, 0); nuclear@0: envmap = envmap_conv = 0; nuclear@0: fog_start = fog_end = -1; nuclear@0: } nuclear@0: nuclear@0: Scene::~Scene() nuclear@0: { nuclear@0: for(auto obj: objects) { nuclear@0: delete obj; nuclear@0: } nuclear@0: for(auto lt: lights) { nuclear@0: delete lt; nuclear@0: } nuclear@0: if(camera != &def_cam) { nuclear@0: delete camera; nuclear@0: } nuclear@0: nuclear@0: delete envmap; nuclear@0: if(envmap_conv != envmap) { nuclear@0: delete envmap_conv; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: bool Scene::load(const char *fname) nuclear@0: { nuclear@0: return load_scene_file(this, fname); nuclear@0: } nuclear@0: nuclear@0: bool Scene::save(const char *fname) const nuclear@0: { nuclear@0: return save_scene_file(this, fname); nuclear@0: } nuclear@0: nuclear@0: void Scene::set_background_color(const Color &color) nuclear@0: { nuclear@0: bgcolor = color; nuclear@0: } nuclear@0: nuclear@0: void Scene::set_fog(float fog_start, float fog_end) nuclear@0: { nuclear@0: this->fog_start = fog_start; nuclear@0: this->fog_end = fog_end; nuclear@0: } nuclear@0: nuclear@0: void Scene::get_fog(float *fog_start, float *fog_end) const nuclear@0: { nuclear@0: *fog_start = this->fog_start; nuclear@0: *fog_end = this->fog_end; nuclear@0: } nuclear@0: nuclear@0: void Scene::set_environment_map(TextureCube *map, TextureCube *map_conv) nuclear@0: { nuclear@0: envmap = map; nuclear@0: envmap_conv = map_conv;//map_conv ? map_conv : map; nuclear@0: } nuclear@0: nuclear@0: void Scene::add_object(Object *obj) nuclear@0: { nuclear@0: objects.push_back(obj); nuclear@0: } nuclear@0: nuclear@0: Object *Scene::get_object(int i) const nuclear@0: { nuclear@0: if(i < 0 || i >= (int)objects.size()) { nuclear@0: return 0; nuclear@0: } nuclear@0: return objects[i]; nuclear@0: } nuclear@0: nuclear@0: int Scene::get_object_count() const nuclear@0: { nuclear@0: return (int)objects.size(); nuclear@0: } nuclear@0: nuclear@0: void Scene::add_light(Light *lt) nuclear@0: { nuclear@0: lights.push_back(lt); nuclear@0: } nuclear@0: nuclear@0: Light *Scene::get_light(int i) const nuclear@0: { nuclear@0: if(i < 0 || i >= (int)lights.size()) { nuclear@0: return 0; nuclear@0: } nuclear@0: return lights[i]; nuclear@0: } nuclear@0: nuclear@0: int Scene::get_light_count() const nuclear@0: { nuclear@0: return (int)lights.size(); nuclear@0: } nuclear@0: nuclear@0: void Scene::set_camera(Camera *cam) nuclear@0: { nuclear@0: if(camera != &def_cam) { nuclear@0: delete camera; nuclear@0: } nuclear@0: camera = cam; nuclear@0: } nuclear@0: nuclear@0: Camera *Scene::get_camera() const nuclear@0: { nuclear@0: return camera; nuclear@0: } nuclear@0: nuclear@0: bool Scene::intersect(const Ray &ray, HitPoint *nearest_hit) const nuclear@0: { nuclear@0: nearest_hit->obj = 0; nuclear@0: nearest_hit->dist = FLT_MAX; nuclear@0: nuclear@0: // find the nearest hit (if any) nuclear@0: for(Object *obj: objects) { nuclear@0: HitPoint hit; nuclear@0: if(obj->intersect(ray, &hit) && hit.dist < nearest_hit->dist) { nuclear@0: *nearest_hit = hit; nuclear@0: } nuclear@0: } nuclear@0: return nearest_hit->obj != 0; nuclear@0: } nuclear@0: nuclear@0: Color Scene::env_color(const Ray &ray) const nuclear@0: { nuclear@0: if(envmap) { nuclear@0: Vector3 dir = ray.dir.normalized(); nuclear@0: return envmap->sample(dir.x, dir.y, dir.z); nuclear@0: } nuclear@0: return bgcolor; nuclear@0: } nuclear@0: nuclear@0: void Scene::prepare_xform(long msec) nuclear@0: { nuclear@0: int nobj = get_object_count(); nuclear@0: for(int i=0; iprepare_xform(msec); nuclear@0: } nuclear@0: }