diff -r 9374fea8f77f -r f1b8cb53d2a2 src/types.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/types.h Wed May 08 15:19:06 2013 +0300
@@ -0,0 +1,222 @@
+/*
+ * LDForge: LDraw parts authoring CAD
+ * Copyright (C) 2013 Santeri 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 .
+ */
+
+#ifndef TYPES_H
+#define TYPES_H
+
+#include "common.h"
+#include "misc.h"
+
+typedef unsigned int uint;
+typedef short unsigned int ushort;
+typedef long unsigned int ulong;
+
+// Typedef out the _t suffices :)
+typedef int8_t int8;
+typedef int16_t int16;
+typedef int32_t int32;
+typedef int64_t int64;
+typedef uint8_t uint8;
+typedef uint16_t uint16;
+typedef uint32_t uint32;
+typedef uint64_t uint64;
+
+template using initlist = std::initializer_list;
+using std::vector;
+
+enum Axis { X, Y, Z };
+static const Axis g_Axes[3] = {X, Y, Z};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+// matrix
+//
+// A templated, mathematical N x N matrix
+// =============================================================================
+template class matrix {
+public:
+ // Constructors
+ matrix () {}
+ matrix (initlist vals) {
+ assert (vals.size() == N * N);
+ memcpy (&m_vals[0], &(*vals.begin ()), sizeof m_vals);
+ }
+
+ matrix (double fillval) {
+ for (short i = 0; i < (N * N); ++i)
+ m_vals[i] = fillval;
+ }
+
+ matrix (double vals[]) {
+ for (short i = 0; i < (N * N); ++i)
+ m_vals[i] = vals[i];
+ }
+
+ template matrix (matrix other) {
+ assert (M >= N);
+
+ for (short i = 0; i < M; ++i)
+ for (short j = 0; j < M; ++j) {
+ const short idx = (i * M) + j;
+ m_vals[idx] = other[idx];
+ }
+ }
+
+ matrix mult (matrix other) {
+ matrix val;
+ val.zero ();
+
+ for (short i = 0; i < N; ++i)
+ for (short j = 0; j < N; ++j)
+ for (short k = 0; k < N; ++k)
+ val[(i * N) + j] += m_vals[(i * N) + k] * other[(k * N) + j];
+
+ return val;
+ }
+
+ matrix& operator= (matrix other) {
+ memcpy (&m_vals[0], &other.m_vals[0], sizeof (double) * N * N);
+ return *this;
+ }
+
+ matrix operator* (matrix other) {
+ return mult (other);
+ }
+
+ double& operator[] (const uint idx) {
+ return m_vals[idx];
+ }
+
+ const double& operator[] (const uint idx) const {
+ return m_vals[idx];
+ }
+
+ void zero () {
+ memset (&m_vals[0], 0, sizeof (double) * N * N);
+ }
+
+ void puts () const {
+ for (short i = 0; i < N; ++i) {
+ for (short j = 0; j < N; ++j)
+ printf ("%*f\t", 10, m_vals[(i * N) + j]);
+
+ printf ("\n");
+ }
+ }
+
+ str stringRep () const {
+ str val;
+ for (short i = 0; i < N * N; ++i) {
+ if (i > 0)
+ val += ' ';
+
+ val.appendformat ("%s", ftoa (m_vals[i]).chars());
+ }
+
+ return val;
+ }
+
+private:
+ double m_vals[N * N];
+};
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+// vertex
+//
+// Vertex class, contains a single point in 3D space. Not to be confused with
+// LDVertex, which is a vertex used in an LDraw part file.
+// =============================================================================
+class vertex {
+public:
+ double m_coords[3];
+
+ vertex () {}
+ vertex (double x, double y, double z) {
+ m_coords[X] = x;
+ m_coords[Y] = y;
+ m_coords[Z] = z;
+ }
+
+ void move (vertex other) {
+ for (const Axis ax : g_Axes)
+ m_coords[ax] += other[ax];
+ }
+
+ vertex& operator+= (vertex other) {
+ move (other);
+ return *this;
+ }
+
+ vertex operator/ (const double d) const {
+ vertex other (*this);
+ return other /= d;
+ }
+
+ vertex& operator/= (const double d) {
+ for (const Axis ax : g_Axes)
+ m_coords[ax] /= d;
+ return *this;
+ }
+
+ bool operator== (const vertex& other) const {
+ return coord (X) == other[X] &&
+ coord (Y) == other[Y] &&
+ coord (Z) == other[Z];
+ }
+
+ bool operator!= (const vertex& other) const {
+ return !operator== (other);
+ }
+
+ vertex operator- () const {
+ return vertex (-m_coords[X], -m_coords[Y], -m_coords[Z]);
+ }
+
+ double& coord (const ushort n) {
+ return m_coords[n];
+ }
+
+ const double& coord (const ushort n) const {
+ return m_coords[n];
+ }
+
+ double& operator[] (const Axis ax) {
+ return coord ((ushort) ax);
+ }
+
+ const double& operator[] (const Axis ax) const {
+ return coord ((ushort) ax);
+ }
+
+ double& x () { return m_coords[X]; }
+ double& y () { return m_coords[Y]; }
+ double& z () { return m_coords[Z]; }
+ const double& x () const { return m_coords[X]; }
+ const double& y () const { return m_coords[Y]; }
+ const double& z () const { return m_coords[Z]; }
+
+ vertex midpoint (vertex& other);
+ str stringRep (const bool mangled);
+ void transform (matrix<3> matr, vertex pos);
+ void transform (matrix<4> matr);
+};
+
+#endif // TYPES_H
\ No newline at end of file