Esempio n. 1
0
//------------------------------------------------------------------------------------------------
// zacatek 3d kresleni
//------------------------------------------------------------------------------------------------
void ddx2StartRender2D(void)
{
  set_matrix_2d(SCREEN_XRES, SCREEN_YRES);
  glColor4f(1, 1, 1, 1);
  glDisable(GL_BLEND);
  glDisable(GL_DEPTH_TEST);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_LEQUAL, 0);
  specular_off();
  specular_color(0, 0, 0);
}
void HORN_SCHUNCK_WARP
(
                        /*****************************************************/
float **f1_orig,        /* in     : 1st image (original resolution)          */
float **f2_orig,        /* in     : 2nd image (original resolution)          */
int   nx_orig,          /* in     : size in x-direction (original resolution)*/
int   ny_orig,          /* in     : size in y-direction (original resoluiton)*/
float **f1_res,         /* in+out : 1st image, resampled                     */
float **f2_res,         /* in+out : 2nd image, resampled                     */
float **f2_res_warp,    /* in+out : 2nd image, resampled  and warped         */
float **du,             /* in+out : x-component of flow increment            */
float **dv,             /* in+out : y-component of flow increment            */
float **u,              /* in+out : x-component of flow field                */
float **v,              /* in+out : y-component of flow field                */
float **tmp,            /* in+out : temporary aray for resampling            */
int   nx_fine,          /* in     : size in x-direction (current resolution) */
int   ny_fine,          /* in     : size in y-direction (current resolution) */
int   bx,               /* in     : boundary size in x-direction             */
int   by,               /* in     : boundary size in y-direction             */
float hx_fine,          /* in     : spacing in x-direction (current resol.)  */
float hy_fine,          /* in     : spacing in y-direction (current resol.)  */
float m_alpha,          /* in     : smoothness weight                        */
float epsilon_d,         /* in     : diffusivity param data term              */
float epsilon_s,
float w_bright_grad,
int   num_iter_inner,   /* in     : inner solver iterations                  */
int   num_iter_outer,   /* in     : outer nonlin update iterations           */
float n_omega,          /* in     : SOR overrelaxation parameter             */
float n_warp_eta,       /* in     : warping reduction factor between levels  */
int   max_rec_depth,    /* in     : maximum recursion depth                  */
int   rec_depth         /* in     : current recursion depth                  */

                        /*****************************************************/
)

/* implements warping for the Horn and Schunck method */

