# HG changeset patch # User John Tsiombikas # Date 1405640106 -10800 # Node ID 977bc1cb055b8ec7438f839570928f6923071f8a # Parent 9b5bb05ae53ada320e32fc522e9eeb07335cbb0d almost done diff -r 9b5bb05ae53a -r 977bc1cb055b data/device.mtl --- a/data/device.mtl Fri Jul 18 00:42:15 2014 +0300 +++ b/data/device.mtl Fri Jul 18 02:35:06 2014 +0300 @@ -1,6 +1,4 @@ -# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware -# File Created: 14.07.2014 08:46:21 - +# box material newmtl 01___Default Ns 50.0000 Ni 1.5000 @@ -16,6 +14,7 @@ map_Kd /Users/nuclear/code/equeue_dummy/data/labels.png map_refl /Users/nuclear/code/equeue_dummy/data/envmap.png +# ? newmtl 02___Default Ns 10.0000 Ni 1.5000 @@ -28,6 +27,7 @@ Ks 0.0000 0.0000 0.0000 Ke 0.0000 0.0000 0.0000 +# LED material newmtl 03___Default Ns 24.0000 Ni 1.5000 @@ -35,11 +35,12 @@ Tr 0.0000 Tf 1.0000 1.0000 1.0000 illum 2 - Ka 1.0000 0.0000 0.0000 - Kd 1.0000 0.0000 0.0000 + Ka 0.2000 0.0100 0.0100 + Kd 0.2000 0.0100 0.0100 Ks 0.6030 0.6030 0.6030 - Ke 0.0000 0.0000 0.0000 + Ke 1.0000 0.1 0.05 +# 7seg material newmtl 08___Default Ns 10.0000 Ni 1.5000 @@ -50,6 +51,6 @@ Ka 0.5882 0.5882 0.5882 Kd 0.5882 0.5882 0.5882 Ks 0.0000 0.0000 0.0000 - Ke 0.0000 0.0000 0.0000 + Ke 1.0000 1.0000 1.0000 map_Ka /Users/nuclear/code/equeue_dummy/data/7seg.png map_Kd /Users/nuclear/code/equeue_dummy/data/7seg.png diff -r 9b5bb05ae53a -r 977bc1cb055b data/device.obj --- a/data/device.obj Fri Jul 18 00:42:15 2014 +0300 +++ b/data/device.obj Fri Jul 18 02:35:06 2014 +0300 @@ -2179,14 +2179,14 @@ vn -1.0000 0.0000 -0.0000 # 6 vertex normals -vt 0.4546 0.9995 0.9995 -vt 0.4546 0.0005 0.9995 -vt 0.5454 0.0005 0.9995 -vt 0.5454 0.9995 0.9995 -vt 0.5454 0.0005 0.0005 -vt 0.4546 0.0005 0.0005 -vt 0.4546 0.9995 0.0005 -vt 0.5454 0.9995 0.0005 +vt 0.0000 0.9995 0.9995 +vt 0.0000 0.0005 0.9995 +vt 0.0908 0.0005 0.9995 +vt 0.0908 0.9995 0.9995 +vt 0.0908 0.0005 0.0005 +vt 0.0000 0.0005 0.0005 +vt 0.0000 0.9995 0.0005 +vt 0.0908 0.9995 0.0005 # 8 texture coords g 7seg1 @@ -2227,14 +2227,14 @@ vn -1.0000 0.0000 -0.0000 # 6 vertex normals -vt 0.4546 0.9995 0.9995 -vt 0.4546 0.0005 0.9995 -vt 0.5454 0.0005 0.9995 -vt 0.5454 0.9995 0.9995 -vt 0.5454 0.0005 0.0005 -vt 0.4546 0.0005 0.0005 -vt 0.4546 0.9995 0.0005 -vt 0.5454 0.9995 0.0005 +vt 0.0000 0.9995 0.9995 +vt 0.0000 0.0005 0.9995 +vt 0.0908 0.0005 0.9995 +vt 0.0908 0.9995 0.9995 +vt 0.0908 0.0005 0.0005 +vt 0.0000 0.0005 0.0005 +vt 0.0000 0.9995 0.0005 +vt 0.0908 0.9995 0.0005 # 8 texture coords g 7seg0 diff -r 9b5bb05ae53a -r 977bc1cb055b data/envmap.png Binary file data/envmap.png has changed diff -r 9b5bb05ae53a -r 977bc1cb055b src/dev.cc --- a/src/dev.cc Fri Jul 18 00:42:15 2014 +0300 +++ b/src/dev.cc Fri Jul 18 02:35:06 2014 +0300 @@ -119,6 +119,22 @@ } } +#define TICKET_SHOW_DUR 1000 + +int get_display_number() +{ + if(get_msec() - last_ticket_msec < TICKET_SHOW_DUR) { + return ticket; + } + return customer; +} + +int get_led_state(int led) +{ + int ledon = get_msec() - last_ticket_msec < TICKET_SHOW_DUR ? 0 : 1; + return led == ledon ? 1 : 0; +} + #define VERSTR \ "Queue system emulator v0.1 by John Tsiombikas " diff -r 9b5bb05ae53a -r 977bc1cb055b src/main.cc --- a/src/main.cc Fri Jul 18 00:42:15 2014 +0300 +++ b/src/main.cc Fri Jul 18 02:35:06 2014 +0300 @@ -42,8 +42,11 @@ static Scene *scn; enum { BN_TICKET, BN_NEXT, NUM_BUTTONS }; -const char *button_names[] = { "button1", "button2" }; +static const char *button_names[] = { "button1", "button2" }; static Object *button_obj[NUM_BUTTONS]; +static Object *disp_obj[2]; +static Object *led_obj[2]; +static Vector3 led_on_emissive; int main(int argc, char **argv) { @@ -121,6 +124,25 @@ bs.set_radius(bs.get_radius() * 1.5); } + disp_obj[0] = scn->get_object("7seg0"); + disp_obj[1] = scn->get_object("7seg1"); + if(!disp_obj[0] || !disp_obj[1]) { + fprintf(stderr, "invalid 3D model\n"); + return false; + } + scn->remove_object(disp_obj[0]); + scn->remove_object(disp_obj[1]); + + led_obj[0] = scn->get_object("led1"); + led_obj[1] = scn->get_object("led2"); + if(!led_obj[0] || !led_obj[1]) { + fprintf(stderr, "invalid 3D model\n"); + return false; + } + scn->remove_object(led_obj[0]); + scn->remove_object(led_obj[1]); + led_on_emissive = led_obj[0]->mtl.emissive; + glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); @@ -145,6 +167,8 @@ XCloseDisplay(dpy); } +#define DIGIT_USZ (1.0 / 11.0) + static void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -160,6 +184,28 @@ scn->render(); + // shift the textures and modify the materials to make the display match our state + for(int i=0; i<2; i++) { + int digit = get_display_number(); + for(int j=0; jmtl.tex_offset[TEX_DIFFUSE] = Vector2(uoffs, 0); + disp_obj[i]->render(); + + // LEDs + if(get_led_state(i)) { + led_obj[i]->mtl.emissive = led_on_emissive; + } else { + led_obj[i]->mtl.emissive = Vector3(0, 0, 0); + } + led_obj[i]->render(); + } + glXSwapBuffers(dpy, win); assert(glGetError() == GL_NO_ERROR); } @@ -240,13 +286,18 @@ cam_phi += dy * 0.5; if(cam_phi < -90) cam_phi = -90; if(cam_phi > 90) cam_phi = 90; - draw_pending = true; - } - if(bnstate[2]) { + + } else if(bnstate[2]) { cam_dist += dy * 0.5; if(cam_dist < 0.0) cam_dist = 0.0; - draw_pending = true; + + } else { + float xoffs = 2.0 * x / win_width - 1.0; + float yoffs = 2.0 * y / win_height - 1.0; + cam_theta = -xoffs * 15.0 * (win_width / win_height); + cam_phi = -yoffs * 15.0; } + draw_pending = true; } static Ray calc_pick_ray(int x, int y) @@ -317,7 +368,7 @@ unsigned int evmask = StructureNotifyMask | VisibilityChangeMask | ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | PointerMotionMask; + PointerMotionMask; XSelectInput(dpy, win, evmask); xa_wm_prot = XInternAtom(dpy, "WM_PROTOCOLS", False); @@ -357,7 +408,7 @@ case Expose: if(win_mapped && ev.xexpose.count == 0) { - draw_pending = 1; + draw_pending = true; } break; diff -r 9b5bb05ae53a -r 977bc1cb055b src/material.cc --- a/src/material.cc Fri Jul 18 00:42:15 2014 +0300 +++ b/src/material.cc Fri Jul 18 02:35:06 2014 +0300 @@ -20,20 +20,23 @@ void Material::setup() const { + float amb[] = {ambient.x, ambient.y, ambient.z, 1.0}; + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, amb); + float col[] = {diffuse.x, diffuse.y, diffuse.z, alpha}; - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col); float spec[] = {specular.x, specular.y, specular.z, 1.0}; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess > 128 ? 128 : shininess); - if(sdr) { - glUseProgram(sdr); - } + float emit[] = {emissive.x, emissive.y, emissive.z, 1.0}; + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emit); + int num_tex = 0; if(tex[TEX_DIFFUSE]) { - glActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0 + num_tex++); glMatrixMode(GL_TEXTURE); glLoadIdentity(); @@ -43,13 +46,14 @@ glBindTexture(GL_TEXTURE_2D, tex[TEX_DIFFUSE]); glEnable(GL_TEXTURE_2D); - int loc = glGetUniformLocation(sdr, "tex_diffuse"); - if(loc != -1) { - glUniform1i(loc, 0); - } + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } + if(tex[TEX_ENVMAP]) { - glActiveTexture(GL_TEXTURE1); + glActiveTexture(GL_TEXTURE0 + num_tex++); glMatrixMode(GL_TEXTURE); glLoadIdentity(); @@ -64,10 +68,13 @@ glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); - int loc = glGetUniformLocation(sdr, "tex_envmap"); - if(loc != -1) { - glUniform1i(loc, 1); - } + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD); + } + + + for(int i=num_tex; i<4; i++) { + glActiveTexture(GL_TEXTURE0 + i); + glDisable(GL_TEXTURE_2D); } glActiveTexture(GL_TEXTURE0); @@ -98,62 +105,6 @@ return tex; } -static char *read_shader(const char *fname) -{ - FILE *fp = fopen(fname, "r"); - if(!fp) { - return 0; - } - fseek(fp, 0, SEEK_END); - long len = ftell(); - rewind(fp); - - char *buf = new char[len + 1]; - fread(buf, len, fp); - buf[len] = 0; - fclose(fp); - - return buf; -} - -unsigned int load_shader_program(const char *vname, const char *pname) -{ - unsigned int vsdr = 0, psdr = 0; - - if(vname) { - char *src = read_shader(find_path(vname)); - if(!src) { - fprintf(stderr, "failed to load vertex shader: %s\n", vname); - return 0; - } - vsdr = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vsdr, 1, &src, 0); - delete [] src; - - int res; - glGetShaderiv(vsdr, GL_INFO_LOG_LENGTH, &res); - if(res > 0) {URE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); - img_free_pixels(pixels); - return tex; -} - -static char *read_shader(const char *fname) -{ - FILE *fp = fopen(find_path(vname), "r"); - if(!fp) { - fprintf(stderr, "failed to load shader: %s\n", vname); - return 0; - char *info = new char[res]; - glGetShaderInfoLog(vsdr, res, &res, info); - printf("shader compiler log: %s\n", info); - } - glGetShaderiv(vsdr, GL_COMPILE_STATUS, &res); - if(!res) { - return 0; - } - } -} - static const char *find_path(const char *fname) { const char *ptr = fname + strlen(fname) - 1; diff -r 9b5bb05ae53a -r 977bc1cb055b src/material.h --- a/src/material.h Fri Jul 18 00:42:15 2014 +0300 +++ b/src/material.h Fri Jul 18 02:35:06 2014 +0300 @@ -12,6 +12,7 @@ class Material { public: + Vector3 emissive; Vector3 ambient; Vector3 diffuse; Vector3 specular; diff -r 9b5bb05ae53a -r 977bc1cb055b src/objfile.cc --- a/src/objfile.cc Fri Jul 18 00:42:15 2014 +0300 +++ b/src/objfile.cc Fri Jul 18 02:35:06 2014 +0300 @@ -22,6 +22,7 @@ CMD(MTLLIB), \ CMD(USEMTL), \ CMD(NEWMTL), \ + CMD(KE), \ CMD(KA), \ CMD(KD), \ CMD(KS), \ @@ -30,6 +31,8 @@ CMD(D), \ CMD(TR), \ CMD(MAP_KD), \ + CMD(MAP_REFL), \ + CMD(MAP_BUMP), \ CMD(MAP_KS), \ CMD(MAP_NS), \ CMD(MAP_D), \ @@ -68,6 +71,7 @@ struct ObjMat { string name; // newmtl Color ambient, diffuse, specular; // Ka, Kd, Ks + Color emissive; // Ke float shininess; // Ns float ior; // Ni float alpha; // d, Tr @@ -207,6 +211,7 @@ mat.diffuse = vmtl[i].diffuse; mat.specular = vmtl[i].specular; mat.shininess = vmtl[i].shininess; + mat.emissive = vmtl[i].emissive; mat.alpha = vmtl[i].alpha; if(vmtl[i].tex_dif.length()) { @@ -383,6 +388,10 @@ } break; + case CMD_KE: + parse_color(&mat.emissive); + break; + case CMD_KA: parse_color(&mat.ambient); break; @@ -421,6 +430,10 @@ mat.tex_dif = parse_map(); break; + case CMD_MAP_REFL: + mat.tex_refl = parse_map(); + break; + default: break; } diff -r 9b5bb05ae53a -r 977bc1cb055b src/scene.cc --- a/src/scene.cc Fri Jul 18 00:42:15 2014 +0300 +++ b/src/scene.cc Fri Jul 18 02:35:06 2014 +0300 @@ -61,6 +61,17 @@ return 0; } +bool Scene::remove_object(Object *obj) +{ + for(size_t i=0; i