예제 #1
0
파일: img.c 프로젝트: polku/raytracer
void	init_scene(t_img *img)
{
	init_cam(&img->scene.cam, init_vect(-2, -2, 0));
	img->scene.light = create_light(init_vect(0, 0, -35), 0xffffff);
	img->scene.obj[0] = create_sphere(init_vect(0, 0, -10), 80, 0xffffff);
	img->scene.obj[1] = create_sphere(init_vect(-20, 24, -80), 50, 0x00ff00);
	img->scene.obj[2] = create_sphere(init_vect(10, 10, -100), 50, 0xfff700);
	img->scene.obj[3] = create_sphere(init_vect(200, 200, -150), 50, 0x0000ff);
//	img->scene.obj[4] = create_cone(init_vect(0, 0, -5), 20, 0xff00ff);
	img->scene.obj[4] = create_sphere(init_vect(600, 600, -150), 50, 0xff00ff);
	img->scene.obj[5] = create_cylinder(init_vect(2, 2, -110),
							init_vect(0, 1, 1), 50, 0x777777);
	img->scene.obj[6] = create_plane(init_vect(1, 0, 1),
							init_vect(0, 0, -200), 0xff0000);
	img->scene.obj[7] = create_plane(init_vect(0, 1, 1),
							init_vect(0, 0, -200), 0xffffcc);
}
예제 #2
0
void update_state(void){
	state.planes_num = get_airplanes(state.planes);
	state.crashed_planes = get_crashed();
	state.landed_planes = get_landed();
	state.cur_time = time(NULL);
	if (difftime(state.cur_time, state.tick_time) > 20){
		state.tick_time = state.cur_time;
		create_plane();
	}
}
예제 #3
0
int main(int argc, char ** argv)
{
	init_signal_handler();
	atc_init();
	init_UI();
	init_time();
	create_plane();
	state.airports_num = get_airports(state.airports);
	while(1){
		update_state();
		draw_UI();
		input(wgetch(ui.cmd_log));
	}
	atc_deinit();
	dispose_UI();
    return 0;
}
예제 #4
0
static int omap_modeset_init(struct drm_device *dev)
{
	const struct omap_drm_platform_data *pdata = dev->dev->platform_data;
	struct omap_kms_platform_data *kms_pdata = NULL;
	struct omap_drm_private *priv = dev->dev_private;
	struct omap_dss_device *dssdev = NULL;
	int i, j;
	unsigned int connected_connectors = 0;

	drm_mode_config_init(dev);

	if (pdata && pdata->kms_pdata) {
		kms_pdata = pdata->kms_pdata;

		/* if platform data is provided by the board file, use it to
		 * control which overlays, managers, and devices we own.
		 */
		for (i = 0; i < kms_pdata->mgr_cnt; i++) {
			struct omap_overlay_manager *mgr =
				omap_dss_get_overlay_manager(
						kms_pdata->mgr_ids[i]);
			create_encoder(dev, mgr);
		}

		for (i = 0; i < kms_pdata->dev_cnt; i++) {
			struct omap_dss_device *dssdev =
				omap_dss_find_device(
					(void *)kms_pdata->dev_names[i],
					match_dev_name);
			if (!dssdev) {
				dev_warn(dev->dev, "no such dssdev: %s\n",
						kms_pdata->dev_names[i]);
				continue;
			}
			create_connector(dev, dssdev);
		}

		connected_connectors = detect_connectors(dev);

		j = 0;
		for (i = 0; i < kms_pdata->ovl_cnt; i++) {
			struct omap_overlay *ovl =
				omap_dss_get_overlay(kms_pdata->ovl_ids[i]);
			create_crtc(dev, ovl, &j, connected_connectors);
		}

		for (i = 0; i < kms_pdata->pln_cnt; i++) {
			struct omap_overlay *ovl =
				omap_dss_get_overlay(kms_pdata->pln_ids[i]);
			create_plane(dev, ovl, (1 << priv->num_crtcs) - 1);
		}
	} else {
		/* otherwise just grab up to CONFIG_DRM_OMAP_NUM_CRTCS and try
		 * to make educated guesses about everything else
		 */
		int max_overlays = min(omap_dss_get_num_overlays(), num_crtc);

		for (i = 0; i < omap_dss_get_num_overlay_managers(); i++) {
			create_encoder(dev, omap_dss_get_overlay_manager(i));
		}

		for_each_dss_dev(dssdev) {
			create_connector(dev, dssdev);
		}

		connected_connectors = detect_connectors(dev);

		j = 0;
		for (i = 0; i < max_overlays; i++) {
			create_crtc(dev, omap_dss_get_overlay(i),
					&j, connected_connectors);
		}

		/* use any remaining overlays as drm planes */
		for (; i < omap_dss_get_num_overlays(); i++) {
			struct omap_overlay *ovl = omap_dss_get_overlay(i);
			create_plane(dev, ovl, (1 << priv->num_crtcs) - 1);
		}
	}

	/* for now keep the mapping of CRTCs and encoders static.. */
	for (i = 0; i < priv->num_encoders; i++) {
		struct drm_encoder *encoder = priv->encoders[i];
		struct omap_overlay_manager *mgr =
				omap_encoder_get_manager(encoder);

		encoder->possible_crtcs = (1 << priv->num_crtcs) - 1;

		DBG("%s: possible_crtcs=%08x", mgr->name,
					encoder->possible_crtcs);
	}

	dump_video_chains();

	dev->mode_config.min_width = 32;
	dev->mode_config.min_height = 32;

	/* note: eventually will need some cpu_is_omapXYZ() type stuff here
	 * to fill in these limits properly on different OMAP generations..
	 */
	dev->mode_config.max_width = 2048;
	dev->mode_config.max_height = 2048;

	dev->mode_config.funcs = &omap_mode_config_funcs;

	return 0;
}
예제 #5
0
Primitive * create_scene(cl_uint & n_primitives)
{	
	int curr_prim = 0;
	Primitive * primitive_list;

	if (CHOOSE_SCENE == 0){

		n_primitives = 17;
		primitive_list = (Primitive *) malloc(sizeof(Primitive) * n_primitives);
		memset(primitive_list, 0, sizeof(Primitive) * n_primitives);

		float light = 0.85f;
		//create_plane(create_material(r, g, b, refl, refr, refr_index, diff, spec), is_light, x, y, z, depth/radius);
		// floor plane
		primitive_list[curr_prim++] = create_plane(create_material(0.6f, 0.6f, 0.6f, 0.0f, 0.0f, 0.0f, 0.4f, 1.8f), false, 0.0f, 0.75f, 0.0f, 4.4f);
		// big sphere
		primitive_list[curr_prim++] = create_sphere(create_material(0.08f, 0.08f, 0.08f, 0.2f, 1.0f, 1.4f, 0.0f, 0.0f), false, 3.4f, -3.4f, 23.0f, 2.5f);
		// small sphere 5
		primitive_list[curr_prim++] = create_sphere(create_material(0.07f, 0.17f, 0.07f, 0.1f, 1.0f, 1.2f, 0.0f, 0.0f), false, -0.7f, -4.90f, 27.0f, 1.0f);
		// small sphere
		primitive_list[curr_prim++] = create_sphere(create_material(1.0f, 1.0f, 1.0f, 0.8f, 0.0f, 0.0f, 0.0f, 0.0f), false, -3.4f, -3.4f, 29.0f, 2.5f);
		// small sphere 2
		primitive_list[curr_prim++] = create_sphere(create_material(1.5f, 0.7f, 0.7f, 0.1f, 0.0f, 0.0f, 0.2f, 0.2f), false, 0.5f, -4.1f, 29.0f, 1.5f);
		// small sphere 3
		primitive_list[curr_prim++] = create_sphere(create_material(0.7f, 0.7f, 1.7f, 0.2f, 0.0f, 0.0f, 0.2f, 0.2f), false, -6.0f, -4.1f, 32.0f, 1.5f);
		// small sphere 4
		primitive_list[curr_prim++] = create_sphere(create_material(0.07f, 0.17f, 0.07f, 0.3f, 1.0f, 1.2f, 0.2f, 0.8f), false, -6.7f, -4.90f, 29.0f, 1.0f);
		// small sphere 6 up front
		primitive_list[curr_prim++] = create_sphere(create_material(0.08f, 0.08f, 0.08f, 0.7f, 1.0f, 1.3f, 0.8f, 0.0f), false, 6.4f, -4.9f, 18.0f, 1.0f);
		// left wall
		primitive_list[curr_prim++] = create_plane(create_material(1.0f, 0.6f, 0.6f, 0.0f, 0.0f, 0.0f, 0.8f, 1.5f), false, 0.7f, 0.0f, 0.0f, 5.4f);
		// right wall
		primitive_list[curr_prim++] = create_plane(create_material(0.7f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.8f, 0.8f), false, -0.7f, 0.0f, 0.0f, 5.4f);
		// top wall
		primitive_list[curr_prim++] = create_plane(create_material(1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.2f, 0.8f), false, 0.0f, -0.8f, 0.0f, 5.4f);
		// back wall
		primitive_list[curr_prim++] = create_plane(create_material(1.5f, 1.5f, 1.5f, 0.0f, 0.0f, 0.0f, 1.2f, 0.8f), false, 0.0f, 0.0f, -0.14f, 5.4f);
		// front wall
		primitive_list[curr_prim++] = create_plane(create_material(0.1f, 0.1f, 0.1f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f), false, 0.0f, 0.0f, 0.72f, 5.4f);
		// light source center
		primitive_list[curr_prim++] = create_sphere(create_material(light, light, light, 0.0f, 0.0f, 0.0f, 0.0f, 1.8f), true, 0.0f, 6.5f, 22.0f, 0.35f);
		// light source right
		primitive_list[curr_prim++] = create_sphere(create_material(light, light, light, 0.0f, 0.0f, 0.0f, 0.0f, 1.8f), true, -3.0f, 6.5f, 22.0f, 0.35f);
		// light source left
		primitive_list[curr_prim++] = create_sphere(create_material(light, light, light, 0.0f, 0.0f, 0.0f, 0.0f, 1.8f), true, 3.0f, 6.5f, 22.0f, 0.35f);	
		/*	
		// light source ground back
		primitive_list[curr_prim++] = create_sphere(create_material(0.85f, 0.25f, 0.25f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), false, -5.8f, -5.55f, 31.0f, 0.35f);
		*/

	}else if(CHOOSE_SCENE == 1){		
		n_primitives = 64;
		primitive_list = (Primitive *) malloc(sizeof(Primitive) * n_primitives);
		memset(primitive_list, 0, sizeof(Primitive) * n_primitives);
		//create_plane(create_material(r, g, b, refl, refr, refr_index, diff, spec), is_light, x, y, z, depth/radius);
		// floor plane
		primitive_list[curr_prim++] = create_plane(create_material(0.4f, 0.3f, 0.3f, 0.0f, 0.0f, 1.0f, 1.0f, 0.8f), false, 0.0f, 1.0f, 0.0f, 4.4f);
		// big sphere
		primitive_list[curr_prim++] = create_sphere(create_material(0.7f, 0.7f, 1.0f, 0.0f, 1.0f, 1.3f, 0.2f, 0.8f), false, 2.0f, 0.8f, 3.0f, 2.5f);
		// small sphere
		primitive_list[curr_prim++] = create_sphere(create_material(0.7f, 0.7f, 1.0f, 0.5f, 0.0f, 1.0f, 0.1f, 0.8f), false, -5.5f, -0.5f, 7.0f, 2.0f);
		// light source 1
		primitive_list[curr_prim++] = create_sphere(create_material(0.4f, 0.4f, 0.4f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f), true, 0.0f, 5.0f, 5.0f, 0.1f);
		// light source 2
		primitive_list[curr_prim++] = create_sphere(create_material(0.6f, 0.6f, 0.8f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f), true, -3.0f, 5.0f, 1.0f, 0.1f);
		// sphere 3
		primitive_list[curr_prim++] = create_sphere(create_material(1.0f, 0.4f, 0.4f, 0.5f, 0.0f, 1.0f, 0.2f, 0.8f), false, -1.5f, -3.8f, 1.0f, 1.5f);
		// back plane
		primitive_list[curr_prim++] = create_plane(create_material(0.5f, 0.3f, 0.5f, 0.0f, 0.0f, 1.0f, 0.6f, 0.0f), false, 0.4f, 0.0f, -1.0f, 12.0f);
		// ceiling plane
		primitive_list[curr_prim++] = create_plane(create_material(0.4f, 0.7f, 0.7f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f), false, 0.0f, -1.0f, 0.0f, 7.4f);

		for (int x = 0; x < 8; x++)
			for (int y = 0; y < 7; y++)
			{
				primitive_list[curr_prim++] = create_sphere(create_material(0.3f, 1.0f, 0.4f, 0.0f, 0.0f, 1.0f, 0.6f, 0.6f), false, -4.5f + x * 1.5f, -4.3f + y * 1.5f, 10.0f, 0.3f);
			}	
	}

	return primitive_list;
}
예제 #6
0
void
CRevise_group::show ()
{
	init ();

	SetBackPixmap (g_pReciteWord->fixed,
		       Skin->revise_group.revise_group.p[0]);
	return_button.create (g_pReciteWord->fixed,
			      Skin->revise_group.return_button.x[0],
			      Skin->revise_group.return_button.y[0],
			      Skin->revise_group.return_button.p[0],
			      Skin->revise_group.return_button.p[1],
			      Skin->revise_group.return_button.p[2],
			      (GdkPixmap *) NULL,
			      on_revise_group_return_clicked);
	chooseword_button.create (g_pReciteWord->fixed,
			      Skin->revise_group.chooseword_button.x[0],
			      Skin->revise_group.chooseword_button.y[0],
			      Skin->revise_group.chooseword_button.p[0],
			      Skin->revise_group.chooseword_button.p[1],
			      Skin->revise_group.chooseword_button.p[2],
			      on_revise_group_chooseword_clicked,this);
	gtk_tooltips_set_tip (g_pReciteWord->tooltips, chooseword_button.event_box,"Ctrl-W","");
	order_ckbutton.create (g_pReciteWord->fixed,
			      Skin->revise_group.order_ckbutton.x[0],
			      Skin->revise_group.order_ckbutton.y[0],
			      Skin->revise_group.order_ckbutton.p[0],
			      Skin->revise_group.order_ckbutton.p[1],
			      Skin->revise_group.order_ckbutton.p[2],
				  Skin->revise_group.order_ckbutton.p[3],
			      NULL);				  
   	gboolean order;
	rw_cfg_read_boolean(usercfgfile,
			     "revise_group", "disorder",
			     &order);
	order_ckbutton.set_status(order);
	glong found_group = 0;
	gint found = TRUE;
	gint zu_index = 0, revise_times;
	gchar tmpstr[256];
	std::time_t last_time;
	double between_time;
	while (found)
	{
		sprintf (tmpstr, "zu%d_time0", zu_index);
		if (rw_cfg_read_time (usercfgfile, g_pReciteWord->now_book->bookfilename, tmpstr, &last_time))	// have firstrecited 
		{
			sprintf (tmpstr, "zu%d_revisetimes", zu_index);
			rw_cfg_read_int (usercfgfile,
					 g_pReciteWord->now_book->
					 bookfilename, tmpstr, &revise_times);
			if (revise_times < max_revise_times)
			{
				sprintf (tmpstr, "zu%d_time%d", zu_index,
					 revise_times);
				rw_cfg_read_time (usercfgfile,
						  g_pReciteWord->now_book->
						  bookfilename, tmpstr,
						  &last_time);
				between_time = (revise_times * (24 * 60 * 60)) - (12 * 60 * 60);
				std::time_t now = std::time (0);
				if (difftime (now, last_time) > between_time)
				{
					found_group++;
					if (found_group <= 5)  //only show the first 5 groups.
					{
						this->revise_zu_index[found_group-1] =
							zu_index;						
						if (revise_times > 4)
							create_plane (4,found_group-1);
						else
							create_plane (revise_times,found_group-1);
					}
				}
			}
		}
		zu_index++;
		if (zu_index > g_pReciteWord->max_zu_index)	//the current book is search over....will try old books.
			found = FALSE;
	}
	sprintf(tmpstr,_("found %ld groups in total"),found_group);
	total_groups_label = gtk_label_new(tmpstr);
	gtk_fixed_put (GTK_FIXED (g_pReciteWord->fixed), total_groups_label,
		       Skin->revise_group.total_groups_label.x[0], Skin->revise_group.total_groups_label.y[0]);
	gtk_widget_show (total_groups_label);
}
예제 #7
0
int reply_handler(struct atc_conn * conn){
    int aux;
    struct atc_res * response = &conn->res;
    response->type = atc_ack;
    response->msg.return_code = 0;
	switch (conn->req.type){
		case atc_speed_up:
    	if (set(speed_up, &(conn->req.plane)) == -1){
    		response->msg.return_code = -1;
    	}
		break;

    	case atc_speed_down:
    	if(set(speed_down, &(conn->req.plane)) == -1){
    		response->msg.return_code = -1;
    	}
    	break;

    	case atc_turn_left:
    	if(set(turn_left, &(conn->req.plane)) == -1){
    		response->msg.return_code = -1;
    	}
    	break;

    	case atc_turn_right:
    	if(set(turn_right, &(conn->req.plane)) == -1){
    		response->msg.return_code = -1;
    	}
    	break;

    	case atc_ascend:
    	if (set(climb, &(conn->req.plane)) == -1){
    		response->msg.return_code = -1;
    	}
    	break;

    	case atc_descend:
    	if(set(descend, &(conn->req.plane)) == -1){
    		response->msg.return_code = -1;
    	}
    	break;

    	case atc_get_planes:
    	response->type = atc_planes;
    	aux = get_airplanes(response->msg.planes);
        if (aux == -1){
            response->msg.return_code = -1;
        }else{
            response->len.planes = aux;
        }
    	break;

    	case atc_get_airports:
    	response->type = atc_airports;
    	response->len.airports = get_airports(response->msg.airports);
    	break;

    	case atc_get_landed:
    	response->type = atc_ack;
        aux = get_landed();
        if (aux == -1){
            response->msg.return_code = -1;
        }else{
            response->msg.return_code = aux;
        }
    	break;

    	case atc_get_crashed:
        response->type = atc_ack;
    	aux = get_crashed();
        if (aux == -1){
            response->msg.return_code = -1;
        }else{
            response->msg.return_code = aux;
        }
    	break;

    	case atc_create_plane:
    	create_plane();
    	break;

    	case atc_join:
    	break;

    	case atc_leave:
        puts("Hanging");
        return -1;
    	break;
	}
    return 0;
}
예제 #8
0
/**
 to initialize the scene with the default one.
 */