{

                             /************************************************/
int   nx_coarse,ny_coarse;   /* dimensions on previous coarser grid          */
float hx_coarse,hy_coarse;   /* grid sizes on previous coarser grid          */
                             /************************************************/
  

/* compute dimensions and grid sizes for previous coarser grid */	
nx_coarse=(int)ceil(nx_orig*pow(n_warp_eta,rec_depth+1));
ny_coarse=(int)ceil(ny_orig*pow(n_warp_eta,rec_depth+1));
hx_coarse=(float)nx_orig/(float)nx_coarse;
hy_coarse=(float)ny_orig/(float)ny_coarse;


/* start at coarsest level by recursively calling the routine */
if (rec_depth<max_rec_depth)
{
HORN_SCHUNCK_WARP(f1_orig, f2_orig, nx_orig, ny_orig,
		  f1_res, f2_res, f2_res_warp,
		  du, dv, u, v, tmp,
		  nx_coarse, ny_coarse, bx, by, hx_coarse, hy_coarse,	       
		  m_alpha, epsilon_d,epsilon_s, w_bright_grad,
		  num_iter_inner,num_iter_outer, n_omega, n_warp_eta, 
		  max_rec_depth,rec_depth+1);
}



/* ---- resample images ---------------------------------------------------- */

/* restrict original image pair to resolution of current level */ 
resample_2d(f1_orig,nx_orig,ny_orig,bx,by,f1_res,nx_fine,ny_fine,tmp);
resample_2d(f2_orig,nx_orig,ny_orig,bx,by,f2_res,nx_fine,ny_fine,tmp);


/* ---- get overall flow field from previous resolution level -------------- */

/* if on coarsest resolution */
if(rec_depth==max_rec_depth)
 {            
     /* set flow field zero */
     set_matrix_2d(u,nx_fine+2*bx,ny_fine+2*by,0,0,(float)0.0);
     set_matrix_2d(v,nx_fine+2*bx,ny_fine+2*by,0,0,(float)0.0); 
 }
 /* if not on coarsest resolution */
 else
 {
     /* interpolate solution from previous coarser level */    
     resample_2d(u,nx_coarse,ny_coarse,bx,by,u,nx_fine,ny_fine,tmp);
     resample_2d(v,nx_coarse,ny_coarse,bx,by,v,nx_fine,ny_fine,tmp);     
 }

/* ---- set up difference problem at current resolution -------------------- */
                
/* warp second image by overall flow field from previous coarser resolution */
backward_registration(f1_res,f2_res,f2_res_warp,u,v,
		              nx_fine,ny_fine,bx,by,hx_fine,hy_fine);



/* ---- solve difference problem at current resolution --------------------- */
     
/* solve difference problem at current resolution to obtain increment */
HORN_SCHUNCK_WARP_LEVEL(f1_res, f2_res_warp, du, dv, u, v,
                        nx_fine, ny_fine, bx, by, hx_fine, hy_fine,
                        m_alpha, epsilon_d, epsilon_s, w_bright_grad,
                        num_iter_inner, num_iter_outer, n_omega);

/* ---- compute overall flow field at current resolution ------------------- */
  
/* sum up flow increment */
add_matrix_2d(u,du,u,nx_fine,ny_fine,bx,by);
add_matrix_2d(v,dv,v,nx_fine,ny_fine,bx,by);
//  printf (" current depth: -- %d -- \n", rec_depth);
}
Esempio n. 3
0
int main(int argc, char **argv) {
    srand(time(NULL));
    rand();
    if (argc == 2 || argc == 3) {
        char *hostname = argv[1];
        int port = DEFAULT_PORT;
        if (argc == 3) {
            port = atoi(argv[2]);
        }
        db_disable();
        client_enable();
        client_connect(hostname, port);
        client_start();
    }
    if (!glfwInit()) {
        return -1;
    }
    create_window();
    if (!window) {
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSwapInterval(VSYNC);
    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
    glfwSetKeyCallback(window, on_key);
    glfwSetMouseButtonCallback(window, on_mouse_button);
    glfwSetScrollCallback(window, on_scroll);

    #ifndef __APPLE__
        if (glewInit() != GLEW_OK) {
            return -1;
        }
    #endif

    if (db_init()) {
        return -1;
    }

    glEnable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LINE_SMOOTH);
    glLogicOp(GL_INVERT);
    glClearColor(0.53, 0.81, 0.92, 1.00);

    GLuint texture;
    glGenTextures(1, &texture);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    load_png_texture("texture.png");

    GLuint block_program = load_program(
        "shaders/block_vertex.glsl", "shaders/block_fragment.glsl");
    GLuint matrix_loc = glGetUniformLocation(block_program, "matrix");
    GLuint camera_loc = glGetUniformLocation(block_program, "camera");
    GLuint sampler_loc = glGetUniformLocation(block_program, "sampler");
    GLuint timer_loc = glGetUniformLocation(block_program, "timer");
    GLuint position_loc = glGetAttribLocation(block_program, "position");
    GLuint normal_loc = glGetAttribLocation(block_program, "normal");
    GLuint uv_loc = glGetAttribLocation(block_program, "uv");

    GLuint line_program = load_program(
        "shaders/line_vertex.glsl", "shaders/line_fragment.glsl");
    GLuint line_matrix_loc = glGetUniformLocation(line_program, "matrix");
    GLuint line_position_loc = glGetAttribLocation(line_program, "position");

    GLuint item_position_buffer = 0;
    GLuint item_normal_buffer = 0;
    GLuint item_uv_buffer = 0;
    int previous_block_type = 0;

    Chunk chunks[MAX_CHUNKS];
    int chunk_count = 0;

    Player players[MAX_PLAYERS];
    int player_count = 0;

    FPS fps = {0, 0};
    float matrix[16];
    float x = (rand_double() - 0.5) * 10000;
    float z = (rand_double() - 0.5) * 10000;
    float y = 0;
    float dy = 0;
    float rx = 0;
    float ry = 0;
    double px = 0;
    double py = 0;

    int loaded = db_load_state(&x, &y, &z, &rx, &ry);
    ensure_chunks(chunks, &chunk_count, x, y, z, 1);
    if (!loaded) {
        y = highest_block(chunks, chunk_count, x, z) + 2;
    }

    glfwGetCursorPos(window, &px, &py);
    double previous = glfwGetTime();
    while (!glfwWindowShouldClose(window)) {
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        glViewport(0, 0, width, height);

        update_fps(&fps, SHOW_FPS);
        double now = glfwGetTime();
        double dt = MIN(now - previous, 0.2);
        previous = now;

        if (exclusive && (px || py)) {
            double mx, my;
            glfwGetCursorPos(window, &mx, &my);
            float m = 0.0025;
            rx += (mx - px) * m;
            ry -= (my - py) * m;
            if (rx < 0) {
                rx += RADIANS(360);
            }
            if (rx >= RADIANS(360)){
                rx -= RADIANS(360);
            }
            ry = MAX(ry, -RADIANS(90));
            ry = MIN(ry, RADIANS(90));
            px = mx;
            py = my;
        }
        else {
            glfwGetCursorPos(window, &px, &py);
        }

        int szlast = sz;
        int sxlast = sx;
        sz = 0;
        sx = 0;
        ortho = glfwGetKey(window, 'F');
        fov = glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) ? 15.0 : 65.0;
        if (glfwGetKey(window, 'Q')) break;
        if (glfwGetKey(window, 'W')) sz--; 
        if (glfwGetKey(window, 'S')) sz++;
        if (glfwGetKey(window, 'A')) sx--;
        if (glfwGetKey(window, 'D')) sx++;
	if (sx != 0 || sz !=0 && flying == 0){
            acc = walking_speed > acc && acc > 0 ? acc + (acc - (acc / 3))  : walking_speed; }
        else{
            if(sx == 0 && sz == 0 && flying == 0){
                if(acc > 1 && acc > 0){
                    acc = acc - (acc / 1.45);
                    if(szlast != 0){sz = szlast; };
                    if(sxlast != 0){sx = sxlast; };}		
                else{
                    acc = .8;
                }

                }
            }
       
        float m = dt * 1.0;
        if (glfwGetKey(window, GLFW_KEY_LEFT)) rx -= m;
        if (glfwGetKey(window, GLFW_KEY_RIGHT)) rx += m;
        if (glfwGetKey(window, GLFW_KEY_UP)) ry += m;
        if (glfwGetKey(window, GLFW_KEY_DOWN)) ry -= m;
        float vx, vy, vz;
        get_motion_vector(flying, sz, sx, rx, ry, &vx, &vy, &vz);
        if (glfwGetKey(window, GLFW_KEY_SPACE)) {
            if (flying) {
                vy = 1;
            }
            else if (dy == 0) {
                dy = 8;
            }
        }
        if (glfwGetKey(window, 'Z')) {
            vx = -1; vy = 0; vz = 0;
        }
        if (glfwGetKey(window, 'X')) {
            vx = 1; vy = 0; vz = 0;
        }
        if (glfwGetKey(window, 'C')) {
            vx = 0; vy = -1; vz = 0;
        }
        if (glfwGetKey(window, 'V')) {
            vx = 0; vy = 1; vz = 0;
        }
        if (glfwGetKey(window, 'B')) {
            vx = 0; vy = 0; vz = -1;
        }
        if (glfwGetKey(window, 'N')) {
            vx = 0; vy = 0; vz = 1;
        }
        float speed = flying ? 20 : acc;
        int step = 8;
        float ut = dt / step;
        vx = vx * ut * speed;
        vy = vy * ut * speed;
        vz = vz * ut * speed;
        for (int i = 0; i < step; i++) {
            if (flying) {
                dy = 0;
            }
            else {
                dy -= ut * 25;
                dy = MAX(dy, -250);
            }
            x += vx;
            y += vy + dy * ut;
            z += vz;
            if (collide(chunks, chunk_count, 2, &x, &y, &z)) {
                dy = 0;
            }
        }
        if (y < 0) {
            y = highest_block(chunks, chunk_count, x, z) + 2;
        }

        if (left_click) {
            left_click = 0;
            int hx, hy, hz;
            int hw = hit_test(chunks, chunk_count, 0, x, y, z, rx, ry,
                &hx, &hy, &hz);
            if (hy > 0 && is_destructable(hw)) {
                set_block(chunks, chunk_count, hx, hy, hz, 0, 1);
                int above = get_block(chunks, chunk_count, hx, hy + 1, hz);
                if (is_plant(above)) {
                    set_block(chunks, chunk_count, hx, hy + 1, hz, 0, 1);
                }
            }
        }

        if (right_click) {
            right_click = 0;
            int hx, hy, hz;
            int hw = hit_test(chunks, chunk_count, 1, x, y, z, rx, ry,
                &hx, &hy, &hz);
            if (is_obstacle(hw)) {
                if (!player_intersects_block(2, x, y, z, hx, hy, hz)) {
                    set_block(chunks, chunk_count, hx, hy, hz, block_type, 1);
                }
            }
        }

        if (middle_click) {
            middle_click = 0;
            int hx, hy, hz;
            int hw = hit_test(chunks, chunk_count, 0, x, y, z, rx, ry,
                &hx, &hy, &hz);
            if (is_selectable(hw)) {
                block_type = hw;
            }
        }

        if (teleport) {
            teleport = 0;
            if (player_count) {
                int index = rand_int(player_count);
                Player *player = players + index;
                x = player->x; y = player->y; z = player->z;
                rx = player->rx; ry = player->ry;
                ensure_chunks(chunks, &chunk_count, x, y, z, 1);
            }
        }

        client_position(x, y, z, rx, ry);
        char buffer[RECV_BUFFER_SIZE];
        while (client_recv(buffer, RECV_BUFFER_SIZE)) {
            float ux, uy, uz, urx, ury;
            if (sscanf(buffer, "U,%*d,%f,%f,%f,%f,%f",
                &ux, &uy, &uz, &urx, &ury) == 5)
            {
                x = ux; y = uy; z = uz; rx = urx; ry = ury;
                ensure_chunks(chunks, &chunk_count, x, y, z, 1);
                y = highest_block(chunks, chunk_count, x, z) + 2;
            }
            int bx, by, bz, bw;
            if (sscanf(buffer, "B,%*d,%*d,%d,%d,%d,%d",
                &bx, &by, &bz, &bw) == 4)
            {
                set_block(chunks, chunk_count, bx, by, bz, bw, 0);
                if (player_intersects_block(2, x, y, z, bx, by, bz)) {
                    y = highest_block(chunks, chunk_count, x, z) + 2;
                }
            }
            int pid;
            float px, py, pz, prx, pry;
            if (sscanf(buffer, "P,%d,%f,%f,%f,%f,%f",
                &pid, &px, &py, &pz, &prx, &pry) == 6)
            {
                Player *player = find_player(players, player_count, pid);
                if (!player && player_count < MAX_PLAYERS) {
                    player = players + player_count;
                    player_count++;
                    player->id = pid;
                    player->position_buffer = 0;
                    player->normal_buffer = 0;
                    player->uv_buffer = 0;
                    printf("%d other players are online\n", player_count);
                }
                if (player) {
                    update_player(player, px, py, pz, prx, pry);
                }
            }
            if (sscanf(buffer, "D,%d", &pid) == 1) {
                delete_player(players, &player_count, pid);
                printf("%d other players are online\n", player_count);
            }
        }

        int p = chunked(x);
        int q = chunked(z);
        ensure_chunks(chunks, &chunk_count, x, y, z, 0);

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        set_matrix_3d(matrix, width, height, x, y, z, rx, ry, fov, ortho);

        // render chunks
        glUseProgram(block_program);
        glUniformMatrix4fv(matrix_loc, 1, GL_FALSE, matrix);
        glUniform3f(camera_loc, x, y, z);
        glUniform1i(sampler_loc, 0);
        glUniform1f(timer_loc, glfwGetTime());
        for (int i = 0; i < chunk_count; i++) {
            Chunk *chunk = chunks + i;
            if (chunk_distance(chunk, p, q) > RENDER_CHUNK_RADIUS) {
                continue;
            }
            if (y < 100 && !chunk_visible(chunk, matrix)) {
                continue;
            }
            draw_chunk(chunk, position_loc, normal_loc, uv_loc);
        }

        // render players
        for (int i = 0; i < player_count; i++) {
            Player *player = players + i;
            draw_player(player, position_loc, normal_loc, uv_loc);
        }

        // render focused block wireframe
        int hx, hy, hz;
        int hw = hit_test(
            chunks, chunk_count, 0, x, y, z, rx, ry, &hx, &hy, &hz);
        if (is_obstacle(hw)) {
            glUseProgram(line_program);
            glLineWidth(1);
            glEnable(GL_COLOR_LOGIC_OP);
            glUniformMatrix4fv(line_matrix_loc, 1, GL_FALSE, matrix);
            GLuint wireframe_buffer = gen_wireframe_buffer(hx, hy, hz, 0.51);
            draw_lines(wireframe_buffer, line_position_loc, 3, 48);
            glDeleteBuffers(1, &wireframe_buffer);
            glDisable(GL_COLOR_LOGIC_OP);
        }

        set_matrix_2d(matrix, width, height);

        // render crosshairs
        glUseProgram(line_program);
        glLineWidth(4);
        glEnable(GL_COLOR_LOGIC_OP);
        glUniformMatrix4fv(line_matrix_loc, 1, GL_FALSE, matrix);
        GLuint crosshair_buffer = gen_crosshair_buffer(width, height);
        draw_lines(crosshair_buffer, line_position_loc, 2, 4);
        glDeleteBuffers(1, &crosshair_buffer);
        glDisable(GL_COLOR_LOGIC_OP);

        // render selected item
        set_matrix_item(matrix, width, height);
        if (block_type != previous_block_type) {
            previous_block_type = block_type;
            gen_item_buffers(
                &item_position_buffer, &item_normal_buffer, &item_uv_buffer,
                block_type);
        }
        glUseProgram(block_program);
        glUniformMatrix4fv(matrix_loc, 1, GL_FALSE, matrix);
        glUniform3f(camera_loc, 0, 0, 5);
        glUniform1i(sampler_loc, 0);
        glUniform1f(timer_loc, glfwGetTime());
        glDisable(GL_DEPTH_TEST);
        draw_cube(
            item_position_buffer, item_normal_buffer, item_uv_buffer,
            position_loc, normal_loc, uv_loc);
        glEnable(GL_DEPTH_TEST);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    client_stop();
    db_save_state(x, y, z, rx, ry);
    db_close();
    glfwTerminate();
    return 0;
}
void HORN_SCHUNCK_WARP_LEVEL
(
                        /*****************************************************/
float **f1,             /* in     : 1st image                                */
float **f2,             /* in     : 2nd image                                */
float **du,             /* in+out : x-component of flow increment            */
float **dv,             /* in+out : y-component of flow increment            */
float **u,              /* in+out : x-component of flow field                */
float **v,              /* in+out : y-component of flow field                */
int   nx,               /* in     : size in x-direction                      */
int   ny,               /* in     : size in y-direction                      */
int   bx,               /* in     : boundary size in x-direction             */
int   by,               /* in     : boundary size in y-direction             */
float hx,               /* in     : grid spacing in x-direction              */
float hy,               /* in     : grid spacing in y-direction              */
float m_alpha,          /* in     : smoothness weight                        */
float epsilon_d,         /* in     : diffusivity param data term              */
float epsilon_s,       /* in     : diffusivity type data term               */
float w_bright_grad,
int   num_iter_inner,   /* in     : inner solver iterations                  */
int   num_iter_outer,   /* in     : outer nonlin update iterations           */
float n_omega           /* in     : SOR overrelaxation parameter             */

                        /*****************************************************/
)


