#ifndef MV3DELEMENTFLOOROBSTACLEWALL_H #define MV3DELEMENTFLOOROBSTACLEWALL_H #include #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