create, delete, select
This commit is contained in:
parent
9eb782b77c
commit
f3cc9ee4d9
@ -39,12 +39,30 @@ struct walkbot_node_s {
|
|||||||
float y { 0.0f }; // 8
|
float y { 0.0f }; // 8
|
||||||
float z { 0.0f }; // 12
|
float z { 0.0f }; // 12
|
||||||
};
|
};
|
||||||
Vector xyz { 0, 0, 0 };
|
Vector xyz { 0, 0, 0 }; // 12
|
||||||
};
|
};
|
||||||
unsigned flags { 0 }; // 16
|
unsigned flags { 0 }; // 16
|
||||||
size_t connection_count { 0 }; // 20
|
size_t connection_count { 0 }; // 20
|
||||||
index_t connections[MAX_CONNECTIONS]; // 36
|
index_t connections[MAX_CONNECTIONS]; // 36
|
||||||
}; // 36
|
index_t preferred { INVALID_NODE }; // 40
|
||||||
|
|
||||||
|
void link(index_t node) {
|
||||||
|
if (connection_count == MAX_CONNECTIONS) {
|
||||||
|
logging::Info("[wb] Too many connections! Node at (%.2f %.2f %.2f)", x, y, z);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
connections[connection_count++] = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void unlink(index_t node) {
|
||||||
|
for (size_t i = 0; i < connection_count; i++) {
|
||||||
|
if (connections[i] == node) {
|
||||||
|
connections[i] = connections[connection_count];
|
||||||
|
connections[connection_count--] = INVALID_NODE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}; // 40
|
||||||
|
|
||||||
namespace state {
|
namespace state {
|
||||||
|
|
||||||
@ -60,6 +78,9 @@ index_t closest_node { INVALID_NODE };
|
|||||||
// Global state
|
// Global state
|
||||||
EWalkbotState state { WB_DISABLED };
|
EWalkbotState state { WB_DISABLED };
|
||||||
|
|
||||||
|
// g_pUserCmd->buttons state when last node was recorded
|
||||||
|
int last_node_buttons { 0 };
|
||||||
|
|
||||||
// A little bit too expensive function, finds next free node or creates one if no free slots exist
|
// A little bit too expensive function, finds next free node or creates one if no free slots exist
|
||||||
index_t free_node() {
|
index_t free_node() {
|
||||||
for (index_t i = 0; i < nodes.size(); i++) {
|
for (index_t i = 0; i < nodes.size(); i++) {
|
||||||
@ -72,7 +93,7 @@ index_t free_node() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool node_good(index_t node) {
|
bool node_good(index_t node) {
|
||||||
return node < nodes.size() && (nodes[node].flags & NF_GOOD);
|
return node != INVALID_NODE && node < nodes.size() && (nodes[node].flags & NF_GOOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -83,6 +104,59 @@ CatVar draw_path(CV_SWITCH, "wb_path", "1", "Walkbot path");
|
|||||||
CatVar draw_nodes(CV_SWITCH, "wb_nodes", "1", "Walkbot nodes");
|
CatVar draw_nodes(CV_SWITCH, "wb_nodes", "1", "Walkbot nodes");
|
||||||
CatVar draw_indices(CV_SWITCH, "wb_indices", "1", "Node indices");
|
CatVar draw_indices(CV_SWITCH, "wb_indices", "1", "Node indices");
|
||||||
|
|
||||||
|
// Selects closest node, clears selection if node is selected
|
||||||
|
CatCommand c_select_node("wb_select", "Select node", []() {
|
||||||
|
if (state::active_node == state::closest_node) {
|
||||||
|
state::active_node = INVALID_NODE;
|
||||||
|
} else {
|
||||||
|
state::active_node = state::closest_node;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Deletes closest node and its connections
|
||||||
|
CatCommand c_delete_node("wb_delete", "Delete node", []() {
|
||||||
|
if (not state::node_good(state::closest_node))
|
||||||
|
return;
|
||||||
|
logging::Info("[wb] Deleting node %u", state::closest_node);
|
||||||
|
auto& n = state::nodes[state::closest_node];
|
||||||
|
for (size_t i = 0; i < n.connection_count && i < MAX_CONNECTIONS; i++) {
|
||||||
|
if (state::node_good(n.connections[i])) {
|
||||||
|
logging::Info("[wb] Unlinking %u from %u", state::closest_node, n.connections[i]);
|
||||||
|
state::nodes[n.connections[i]].unlink(state::closest_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(&n, 0, sizeof(walkbot_node_s));
|
||||||
|
});
|
||||||
|
// Creates a new node under your feet and connects it to closest node to your crosshair
|
||||||
|
CatCommand c_create_node("wb_create", "Create node", []() {
|
||||||
|
const Vector& origin = LOCAL_E->m_vecOrigin;
|
||||||
|
index_t node = state::free_node();
|
||||||
|
logging::Info("[wb] Creating node %u at (%.2f %.2f %.2f)", node, origin.x, origin.y, origin.z);
|
||||||
|
auto& n = state::nodes[node];
|
||||||
|
n.xyz = origin;
|
||||||
|
n.preferred = INVALID_NODE;
|
||||||
|
n.connection_count = 0;
|
||||||
|
n.flags |= NF_GOOD;
|
||||||
|
if (g_pUserCmd->buttons & IN_DUCK)
|
||||||
|
n.flags |= NF_DUCK;
|
||||||
|
if (state::node_good(state::closest_node)) {
|
||||||
|
n.link(state::closest_node);
|
||||||
|
state::nodes[state::closest_node].link(node);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Connects selected node to closest one
|
||||||
|
CatCommand c_connect_node("wb_connect", "Connect node", []() {
|
||||||
|
|
||||||
|
});
|
||||||
|
// Updates flags on region of nodes (selected to closest)
|
||||||
|
// Updates a single closest node if no node is selected
|
||||||
|
CatCommand c_update_flags("wb_flags", "Update flags", []() {
|
||||||
|
|
||||||
|
});
|
||||||
|
// Sets the closest node as preferred path for the selected node
|
||||||
|
CatCommand c_set_preferred("wb_prefer", "Set preferred node", []() {
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
void Initialize() {
|
void Initialize() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,8 +276,18 @@ void Draw() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Move() {
|
void Move() {
|
||||||
if (state == WB_DISABLED) return;
|
if (state::state == WB_DISABLED) return;
|
||||||
|
switch (state::state) {
|
||||||
|
case WB_RECORDING: {
|
||||||
|
|
||||||
|
} break;
|
||||||
|
case WB_EDITING: {
|
||||||
|
UpdateClosestNode();
|
||||||
|
} break;
|
||||||
|
case WB_REPLAYING: {
|
||||||
|
|
||||||
|
} break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}}}
|
}}}
|
||||||
|
Reference in New Issue
Block a user