Add dynamic snapping resolution
parent
857b3a8b31
commit
aebb5b3d4c
|
@ -2,6 +2,9 @@
|
||||||
# snap to pixels
|
# snap to pixels
|
||||||
snapping = true
|
snapping = true
|
||||||
|
|
||||||
|
# The resolution the nodebox snaps to (can be overriden per node)
|
||||||
|
default_snap_res = 16
|
||||||
|
|
||||||
# limiting stops node boxes going out of node bounds
|
# limiting stops node boxes going out of node bounds
|
||||||
limiting = true
|
limiting = true
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,7 @@ int main(int argc, char *argv[]) {
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
conf->set("snapping", "true");
|
conf->set("snapping", "true");
|
||||||
|
conf->set("default_snap_res", "16");
|
||||||
conf->set("limiting", "true");
|
conf->set("limiting", "true");
|
||||||
conf->set("fractional_positions", "false");
|
conf->set("fractional_positions", "false");
|
||||||
conf->set("driver", "opengl");
|
conf->set("driver", "opengl");
|
||||||
|
|
|
@ -393,11 +393,19 @@ void CDR::update(NBEditor* editor, bool drag, rect<s32> offset)
|
||||||
|
|
||||||
// Call required function
|
// Call required function
|
||||||
editor->fillProperties();
|
editor->fillProperties();
|
||||||
|
|
||||||
|
int snap_res = node->snap_res;
|
||||||
|
if (snap_res == -1) {
|
||||||
|
static const int set_snap_res =
|
||||||
|
editor->state->settings->getInt("default_snap_res");
|
||||||
|
snap_res = set_snap_res;
|
||||||
|
}
|
||||||
|
|
||||||
if (actualType < CDR_XZ) {
|
if (actualType < CDR_XZ) {
|
||||||
if (editor->state->settings->getBool("snapping")) {
|
if (editor->state->settings->getBool("snapping")) {
|
||||||
wpos.X = (f32)floor((wpos.X + 0.5) * 16 + 0.5) / 16 - 0.5;
|
wpos.X = (f32)floor((wpos.X + 0.5) * snap_res + 0.5) / snap_res - 0.5;
|
||||||
wpos.Y = (f32)floor((wpos.Y + 0.5) * 16 + 0.5) / 16 - 0.5;
|
wpos.Y = (f32)floor((wpos.Y + 0.5) * snap_res + 0.5) / snap_res - 0.5;
|
||||||
wpos.Z = (f32)floor((wpos.Z + 0.5) * 16 + 0.5) / 16 - 0.5;
|
wpos.Z = (f32)floor((wpos.Z + 0.5) * snap_res + 0.5) / snap_res - 0.5;
|
||||||
|
|
||||||
// (X + 0.5) round relative to (-0.5, -0.5, -0.5)
|
// (X + 0.5) round relative to (-0.5, -0.5, -0.5)
|
||||||
// ie: (-0.5, -0.5, -0.5) goes to (0, 0, 0)
|
// ie: (-0.5, -0.5, -0.5) goes to (0, 0, 0)
|
||||||
|
@ -410,7 +418,7 @@ void CDR::update(NBEditor* editor, bool drag, rect<s32> offset)
|
||||||
editor->state->keys[KEY_LCONTROL] == EKS_DOWN);
|
editor->state->keys[KEY_LCONTROL] == EKS_DOWN);
|
||||||
} else {
|
} else {
|
||||||
box->move(editor->state, actualType, wpos,
|
box->move(editor->state, actualType, wpos,
|
||||||
editor->state->settings->getBool("snapping"));
|
(editor->state->settings->getBool("snapping")?snap_res:0));
|
||||||
}
|
}
|
||||||
node->remesh(box);
|
node->remesh(box);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,8 @@ Node::Node(IrrlichtDevice* device, EditorState* state, unsigned int id) :
|
||||||
state(state),
|
state(state),
|
||||||
_selected(-1),
|
_selected(-1),
|
||||||
_nid(id),
|
_nid(id),
|
||||||
_box_count(0)
|
_box_count(0),
|
||||||
|
snap_res(-1)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
images[i] = NULL;
|
images[i] = NULL;
|
||||||
|
|
|
@ -40,6 +40,7 @@ public:
|
||||||
vector3di position;
|
vector3di position;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::vector<NodeBox*> boxes;
|
std::vector<NodeBox*> boxes;
|
||||||
|
int snap_res;
|
||||||
private:
|
private:
|
||||||
// Data
|
// Data
|
||||||
int _selected;
|
int _selected;
|
||||||
|
|
|
@ -91,7 +91,7 @@ void NodeBox::moveFace(EditorState* editor, ECDR_DIR type,
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeBox::move(EditorState* editor, ECDR_DIR type, vector3df position,
|
void NodeBox::move(EditorState* editor, ECDR_DIR type, vector3df position,
|
||||||
bool do_snap)
|
const int snap_res)
|
||||||
{
|
{
|
||||||
vector3df new_one = one;
|
vector3df new_one = one;
|
||||||
vector3df new_two = two;
|
vector3df new_two = two;
|
||||||
|
@ -157,11 +157,11 @@ void NodeBox::move(EditorState* editor, ECDR_DIR type, vector3df position,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (do_snap) {
|
if (snap_res > 0) {
|
||||||
vector3df snapped_one(
|
vector3df snapped_one(
|
||||||
(f32)floor((new_one.X + 0.5) * 16 + 0.5) / 16 - 0.5,
|
(f32)floor((new_one.X + 0.5) * snap_res + 0.5) / snap_res - 0.5,
|
||||||
(f32)floor((new_one.Y + 0.5) * 16 + 0.5) / 16 - 0.5,
|
(f32)floor((new_one.Y + 0.5) * snap_res + 0.5) / snap_res - 0.5,
|
||||||
(f32)floor((new_one.Z + 0.5) * 16 + 0.5) / 16 - 0.5);
|
(f32)floor((new_one.Z + 0.5) * snap_res + 0.5) / snap_res - 0.5);
|
||||||
new_two += snapped_one - new_one;
|
new_two += snapped_one - new_one;
|
||||||
new_one = snapped_one;
|
new_one = snapped_one;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ public:
|
||||||
void moveFace(EditorState* editor, ECDR_DIR type,
|
void moveFace(EditorState* editor, ECDR_DIR type,
|
||||||
vector3df position, bool both);
|
vector3df position, bool both);
|
||||||
void move(EditorState* editor, ECDR_DIR type, vector3df position,
|
void move(EditorState* editor, ECDR_DIR type, vector3df position,
|
||||||
bool do_snap=false);
|
const int snap_res=0);
|
||||||
void rotate(EAxis axis);
|
void rotate(EAxis axis);
|
||||||
void flip(EAxis axis);
|
void flip(EAxis axis);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue