Wed, 22 Jan 2020 00:23:29 +0200
at least VAOs work now
/* * LDForge: LDraw parts authoring CAD * Copyright (C) 2013 - 2020 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 <http://www.gnu.org/licenses/>. */ #include "main.h" #include "vertex.h" /* void Vertex::transform(const Matrix& matrix, const Vertex& pos) { double x2 = (matrix(0, 0) * x) + (matrix(0, 1) * y) + (matrix(0, 2) * z) + pos.x; double y2 = (matrix(1, 0) * x) + (matrix(1, 1) * y) + (matrix(1, 2) * z) + pos.y; double z2 = (matrix(2, 0) * x) + (matrix(2, 1) * y) + (matrix(2, 2) * z) + pos.z; this->x = x2; this->y = y2; this->z = z2; } */ Point3D::CoordinateType& Point3D::get(Axis axis) { switch (axis) { case X: return this->x; case Y: return this->y; case Z: return this->z; default: throw std::runtime_error("Non-axis given to Vertex::operator[]"); } } Point3D::CoordinateType Point3D::get(Axis axis) const { switch (axis) { case X: return this->x; case Y: return this->y; case Z: return this->z; default: return 0; } } Point3D::operator QVariant() const { return QVariant::fromValue(*this); } void Point3D::assign(Axis axis, CoordinateType value) { this->get(axis) = value; } Point3D VertexFromVector(const QVector3D& vector) { return {vector.x(), vector.y(), vector.z()}; } Point3D operator*(const Point3D& point, Point3D::CoordinateType scalar) { return {point.x * scalar, point.y * scalar, point.z * scalar}; } Point3D& operator+=(Point3D& point, const QVector3D& other) { point.x += other.x(); point.y += other.y(); point.z += other.z(); return point; } Point3D operator+(Point3D point, const QVector3D& other) { point += other; return point; } QVector3D vertexToVector(const Point3D& vertex) { return { static_cast<float>(vertex.x), static_cast<float>(vertex.y), static_cast<float>(vertex.z) }; } Point3D operator-(Point3D point, const QVector3D& vector) { point -= vector; return point; } Point3D& operator-=(Point3D& point, const QVector3D& vector) { point.x -= vector.x(); point.y -= vector.y(); point.z -= vector.z(); return point; } QVector3D operator-(const Point3D& point, const Point3D& other) { return { static_cast<float>(point.x - other.x), static_cast<float>(point.y - other.y), static_cast<float>(point.z - other.z) }; } Point3D& operator*=(Point3D& point, Point3D::CoordinateType scalar) { point.x *= scalar; point.y *= scalar; point.z *= scalar; return point; } bool operator==(const Point3D& point, const Point3D& other) { return point.x == other.x and point.y == other.y and point.z == other.z; } bool operator!=(const Point3D& point, const Point3D& other) { return not (point == other); } bool operator<(const Point3D& point, const Point3D& other) { if (not qFuzzyCompare(point.x, other.x)) return point.x < other.x; else if (not qFuzzyCompare(point.y, other.y)) return point.y < other.y; else return point.z < other.z; } /* * Transforms the specified vertex with a transformation matrix */ Point3D math::transform(const Point3D& point, const Matrix4x4& matrix) { return { matrix(0, 0) * point.x + matrix(0, 1) * point.y + matrix(0, 2) * point.z + matrix(0, 3), matrix(1, 0) * point.x + matrix(1, 1) * point.y + matrix(1, 2) * point.z + matrix(1, 3), matrix(2, 0) * point.x + matrix(2, 1) * point.y + matrix(2, 2) * point.z + matrix(2, 3), }; } /* * Returns the distance from one vertex to another. */ qreal math::distance(const Point3D& one, const Point3D& other) { return (one - other).length(); } /* * Returns a vertex with all coordinates inverted. */ Point3D operator-(const Point3D& vertex) { return {-vertex.x, -vertex.y, -vertex.z}; } /* * Inserts this vertex into a data stream. This is needed for vertices to be * stored in QSettings. */ QDataStream& operator<<(QDataStream& out, const Point3D& vertex) { return out << vertex.x << vertex.y << vertex.z; } /* * Takes a vertex from a data stream. */ QDataStream& operator>>(QDataStream& in, Point3D& vertex) { return in >> vertex.x >> vertex.y >> vertex.z; } unsigned int qHash(const Point3D& key) { return qHash(key.x) ^ utility::rotl10(qHash(key.y)) ^ utility::rotl20(qHash(key.z)); } QString vertexToStringParens(const Point3D& vertex) { return utility::format("(%1, %2, %3)", vertex.x, vertex.y, vertex.z); }