/* ui/modelview.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "auxiliary/functions.h" #include "ui/modelview.h" #include "ui/paint.h" #include "sys/sys.h" #include "render/camera.h" #include "render/draw.h" #include "render/render.h" namespace ui { ModelView::ModelView(Widget *parent, const char *modelname) : Widget(parent) { set_border(false); set_background(false); set_label("modelview"); set_modelname(modelname); modelview_zoom = 1.0f; } ModelView::~ModelView() {} void ModelView::print(const size_t indent) const { std::string marker(""); con_print << aux::pad_left(marker, indent*2) << label() << " \"" << modelname() << "\"" << std::endl; } void ModelView::set_modelname(const std::string & modelname) { modelview_modelname.assign(modelname); } void ModelView::set_modelname(const char *modelname) { if (modelname) modelview_modelname.assign(modelname); else modelview_modelname.clear(); } void ModelView::set_color(const math::Color & color) { modelview_color.assign(color); } void ModelView::set_zoom(const float zoom) { modelview_zoom = zoom; math::clamp(modelview_zoom, 1.0f, 10.0f); } bool ModelView::on_keypress(const int key, const unsigned int modifier) { if (key == 512 + SDL_BUTTON_WHEELUP) { modelview_zoom -= 0.1f; if (modelview_zoom < 1.0f) modelview_zoom = 1.0f; return true; } else if (key == 512 + SDL_BUTTON_WHEELDOWN) { modelview_zoom += 0.1f; if (modelview_zoom > 10.0f) modelview_zoom = 10.0f; return true; } return false; } void ModelView::draw() { if (!modelview_modelname.size()) { return; } paint::color(1.0f, 1.0f, 1.0f); model::Model *model = model::Model::find(modelview_modelname); if (!model) { paint::bitmap(global_location(), size(), "bitmap/notex"); return; } math ::Vector2f center(global_location() + size() * 0.5f); gl::clear(GL_DEPTH_BUFFER_BIT); // gl 3d mode render::Camera::frustum_default(model->radius() * modelview_zoom, center.x(), center.y()); gl::disable(GL_BLEND); gl::depthmask(GL_TRUE); // enable writing to the depth buffer gl::enable(GL_DEPTH_TEST); gl::enable(GL_CULL_FACE); // enable culling gl::enable(GL_COLOR_MATERIAL); // enable color tracking gl::enable(GL_LIGHTING); // enable vertex arrays glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); render::draw_model_fragments(model, core::localplayer()->color(), core::localplayer()->color_second(), true, true, 0); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); gl::disable(GL_LIGHTING); gl::disable(GL_COLOR_MATERIAL); // disable color tracking gl::disable(GL_CULL_FACE); // disable culling gl::depthmask(GL_TRUE); // enable depth buffer writing gl::disable(GL_DEPTH_TEST); // disable depth buffer testing gl::enable(GL_BLEND); // gl 2d mode render::Camera::ortho(); } void ModelView::draw_border() { paint::color(palette()->foreground()); paint::border(global_location(), size()); } }