nuclear@2: #include nuclear@2: nuclear@2: #ifndef __APPLE__ nuclear@2: #include nuclear@2: #else nuclear@2: #include nuclear@2: #endif nuclear@2: nuclear@2: #include nuclear@2: #include nuclear@2: #include "gui.h" nuclear@2: #include "utktext.h" nuclear@2: #include "sdr.h" nuclear@2: nuclear@2: #define TEXT_PT_SIZE 18 nuclear@2: nuclear@2: void huecb(utk::Event *ev, void *cls); nuclear@2: static void cbfunc(utk::Event *ev, void *cls); nuclear@2: nuclear@2: void utk_color(int r, int g, int b, int a); nuclear@2: void utk_clip(int x1, int y1, int x2, int y2); nuclear@2: void utk_image(int x, int y, const void *pix, int xsz, int ysz); nuclear@2: nuclear@2: void utk_rect(int x1, int y1, int x2, int y2); nuclear@2: void utk_line(int x1, int y1, int x2, int y2, int width); nuclear@2: nuclear@2: void utk_text(int x, int y, const char *txt, int sz); nuclear@2: int utk_text_spacing(); nuclear@2: int utk_text_width(const char *txt, int sz); nuclear@2: nuclear@2: nuclear@2: int xsz, ysz; nuclear@2: static utk::Container *utkroot; nuclear@2: static float max_descent; nuclear@2: utk::Window *win_seed, *win_material; nuclear@2: nuclear@2: nuclear@2: extern unsigned int sdr; nuclear@2: extern Vector4 seed; nuclear@2: extern int iter; nuclear@2: extern float err_thres; nuclear@2: extern float reflectivity; nuclear@2: extern Vector3 color; nuclear@2: nuclear@2: int gui_init(int width, int height) nuclear@2: { nuclear@2: xsz = width; nuclear@2: ysz = height; nuclear@2: nuclear@2: if(!CreateFont("georgia.ttf", TEXT_PT_SIZE)) { nuclear@2: fprintf(stderr, "failed to load font\n"); nuclear@2: return -1; nuclear@2: } nuclear@2: max_descent = GetMaxDescent(); nuclear@2: nuclear@2: utk::gfx::color = utk_color; nuclear@2: utk::gfx::clip = utk_clip; nuclear@2: utk::gfx::image = utk_image; nuclear@2: utk::gfx::rect = utk_rect; nuclear@2: utk::gfx::line = utk_line; nuclear@2: utk::gfx::text = utk_text; nuclear@2: utk::gfx::text_spacing = utk_text_spacing; nuclear@2: utk::gfx::text_width = utk_text_width; nuclear@2: nuclear@2: utkroot = utk::init(xsz, ysz); nuclear@2: nuclear@2: win_seed = utk::create_window(utkroot, 5, 25, 220, 175, "julia parameters"); nuclear@2: win_seed->set_alpha(128); nuclear@2: win_seed->show(); nuclear@2: nuclear@2: utk::VBox *vbox = utk::create_vbox(win_seed); nuclear@2: utk::HBox *hbox; nuclear@2: nuclear@2: hbox = utk::create_hbox(vbox); nuclear@2: utk::create_label(hbox, "seed x"); nuclear@2: utk::create_slider(hbox, -1.0, 1.0, cbfunc, (void*)0)->set_value(seed.x); nuclear@2: hbox = utk::create_hbox(vbox); nuclear@2: utk::create_label(hbox, "seed y"); nuclear@2: utk::create_slider(hbox, -1.0, 1.0, cbfunc, (void*)1)->set_value(seed.y); nuclear@2: hbox = utk::create_hbox(vbox); nuclear@2: utk::create_label(hbox, "seed z"); nuclear@2: utk::create_slider(hbox, -1.0, 1.0, cbfunc, (void*)2)->set_value(seed.z); nuclear@2: hbox = utk::create_hbox(vbox); nuclear@2: utk::create_label(hbox, "seed w"); nuclear@2: utk::create_slider(hbox, -1.0, 1.0, cbfunc, (void*)3)->set_value(seed.w); nuclear@2: nuclear@2: hbox = utk::create_hbox(vbox); nuclear@2: utk::create_label(hbox, "iterations"); nuclear@2: utk::Slider *iter_slider = utk::create_slider(hbox, 0, 32, cbfunc, (void*)5); nuclear@2: iter_slider->set_value(iter); nuclear@2: iter_slider->set_vis_decimal(0); nuclear@2: nuclear@2: hbox = utk::create_hbox(vbox); nuclear@2: utk::create_label(hbox, "max error"); nuclear@2: utk::Slider *err_slider = utk::create_slider(hbox, 0, 0.075, cbfunc, (void*)6); nuclear@2: err_slider->set_value(err_thres); nuclear@2: err_slider->set_vis_decimal(4); nuclear@2: nuclear@2: win_material = utk::create_window(utkroot, 250, 25, 220, 210, "material"); nuclear@2: win_material->set_alpha(128); nuclear@2: win_material->show(); nuclear@2: ((utk::WinFrame*)win_material->get_parent())->set_shade(true); nuclear@2: nuclear@2: vbox = utk::create_vbox(win_material); nuclear@2: nuclear@2: utk::ColorBox *colbox = new utk::ColorBox; nuclear@2: vbox->add_child(colbox); nuclear@2: utk::HueBox *huebox = new utk::HueBox; nuclear@2: vbox->add_child(huebox); nuclear@2: huebox->set_callback(utk::EVENT_MODIFY, huecb, colbox); nuclear@2: nuclear@2: float hue, sat, val; nuclear@2: utk::rgb_to_hsv(color.x, color.y, color.z, &hue, &sat, &val); nuclear@2: colbox->set_color_hsv(hue, sat, val); nuclear@2: huebox->set_h(hue); nuclear@2: nuclear@2: hbox = utk::create_hbox(vbox); nuclear@2: utk::create_label(hbox, "reflectivity"); nuclear@2: utk::create_slider(hbox, 0, 1.0, cbfunc, (void*)4)->set_value(reflectivity); nuclear@2: nuclear@2: return 0; nuclear@2: } nuclear@2: nuclear@2: void gui_draw() nuclear@2: { nuclear@2: glMatrixMode(GL_MODELVIEW); nuclear@2: glPushMatrix(); nuclear@2: glLoadIdentity(); nuclear@2: glMatrixMode(GL_PROJECTION); nuclear@2: glPushMatrix(); nuclear@2: glLoadIdentity(); nuclear@2: nuclear@2: glPushAttrib(GL_ENABLE_BIT); nuclear@2: glDisable(GL_LIGHTING); nuclear@2: glDisable(GL_DEPTH_TEST); nuclear@2: glDisable(GL_CULL_FACE); nuclear@2: glEnable(GL_BLEND); nuclear@2: nuclear@2: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nuclear@2: nuclear@2: utk::draw(); nuclear@2: nuclear@2: glPopAttrib(); nuclear@2: nuclear@2: glMatrixMode(GL_PROJECTION); nuclear@2: glPopMatrix(); nuclear@2: glMatrixMode(GL_MODELVIEW); nuclear@2: glPopMatrix(); nuclear@2: } nuclear@2: nuclear@2: void gui_set_visible(bool vis) nuclear@2: { nuclear@2: if(vis) { nuclear@2: win_seed->show(); nuclear@2: win_material->show(); nuclear@2: } else { nuclear@2: win_seed->hide(); nuclear@2: win_material->hide(); nuclear@2: } nuclear@2: } nuclear@2: nuclear@2: void huecb(utk::Event *ev, void *cls) nuclear@2: { nuclear@2: utk::HueBox *huebox = (utk::HueBox*)ev->widget; nuclear@2: utk::ColorBox *colbox = (utk::ColorBox*)cls; nuclear@2: nuclear@2: colbox->set_h(huebox->get_h()); nuclear@2: } nuclear@2: nuclear@2: void cbfunc(utk::Event *ev, void *cls) nuclear@2: { nuclear@2: int id = (int)(intptr_t)cls; nuclear@2: nuclear@2: switch(id) { nuclear@2: case 0: nuclear@2: case 1: nuclear@2: case 2: nuclear@2: case 3: nuclear@2: { nuclear@2: utk::Slider *slider = (utk::Slider*)ev->widget; nuclear@2: nuclear@2: seed[id] = slider->get_value(); nuclear@2: set_uniform_float4(sdr, "seed", seed.x, seed.y, seed.z, seed.w); nuclear@2: glutPostRedisplay(); nuclear@2: } nuclear@2: break; nuclear@2: nuclear@2: case 4: nuclear@2: { nuclear@2: utk::Slider *slider = (utk::Slider*)ev->widget; nuclear@2: nuclear@2: reflectivity = slider->get_value(); nuclear@2: set_uniform_float(sdr, "reflectivity", reflectivity); nuclear@2: glutPostRedisplay(); nuclear@2: } nuclear@2: break; nuclear@2: nuclear@2: case 5: nuclear@2: { nuclear@2: utk::Slider *slider = (utk::Slider*)ev->widget; nuclear@2: nuclear@2: iter = (int)slider->get_value(); nuclear@2: set_uniform_int(sdr, "iter", iter); nuclear@2: glutPostRedisplay(); nuclear@2: } nuclear@2: break; nuclear@2: nuclear@2: case 6: nuclear@2: { nuclear@2: utk::Slider *slider = (utk::Slider*)ev->widget; nuclear@2: nuclear@2: err_thres = slider->get_value(); nuclear@2: set_uniform_float(sdr, "err_thres", err_thres); nuclear@2: glutPostRedisplay(); nuclear@2: } nuclear@2: break; nuclear@2: nuclear@2: default: nuclear@2: fprintf(stderr, "unhandled callback (id: %d)\n", id); nuclear@2: break; nuclear@2: } nuclear@2: } nuclear@2: nuclear@2: nuclear@2: #define CONVX(x) (2.0 * (float)(x) / (float)xsz - 1.0) nuclear@2: #define CONVY(y) (1.0 - 2.0 * (float)(y) / (float)ysz) nuclear@2: nuclear@2: void utk_color(int r, int g, int b, int a) nuclear@2: { nuclear@2: glColor4ub(r, g, b, a); nuclear@2: SetTextColor(Color(r / 255.0, g / 255.0, b / 255.0, a / 255.0)); nuclear@2: } nuclear@2: nuclear@2: void utk_clip(int x1, int y1, int x2, int y2) nuclear@2: { nuclear@2: if(x1 == x2 && y1 == y2 && x1 == y1 && x1 == 0) { nuclear@2: glDisable(GL_SCISSOR_TEST); nuclear@2: } else { nuclear@2: glEnable(GL_SCISSOR_TEST); nuclear@2: } nuclear@2: glScissor(x1, ysz - y2, x2 - x1, y2 - y1); nuclear@2: } nuclear@2: nuclear@2: void utk_image(int x, int y, const void *pix, int w, int h) nuclear@2: { nuclear@2: glPixelZoom(1, -1); nuclear@2: glRasterPos2f(CONVX(x), CONVY(y)); nuclear@2: glDrawPixels(w, h, GL_BGRA, GL_UNSIGNED_BYTE, pix); nuclear@2: } nuclear@2: nuclear@2: void utk_rect(int x1, int y1, int x2, int y2) nuclear@2: { nuclear@2: glRectf(CONVX(x1), CONVY(y1), CONVX(x2), CONVY(y2)); nuclear@2: } nuclear@2: nuclear@2: void utk_line(int x1, int y1, int x2, int y2, int width) nuclear@2: { nuclear@2: glPushAttrib(GL_LINE_BIT); nuclear@2: nuclear@2: glLineWidth((float)width); nuclear@2: glBegin(GL_LINES); nuclear@2: glVertex2f(CONVX(x1), CONVY(y1)); nuclear@2: glVertex2f(CONVX(x2), CONVY(y2)); nuclear@2: glEnd(); nuclear@2: nuclear@2: glPopAttrib(); nuclear@2: } nuclear@2: nuclear@2: void utk_text(int x, int y, const char *txt, int sz) nuclear@2: { nuclear@2: float fx = (float)x / (float)xsz; nuclear@2: float fy = (float)y / (float)ysz; nuclear@2: nuclear@2: SetTextPos(Vector2(fx, fy - max_descent)); nuclear@2: //SetTextPos(Vector2(0.25, 0.25)); nuclear@2: SetTextSize((float)sz / (float)TEXT_PT_SIZE); nuclear@2: PrintString(txt); nuclear@2: } nuclear@2: nuclear@2: int utk_text_spacing() nuclear@2: { nuclear@2: return (int)(GetLineAdvance() * (float)ysz); nuclear@2: } nuclear@2: nuclear@2: int utk_text_width(const char *txt, int sz) nuclear@2: { nuclear@2: float prev_sz = GetTextSize(); nuclear@2: SetTextSize((float)sz / (float)TEXT_PT_SIZE); nuclear@2: nuclear@2: int width = (int)(GetTextWidth(txt) * (float)xsz); nuclear@2: nuclear@2: SetTextSize(prev_sz); nuclear@2: return width; nuclear@2: } nuclear@2: