diff -r 6e03c68c81ba -r 7184f3bae695 src/ldObjectMath.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldObjectMath.cpp Sun Aug 31 20:39:30 2014 +0300
@@ -0,0 +1,89 @@
+/*
+ * LDForge: LDraw parts authoring CAD
+ * Copyright (C) 2013, 2014 Teemu Piippo
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "ldObjectMath.h"
+#include "ldObject.h"
+#include "miscallenous.h"
+
+// =============================================================================
+//
+static void RotateVertex (Vertex& v, const Vertex& rotpoint, const Matrix& transformer)
+{
+ v -= rotpoint;
+ v.transform (transformer, Origin);
+ v += rotpoint;
+}
+
+// =============================================================================
+//
+void RotateObjects (const int l, const int m, const int n, double angle, LDObjectList const& objects)
+{
+ QList queue;
+ const Vertex rotpoint = GetRotationPoint (objects);
+ const double cosangle = cos (angle),
+ sinangle = sin (angle);
+
+ // ref: http://en.wikipedia.org/wiki/Transformation_matrix#Rotation_2
+ Matrix transform (
+ {
+ (l* l * (1 - cosangle)) + cosangle,
+ (m* l * (1 - cosangle)) - (n* sinangle),
+ (n* l * (1 - cosangle)) + (m* sinangle),
+
+ (l* m * (1 - cosangle)) + (n* sinangle),
+ (m* m * (1 - cosangle)) + cosangle,
+ (n* m * (1 - cosangle)) - (l* sinangle),
+
+ (l* n * (1 - cosangle)) - (m* sinangle),
+ (m* n * (1 - cosangle)) + (l* sinangle),
+ (n* n * (1 - cosangle)) + cosangle
+ });
+
+ // Apply the above matrix to everything
+ for (LDObjectPtr obj : objects)
+ {
+ if (obj->numVertices())
+ {
+ for (int i = 0; i < obj->numVertices(); ++i)
+ {
+ Vertex v = obj->vertex (i);
+ RotateVertex (v, rotpoint, transform);
+ obj->setVertex (i, v);
+ }
+ }
+ elif (obj->hasMatrix())
+ {
+ LDMatrixObjectPtr mo = obj.dynamicCast();
+
+ // Transform the position
+ Vertex v = mo->position();
+ RotateVertex (v, rotpoint, transform);
+ mo->setPosition (v);
+
+ // Transform the matrix
+ mo->setTransform (transform * mo->transform());
+ }
+ elif (obj->type() == OBJ_Vertex)
+ {
+ LDVertexPtr vert = obj.staticCast();
+ Vertex v = vert->pos;
+ RotateVertex (v, rotpoint, transform);
+ vert->pos = v;
+ }
+ }
+}