{
                        /*****************************************************/
int    i,j;             /* loop variable                                     */
float  **J_11;          /* entry 11 of the motion tensor                     */
float  **J_22;          /* entry 22 of the motion tensor                     */
float  **J_33;          /* entry 33 of the motion tensor                     */
float  **J_12;          /* entry 12 of the motion tensor                     */
float  **J_13;          /* entry 13 of the motion tensor                     */
float  **J_23;          /* entry 23 of the motion tensor                     */
float  **psi_prime_d;   /* nonlinearitys of data term                        */
float  **psi_prime_s;
                        /*****************************************************/



/* ---- alloc memory ---- */
malloc_multi(8,2,sizeof(float),nx,ny,bx,by,0,0,&J_11,&J_22,&J_33,&J_12,&J_13,
             &J_23,&psi_prime_d, &psi_prime_s);

/* ---- initialise displacement field with zero ----  */
set_matrix_2d(du,nx+2*bx,ny+2*by,0,0,(float)0.0);
set_matrix_2d(dv,nx+2*bx,ny+2*by,0,0,(float)0.0);


/* ---- compute motion tensor ---- */
compute_motion_tensor(f1,f2,nx,ny,bx,by,hx,hy,w_bright_grad,
                      J_11,J_22,J_33,J_12,J_13,J_23);




/* ---- perform SOR iterations ---- */
for(j=0;j<num_iter_outer;j++)
{
	update_nonlinearities(J_11, J_22, J_33, J_12, J_13, J_23, du, dv,
                        psi_prime_d, epsilon_d, nx,
                        ny, bx, by);
  
  update_nonlinearities_reg(u,v,du,dv,psi_prime_s,epsilon_s,nx,ny,bx,by,
                            hx,hy);
	for(i=1;i<=num_iter_inner;i++)
	{
		horn_schunck_warp_sor(J_11, J_22, J_33, J_12, J_13, J_23,
							du, dv, u, v, psi_prime_d, psi_prime_s,nx, ny, bx, by, hx, hy,
							m_alpha, n_omega);
	}
  

}

/* ---- free memory ---- */
  free_multi(8,2,sizeof(float),nx,ny,bx,by,0,0,&J_11,&J_22,&J_33,&J_12,&J_13,
               &J_23,&psi_prime_d, &psi_prime_s);

}