int main(int argc, char **argv) { assert(argc == 2 || argc == 3); char *path = argv[1]; s3d_gl_init(w, h, "Sokoban 3D Model Viewer"); glfwSetKeyCallback(s3d_gl_wnd, key_callback); s3d_model_load(&model, path); assert(model.idxtab.num_rows > 0); if(argc == 3) { errno = 0; char *endptr = 0; i_idxtab_row = strtol(argv[2], &endptr, 10) - 1; assert(!errno && s3d_strempty(endptr)); if(i_idxtab_row < 0 || i_idxtab_row >= model.idxtab.num_rows) { fprintf( stderr, "Index row %d doesn't exist in %s.\n", i_idxtab_row + 1, path ); i_idxtab_row = 0; } mode = 'S'; } printf("Index table row count: %d.\n", model.idxtab.num_rows); print_mode(); unsigned p_id = s3d_glsl_load_program( "glsl/xyz_uv.xyz.glsl", "glsl/uv_tex.frag.glsl" ); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); unsigned mvp_id = glGetUniformLocation(p_id, "mvp"); s3d_identity(model_mat); s3d_vec3 y_axis = { 0, 1, 0 }; s3d_normalize(y_axis); s3d_model_idxtab_row *idxrow; { s3d_color_quad_prepare(); static s3d_vec4 bg_gradient[4] = { s3d_gl_u8_rgb(0x0f, 0x38, 0x7f), 1, s3d_gl_u8_rgb(0x0f, 0x30, 0x70), 1, s3d_gl_u8_rgb(0x40, 0xc0, 0xdf), 1, s3d_gl_u8_rgb(0x40, 0xc0, 0xdf), 1 }; s3d_color_quad_set(s3d_geom_full_screen_quad, bg_gradient); } while(!s3d_gl_should_close()) { assert_gl_ok(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDepthMask(0); s3d_color_quad_prepare(); s3d_color_quad_draw(); glDepthMask(1); glUseProgram(p_id); s3d_model_bind_va(&model); s3d_model_bind_tex(&model); glfwGetWindowSize(s3d_gl_wnd, &w, &h); s3d_perspective(mvp, s3d_radians(45), (float)(w) / h, 0.1, 100); s3d_identity(view_mat); s3d_translate(view_mat, view_translation); s3d_mat_mul(mvp, view_mat); s3d_mat_mul(mvp, model_mat); s3d_axis_rot(model_mat, s3d_radians(1), y_axis); glUniformMatrix4fv(mvp_id, 1, 0, (float *)(mvp)); switch(mode) { case 'A': for(int i = 0; i < model.idxtab.num_rows; ++i) { idxrow = &model.idxtab.rows[i]; glDrawElements( GL_TRIANGLES, idxrow->num_idx, GL_UNSIGNED_INT, idxrow->idx_ptr ); } break; case 'S': idxrow = &model.idxtab.rows[i_idxtab_row]; glDrawElements( GL_TRIANGLES, idxrow->num_idx, GL_UNSIGNED_INT, idxrow->idx_ptr ); break; } s3d_gl_swap(); glfwPollEvents(); s3d_fsleep(0.001); } return 0; }
int main(int argc, char **argv) { s3d_vec2_assign(wnd_sz, 1280, 720); s3d_gl_init(wnd_sz[0], wnd_sz[1], "Sokoban 3D Prototype 1"); glfwSetKeyCallback(s3d_gl_wnd, s3d_pad_callback); { cam.fov = s3d_radians(45); s3d_vec3_assign( cam.rot, s3d_radians(45), s3d_radians(-35), 0 ); s3d_vec3_assign(cam.pos, 0, 2, -25); } { main_prog.id = s3d_glsl_load_program( "glsl/xyz_uv.xyz.glsl", "glsl/uv_tex.frag.glsl" ); main_prog.uni.mvp_id = glGetUniformLocation( main_prog.id, "mvp" ); } { const char *stg_path = ( (argc >= 2)? argv[1] : "data/stg/proto_2" ); s3d_stg_load_spec(stg_path); s3d_stg_load_models(stg_path); s3d_stg_init(); } while(!s3d_gl_should_close()) { assert_gl_ok(); if(s3d_stg.num_slotted_blocks == s3d_stg.num_blocks) { break; } if(s3d_pad_btn_st(DL, hit)) { s3d_stg_play(-1, 0); } else if(s3d_pad_btn_st(DU, hit)) { s3d_stg_play(0, -1); } else if(s3d_pad_btn_st(DR, hit)) { s3d_stg_play(1, 0); } else if(s3d_pad_btn_st(DD, hit)) { s3d_stg_play(0, 1); } s3d_stg_update(); s3d_pad_update(); glfwGetWindowSize(s3d_gl_wnd, &wnd_sz[0], &wnd_sz[1]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); { glDepthMask(1); glEnable(GL_DEPTH_TEST); glUseProgram(main_prog.id); { s3d_perspective( cam.mat, cam.fov, s3d_ratio(wnd_sz), 0.1, 100 ); s3d_translate(cam.mat, cam.pos); s3d_euler_rot(cam.mat, cam.rot); } static s3d_mat4 mvp; #define upload_mvp() \ glUniformMatrix4fv( \ main_prog.uni.mvp_id, 1, 0, (float *)(mvp) \ ) { { s3d_mat_copy(mvp, cam.mat); s3d_mat_mul(mvp, s3d_stg.mat); upload_mvp(); } { s3d_model_bind_va(&s3d_stg.model); s3d_model_bind_tex(&s3d_stg.model); s3d_model_draw(&s3d_stg.model, 0); } } { { s3d_mat_copy(mvp, cam.mat); s3d_mat_mul(mvp, s3d_stg.player.mat); upload_mvp(); } { s3d_model_bind_va(&s3d_stg.player_model); s3d_model_bind_tex(&s3d_stg.player_model); s3d_model_draw(&s3d_stg.player_model, 0); } } for(int i = 0; i < s3d_stg.num_walls; ++i) { s3d_stg_wall *w = &s3d_stg.walls[i]; { s3d_mat_copy(mvp, cam.mat); s3d_mat_mul(mvp, w->mat); upload_mvp(); } { s3d_model_bind_va(&s3d_stg.wall_model); s3d_model_bind_tex(&s3d_stg.wall_model); s3d_model_draw(&s3d_stg.wall_model, 0); } } for(int i = 0; i < s3d_stg.num_blocks; ++i) { s3d_stg_block *b = &s3d_stg.blocks[i]; { s3d_mat_copy(mvp, cam.mat); s3d_mat_mul(mvp, b->mat); upload_mvp(); } { s3d_model_bind_va(&s3d_stg.block_model); s3d_model_bind_tex(&s3d_stg.block_model); s3d_model_draw(&s3d_stg.block_model, 0); } } for(int i = 0; i < s3d_stg.num_slots; ++i) { s3d_stg_slot *s = &s3d_stg.slots[i]; { s3d_mat_copy(mvp, cam.mat); s3d_mat_mul(mvp, s->mat); upload_mvp(); } { s3d_model_bind_va(&s3d_stg.slot_model); s3d_model_bind_tex(&s3d_stg.slot_model); s3d_model_draw(&s3d_stg.slot_model, 0); } } #undef upload_mvp } s3d_gl_swap(); glfwPollEvents(); s3d_fsleep(0.001); } return 0; }
int main(int a, char **v) { p("Hi"); if (s3d_init(&a,&v,"test")) { printf("opsie\n"); s3d_usage(); } else { FILE * f = fopen("lastpos", "r"); if (f) { fread(&pos, 1, 4, f); fclose(f); } float mw=0.1; sw=s/2.0; px=-13*sw; py=13*s; #ifdef hfgm if (s3d_select_font("Courier new")) { printf("font not found\n"); } else { if ((txt=malloc(128*4))) { int i; float w; char buf[2]; buf[1]=0; for (i=0; (i<128); i++) { buf[0]=i; txt[i]=s3d_draw_string(buf,&w); if (txt[i]) { if (w>mw)mw=w; s3d_scale(txt[i], 5); } } px=-mw*5/2; for (i=0; (i<128); i++) s3d_translate(txt[i],px,py-4,0.00001); } } #endif sw=mw/26*5;//s/2.0; float red[12]= {1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1 }; float black[12]= {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }; float teal[12]= {0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1 }; float orange[12]= {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1 }; oo=s3d_new_object(); s3d_translate(oo, px,py,0); s3d_push_materials_a(oo,red, 1); s3d_push_materials_a(oo,teal,1); s3d_push_materials_a(oo,orange,1); s3d_flags_on(oo, S3D_OF_VISIBLE); aoo=s3d_new_object(); s3d_translate(aoo, px, py,0); s3d_push_materials_a(aoo,red, 1); s3d_flags_on(aoo, S3D_OF_VISIBLE); showpos(); loadl2("l2"); if (!l2)return 1; disp(); int b,c; for (b=0; b<26; b++) { black[0]=black[4]=black[8]=b/(float)26; for (c=0; c<26; c++) { black[1]=black[5]=black[9]=(float)c/26; int ob=s3d_new_object(); o[b][c]=ob; s3d_translate(ob, px+sw*b, py-s*c,0); s3d_push_materials_a(ob,black, 1); float vs2[12]={0,0,0,sw,0,0,sw,s,0,0,s,0}; s3d_push_vertices(ob, vs2, 4); if (0) { s3d_push_materials_a(ob,red, 1); float vs[12]={0,0,griddist,sw,0,griddist,sw,s,griddist,0,s,griddist}; s3d_push_vertices(ob, vs, 4); int ls[12]={0,1,1,1,2,1,2,3,1,3,0,1}; s3d_push_lines(ob,ls,4); int ps[8]={4,6,5,0,4,7,6,0}; s3d_push_polygons(ob, ps, 2); } else { int ps[8]={0,2,1,0,0,3,2,0}; s3d_push_polygons(ob, ps, 2); } s3d_flags_on(o[b][c], S3D_OF_VISIBLE|S3D_OF_SELECTABLE); } } space=s3d_new_object(); s3d_translate(space, px, py-s*27,0); s3d_push_materials_a(space,black, 1); float svs2[12]={0,0,0,sw*26,0,0,sw*26,s,0,0,s,0}; s3d_push_vertices(space, svs2, 4); int sps[8]={0,2,1,0,0,3,2,0}; s3d_push_polygons(space, sps, 2); s3d_flags_on(space, S3D_OF_VISIBLE|S3D_OF_SELECTABLE); s3d_set_callback(S3D_EVENT_OBJ_CLICK, click); s3d_set_callback(S3D_EVENT_QUIT, stop_quit); s3d_set_callback(S3D_EVENT_KEY, keypress); s3d_mainloop(mainloop); } }