void test_conversion_functions(void) { chunk_size memsiz = 1 Mb; Priv_mem new_mem = malloc(sizeof(priv_mem)); new_mem->as = malloc(sizeof(addressspace)); new_mem->as->start = malloc(memsiz); new_mem->as->end = new_mem->as->start + memsiz; new_mem->lists = create_lists(new_mem->as->start, memsiz, ASCENDING_SIZE); new_mem->functions.manual.alloc = &manual_alloc; new_mem->functions.manual.avail = &avail; new_mem->functions.manual.free = &priv_free; Manual new_manual = (Manual) priv_to_style((Priv_mem) new_mem); CU_ASSERT(new_manual->alloc == &manual_alloc); CU_ASSERT(new_manual->avail == &avail); CU_ASSERT(new_manual->free == &priv_free); Priv_mem compare_priv = (Priv_mem) style_to_priv((Memory) new_manual); CU_ASSERT(new_mem->as->start == compare_priv->as->start); CU_ASSERT(new_mem->as->end == compare_priv->as->end); CU_ASSERT(new_mem->lists == compare_priv->lists); CU_ASSERT(new_mem->functions.manual.alloc == compare_priv->functions.manual.alloc); CU_ASSERT(new_mem->functions.manual.avail == compare_priv->functions.manual.avail); CU_ASSERT(new_mem->functions.manual.free == compare_priv->functions.manual.free); free_lists(new_mem->lists); free(new_mem->as->start); free(new_mem); }
void CL_EarClipTriangulator_Impl::end_hole() { create_lists(false); target_array = &vertices; // To be able to triangulate holes the inner and outer vertice arrays are connected // so that there isn't actually any hole, just a single polygon with a small gap // eliminating the hole. // // 1. find point on inner contour closest to a vertice on the outer contour. // // 2. Create bridge start and end points by offsetting the new vertices a bit along the edges to the next and prev vertices. // LinkedVertice *outer_vertice = 0; LinkedVertice *segment_start; LinkedVertice *segment_end; CL_Pointf inner_point; float inner_point_rel; float distance = FLT_MAX; for (unsigned int vertex_cnt = 0; vertex_cnt < vertices.size(); vertex_cnt++) { CL_Pointf tmp_outer_point = CL_Pointf(vertices[vertex_cnt]->x,vertices[vertex_cnt]->y); for (unsigned int hole_cnt = 0; hole_cnt < hole.size(); hole_cnt++) { CL_Pointf tmp_line_start(hole[hole_cnt]->x, hole[hole_cnt]->y); CL_Pointf tmp_line_end(hole[hole_cnt]->next->x, hole[hole_cnt]->next->y); CL_Pointf tmp_inner_point = CL_LineMath::closest_point(tmp_outer_point, tmp_line_start, tmp_line_end); float tmp_distance = tmp_inner_point.distance(tmp_outer_point); if( tmp_distance < distance ) { inner_point_rel = CL_LineMath::closest_point_relative(tmp_outer_point, tmp_line_start, tmp_line_end); distance = tmp_distance; outer_vertice = vertices[vertex_cnt]; inner_point = tmp_inner_point; segment_start = hole[hole_cnt]; segment_end = hole[hole_cnt]->next; } } } LinkedVertice *outer_bridge_start = new LinkedVertice(); LinkedVertice *outer_bridge_end = new LinkedVertice(); LinkedVertice *inner_bridge_start = new LinkedVertice(); LinkedVertice *inner_bridge_end = new LinkedVertice(); // offset new points along old edges CL_Pointf outer_point(outer_vertice->x, outer_vertice->y); set_bridge_vertice_offset( outer_bridge_start, outer_point, 0.0, outer_vertice, outer_vertice->previous, 1 ); set_bridge_vertice_offset( outer_bridge_end, outer_point, 0.0, outer_vertice, outer_vertice->next, 1 ); set_bridge_vertice_offset( inner_bridge_start, inner_point, inner_point_rel, segment_start, segment_end, 1 ); set_bridge_vertice_offset( inner_bridge_end, inner_point, inner_point_rel, segment_start, segment_end, -1 ); // update next pointers to ignore old vertices // connections between inner and outer contours outer_bridge_start->next = inner_bridge_start; inner_bridge_end->next = outer_bridge_end; // connections between new and old vertices: outer contour outer_bridge_end->next = outer_vertice->next; outer_vertice->previous->next = outer_bridge_start; // connections between new and old vertices: inner contour inner_bridge_start->next = segment_end; segment_start->next = inner_bridge_end; delete outer_vertice; outer_vertice = 0; if( inner_point_rel == 0.0 ) // if split point is at line end, remove inner vertex { segment_start->previous->next = inner_bridge_end; delete segment_start; segment_start = 0; } if( inner_point_rel == 1.0 ) // if split point is at line end, remove inner vertex { inner_bridge_start->next = segment_end->next; delete segment_end; segment_end = 0; } hole.clear(); // rebuild the vector... vertices.clear(); LinkedVertice *test = inner_bridge_start; do { vertices.push_back(test); test = test->next; } while( test != inner_bridge_start ); // print the bridge start and end points: /* cl_write_console_line("outer_point: %1 %2", outer_point.x, outer_point.y ); cl_write_console_line("inner_point: %1 %2", inner_point.x, inner_point.y ); cl_write_console_line("inner_bridge_end: %1 %2", inner_bridge_end->x, inner_bridge_end->y ); cl_write_console_line("outer_bridge_end: %1 %2", outer_bridge_end->x, outer_bridge_end->y ); cl_write_console_line("inner_bridge_start: %1 %2", inner_bridge_start->x, inner_bridge_start->y ); cl_write_console_line("outer_bridge_start: %1 %2", outer_bridge_start->x, outer_bridge_start->y ); */ }
int main() { Display *dpy; int fbattrib[] = { GLX_DOUBLEBUFFER, True, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 8, GLX_SAMPLE_BUFFERS, 1, GLX_SAMPLES, 1, None }; int eventbase, errorbase; int screen; Window root, win; XVisualInfo *visinfo; XSetWindowAttributes attr; GLXContext ctx; GLXFBConfig *fbconfig; int i, numfbconfig, maxsample = 0; int bestfbi = 0, value; dpy = XOpenDisplay(NULL); if(NULL == dpy) { fprintf(stderr, "error: unable to open display!\n"); return EXIT_FAILURE; } if(!glXQueryExtension(dpy, &eventbase, &errorbase)) { fprintf(stderr, "GLX is not available!\n"); return EXIT_FAILURE; } screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); fbconfig = glXChooseFBConfig(dpy, screen, fbattrib, &numfbconfig); if(NULL == fbconfig) { fprintf(stderr, "error: choosing GLXFBConfig!\n"); return EXIT_FAILURE; } for(i = 0; i < numfbconfig; ++i) { glXGetFBConfigAttrib(dpy, fbconfig[i], GLX_SAMPLES, &value); if(value > maxsample) { bestfbi = i; maxsample = value; } } glXGetFBConfigAttrib(dpy, fbconfig[bestfbi], GLX_SAMPLES, &value); printf("peak GLX_SAMPLES %d\n", value); visinfo = glXGetVisualFromFBConfig(dpy, fbconfig[bestfbi]); if (!visinfo) { fprintf(stderr, "error: couldn't get an RGBA, double-buffered visual!\n"); return EXIT_FAILURE; } printf("visinfo->visualid %lx\n", visinfo->visualid); glXGetFBConfigAttrib(dpy, fbconfig[bestfbi], GLX_FBCONFIG_ID, &value); printf("fbconfig id 0x%x\n", value); attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask; win = XCreateWindow(dpy, root, /*x*/ 0, /*y*/ 0, /*width*/ 400, /*height*/ 400, 0, visinfo->depth, InputOutput, visinfo->visual, CWBackPixel | CWBorderPixel | CWColormap | CWEventMask, &attr); ctx = glXCreateNewContext(dpy, fbconfig[bestfbi], GLX_WINDOW_BIT, NULL, True); if (!ctx) { fprintf(stderr, "error: glXCreateNewContext failed!\n"); return EXIT_FAILURE; } XMapWindow(dpy, win); if(!glXMakeCurrent(dpy, win, ctx)) { fprintf(stderr, "error: making context current!\n"); return EXIT_FAILURE; } printf("GL_RENDERER %s\n", (char *) glGetString(GL_RENDERER)); glEnable(GL_MULTISAMPLE); create_lists(); { GLint alpha, red, green; GLboolean dbuf; glGetIntegerv(GL_RED_BITS, &red); printf("glGetIntegerv(GL_RED_BITS) %d\n", red); glGetIntegerv(GL_GREEN_BITS, &green); printf("glGetIntegerv(GL_GREEN_BITS) %d\n", green); glGetIntegerv(GL_ALPHA_BITS, &alpha); printf("glGetIntegerv(GL_ALPHA_BITS) %d\n", alpha); glGetBooleanv(GL_DOUBLEBUFFER, &dbuf); printf("glGetBooleanv(GL_DOUBLEBUFFER) %d\n", dbuf); GLint aux; glGetIntegerv(GL_AUX_BUFFERS, &aux); printf("aux buffers %d\n", aux); GLint ared; glGetIntegerv(GL_ACCUM_RED_BITS, &ared); printf("accum red bits %d\n", ared); } event_loop(dpy); return EXIT_SUCCESS; }
CL_EarClipResult CL_EarClipTriangulator_Impl::triangulate() { create_lists(true); int num_triangles = vertices.size()-2; int tri_count = 0; CL_EarClipResult result(num_triangles); while( tri_count < num_triangles ) { if( ear_list.empty() ) // something went wrong, but lets not crash anyway. break; LinkedVertice *v = ear_list.back(); ear_list.pop_back(); CL_EarClipTriangulator_Triangle tri; tri.x1 = v->x; tri.y1 = v->y; tri.x2 = v->previous->x; tri.y2 = v->previous->y; tri.x3 = v->next->x; tri.y3 = v->next->y; result.get_triangles().push_back(tri); v->next->previous = v->previous; v->previous->next = v->next; if( is_ear(*v->next) ) { if( v->next->is_ear == false ) // not marked as an ear yet. Mark it, and add to the list. { v->next->is_ear = true; ear_list.push_back(v->next); } } else { if( v->next->is_ear == true ) // Not an ear any more. Delete from ear list. { v->next->is_ear = false; std::vector<LinkedVertice*>::iterator it; for( it = ear_list.begin(); it != ear_list.end(); ++it ) { if( (*it) == v->next ) { ear_list.erase(it); break; } } } } if( is_ear(*v->previous) ) { if( v->previous->is_ear == false ) // not marked as an ear yet. Mark it, and add to the list. { v->previous->is_ear = true; ear_list.push_back(v->previous); } } else { if( v->previous->is_ear == true ) // Not an ear any more. Delete from ear list. { v->previous->is_ear = false; std::vector<LinkedVertice*>::iterator it; for( it = ear_list.begin(); it != ear_list.end(); ++it ) { if( (*it) == v->previous ) { ear_list.erase(it); break; } } } } /* cl_write_console_line("Ear list:"); for( std::vector<LinkedVertice*>::iterator it = ear_list.begin(); it != ear_list.end(); ++it ) { cl_write_console_line(" (%1,%2)", (*it)->x, (*it)->y ); } cl_write_console_line(""); */ tri_count++; } // cl_write_console_line("num triangles - final: %1", tri_count ); return result; }
int main(int argc, char **argv) { glutInit(&argc,argv); my_setup(canvas_Width,canvas_Height,canvas_Name); vector <int >new_fan; if(argc!=2){ cout<<"<usuage>:mismatched arguments"<<endl; exit(0); } ifstream mesh_input(argv[1]); if(mesh_input.is_open()) read_input_mesh(mesh_input,v_count,f_count,d_vb,d_ib); else{ cout<<"Cannot open input mesh"<<endl; exit(0); } mesh_input.close();//Finised with reading mesh data vector < vector<int> >fan(v_count); vector < vector<edge> >e(v_count); create_lists(e,d_ib,f_count); //delete[]d_ib;//done with index buffer list triangle_fan_create(e,d_vb,fan); output=new vertex_buffer[v_count]; size=fan[0].size(); for(int i=0;i<fan.size();i++){ for(int j=0;j<size;j++){ new_fan.push_back(fan[i][j]); } } test=&new_fan[0]; clock_t start=clock(); for(int i=0;i<10;i++) zhou_shimada(d_vb,output,test,fan[0].size(),v_count); clock_t stop=clock(); cout<<"Elapsed time="<<(double)((stop-start))/CLOCKS_PER_SEC<<endl; // print_output(output,v_count); glutDisplayFunc(display_func); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }