int main(int argc, char **argv) { cg_onscreen_t *onscreen; cg_error_t *error = NULL; struct demo demo; float fovy, aspect, z_near, z_2d, z_far; uv_loop_t *loop = uv_default_loop(); demo.dev = cg_device_new (); if (!demo.dev || error != NULL) c_error("Failed to create Cogl context\n"); onscreen = cg_onscreen_new(demo.dev, WIDTH, HEIGHT); demo.fb = onscreen; demo.width = cg_framebuffer_get_width(demo.fb); demo.height = cg_framebuffer_get_height(demo.fb); cg_onscreen_show(onscreen); cg_framebuffer_set_viewport(demo.fb, 0, 0, demo.width, demo.height); fovy = 45; aspect = (float)demo.width / (float)demo.height; z_near = 0.1; z_2d = 1000; z_far = 2000; cg_framebuffer_perspective(demo.fb, fovy, aspect, z_near, z_far); c_matrix_init_identity(&demo.view); c_matrix_view_2d_in_perspective(&demo.view, fovy, aspect, z_near, z_2d, demo.width, demo.height); cg_framebuffer_set_modelview_matrix(demo.fb, &demo.view); demo.swap_ready = true; cg_onscreen_add_frame_callback(demo.fb, frame_event_cb, &demo, NULL); init_particle_emitters(&demo); demo.timer = c_timer_new(); demo.spin_rate = 0; demo.angle_between_emitters = 2 * M_PI / C_N_ELEMENTS(demo.emitter); uv_idle_init(loop, &demo.idle); demo.idle.data = &demo; uv_idle_start(&demo.idle, paint_cb); cg_uv_set_mainloop(demo.dev, loop); uv_run(loop, UV_RUN_DEFAULT); return 0; }
int main(int argc, char **argv) { Data data; cg_onscreen_t *onscreen; cg_error_t *error = NULL; cg_vertex_p2c4_t triangle_vertices[] = { { 0, 0.7, 0xff, 0x00, 0x00, 0xff }, { -0.7, -0.7, 0x00, 0xff, 0x00, 0xff }, { 0.7, -0.7, 0x00, 0x00, 0xff, 0xff } }; cg_renderer_t *renderer; cg_display_t *display; uv_loop_t *loop = uv_default_loop(); renderer = cg_renderer_new(); cg_renderer_add_constraint(renderer, CG_RENDERER_CONSTRAINT_SUPPORTS_CG_GLES2); if (!cg_renderer_connect(renderer, &error)) { c_error("%s", error->message); exit(1); } display = cg_display_new(renderer, NULL); data.dev = cg_device_new(); cg_device_set_display(data.dev, display); if (!cg_device_connect(data.dev, &error)) { c_error("%s", error->message); exit(1); } onscreen = cg_onscreen_new(data.dev, 640, 480); cg_onscreen_show(onscreen); data.fb = onscreen; /* Prepare onscreen primitive */ data.triangle = cg_primitive_new_p2c4( data.dev, CG_VERTICES_MODE_TRIANGLES, 3, triangle_vertices); data.pipeline = cg_pipeline_new(data.dev); data.offscreen_texture = cg_texture_2d_new_with_size( data.dev, OFFSCREEN_WIDTH, OFFSCREEN_HEIGHT); data.offscreen = cg_offscreen_new_with_texture(data.offscreen_texture); data.gles2_ctx = cg_gles2_context_new(data.dev, &error); if (!data.gles2_ctx) { c_error("Failed to create GLES2 context: %s\n", error->message); } data.gles2_vtable = cg_gles2_context_get_vtable(data.gles2_ctx); /* Draw scene with GLES2 */ if (!cg_push_gles2_context( data.dev, data.gles2_ctx, data.fb, data.fb, &error)) { c_error("Failed to push gles2 context: %s\n", error->message); } cg_pop_gles2_context(data.dev); cg_onscreen_add_frame_callback( CG_ONSCREEN(data.fb), frame_event_cb, &data, NULL); /* destroy notify */ uv_idle_init(loop, &data.idle); data.idle.data = &data; uv_idle_start(&data.idle, paint_cb); cg_uv_set_mainloop(data.dev, loop); uv_run(loop, UV_RUN_DEFAULT); return 0; }