87 lines
1.7 KiB
C++
87 lines
1.7 KiB
C++
#ifndef MV3DELEMENTFLOOROBSTACLEWALL_H
|
|
#define MV3DELEMENTFLOOROBSTACLEWALL_H
|
|
|
|
#include <Indoor/floorplan/v2/Floorplan.h>
|
|
|
|
#include "MV3DElement.h"
|
|
|
|
class MV3DElementFloorObstacleWall : public MV3DElement {
|
|
|
|
Floorplan::Floor* f;
|
|
Floorplan::FloorObstacleLine* fo;
|
|
|
|
public:
|
|
|
|
/** ctor */
|
|
MV3DElementFloorObstacleWall(Floorplan::Floor* f, Floorplan::FloorObstacleLine* fo) : f(f), fo(fo) {
|
|
;
|
|
}
|
|
|
|
protected:
|
|
|
|
Point3 cross(Point3 u, Point3 v) {
|
|
float x = u.y*v.z - u.z*v.y;
|
|
float y = u.z*v.x - u.x*v.z;
|
|
float z = u.x*v.y - u.y*v.x;
|
|
return Point3(x,y,z);
|
|
}
|
|
|
|
/** repaint me */
|
|
void paintGL() override {
|
|
|
|
float y1 = f->atHeight;
|
|
float y2 = y1+f->height;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Point3 p1 = Point3(fo->from.x, y1, fo->from.y);
|
|
Point3 p2 = Point3(fo->to.x, y1, fo->to.y);
|
|
Point3 p3 = Point3(fo->to.x, y2, fo->to.y);
|
|
Point3 p4 = Point3(fo->from.x, y2, fo->from.y);
|
|
|
|
Point3 v1 = p2-p1;
|
|
Point3 v2 = p3-p1;
|
|
Point3 n = cross(v1, v2);
|
|
n/=n.length();
|
|
|
|
// align normals to virtual viewport
|
|
Point3 view(99,99,99);
|
|
if ((view-n).length() > (view+n).length()) {n = -n;}
|
|
|
|
if (fo->type == Floorplan::ObstacleType::WALL) {
|
|
|
|
// fill the wall
|
|
glColor3f(0.75, 0.75, 0.75);
|
|
glDisable(GL_CULL_FACE);
|
|
glBegin(GL_QUADS);
|
|
glNormal3f(n.x, n.y, n.z);
|
|
glVertex3f(p1.x, p1.y, p1.z);
|
|
glVertex3f(p2.x, p2.y, p2.z);
|
|
glVertex3f(p3.x, p3.y, p3.z);
|
|
glVertex3f(p4.x, p4.y, p4.z);
|
|
glEnd();
|
|
glEnable(GL_CULL_FACE);
|
|
|
|
}
|
|
|
|
glColor3f(0,0,0);
|
|
|
|
// glDisable(GL_LIGHTING);
|
|
// glBegin(GL_LINE_STRIP);
|
|
// glVertex3f(p1.x, p1.y, p1.z);
|
|
// glVertex3f(p2.x, p2.y, p2.z);
|
|
// glVertex3f(p3.x, p3.y, p3.z);
|
|
// glVertex3f(p4.x, p4.y, p4.z);
|
|
// glVertex3f(p1.x, p1.y, p1.z);
|
|
// glEnd();
|
|
// glEnable(GL_LIGHTING);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
#endif // MV3DELEMENTFLOOROBSTACLEWALL_H
|