void GridMapEditor::_item_selected_cbk() {

	TreeItem *it = theme_pallete->get_selected();
	if (it) {

		selected_pallete=it->get_metadata(theme_pallete->get_selected_column());

	} else {

		selected_pallete=-1;

	}

	_update_cursor_instance();

}
Exemplo n.º 2
0
bool GridMapEditor::do_input_action(Camera* p_camera,const Point2& p_point,bool p_click) {

	if (!spatial_editor)
		return false;


	if (selected_pallete<0 && input_action!=INPUT_COPY && input_action!=INPUT_SELECT && input_action!=INPUT_DUPLICATE)
		return false;
	Ref<MeshLibrary> theme = node->get_theme();
	if (theme.is_null())
		return false;
	if (input_action!=INPUT_COPY && input_action!=INPUT_SELECT && input_action!=INPUT_DUPLICATE && !theme->has_item(selected_pallete))
		return false;

	Camera *camera = p_camera;
	Vector3 from = camera->project_ray_origin(p_point);
	Vector3 normal = camera->project_ray_normal(p_point);
	Transform local_xform = node->get_global_transform().affine_inverse();
	Vector<Plane> planes=camera->get_frustum();
	from=local_xform.xform(from);
	normal=local_xform.basis.xform(normal).normalized();


	Plane p;
	p.normal[edit_axis]=1.0;
	p.d=edit_floor[edit_axis]*node->get_cell_size();

	Vector3 inters;
	if (!p.intersects_segment(from, from + normal * settings_pick_distance->get_value(), &inters))
		return false;


	//make sure the intersection is inside the frustum planes, to avoid
	//painting on invisible regions
	for(int i=0;i<planes.size();i++) {

		Plane fp = local_xform.xform(planes[i]);
		if (fp.is_point_over(inters))
			return false;
	}


	int cell[3];
	float cell_size[3]={node->get_cell_size(),node->get_cell_size(),node->get_cell_size()};

	last_mouseover=Vector3(-1,-1,-1);

	for(int i=0;i<3;i++) {

		if (i==edit_axis)
			cell[i]=edit_floor[i];
		else {

			cell[i]=inters[i]/node->get_cell_size();
			if (inters[i]<0)
				cell[i]-=1; //compensate negative
			grid_ofs[i]=cell[i]*cell_size[i];
		}

		/*if (cell[i]<0 || cell[i]>=grid_size[i]) {

			cursor_visible=false;
			_update_cursor_transform();
			return false;
		}*/
	}

	last_mouseover=Vector3(cell[0],cell[1],cell[2]);
	VS::get_singleton()->instance_set_transform(grid_instance[edit_axis],Transform(Basis(),grid_ofs));


	if (cursor_instance.is_valid()) {

		cursor_origin=(Vector3(cell[0],cell[1],cell[2])+Vector3(0.5*node->get_center_x(),0.5*node->get_center_y(),0.5*node->get_center_z()))*node->get_cell_size();
		cursor_visible=true;

		_update_cursor_transform();

	}

	if (input_action==INPUT_DUPLICATE) {

		selection.current=Vector3(cell[0],cell[1],cell[2]);
		_update_duplicate_indicator();

	} else if (input_action==INPUT_SELECT) {

		selection.current=Vector3(cell[0],cell[1],cell[2]);
		if (p_click)
			selection.click=selection.current;
		selection.active=true;
		_validate_selection();

		return true;
	} else if (input_action==INPUT_COPY) {

		int item=node->get_cell_item(cell[0],cell[1],cell[2]);
		if (item>=0) {
			selected_pallete=item;
			theme_pallete->set_current(item);
			update_pallete();
			_update_cursor_instance();
		}
		return true;
	} if (input_action==INPUT_PAINT) {
		SetItem si;
		si.pos=Vector3(cell[0],cell[1],cell[2]);
		si.new_value=selected_pallete;
		si.new_orientation=cursor_rot;
		si.old_value=node->get_cell_item(cell[0],cell[1],cell[2]);
		si.old_orientation=node->get_cell_item_orientation(cell[0],cell[1],cell[2]);
		set_items.push_back(si);
		node->set_cell_item(cell[0],cell[1],cell[2],selected_pallete,cursor_rot);
		return true;
	} else if (input_action==INPUT_ERASE) {
		SetItem si;
		si.pos=Vector3(cell[0],cell[1],cell[2]);
		si.new_value=-1;
		si.new_orientation=0;
		si.old_value=node->get_cell_item(cell[0],cell[1],cell[2]);
		si.old_orientation=node->get_cell_item_orientation(cell[0],cell[1],cell[2]);
		set_items.push_back(si);
		node->set_cell_item(cell[0],cell[1],cell[2],-1);
		return true;
	}


	return false;

}
Exemplo n.º 3
0
void GridMapEditor::_item_selected_cbk(int idx) {
	selected_pallete=theme_pallete->get_item_metadata(idx);

	_update_cursor_instance();

}