struct canvas * makeDisplay(int w, int h) { displayCanvas = canvas_create(w, h); LOGI("Making displayCanvas %p data %p", displayCanvas, displayCanvas->data); return displayCanvas; }
SCanvas::SCanvas(bool onscreen, int width, int height, uint32_t format, RedWindow *win, PixmapCache& pixmap_cache, PaletteCache& palette_cache, GlzDecoderWindow &glz_decoder_window, CSurfaces& csurfaces) : Canvas (pixmap_cache, palette_cache, glz_decoder_window, csurfaces) , _pixmap (0) { if (onscreen) { _pixmap = new RedPixmapSw(width, height, RedDrawable::format_from_surface(format), true, win); _canvas = canvas_create_for_data(width, height, format, _pixmap->get_data(), _pixmap->get_stride(), &pixmap_cache.base, &palette_cache.base, &csurfaces.base, &glz_decoder(), &jpeg_decoder(), &zlib_decoder()); } else { _canvas = canvas_create(width, height, format, &pixmap_cache.base, &palette_cache.base, &csurfaces.base, &glz_decoder(), &jpeg_decoder(), &zlib_decoder()); } if (_canvas == NULL) { THROW("create canvas failed"); } }
static void selected(const wimp_selection *selection, void *opaque) { NOT_USED(opaque); switch (selection->items[0]) { #ifdef EYE_CANVAS case ICONBAR_NEW: switch (selection->items[1]) { case NEW_CANVAS: { error err; canvas_t *canvas; err = canvas_create(&canvas); if (err) return; canvas_open(canvas); } break; } break; #endif /* Close all */ case ICONBAR_CLOSE: switch (selection->items[1]) { case CLOSE_VIEWERS: if (can_quit()) viewer_close_all(); break; #ifdef EYE_THUMBVIEW case CLOSE_THUMBVIEWS: thumbview_close_all(); break; #endif #ifdef EYE_CANVAS case CLOSE_CANVASES: canvas_close_all(); break; #endif } break; case ICONBAR_EMPTYCACHE: imagecache_empty(); break; #ifdef EYE_TAGS case ICONBAR_SEARCHTAGS: tags_search_open(); break; #endif case ICONBAR_CHOICES: /* Choices... */ choices_open(&privateeye_choices); break; case ICONBAR_QUIT: /* Quit */ if (can_quit()) GLOBALS.flags |= Flag_Quit; break; } }
static VALUE display_initialize(int argc, VALUE* argv, VALUE self) { caca_display_t *display; caca_canvas_t *canvas = NULL; const char *driver = NULL; VALUE cv = Qnil; VALUE arg1, arg2; rb_scan_args(argc, argv, "02", &arg1, &arg2); if(CLASS_OF(arg1) == cCanvas) { cv = arg1; if(CLASS_OF(arg2) == cCanvas) { rb_raise(rb_eArgError, "Only one argument can be a Caca::Canvas"); } } else if(CLASS_OF(arg2) == cCanvas) { cv = arg2; } if(TYPE(arg1) == T_STRING) { driver = StringValuePtr(arg1); if(TYPE(arg2) == T_STRING) { rb_raise(rb_eArgError, "Only one argument can be a string"); } } else if(TYPE(arg2) == T_STRING) { driver = StringValuePtr(arg2); } if(cv != Qnil) canvas = DATA_PTR(cv); if(driver == NULL) { display = caca_create_display(canvas); if(display && NIL_P(cv)) { cv = canvas_create(caca_get_canvas(display)); } } else { display = caca_create_display_with_driver(canvas, driver); } if(display == NULL) { rb_raise(rb_eRuntimeError, "%s", strerror(errno)); } _SELF = display; rb_iv_set(self, "@canvas", cv); return self; }
int32_t main(int32_t argc, char *argv[]) { if( init_sdl2() ) { return 1; } int width = 1280; int height = 720; SDL_Window* window; sdl2_window("cute3d: " __FILE__, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, &window); SDL_GLContext* context; sdl2_glcontext(3, 2, window, &context); if( init_shader() ) { return 1; } if( init_canvas(width, height) ) { return 1; } canvas_create("global_dynamic_canvas", &global_dynamic_canvas); canvas_create("global_static_canvas", &global_static_canvas); struct Vbo vbo = {0}; vbo_create(&vbo); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX_NORMAL, 3, GL_FLOAT, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX_NORMAL, NORMAL_SIZE, GL_FLOAT, GL_STATIC_DRAW); struct Ibo ibo = {0}; ibo_create(GL_TRIANGLES, GL_UNSIGNED_INT, GL_STATIC_DRAW, &ibo); struct SolidTetrahedron hard_tetrahedron = {0}; struct SolidBox hard_cube = {0}; struct SolidSphere16 hard_sphere16 = {0}; struct SolidSphere32 hard_sphere32 = {0}; solid_tetrahedron_create(1.0, (Color){255, 0, 0, 255}, &hard_tetrahedron); solid_cube_create(0.5, (Color){0, 255, 0, 255}, &hard_cube); solid_sphere16_create(16, 8, 0.75, (Color){0, 255, 255, 255}, &hard_sphere16); solid_sphere32_create(32, 16, 0.75, (Color){255, 255, 0, 255}, &hard_sphere32); solid_optimize((struct Solid*)&hard_tetrahedron); solid_optimize((struct Solid*)&hard_cube); solid_optimize((struct Solid*)&hard_sphere16); solid_optimize((struct Solid*)&hard_sphere32); struct VboMesh hard_tetrahedron_mesh, hard_box_mesh, hard_cube_mesh, hard_sphere16_mesh, hard_sphere32_mesh; vbo_mesh_create_from_solid((struct Solid*)&hard_tetrahedron, &vbo, &ibo, &hard_tetrahedron_mesh); vbo_mesh_create_from_solid((struct Solid*)&hard_cube, &vbo, &ibo, &hard_cube_mesh); vbo_mesh_create_from_solid((struct Solid*)&hard_sphere16, &vbo, &ibo, &hard_sphere16_mesh); vbo_mesh_create_from_solid((struct Solid*)&hard_sphere32, &vbo, &ibo, &hard_sphere32_mesh); struct SolidTetrahedron smooth_tetrahedron = {0}; struct SolidBox smooth_cube = {0}; struct SolidSphere16 smooth_sphere16 = {0}; struct SolidSphere32 smooth_sphere32 = {0}; solid_tetrahedron_create(1.0, (Color){255, 0, 0, 255}, &smooth_tetrahedron); solid_cube_create(0.5, (Color){0, 255, 0, 255}, &smooth_cube); solid_sphere16_create(16, 8, 0.75, (Color){0, 255, 255, 255}, &smooth_sphere16); solid_sphere32_create(32, 16, 0.75, (Color){255, 255, 0, 255}, &smooth_sphere32); solid_optimize((struct Solid*)&smooth_tetrahedron); solid_optimize((struct Solid*)&smooth_cube); solid_optimize((struct Solid*)&smooth_sphere16); solid_optimize((struct Solid*)&smooth_sphere32); solid_smooth_normals((struct Solid*)&smooth_tetrahedron, smooth_tetrahedron.normals, smooth_tetrahedron.normals); solid_smooth_normals((struct Solid*)&smooth_cube, smooth_cube.normals, smooth_cube.normals); solid_smooth_normals((struct Solid*)&smooth_sphere16, smooth_sphere16.normals, smooth_sphere16.normals); solid_smooth_normals((struct Solid*)&smooth_sphere32, smooth_sphere32.normals, smooth_sphere32.normals); struct VboMesh smooth_tetrahedron_mesh, smooth_box_mesh, smooth_cube_mesh, smooth_sphere16_mesh, smooth_sphere32_mesh; vbo_mesh_create_from_solid((struct Solid*)&smooth_tetrahedron, &vbo, &ibo, &smooth_tetrahedron_mesh); vbo_mesh_create_from_solid((struct Solid*)&smooth_cube, &vbo, &ibo, &smooth_cube_mesh); vbo_mesh_create_from_solid((struct Solid*)&smooth_sphere16, &vbo, &ibo, &smooth_sphere16_mesh); vbo_mesh_create_from_solid((struct Solid*)&smooth_sphere32, &vbo, &ibo, &smooth_sphere32_mesh); struct Arcball arcball = {0}; arcball_create(width, height, (Vec4f){2.5,17.0,17.0,1.0}, (Vec4f){2.5,0.0,0.0,1.0}, 0.1, 100.0, &arcball); float circular_motion_angle = 0.0f; float circular_motion_speed = (2.0f*PI)/30; float circular_motion_radius = 12.0f; Vec3f light_position = { circular_motion_radius, 10.0, circular_motion_radius }; Vec3f light_direction = {0}; vec_sub((Vec3f){0.0f, 0.0f, 0.0f}, light_position, light_direction); vec_normalize(light_direction, light_direction); Vec3f eye_position = {0}; vec_copy3f(arcball.camera.pivot.position, eye_position); Color ambiance = {50, 25, 150, 255}; Color specular = {255, 255, 255, 255}; float material_shininess = 1.0; Vec4f material_coefficients = { 0.8, 0.2, 0.0, 0.0 }; // flat struct Shader flat_shader = {0}; shader_create(&flat_shader); shader_attach(&flat_shader, GL_VERTEX_SHADER, "prefix.vert", 1, "flat_shading.vert"); shader_attach(&flat_shader, GL_FRAGMENT_SHADER, "prefix.frag", 1, "flat_shading.frag"); shader_make_program(&flat_shader, SHADER_DEFAULT_NAMES, "flat_shader"); shader_set_uniform_3f(&flat_shader, flat_shader.program, SHADER_UNIFORM_LIGHT_DIRECTION, 3, GL_FLOAT, light_direction); shader_set_uniform_4f(&flat_shader, flat_shader.program, SHADER_UNIFORM_AMBIENT_LIGHT, 4, GL_UNSIGNED_BYTE, ambiance); // gouraud struct Shader gouraud_shader = {0}; shader_create(&gouraud_shader); shader_attach(&gouraud_shader, GL_VERTEX_SHADER, "prefix.vert", 1, "gouraud_shading.vert"); shader_attach(&gouraud_shader, GL_FRAGMENT_SHADER, "prefix.frag", 1, "gouraud_shading.frag"); shader_make_program(&gouraud_shader, SHADER_DEFAULT_NAMES, "gouraud_shader"); shader_set_uniform_3f(&gouraud_shader, gouraud_shader.program, SHADER_UNIFORM_LIGHT_POSITION, 3, GL_FLOAT, light_position); shader_set_uniform_3f(&gouraud_shader, gouraud_shader.program, SHADER_UNIFORM_EYE_POSITION, 3, GL_FLOAT, eye_position); shader_set_uniform_4f(&gouraud_shader, gouraud_shader.program, SHADER_UNIFORM_AMBIENT_LIGHT, 4, GL_UNSIGNED_BYTE, ambiance); shader_set_uniform_4f(&gouraud_shader, gouraud_shader.program, SHADER_UNIFORM_SPECULAR_LIGHT, 4, GL_UNSIGNED_BYTE, specular); shader_set_uniform_1f(&gouraud_shader, gouraud_shader.program, SHADER_UNIFORM_MATERIAL_SHININESS, 1, GL_FLOAT, &material_shininess); shader_set_uniform_4f(&gouraud_shader, gouraud_shader.program, SHADER_UNIFORM_MATERIAL_COEFFICIENTS, 4, GL_FLOAT, material_coefficients); shader_set_uniform_3f(&gouraud_shader, gouraud_shader.program, SHADER_UNIFORM_EYE_POSITION, 3, GL_FLOAT, &arcball.camera.pivot.position); Mat identity = IDENTITY_MAT; draw_grid(&global_static_canvas, 0, identity, (Color){127, 127, 127, 255}, 0.03f, 12.0f, 12.0f, 12); Mat shading_label_transform = IDENTITY_MAT; Quat text_rotation = IDENTITY_QUAT; quat_from_axis_angle((Vec3f)X_AXIS, -PI/2.0f, text_rotation); mat_rotate(shading_label_transform, text_rotation, shading_label_transform); mat_translate(shading_label_transform, (float[4]){ 6.5, 0.0, -2.5, 1.0 }, shading_label_transform);
BOOL InitInstance() { DWORD style = WS_OVERLAPPEDWINDOW&~WS_SIZEBOX&~WS_MAXIMIZEBOX; RECT rect = { 0, 0, WIDTH, HEIGHT }; AdjustWindowRect(&rect, style, FALSE); hWnd = CreateWindow(L"TEST", L"test", style, CW_USEDEFAULT, 0, rect.right - rect.left, rect.bottom - rect.top, 0, 0, hInst, 0); if (!hWnd) { return FALSE; } { HDC dc = GetDC(hWnd); #if 0 FILE * fp = fopen("D:\\11.bmp", "rb+"); fseek(fp,18L, SEEK_SET); unsigned long buffer1[3]; long buffer2[3]; unsigned short buffer3[3]; fread(buffer2, 4, 2, fp); long _w = buffer2[0]; long _h = buffer2[1]; // bi = (BITMAPINFO *)malloc(sizeof(BITMAPINFO)-sizeof(BITMAPINFOHEADER)+_w*_h*sizeof(RGBQUAD)); fseek(fp, -12L, SEEK_CUR); fread(buffer1, 4, 1, fp); bi.bmiHeader.biSize = buffer1[0]; fread(buffer2, 4, 2, fp); bi.bmiHeader.biWidth = buffer2[0]; bi.bmiHeader.biHeight =-buffer2[1]; fread(buffer3, 2, 2, fp); bi.bmiHeader.biPlanes = buffer3[0]; bi.bmiHeader.biBitCount = buffer3[1]; fread(buffer1, 4, 2, fp); bi.bmiHeader.biCompression = buffer1[0]; bi.bmiHeader.biSizeImage = buffer1[1]; fread(buffer2, 4, 2, fp); bi.bmiHeader.biXPelsPerMeter = buffer2[0]; bi.bmiHeader.biYPelsPerMeter = buffer2[1]; fread(buffer1, 4, 2, fp); bi.bmiHeader.biClrUsed = buffer1[0]; bi.bmiHeader.biClrImportant = buffer1[1]; int temp; p = (char *)malloc(_h*((_w * (bi.bmiHeader.biBitCount / 8) + 3)&(~3))); fread(p, 1, _h*((_w * (bi.bmiHeader.biBitCount / 8) + 3)&(~3)), fp); //p = p +200*((bi.bmiHeader.biWidth * (bi.bmiHeader.biBitCount / 8) + 3)&(~3)); fclose(fp); #if 0 bi.bmiHeader.biSize = buffer1[0]; fread(buffer2, 4, 2, fp); bi.bmiHeader.biWidth = buffer2[0]; bi.bmiHeader.biHeight = buffer2[1]; fread(buffer3, 2, 2, fp); bi.bmiHeader.biPlanes = buffer3[0]; bi.bmiHeader.biBitCount = buffer3[1]; fread(buffer1, 4, 2, fp); bi.bmiHeader.biCompression = buffer1[0]; bi.bmiHeader.biSizeImage = buffer1[1]; fread(buffer2, 4, 2, fp); bi.bmiHeader.biXPelsPerMeter = buffer2[0]; bi.bmiHeader.biYPelsPerMeter = buffer2[1]; fread(buffer1, 4, 2, fp); bi.bmiHeader.biClrUsed = buffer1[0]; bi.bmiHeader.biClrImportant = buffer1[1]; #endif #endif #if 0 BITMAPINFOHEADER *bh = &(bi->bmiHeader); memset(bh, 0, sizeof(*bh)); bh->biSize = sizeof(*bh); bh->biWidth = 100; bh->biHeight = -100; bh->biPlanes = 1; bh->biBitCount = 3* 8; bh->biCompression = BI_RGB; #endif //bi.bmiColors[] //*(int*)(obj->bi.bmiColors[0].) = 0xf800; //*(int*)(obj->bi.bmiColors + 1) = 0x7e0; // *(int*)(obj->bi.bmiColors + 2) = 0x1f; } gdi_create(&g_gdi, hWnd, WIDTH, HEIGHT); g_canvas = canvas_create(g_gdi.width, g_gdi.height, g_gdi.buffer, g_gdi.pitch, g_gdi.flip, g_gdi.object); ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); return TRUE; }
int32_t main(int32_t argc, char *argv[]) { if( init_sdl2() ) { return 1; } SDL_Window* window; sdl2_window("test-shading", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, &window); SDL_GLContext* context; sdl2_glcontext(3, 2, window, (Color){0, 0, 0, 255}, &context); if( init_shader() ) { return 1; } if( init_vbo() ) { return 1; } if( init_canvas(1280,720) ) { return 1; } canvas_create("global_dynamic_canvas", 1280, 720, &global_dynamic_canvas); canvas_create("global_static_canvas", 1280, 720, &global_static_canvas); struct Vbo test_vbo = {0}; vbo_create(&test_vbo); vbo_add_buffer(&test_vbo, SHADER_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_STATIC_DRAW); struct Ibo test_ibo = {0}; ibo_create(GL_TRIANGLES, GL_UNSIGNED_INT, GL_STATIC_DRAW, &test_ibo); struct VboMesh test_mesh1 = {0}; vbo_mesh_create(&test_vbo, &test_ibo, &test_mesh1); float triangle1[3*3] = {1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0}; vbo_mesh_append_attributes(&test_mesh1, SHADER_ATTRIBUTE_VERTEX, 3, GL_FLOAT, 3, &triangle1); vbo_mesh_print(&test_mesh1); struct VboMesh test_mesh2 = {0}; vbo_mesh_create(&test_vbo, &test_ibo, &test_mesh2); float triangle2[3*3] = {4.0, 4.0, 4.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0}; vbo_mesh_append_attributes(&test_mesh2, SHADER_ATTRIBUTE_VERTEX, 3, GL_FLOAT, 3, &triangle2); vbo_mesh_print(&test_mesh2); struct Vbo vbo = {0}; vbo_create(&vbo); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX_NORMAL, 3, GL_FLOAT, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_SMOOTH_NORMAL, NORMAL_SIZE, GL_FLOAT, GL_STATIC_DRAW); struct Ibo ibo = {0}; ibo_create(GL_TRIANGLES, GL_UNSIGNED_INT, GL_STATIC_DRAW, &ibo); struct SolidTetrahedron tetrahedron = {0}; solid_tetrahedron_create(1.0, (Color){255, 0, 0, 255}, &tetrahedron); solid_optimize((struct Solid*)&tetrahedron); struct SolidTetrahedron tetrahedron2 = {0}; solid_tetrahedron_create(1.0, (Color){255, 0, 255, 255}, &tetrahedron2); solid_optimize((struct Solid*)&tetrahedron2); struct SolidBox cube = {0}; solid_cube_create(1.0, (Color){0, 255, 0, 255}, &cube); solid_optimize((struct Solid*)&cube); struct SolidBox cube2 = {0}; solid_cube_create(1.0, (Color){0, 255, 255, 255}, &cube2); solid_optimize((struct Solid*)&cube2); struct VboMesh tetrahedron_mesh; vbo_mesh_create_from_solid((struct Solid*)&tetrahedron, &vbo, &ibo, &tetrahedron_mesh); struct VboMesh cube_mesh = {0}; vbo_mesh_create_from_solid((struct Solid*)&cube, &vbo, &ibo, &cube_mesh); struct VboMesh tetrahedron_mesh2; vbo_mesh_create_from_solid((struct Solid*)&tetrahedron2, &vbo, &ibo, &tetrahedron_mesh2); struct VboMesh cube_mesh2 = {0}; vbo_mesh_create_from_solid((struct Solid*)&cube2, &vbo, &ibo, &cube_mesh2); vbo_mesh_print(&tetrahedron_mesh); vbo_mesh_print(&tetrahedron_mesh2); vbo_mesh_print(&cube_mesh); vbo_mesh_print(&cube_mesh2); struct Shader flat_shader = {0}; shader_create(&flat_shader); shader_attach(&flat_shader, GL_VERTEX_SHADER, "prefix.vert", 1, "flat_shading.vert"); shader_attach(&flat_shader, GL_FRAGMENT_SHADER, "prefix.frag", 1, "flat_shading.frag"); shader_make_program(&flat_shader, "flat_shader"); Vec4f light_direction = { 0.2, -0.5, -1.0 }; shader_set_uniform_3f(&flat_shader, flat_shader.program, SHADER_UNIFORM_LIGHT_DIRECTION, 3, GL_FLOAT, light_direction); Color ambiance = {50, 25, 150, 255 }; shader_set_uniform_4f(&flat_shader, flat_shader.program, SHADER_UNIFORM_AMBIENT_LIGHT, 4, GL_UNSIGNED_BYTE, ambiance); struct Arcball arcball = {0}; arcball_create(window, (Vec4f){0.0,8.0,8.0,1.0}, (Vec4f){0.0,0.0,0.0,1.0}, 0.1, 100.0, &arcball); Mat identity; mat_identity(identity); Quat grid_rotation = {0}; quat_from_vec_pair((Vec4f){0.0, 0.0, 1.0, 1.0}, (Vec4f){0.0, 1.0, 0.0, 1.0}, grid_rotation); Mat grid_transform = {0}; quat_to_mat(grid_rotation, grid_transform); draw_grid(&global_static_canvas, 0, grid_transform, (Color){127, 127, 127, 255}, 0.03f, 12.0f, 12.0f, 12); while (true) { SDL_Event event; while( SDL_PollEvent(&event) ) { switch (event.type) { case SDL_QUIT: goto done; case SDL_KEYDOWN: { SDL_KeyboardEvent* key_event = (SDL_KeyboardEvent*)&event; if(key_event->keysym.scancode == SDL_SCANCODE_ESCAPE) { goto done; } break; } } arcball_event(&arcball, event); } sdl2_gl_set_swap_interval(1); ogl_debug( glClearDepth(1.0f); glClearColor(.0f, .0f, .0f, 1.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); ); Mat transform = {0}; mat_translate(identity, (float[4]){ -1.0, 1.0, -1.0, 1.0 }, transform);
int32_t main(int32_t argc, char *argv[]) { printf("<<watchlist//>>\n"); if( init_sdl2() ) { return 1; } uint32_t width = 1280; uint32_t height = 720; SDL_Window* window; sdl2_window("test-canvas", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, &window); SDL_GLContext* context; sdl2_glcontext(3, 2, window, &context); if( init_shader() ) { return 1; } if( init_canvas() ) { return 1; } printf("sizeof(struct Canvas): %zu\n", sizeof(struct Canvas)); printf("MAX_OGL_PRIMITIVES: %d\n", MAX_OGL_PRIMITIVES); struct Arcball arcball = {0}; arcball_create(width, height, (Vec4f){1.0,2.0,8.0,1.0}, (Vec4f){0.0,0.0,0.0,1.0}, 0.01, 1000.0, &arcball); struct Character symbols[256] = {0}; default_font_create(symbols); struct Shader shader = {0}; shader_create(&shader); shader_attach(&shader, GL_VERTEX_SHADER, "prefix.vert", 1, "volumetric_lines.vert"); shader_attach(&shader, GL_FRAGMENT_SHADER, "prefix.frag", 1, "volumetric_lines.frag"); shader_make_program(&shader, SHADER_DEFAULT_NAMES, "lines_shader"); struct Font font = {0}; font_create_from_characters(L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,:;", 256, symbols, 9, 3, global_default_font_palette, &font); struct Canvas text_canvas = {0}; canvas_create("text_canvas", &text_canvas); canvas_add_attribute(&text_canvas, SHADER_ATTRIBUTE_VERTEX, 3, GL_FLOAT); canvas_add_attribute(&text_canvas, SHADER_ATTRIBUTE_VERTEX_COLOR, 4, GL_UNSIGNED_BYTE); canvas_add_attribute(&text_canvas, SHADER_ATTRIBUTE_VERTEX_TEXCOORD, 2, GL_FLOAT); log_assert( canvas_add_shader(&text_canvas, shader.name, &shader) < MAX_CANVAS_SHADER ); log_assert( canvas_add_font(&text_canvas, "other_font", &font) < MAX_CANVAS_FONTS ); struct GameTime time = {0}; gametime_create(1.0f / 60.0f, &time); SDL_SetEventFilter(event_filter, NULL); while (true) { SDL_Event event; while( sdl2_poll_event(&event) ) { if( sdl2_handle_quit(event) ) { goto done; } sdl2_handle_resize(event); arcball_handle_resize(&arcball, event); arcball_handle_mouse(&arcball, event); } gametime_advance(&time, sdl2_time_delta()); sdl2_debug( SDL_GL_SetSwapInterval(1) ); ogl_debug( glClearDepth(1.0f); glClearColor(.0f, .0f, .0f, 1.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); ); draw_grid(&text_canvas, 0, (Mat)IDENTITY_MAT, (Color){20, 180, 240, 255}, 0.02f, 12.0f, 12.0f, 12); draw_basis(&text_canvas, 1, (Mat)IDENTITY_MAT, 0.02f, 1.0f); Mat text_matrix = {0}; Quat text_rotation = {0}; quat_from_axis_angle((Vec4f){1.0, 0.0, 0.0, 1.0}, PI/2, text_rotation); mat_rotate(NULL, text_rotation, text_matrix); mat_translate(text_matrix, (Vec4f){-3.5, -1.0, 6.25, 1.0}, text_matrix); Vec4f world_cursor = {0,0,0,1}; text_put_world(&text_canvas, 0, world_cursor, text_matrix, (Color){0, 255, 255, 255}, 0.5f, "other_font", L"Dies ist ein Test\n"); text_put_world(&text_canvas, 0, world_cursor, text_matrix, (Color){255, 255, 0, 255}, 0.5f, "other_font", L"fuer einen Text"); gametime_integrate(&time); Vec4f screen_cursor = {0,0,0,1}; double fps = text_show_fps(&global_dynamic_canvas, 0, screen_cursor, 0, 0, (Color){255, 255, 255, 255}, 20.0f, "default_font", time.frame); /* text_show_time(&text_canvas, screen_cursor, 0, "default_font", 20.0, (Color){255, 255, 255, 255}, 0, 0, time.t); */ /* text_put_screen(&text_canvas, screen_cursor, 0, "default_font", 20.0, (Color){255, 210, 255, 255}, 0, 0, L"LALA singt das Meerschweinchen\n"); */ /* text_put_screen(&text_canvas, screen_cursor, 0, "default_font", 20.0, (Color){0, 210, 255, 255}, 0, 0, L"FICKEN immer und ueberall\n"); */ /* text_put_screen(&text_canvas, screen_cursor, 0, "default_font", 20.0, (Color){20, 210, 110, 255}, 0, 0, L"FUMMELN den ganzen Tag lang\n"); */ /* text_printf(&text_canvas, screen_cursor, 0, "default_font", 20.0, (Color){255, 40, 60, 255}, 0, 0, L"PRINTF %d Luftballons\n", 99); */ canvas_render_layers(&text_canvas, 0, MAX_CANVAS_LAYERS, &arcball.camera, (Mat)IDENTITY_MAT); canvas_clear(&text_canvas); canvas_render_layers(&global_dynamic_canvas, 0, MAX_CANVAS_LAYERS, &arcball.camera, (Mat)IDENTITY_MAT); canvas_clear(&global_dynamic_canvas); sdl2_debug( SDL_GL_SwapWindow(window) ); }
int32_t main(int32_t argc, char *argv[]) { printf("<<watchlist//>>\n"); if( init_sdl2() ) { return 1; } int32_t width = 1280; int32_t height = 720; SDL_Window* window; sdl2_window("cute3d: " __FILE__, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, &window); SDL_GLContext* context; sdl2_glcontext(3, 2, window, &context); if( init_shader() ) { return 1; } if( init_canvas(width, height) ) { return 1; } canvas_create("global_dynamic_canvas", &global_dynamic_canvas); struct Arcball arcball = {0}; arcball_create(width, height, (Vec4f){0.0,6.0,10.0,1.0}, (Vec4f){0.0,0.0,0.0,1.0}, 0.001f, 100.0, &arcball); struct GameTime time = {0}; gametime_create(1.0f / 60.0f, &time); Vec4f a = {0.0f, 0.0f, 1.0f}; Vec4f b = {1.0f, 0.0f, 1.0f}; draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){25, 255, 25, 255}, 0.01f, a, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 1.0f); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 25, 25, 255}, 0.01f, b, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 1.0f); Quat axis_angle_rot = {0}; quat_from_axis_angle((Vec4f)Y_AXIS, PI/4, axis_angle_rot); draw_quaternion(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 255, 255, 255}, (Color){255, 0, 255, 255}, 0.01f, axis_angle_rot, 2.0f); vec_print("axis_angle_rot: ", axis_angle_rot); Vec4f axis_angle_result = {0}; vec_rotate(a, axis_angle_rot, axis_angle_result); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 255, 25, 255}, 0.01f, axis_angle_result, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 2.0f); Vec4f axis = {0}; float angle = 0.0f; quat_to_axis_angle(axis_angle_rot, axis, &angle); Quat axis_angle_rot2 = {0}; quat_from_axis_angle(axis, angle, axis_angle_rot2); vec_print("axis_angle_rot2: ", axis_angle_rot2); Quat euler_angles_rot = {0}; quat_from_euler_angles(0.0f, PI/4, 0.0f, euler_angles_rot); vec_print("euler_angles_rot: ", euler_angles_rot); Vec4f euler_angles_result = {0}; vec_rotate(a, euler_angles_rot, euler_angles_result); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){25, 255, 255, 255}, 0.01f, euler_angles_result, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 3.0f); Quat vec_pair_rot = {0}; quat_from_vec_pair(a, b, vec_pair_rot); vec_print("vec_pair_rot: ", vec_pair_rot); Vec4f vec_pair_result = {0}; vec_rotate(a, vec_pair_rot, vec_pair_result); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 25, 255, 255}, 0.01f, vec_pair_result, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 4.0f); Mat xaxis_control = {0}; xaxis_control[0] = 1; xaxis_control[4] = 0; xaxis_control[8] = 0; xaxis_control[12] = 0; xaxis_control[1] = 0; xaxis_control[5] = cosf(PI/4); xaxis_control[9] = -sinf(PI/4); xaxis_control[13] = 0; xaxis_control[2] = 0; xaxis_control[6] = sinf(PI/4); xaxis_control[10] = cosf(PI/4); xaxis_control[14] = 0; xaxis_control[3] = 0; xaxis_control[7] = 0; xaxis_control[11] = 0; xaxis_control[15] = 1; mat_print("xaxis_control: ", xaxis_control); Quat xaxis_rot = {0}; quat_from_axis_angle((Vec4f)X_AXIS, PI/4, xaxis_rot); Mat xaxis_mat = {0}; quat_to_mat(xaxis_rot, xaxis_mat); mat_print("xaxis_mat: ", xaxis_mat); Mat yaxis_control = {0}; yaxis_control[0] = cosf(PI/4); yaxis_control[4] = 0; yaxis_control[8] = sinf(PI/4); yaxis_control[12] = 0; yaxis_control[1] = 0; yaxis_control[5] = 1; yaxis_control[9] = 0; yaxis_control[13] = 0; yaxis_control[2] = -sinf(PI/4); yaxis_control[6] = 0; yaxis_control[10] = cosf(PI/4); yaxis_control[14] = 0; yaxis_control[3] = 0; yaxis_control[7] = 0; yaxis_control[11] = 0; yaxis_control[15] = 1; mat_print("yaxis_control: ", yaxis_control); Quat yaxis_rot = {0}; quat_from_axis_angle((Vec4f)Y_AXIS, PI/4, yaxis_rot); Mat yaxis_mat = {0}; quat_to_mat(yaxis_rot, yaxis_mat); mat_print("yaxis_mat: ", yaxis_mat); Mat zaxis_control = {0}; zaxis_control[0] = cosf(PI/4); zaxis_control[4] = -sinf(PI/4); zaxis_control[8] = 0; zaxis_control[12] = 0; zaxis_control[1] = sinf(PI/4); zaxis_control[5] = cosf(PI/4); zaxis_control[9] = 0; zaxis_control[13] = 0; zaxis_control[2] = 0; zaxis_control[6] = 0; zaxis_control[10] = 1; zaxis_control[14] = 0; zaxis_control[3] = 0; zaxis_control[7] = 0; zaxis_control[11] = 0; zaxis_control[15] = 1; mat_print("zaxis_control: ", zaxis_control); Quat zaxis_rot = {0}; quat_from_axis_angle((Vec4f)Z_AXIS, PI/4, zaxis_rot); Mat zaxis_mat = {0}; quat_to_mat(zaxis_rot, zaxis_mat); mat_print("zaxis_mat: ", zaxis_mat); draw_grid(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){120, 120, 120, 255}, 0.01f, 12.0f, 12.0f, 12); while(true) { SDL_Event event; while( sdl2_poll_event(&event) ) { if( sdl2_handle_quit(event) ) { goto done; } sdl2_handle_resize(event); arcball_handle_resize(&arcball, event); arcball_handle_mouse(&arcball, event); } sdl2_gl_set_swap_interval(0); ogl_debug( glClearDepth(1.0f); glClearColor(.0f, .0f, .0f, 1.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); ); gametime_advance(&time, sdl2_time_delta()); gametime_integrate(&time); canvas_render_layers(&global_static_canvas, 0, MAX_CANVAS_LAYERS, &arcball.camera, (Mat)IDENTITY_MAT); sdl2_gl_swap_window(window); }
int32_t main(int32_t argc, char *argv[]) { printf("<<watchlist//>>\n"); if( init_sdl2() ) { return 1; } int32_t width = 1280; int32_t height = 720; SDL_Window* window; sdl2_window("cute3d: " __FILE__, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, &window); SDL_GLContext* context; sdl2_glcontext(3, 2, window, &context); if( init_shader() ) { return 1; } if( init_vbo() ) { return 1; } if( init_canvas(1280,720) ) { return 1; } canvas_create("global_dynamic_canvas", &global_dynamic_canvas); canvas_create("global_static_canvas", &global_static_canvas); struct Vbo vbo = {0}; vbo_create(&vbo); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX_NORMAL, 3, GL_FLOAT, GL_STATIC_DRAW); vbo_add_buffer(&vbo, SHADER_ATTRIBUTE_VERTEX_COLOR, 4, GL_UNSIGNED_BYTE, GL_STATIC_DRAW); struct Ibo ibo = {0}; ibo_create(GL_TRIANGLES, GL_UNSIGNED_INT, GL_STATIC_DRAW, &ibo); struct CollisionEntity entity_a = {0}; entity_create("red", (Color){ 255, 0, 0, 255 }, &vbo, &ibo, &entity_a); /* quat_mul_axis_angle(entity_a.pivot.orientation, (Vec4f)UP_AXIS, PI/4, entity_a.pivot.orientation); */ /* quat_mul_axis_angle(entity_a.pivot.orientation, (Vec4f)RIGHT_AXIS, PI/2 + 0.2, entity_a.pivot.orientation); */ vec_add(entity_a.pivot.position, (Vec4f){0.2, 0.15, 0.8, 1.0}, entity_a.pivot.position); struct CollisionEntity entity_b = {0}; entity_create("green", (Color){ 0, 255, 0, 255 }, &vbo, &ibo, &entity_b); quat_mul_axis_angle(entity_b.pivot.orientation, (Vec4f)RIGHT_AXIS, PI/4 - 0.2, entity_b.pivot.orientation); quat_mul_axis_angle(entity_b.pivot.orientation, (Vec4f)UP_AXIS, PI/2 + 0.0, entity_b.pivot.orientation); struct Shader flat_shader = {0}; shader_create(&flat_shader); shader_attach(&flat_shader, GL_VERTEX_SHADER, "prefix.vert", 1, "flat_shading.vert"); shader_attach(&flat_shader, GL_FRAGMENT_SHADER, "prefix.frag", 1, "flat_shading.frag"); shader_make_program(&flat_shader, SHADER_DEFAULT_NAMES, "flat_shader"); Vec4f light_direction = { 0.2, -0.5, -1.0 }; shader_set_uniform_3f(&flat_shader, flat_shader.program, SHADER_UNIFORM_LIGHT_DIRECTION, 3, GL_FLOAT, light_direction); Color ambiance = { 65, 25, 50, 255 }; shader_set_uniform_4f(&flat_shader, flat_shader.program, SHADER_UNIFORM_AMBIENT_LIGHT, 4, GL_UNSIGNED_BYTE, ambiance); struct Arcball arcball = {0}; arcball_create(width, height, (Vec4f){5.0, 3.0, 5.0, 1.0}, (Vec4f){0.0, 0.0, 0.0, 1.0}, 1.0, 1000.0, &arcball); size_t num_entities = 2; struct PickingSphere* picking_spheres[2]; picking_spheres[0] = &entity_a.picking_sphere; picking_spheres[1] = &entity_b.picking_sphere; struct CollisionEntity* picking_entities[2]; picking_entities[0] = &entity_a; picking_entities[1] = &entity_b; struct GameTime time = {0}; gametime_create(1.0f / 60.0f, &time); draw_grid(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){127, 127, 127, 127}, 0.01f, 12.0f, 12.0f, 12); while (true) { SDL_Event event; while( sdl2_poll_event(&event) ) { if( sdl2_handle_quit(event) ) { goto done; } sdl2_handle_resize(event); if( picking_sphere_drag_event(&arcball.camera, num_entities, picking_spheres, event) ) { struct CollisionEntity* selected_entity = NULL; float nearest = -FLT_MIN; for( size_t i = 0; i < num_entities; i++ ) { if( picking_spheres[i]->picked && ( picking_spheres[i]->front < nearest || nearest < 0.0f ) ) { nearest = picking_spheres[i]->front; selected_entity = picking_entities[i]; } } static int32_t last_x = -1; static int32_t last_y = -1; if( selected_entity != NULL ) { if( last_x > -1 && last_y > -1 ) { float distance = selected_entity->picking_sphere.front; Vec4f a = {0}; camera_ray(&arcball.camera, CAMERA_PERSPECTIVE, last_x, last_y, a); vec_mul1f(a, distance, a); Vec4f b = {0}; camera_ray(&arcball.camera, CAMERA_PERSPECTIVE, event.motion.x, event.motion.y, b); vec_mul1f(b, distance, b); Vec4f move = {0}; vec_sub(b, a, move); float length = vec_length(move); move[1] = 0.0f; vec_normalize(move, move); vec_mul1f(move, length, move); vec_add(selected_entity->pivot.position, move, selected_entity->pivot.position); } last_x = event.motion.x; last_y = event.motion.y; } if( event.type == SDL_MOUSEBUTTONUP ) { last_x = -1; last_y = -1; } } else { arcball_handle_resize(&arcball, event); arcball_handle_mouse(&arcball, event); } } sdl2_gl_set_swap_interval(0); gametime_advance(&time, sdl2_time_delta()); ogl_debug( glClearDepth(1.0f); glClearColor(.0f, .0f, .0f, 1.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); ); Mat projection_mat = {0}; Mat view_mat = {0}; camera_matrices(&arcball.camera, CAMERA_PERSPECTIVE, projection_mat, view_mat); Mat identity = {0}; mat_identity(identity); Mat transform_a = {0}; pivot_world_transform(&entity_a.pivot, transform_a); //vbo_mesh_render(&entity_a.vbo_mesh, &flat_shader, &arcball.camera, transform_a); draw_halfedgemesh_wire(&global_dynamic_canvas, 0, transform_a, (Color){255, 0, 0, 255}, 0.02f, &entity_a.hemesh); Mat transform_b = {0}; pivot_world_transform(&entity_b.pivot, transform_b); //vbo_mesh_render(&entity_b.vbo_mesh, &flat_shader, &arcball.camera, transform_b); draw_halfedgemesh_wire(&global_dynamic_canvas, 0, transform_b, (Color){0, 255, 0, 255}, 0.02f, &entity_b.hemesh); Mat between_transform = {0}; pivot_between_transform(&entity_a.pivot, &entity_b.pivot, between_transform); Vec3f foo = {0}; mat_mul_vec(between_transform, entity_a.hemesh.vertices.array[0].position, foo); struct CollisionConvexConvex collision = {0}; struct CollisionParameter collision_parameter = { .face_tolerance = 0.9, .edge_tolerance = 0.95, .absolute_tolerance = 0.025 }; collision_create_convex_convex(&entity_a.hemesh, &entity_a.pivot, &entity_b.hemesh, &entity_b.pivot, collision_parameter, &collision); if( collision_test_convex_convex(&collision) ) { collision_contact_convex_convex(&collision); //printf("//collision: %d\n", collision_counter); const struct Contacts* contacts = &collision.contacts; VecP* m = contacts->points[contacts->num_contacts-1]; for( int32_t i = 0; i < contacts->num_contacts; i++ ) { VecP* n = contacts->points[i]; draw_line(&global_dynamic_canvas, 0, transform_b, (Color){255, 255, 255, 255}, 0.08f, m, n); m = n; } } gametime_integrate(&time); Vec4f screen_cursor = {0,0,0,1}; text_show_fps(&global_dynamic_canvas, 0, screen_cursor, 0, 0, (Color){255, 255, 255, 255}, 20.0, "default_font", time.frame); canvas_render_layers(&global_static_canvas, 0, 0, &arcball.camera, (Mat)IDENTITY_MAT); canvas_render_layers(&global_dynamic_canvas, 0, 0, &arcball.camera, (Mat)IDENTITY_MAT); canvas_clear(&global_dynamic_canvas); sdl2_gl_swap_window(window); } done: SDL_Quit(); printf("done\n"); return 0; }