/**
 * @brief Renderer::render render a single frame, then return
 * @return true if the user wants to quit the application
 */
bool Renderer::render(){
    process_keys(SDL_GetKeyboardState(NULL));
    SDL_Event e;
    while(SDL_PollEvent(&e)){
        if(e.type == SDL_QUIT){
            printf("received SDL_QUIT\n");
            quit_flag = true;
        }
        else if(e.type == SDL_MOUSEMOTION){
            mousemove_event(e.motion.xrel, e.motion.yrel);
        }
        else if(e.type == SDL_WINDOWEVENT && e.window.event == SDL_WINDOWEVENT_RESIZED){
            resize_event(e.window.data1, e.window.data2);
            std::cout << "window resized" << std::endl;
        }
    }

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    world_to_camera_matrix = look_matrix(camera_vertical, camera_horizontal, camera_position);
    camera_to_clip_matrix = glm::mat4(
                glm::vec4(frustum_scale/(width/(float)height), 0.0,           0.0,                               0.0),
                glm::vec4(0.0,                                 frustum_scale, 0.0,                               0.0),
                glm::vec4(0.0,                                 0.0,           (z_far + z_near)/(z_near - z_far), (2*z_far*z_near)/(z_near - z_far)),
                glm::vec4(0.0,                                 0.0,           -1.0,                              0.0));

    // update uniforms for all shaders now (no UBOs in 2.x, unfortunately...)
    axes_shader->set_camera_to_clip(camera_to_clip_matrix);
    axes_shader->set_world_to_camera(world_to_camera_matrix);
    render_axes();

    trails_shader->set_camera_to_clip(camera_to_clip_matrix);
    trails_shader->set_world_to_camera(world_to_camera_matrix);
    render_trails();

    pointsprites_shader->set_camera_to_clip(camera_to_clip_matrix);
    pointsprites_shader->set_world_to_camera(world_to_camera_matrix);
    pointsprites_shader->set_uniform("camera_position", camera_position);
    render_pointsprites();
    render_center_of_mass();

    SDL_GL_SwapWindow(win);
    //SDL_Delay(1000/60.0); // limit to 60FPS
    return quit_flag;
}
Beispiel #2
0
static void tween_selit(Menuhdr *mh, SHORT hitid)
/* Pull-down interpreter for tween system */
{
Poly *p;

hide_mp();
switch(hitid)
	{
	case TWE_UND_PUL:
		tween_swap_undo();
		break;
	case TWE_ONC_PUL:
		wireframe_tween();
		break;
	case TWE_LOO_PUL:
		wireloop_tween();
		break;
	case TWE_REN_PUL:
		render_tween();
		break;
	case TWE_TRA_PUL:
		render_trails();
		break;
	case TWE_END_PUL:
		tween_end_to_start();
		break;
	case TWE_SWA_PUL:
		tween_swap_ends();
		break;
	case TWE_CLE_PUL:
		tween_clear();
		break;
	case TWE_FIL_PUL:
		if (tween_save_undo()>=Success)
			{
			if (save_tween_state() >= Success)
				{
				tween_undraw();
				twe_disable_refresh();
				trash_tween_state(&twcb->cur);
				go_files(FTP_TWEEN);
				load_tween_state();
				twe_enable_refresh();
				tween_redraw();
				}
			}
		break;
	case TWE_QUI_PUL:
		mh_gclose_code(mh, Err_abort);
		break;
	case SHA_POL_PUL:	/* polygon */
		vs.tween_tool = TTI_POLY;
		break;
	case SHA_SHA_PUL: /* shape */
		vs.tween_tool = TTI_SHAPE;
		break;
	case SHA_STA_PUL:		/* Star */
		vs.tween_tool = TTI_STAR;
		break;
	case SHA_PET_PUL:		/* Petal */
		vs.tween_tool = TTI_PETAL;
		break;
	case SHA_RPO_PUL:		/* Rpoly */
		vs.tween_tool = TTI_RPOLY;
		break;
	case SHA_OVA_PUL:		/* oval */
		vs.tween_tool = TTI_OVAL;
		break;
	case SHA_REV_PUL:		/* reverse */
		tween_reverse_poly();
		break;
	case SHA_USE_PUL:		/* Use Last */
		if (tween_save_undo()>=Success)
			{
			if ((load_a_poly(poly_name, p = sel_poly())) >= Success)
				{
				softerr(force_other(p),NULL);
				redraw_both_ends();
				}
			}
		break;
	case SHA_LOA_PUL:		/* Load */
		load_cur_shape();
		break;
	case SHA_SAV_PUL:	/* Save */
		save_cur_shape();
		break;
	case MOV_MVP_PUL:		/* Move Point */
		vs.tween_tool = TTI_MPOINT;
		break;
	case MOV_MAG_PUL:		/* Magnet */
		vs.tween_tool = TTI_MAGNET;
		break;
	case MOV_BLO_PUL:		/* Blow */
		vs.tween_tool = TTI_BLOW;
		break;
	case MOV_MVS_PUL:		/* Move Shape */
		vs.tween_tool = TTI_MSHAPE;
		break;
	case MOV_MVT_PUL:		/* Move tween */
		vs.tween_tool = TTI_MTWEEN;
		break;
	case MOV_SZS_PUL:		/* Size shape */
		vs.tween_tool = TTI_SSHAPE;
		break;
	case MOV_SZT_PUL:		/* Size tween */
		vs.tween_tool = TTI_STWEEN;
		break;
	case MOV_LIN_PUL:		/* Link Points */
		vs.tween_tool = TTI_LINK;
		break;
	case MOV_CLE_PUL:		/* clear links */
		if (tween_save_undo()>=Success)
			{
			free_dl_list(&twcb->cur.links);
			redraw_both_ends();
			}
		break;
	case OPT_CLO_PUL:
		vs.closed_curve = !vs.closed_curve;
		redraw_both_ends();
		break;
	case OPT_SPL_PUL:
		vs.tween_spline = !vs.tween_spline;
		break;
	case OPT_TWO_PUL:
		vs.color2 = !vs.color2;
		break;
	case OPT_IN__PUL:		/* in slow */
		vs.ado_ease = !vs.ado_ease;
		break;
	case OPT_OUT_PUL:		/* out slow */
		vs.ado_ease_out = !vs.ado_ease_out;
		break;
	case OPT_STI_PUL:		/* still */
		vs.ado_tween = !vs.ado_tween;
		break;
	case OPT_PIN_PUL:		/* ping-pong */
		vs.ado_pong = !vs.ado_pong;
		break;
	case OPT_REV_PUL:		/* reverse */
		vs.ado_reverse = !vs.ado_reverse;
		break;
	case OPT_COM_PUL:		/* complete */
		vs.ado_complete = !vs.ado_complete;
		break;
	case ACT_STA_PUL:
		vs.tween_end = TWEEN_START;
		redraw_both_ends();
		break;
	case ACT_END_PUL:
		vs.tween_end = TWEEN_END;
		redraw_both_ends();
		break;
	case ACT_BOT_PUL:
		vs.tween_end = TWEEN_BOTH;
		redraw_both_ends();
		break;
	}
show_mp();
}