Point create/Delete and cursor lineedit display
This commit is contained in:
@@ -225,10 +225,10 @@ protected:
|
||||
{
|
||||
switch (id) {
|
||||
case 11:
|
||||
/* TODO: create point */
|
||||
editor->line_create_point();
|
||||
break;
|
||||
case 12:
|
||||
/* TODO: delete point */
|
||||
editor->line_delete_point();
|
||||
break;
|
||||
case 21:
|
||||
/* Create line */
|
||||
@@ -382,15 +382,20 @@ void RoadLinesEditor::update_line_geometry()
|
||||
}
|
||||
}
|
||||
}
|
||||
void RoadLinesEditor::update_line_index_ui()
|
||||
{
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
sp_line_index->set_max(lines[current_line].points.size() - 1);
|
||||
sp_line_index->set_min(0);
|
||||
}
|
||||
void RoadLinesEditor::select_line(const String &line_name)
|
||||
{
|
||||
print_line("selected line: " + line_name);
|
||||
assert(lines.has(line_name));
|
||||
if (current_line != line_name) {
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
sp_line_index->set_max(lines[line_name].points.size() - 1);
|
||||
sp_line_index->set_min(0);
|
||||
current_line = line_name;
|
||||
update_line_index_ui();
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
sp_line_index->set_value(0);
|
||||
/* as actual index of SpinBox might not change
|
||||
call point selection explicitly */
|
||||
@@ -405,25 +410,67 @@ bool RoadLinesEditor::line_exists(const String &line_name)
|
||||
return lines.has(line_name);
|
||||
}
|
||||
|
||||
void RoadLinesEditor::line_create_point()
|
||||
{
|
||||
/* TODO: Create point in line */
|
||||
print_line("line_create_point");
|
||||
Vector3 position = get_cursor_position();
|
||||
Transform xform(Basis(), position);
|
||||
int index = get_line_index();
|
||||
lines[current_line].points.insert(
|
||||
lines[current_line].points.begin() + index + 1, xform);
|
||||
update_line_geometry();
|
||||
update_line_index_ui();
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
sp_line_index->set_value(index + 1);
|
||||
// move_cursor_to_point();
|
||||
}
|
||||
|
||||
void RoadLinesEditor::line_delete_point()
|
||||
{
|
||||
/* TODO: Delete point from line */
|
||||
print_line("line_delete_point");
|
||||
int index = get_line_index();
|
||||
if (lines[current_line].points.size() < 2)
|
||||
return;
|
||||
lines[current_line].points.erase(lines[current_line].points.begin() +
|
||||
index);
|
||||
update_line_geometry();
|
||||
update_line_index_ui();
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
sp_line_index->set_value(0);
|
||||
index = MAX(0, index - 1);
|
||||
sp_line_index->set_value(index);
|
||||
}
|
||||
|
||||
static const String cursor_name = "%line_cursor";
|
||||
|
||||
void RoadLinesEditor::set_point_to_cursor()
|
||||
{
|
||||
print_line("set_point_to_cursor");
|
||||
Spatial *cursor = get_as_node<Spatial>("%line_cursor");
|
||||
Spatial *cursor = get_as_node<Spatial>(cursor_name);
|
||||
Transform xform = cursor->get_global_transform();
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
int index = (int)sp_line_index->get_value();
|
||||
int index = get_line_index();
|
||||
lines[current_line].points[index].origin = xform.origin;
|
||||
update_line_geometry();
|
||||
set_ui_point_position(lines[current_line].points[index].origin);
|
||||
}
|
||||
|
||||
int RoadLinesEditor::get_line_index()
|
||||
{
|
||||
print_line("get_line_index");
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
int index = (int)sp_line_index->get_value();
|
||||
return index;
|
||||
}
|
||||
|
||||
void RoadLinesEditor::move_cursor_to_point()
|
||||
{
|
||||
print_line("move_cursor_to_point");
|
||||
Spatial *cursor = get_as_node<Spatial>("%line_cursor");
|
||||
SpinBox *sp_line_index = get_as_node<SpinBox>("%line_index");
|
||||
int index = (int)sp_line_index->get_value();
|
||||
int index = get_line_index();
|
||||
Transform xform(Basis(), lines[current_line].points[index].origin);
|
||||
cursor->set_global_transform(xform);
|
||||
set_cursor_position(xform.origin);
|
||||
set_ui_cursor_position(xform.origin);
|
||||
}
|
||||
|
||||
void RoadLinesEditor::update(float delta)
|
||||
@@ -433,10 +480,10 @@ void RoadLinesEditor::update(float delta)
|
||||
// print_line("road_lines_editor");
|
||||
if (!cursor_enabled && get_camera_mode() == 3) {
|
||||
cursor_enabled = true;
|
||||
get_as_node<Spatial>("%line_cursor")->show();
|
||||
get_as_node<Spatial>(cursor_name)->show();
|
||||
} else if (cursor_enabled && get_camera_mode() != 3) {
|
||||
cursor_enabled = false;
|
||||
get_as_node<Spatial>("%line_cursor")->hide();
|
||||
get_as_node<Spatial>(cursor_name)->hide();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -457,7 +504,6 @@ void RoadLinesEditor::editor_event(const String &event, const Array &args)
|
||||
if (event == "mouse_press" || event == "mouse_drag") {
|
||||
if (cursor_enabled) {
|
||||
/* Raycasting outside physics process */
|
||||
Spatial *cursor = get_as_node<Spatial>("%line_cursor");
|
||||
Vector2 position = args[0];
|
||||
Camera *cam = editor->get_viewport()->get_camera();
|
||||
Vector3 start = cam->project_ray_origin(position);
|
||||
@@ -482,13 +528,8 @@ void RoadLinesEditor::editor_event(const String &event, const Array &args)
|
||||
(1 << 15) | (1 << 0), true,
|
||||
true);
|
||||
if (result.rid != RID()) {
|
||||
cursor->set_global_transform(
|
||||
Transform(Basis(), result.position));
|
||||
Array pargs;
|
||||
pargs.push_back(result.position);
|
||||
editor->emit_signal("editor_event",
|
||||
"line_cursor_motion",
|
||||
pargs);
|
||||
set_cursor_position(result.position);
|
||||
set_ui_cursor_position(result.position);
|
||||
}
|
||||
end:;
|
||||
}
|
||||
@@ -539,17 +580,49 @@ void RoadLinesEditor::create_new_line_at_cursor(const String &line_name)
|
||||
print_line("creating new line called: " + line_name);
|
||||
}
|
||||
|
||||
void RoadLinesEditor::set_line_index(int index)
|
||||
Vector3 RoadLinesEditor::get_cursor_position()
|
||||
{
|
||||
assert(lines.has(current_line));
|
||||
assert(index < (int)lines[current_line].points.size());
|
||||
Vector3 cursor_position = lines[current_line].points[index].origin;
|
||||
Spatial *cursor = get_as_node<Spatial>("%line_cursor");
|
||||
Spatial *cursor = get_as_node<Spatial>(cursor_name);
|
||||
return cursor->get_global_transform().origin;
|
||||
}
|
||||
|
||||
void RoadLinesEditor::set_cursor_position(const Vector3 &cursor_position)
|
||||
{
|
||||
Spatial *cursor = get_as_node<Spatial>(cursor_name);
|
||||
cursor->set_global_transform(Transform(Basis(), cursor_position));
|
||||
Array pargs;
|
||||
pargs.push_back(cursor_position);
|
||||
editor->emit_signal("editor_event", "line_cursor_motion", pargs);
|
||||
}
|
||||
void RoadLinesEditor::set_ui_cursor_position(const Vector3 &cursor_position)
|
||||
{
|
||||
LineEdit *cursor_x = get_as_node<LineEdit>("%cursor_x");
|
||||
LineEdit *cursor_y = get_as_node<LineEdit>("%cursor_y");
|
||||
LineEdit *cursor_z = get_as_node<LineEdit>("%cursor_z");
|
||||
cursor_x->set_text(String::num(cursor_position.x));
|
||||
cursor_y->set_text(String::num(cursor_position.y));
|
||||
cursor_z->set_text(String::num(cursor_position.z));
|
||||
}
|
||||
void RoadLinesEditor::set_ui_point_position(const Vector3 &point_position)
|
||||
{
|
||||
LineEdit *point_x = get_as_node<LineEdit>("%point_x");
|
||||
LineEdit *point_y = get_as_node<LineEdit>("%point_y");
|
||||
LineEdit *point_z = get_as_node<LineEdit>("%point_z");
|
||||
point_x->set_text(String::num(point_position.x));
|
||||
point_y->set_text(String::num(point_position.y));
|
||||
point_z->set_text(String::num(point_position.z));
|
||||
}
|
||||
|
||||
void RoadLinesEditor::set_line_index(int index)
|
||||
{
|
||||
assert(lines.has(current_line));
|
||||
assert(index < (int)lines[current_line].points.size());
|
||||
Vector3 point_position = lines[current_line].points[index].origin;
|
||||
Vector3 cursor_position = point_position;
|
||||
set_cursor_position(cursor_position);
|
||||
set_ui_cursor_position(cursor_position);
|
||||
set_ui_point_position(point_position);
|
||||
}
|
||||
|
||||
void RoadLinesEditor::line_list_filter_changed(const String &text)
|
||||
{
|
||||
|
||||
@@ -15,9 +15,13 @@ public:
|
||||
virtual ~RoadLinesEditor();
|
||||
Node *scene();
|
||||
void update_line_geometry();
|
||||
void update_line_index_ui();
|
||||
void select_line(const String &line_name);
|
||||
bool line_exists(const String &line_name);
|
||||
void line_create_point();
|
||||
void line_delete_point();
|
||||
void set_point_to_cursor();
|
||||
int get_line_index();
|
||||
void move_cursor_to_point();
|
||||
void update(float delta);
|
||||
void exit();
|
||||
@@ -26,6 +30,10 @@ public:
|
||||
int get_camera_mode() const;
|
||||
void update_ui();
|
||||
void create_new_line_at_cursor(const String &line_name);
|
||||
Vector3 get_cursor_position();
|
||||
void set_cursor_position(const Vector3 &cursor_position);
|
||||
void set_ui_cursor_position(const Vector3 &cursor_position);
|
||||
void set_ui_point_position(const Vector3 &point_position);
|
||||
void set_line_index(int index);
|
||||
void line_list_filter_changed(const String &text);
|
||||
template <class T> T *get_as_node(const String &path);
|
||||
|
||||
Reference in New Issue
Block a user