87 lines
1.9 KiB
C++
87 lines
1.9 KiB
C++
/*
|
||
* © 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 <QMatrix4x4>
|
||
#include <Indoor/geo/Point3.h>
|
||
#include <QOpenGLWidget>
|
||
#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<std::vector<Point3>>& triangles) {
|
||
|
||
for (const std::vector<Point3>& 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));
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
}
|