Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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);
    }
}