/* * © Copyright 2014 – Urheberrechtshinweis * Alle Rechte vorbehalten / All Rights Reserved * * Programmcode ist urheberrechtlich geschuetzt. * Das Urheberrecht liegt, soweit nicht ausdruecklich anders gekennzeichnet, bei Frank Ebner. * Keine Verwendung ohne explizite Genehmigung. * (vgl. § 106 ff UrhG / § 97 UrhG) */ #include "../../../fixC11.h" #include "Outline.h" #include #include #include #include "Shader.h" Outline::Outline() { } void Outline::render(const RenderSettings& rs) { rs.shader->bind(); // identity QMatrix4x4 mat; rs.shader->setModelMatrix(mat); // show both sides //glDisable(GL_CULL_FACE); //glEnable(GL_CULL_FACE); rs.shader->setColor(color.x, color.y, color.z); rs.shader->setVertices(triangles.getVertices().data()); rs.shader->setNormals(triangles.getNormals().data()); rs.funcs->glDrawArrays(GL_TRIANGLES, 0, triangles.getVertices().size() / 3); rs.shader->unsetVertices(); rs.shader->unsetNormals(); rs.shader->release(); } void Outline::setColor(float r, float g, float b) { color = Point3(r,g,b); } void Outline::clear() { triangles.clear(); } void Outline::add(std::vector>& triangles) { for (const std::vector& tria : triangles) { for (size_t i = 2; i < tria.size(); ++i) { const Point3 p1 = tria[i-2]; const Point3 p2 = tria[i-1]; const Point3 p3 = tria[i-0]; const Point3 n = cross(p2-p1, p3-p1); if (n.z < 0) { // upper side (floor) this->triangles.addTriangle(p1, p3, p2, Point3(0,0,+1)); // facing downwards (ceiling) this->triangles.addTriangle(p1, p2, p3, Point3(0,0,-1)); } else { // upper side (floor) this->triangles.addTriangle(p1, p2, p3, Point3(0,0,+1)); // facing downwards (ceiling) this->triangles.addTriangle(p1, p3, p2, Point3(0,0,-1)); } } } }