X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmain.c;h=f7688b9eb920414f4695d9014b000640bf940289;hb=b38189d375ff492f1b4090efc728770e4900c1e0;hp=cde4df3ba14659790a729137b6d3fc1ab17f5125;hpb=3ef1d1967a6391f91117ebdcd828423cc8fdb946;p=geometrycompositor.git diff --git a/source/main.c b/source/main.c index cde4df3..f7688b9 100644 --- a/source/main.c +++ b/source/main.c @@ -32,6 +32,12 @@ typedef struct CompositedWindow int recreate_mask; } CompositedWindow; +enum +{ + CYLINDRICAL = 1, + SPHERICAL +}; + typedef struct CompositedMonitor { char *name; @@ -41,7 +47,8 @@ typedef struct CompositedMonitor unsigned width; unsigned height; float keystone_vertical; - float cylinder_depth; + float curvature_type; + float curvature_depth; float vertical_center; float perspective; unsigned vertex_buffer; @@ -596,8 +603,8 @@ void update_monitor_vertices(CompositedScreen *screen, CompositedMonitor *monito unsigned x, y; unsigned i; float aspect; - float cyl_radius; - float cyl_arc; + float curve_radius; + float curve_arc; float sin_ksv; float cos_ksv; float distance; @@ -611,15 +618,17 @@ void update_monitor_vertices(CompositedScreen *screen, CompositedMonitor *monito aspect = (float)monitor->width/monitor->height; - if(monitor->cylinder_depth) + if(monitor->curvature_depth) { - cyl_radius = (monitor->cylinder_depth*monitor->cylinder_depth+0.25f)/(2.0f*monitor->cylinder_depth); - cyl_arc = 2.0f*asin(0.5f/cyl_radius); + curve_radius = (monitor->curvature_depth*monitor->curvature_depth+0.25f)/(2.0f*monitor->curvature_depth); + curve_arc = 2.0f*asin(0.5f/curve_radius); } sin_ksv = monitor->keystone_vertical/sqrt(1.0f+monitor->keystone_vertical*monitor->keystone_vertical); cos_ksv = sqrt(1.0f-sin_ksv*sin_ksv); distance = monitor->perspective+sin_ksv*((sin_ksv>0)-monitor->vertical_center)/aspect; + if(monitor->curvature_depth<0) + distance += -monitor->curvature_depth; eye[0] = 0.0f; eye[1] = (monitor->vertical_center-0.5f)/aspect+sin_ksv*distance; @@ -638,26 +647,40 @@ void update_monitor_vertices(CompositedScreen *screen, CompositedMonitor *monito v[0] = (float)x/t-0.5f; v[1] = ((float)y/t-0.5f)/aspect; v[2] = 0; - if(monitor->cylinder_depth) + if(monitor->curvature_depth) { - v[2] = (1.0f-cos(v[0]*cyl_arc))*cyl_radius-monitor->cylinder_depth; - v[0] = sin(v[0]*cyl_arc)*cyl_radius; + if(monitor->curvature_type==CYLINDRICAL) + { + v[2] = (1.0f-cos(v[0]*curve_arc))*curve_radius-monitor->curvature_depth; + v[0] = sin(v[0]*curve_arc)*curve_radius; + } + else if(monitor->curvature_type==SPHERICAL) + { + float r; + + v[0] = tan(v[0]*curve_arc)*curve_radius; + v[1] = tan(v[1]*curve_arc)*curve_radius; + r = sqrt(v[0]*v[0]+v[1]*v[1]+curve_radius*curve_radius)/fabs(curve_radius); + v[0] /= r; + v[1] /= r; + v[2] = curve_radius-curve_radius/r-monitor->curvature_depth; + } } } monitor->geometry_data[0] = t; for(i=0; i<3; ++i) - monitor->geometry_data[1+i] = eye[i]*10000; + monitor->geometry_data[1+i] = eye[i]*4096; for(y=0; y<2; ++y) for(x=0; x<2; ++x) { i = 1+(1+y*2+x)*3; - monitor->geometry_data[i] = ((x-0.5f)*distance/monitor->perspective)*10000; - monitor->geometry_data[i+1] = (eye[1]+look[1]*distance-(y-monitor->vertical_center)*look[2]*distance/monitor->perspective/aspect)*10000; - monitor->geometry_data[i+2] = (eye[2]+look[2]*distance+(y-monitor->vertical_center)*look[1]*distance/monitor->perspective/aspect)*10000; + monitor->geometry_data[i] = ((x-0.5f)*distance/monitor->perspective)*4096; + monitor->geometry_data[i+1] = (eye[1]+look[1]*distance-(y-monitor->vertical_center)*look[2]*distance/monitor->perspective/aspect)*4096; + monitor->geometry_data[i+2] = (eye[2]+look[2]*distance+(y-monitor->vertical_center)*look[1]*distance/monitor->perspective/aspect)*4096; } for(i=0; i<(t+1)*(t+1)*3; ++i) - monitor->geometry_data[16+i] = vertex_data[i]*10000; + monitor->geometry_data[16+i] = vertex_data[i]*4096; for(y=t; y<=t; --y) for(x=t; x<=t; --x) @@ -736,7 +759,8 @@ int initialize_monitor(Compositor *compositor, CompositedScreen *screen, XRRScre XRRFreeOutputInfo(output); monitor->keystone_vertical = 0.0f; - monitor->cylinder_depth = 0.0f; + monitor->curvature_type = CYLINDRICAL; + monitor->curvature_depth = 0.0f; monitor->vertical_center = 0.5f; monitor->perspective = 1.0f; @@ -821,7 +845,7 @@ void update_geometry_correction(Compositor *compositor, CompositedScreen *screen use_gl(compositor, screen); name_ptr = names; - for(i=0; i*4keystone_vertical = values[i*4]/10000.0f; - monitor->cylinder_depth = values[i*4+1]/10000.0f; - monitor->vertical_center = values[i*4+2]/10000.0f; - monitor->perspective = values[i*4+3]/10000.0f; + monitor->keystone_vertical = values[i*5]/4096.0f; + monitor->curvature_type = values[i*5+1]; + monitor->curvature_depth = values[i*5+2]/4096.0f; + monitor->vertical_center = values[i*5+3]/4096.0f; + monitor->perspective = values[i*5+4]/4096.0f; if(monitor->enabled) update_monitor_vertices(screen, monitor); @@ -1325,8 +1350,6 @@ void process_events(Compositor *compositor) process_damage_event(compositor, (XDamageNotifyEvent *)&event); else if(event.type==compositor->shape_event+ShapeNotify) process_shape_event(compositor, (XShapeEvent *)&event); - else - printf("Event %d\n", event.type); } } }