summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-12-18 19:59:01 +0000
committerDavid Robillard <d@drobilla.net>2013-12-18 19:59:01 +0000
commit1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba (patch)
tree6a4b38efa2052e08365c0dc3ed8a5e9ba7354d2f /src
parent63c2c34dd2b4ae5be99284b94c0b99d39600bd6f (diff)
downloadganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.tar.gz
ganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.tar.bz2
ganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.zip
Shorter code.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5182 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r--src/Canvas.cpp42
-rw-r--r--src/fdgl.hpp14
2 files changed, 25 insertions, 31 deletions
diff --git a/src/Canvas.cpp b/src/Canvas.cpp
index a0d956f..58f1e9e 100644
--- a/src/Canvas.cpp
+++ b/src/Canvas.cpp
@@ -708,18 +708,20 @@ GanvCanvasImpl::layout_dot(const std::string& filename)
#ifdef GANV_FDGL
-static void
-get_pos_area(const GanvNode* node, Vector* pos, Vector* area)
+inline Region
+get_region(const GanvNode* node)
{
double x1, y1, x2, y2;
ganv_item_get_bounds(GANV_ITEM(node), &x1, &y1, &x2, &y2);
- area->x = x2 - x1;
- area->y = y2 - y1;
- pos->x = x1 + (area->x / 2.0);
- pos->y = y1 + (area->y / 2.0);
+ Region reg;
+ reg.area.x = x2 - x1;
+ reg.area.y = y2 - y1;
+ reg.pos.x = x1 + (reg.area.x / 2.0);
+ reg.pos.y = y1 + (reg.area.y / 2.0);
- ganv_item_i2w(GANV_ITEM(node), &pos->x, &pos->y);
+ ganv_item_i2w(GANV_ITEM(node), &reg.pos.x, &reg.pos.y);
+ return reg;
}
inline void
@@ -737,36 +739,24 @@ GanvCanvasImpl::layout_iteration()
if (!GANV_IS_MODULE(*i) && !GANV_IS_CIRCLE(*i)) {
continue;
}
-
GanvNode* const node = GANV_NODE(*i);
- Vector pos;
- Vector area;
- get_pos_area(node, &pos, &area);
+ const Region reg = get_region(node);
FOREACH_ITEM(_items, j) {
- if (i == j || !GANV_IS_NODE(*j)) {
+ if (i == j || (!GANV_IS_MODULE(*i) && !GANV_IS_CIRCLE(*i))) {
continue;
}
-
GanvNode* const node2 = GANV_NODE(*j);
- Vector pos2;
- Vector area2;
- get_pos_area(node2, &pos2, &area2);
-
- const Vector f = repel_force(pos, area, pos2, area2);
-
- apply_force(node, node2, f);
+ const Region reg2 = get_region(node2);
+ apply_force(node, node2, repel_force(reg, reg2));
}
// Add fake long spring to partner to line up as if connected
GanvNode* partner = ganv_node_get_partner(node);
if (partner) {
- Vector ppos;
- Vector parea;
- get_pos_area(partner, &ppos, &parea);
-
- const Vector f = spring_force(ppos, pos, parea.x);
- apply_force(node, partner, f);
+ const Region preg = get_region(partner);
+ apply_force(node, partner,
+ spring_force(preg.pos, reg.pos, preg.area.x));
}
}
diff --git a/src/fdgl.hpp b/src/fdgl.hpp
index 844912e..c2dac10 100644
--- a/src/fdgl.hpp
+++ b/src/fdgl.hpp
@@ -20,6 +20,11 @@ static const double SPRING_K = 12.0;
static const double CHARGE_KE = 80000.0;
static const double AREA_WEIGHT = 0.4;
+struct Region {
+ Vector pos;
+ Vector area;
+};
+
inline Vector
vec_add(const Vector& a, const Vector& b)
{
@@ -66,13 +71,12 @@ spring_force(const Vector& a, const Vector& b, const double length)
/** Modified Coulomb's law */
inline Vector
-repel_force(const Vector& a, const Vector& a_area,
- const Vector& b, const Vector& b_area)
+repel_force(const Region& a, const Region& b)
{
- const Vector vec = vec_mult(vec_sub(a, b), 4.0);
+ const Vector vec = vec_mult(vec_sub(a.pos, b.pos), 4.0);
const double rmag = vec_rmag(vec);
- const Vector a_weight = vec_mult(a_area, AREA_WEIGHT);
- const Vector b_weight = vec_mult(b_area, AREA_WEIGHT);
+ const Vector a_weight = vec_mult(a.area, AREA_WEIGHT);
+ const Vector b_weight = vec_mult(b.area, AREA_WEIGHT);
const Vector force = vec_mult(vec, rmag * rmag * rmag * CHARGE_KE * 0.5);
return vec_mult(force, vec_mult(a_weight, b_weight));
}