void make_test_scene (int xsize, int ysize) {
    //camera
    set_camera (0.f, 4.f, -4.f,
                0.f, 0.f, 0.f,
                0.f, 1.f, 0.f,
                90.f, xsize, ysize);
    //objects
    Material * plastic = create_plastic_mat (0.6f, 0.5f, 0.5f,
                                             0.6f, 0.5f, 0.5f,
                                             100.f);
	
    // ground plane
    Geometry * plane = create_plane (0.f, -1.f, 0.f,
                                     0.f, 1.f, 0.f);
    add_object (plane, plastic);

    // Up row
    // base objects
    Geometry *boxLeft = create_box (-2.f, 3.f, 0.f,
                                    1.f, 0.f, 0.f,
                                    0.f, 0.25f, 1.f,
                                    1.f, 1.f, 1.f);
    Geometry *sphereLeft = create_sphere (-2.f, 3.f, 0.f,
                                          0.65f);
    Geometry *boxCenter = create_box (0.f, 3.25f, 0.f,
                                      1.f, 0.f, 0.f,
                                      0.f, 0.25f, 1.f,
                                      1.f, 1.f, 1.f);
    Geometry *sphereCenter = create_sphere (0.f, 3.25f, 0.f,
                                            0.65f);
    Geometry *boxRight = create_box (2.f, 3.f, 0.f,
                                     1.f, 0.f, 0.f,
                                     0.f, 0.25f, 1.f,
                                     1.f, 1.f, 1.f);
    Geometry *sphereRight = create_sphere (2.f, 3.f, 0.f,
                                           0.65f);
    // CSG objects
    Geometry *unionUp = create_csg_union (boxLeft, sphereLeft);
    Geometry *intersectionUp = create_csg_intersection(boxCenter, sphereCenter);
    Geometry *differenceUp = create_csg_difference(boxRight, sphereRight);
	
    add_object (unionUp, plastic);
    add_object (intersectionUp, plastic);
    add_object (differenceUp, plastic);
	
    // Middle row
    // base objects
    Geometry *coneLeft = create_cone(-2.25f, 1.f, -1.25f,
                                     -2.25f, 3.f, -1.25f,
                                     0.5f);
    Geometry *cylinderLeft = create_cylinder(-2.25f, 1.75f, -1.25f,
                                             0.5f, 0.f, 1.f,
                                             0.25f, 1.5f);
    Geometry *coneCenter = create_cone(0.f, 1.5f, -0.75f,
                                       0.f, 3.5f, -0.75f,
                                       0.5f);
    Geometry *cylinderCenter = create_cylinder(0.f, 2.25f, -0.75f,
                                               0.5f, 0.f, 1.f,
                                               0.25f, 1.5f);
    Geometry *coneRight = create_cone(2.25f, 1.f, -1.25f,
                                      2.25f, 3.f, -1.25f,
                                      0.5f);
    Geometry *cylinderRight = create_cylinder(2.25f, 1.75f, -1.25f,
                                              0.5f, 0.f, 1.f,
                                              0.25f, 1.5f);
    // CSG objects
    Geometry * unionDown = create_csg_union (coneLeft, cylinderLeft);
    Geometry * intersectionDown = create_csg_intersection(coneCenter, cylinderCenter);
    Geometry * differenceDown = create_csg_difference(coneRight, cylinderRight);
	
    add_object (unionDown, plastic);
    add_object (intersectionDown, plastic);
    add_object (differenceDown, plastic);
	
    // front object
    char complex_tree[] = "(- (* (bo 0. 2.5 -3.25 1. 0. 0. 0. 0. 1. 1.0 1.0 1.0) (sp 0. 2.5 -3.25 0.65) ) (+ (cy 0. 2.5 -3.25 1.0 0.0 0.0 0.3 1.75) (+ (cy 0. 2.5 -3.25 0.0 1.0 0.0 0.3 1.75) (cy 0. 2.5 -3.25 0.0 0.0 1.0 0.3 1.75) ) ) )";
    Geometry *tree = csg_parse(complex_tree);
    if (tree)
        add_object (tree, plastic);

    //lights
	// Front light -- white
    add_light (0.f, 5.f, -1.5f, 1.5f, 1.5f, 1.5f);
	// Back light -- blue
    add_light (4.f, 2.f, 10.f, 0.1f, 0.1f, 0.9f);
	// Left light -- red
    add_light (-4.f, 5.f, -2.f, 0.9f, 0.1f, 0.1f);
}
예제 #9
0
bool create_plane(NodeInstance& node, const Context& context, uint32_t flags)
{
    add_part(node.mesh);
    return create_plane(node.mesh, context, flags);
}
예제 #10
0
/*...screate_z_gt_plane \45\ create plane solid for z \62\\61\ some value:0:*/
PLANE	*create_z_gt_plane(double z)
	{
	return create_plane(0.0, 0.0, -1.0, z);
	}
예제 #11
0
/*...screate_z_lt_plane \45\ create plane solid for z \60\\61\ some value:0:*/
PLANE	*create_z_lt_plane(double z)
	{
	return create_plane(0.0, 0.0, 1.0, -z);
	}
예제 #12
0
/*...screate_y_gt_plane \45\ create plane solid for y \62\\61\ some value:0:*/
PLANE	*create_y_gt_plane(double y)
	{
	return create_plane(0.0, -1.0, 0.0, y);
	}
예제 #13
0
/*...screate_y_lt_plane \45\ create plane solid for y \60\\61\ some value:0:*/
PLANE	*create_y_lt_plane(double y)
	{
	return create_plane(0.0, 1.0, 0.0, -y);
	}
예제 #14
0
/*...screate_x_gt_plane \45\ create plane solid for x \62\\61\ some value:0:*/
PLANE	*create_x_gt_plane(double x)
	{
	return create_plane(-1.0, 0.0, 0.0, x);
	}
예제 #15
0
/*...screate_x_lt_plane \45\ create plane solid for x \60\\61\ some value:0:*/
PLANE	*create_x_lt_plane(double x)
	{
	return create_plane(1.0, 0.0, 0.0, -x);
	}