diff --git a/Geo/OCCRegion.cpp b/Geo/OCCRegion.cpp index fb58b63877122c956499af04f73f80b426b363e4..7ed5de97d6bdf71bf3f2b776f9ced7f2038cda8d 100644 --- a/Geo/OCCRegion.cpp +++ b/Geo/OCCRegion.cpp @@ -31,7 +31,7 @@ OCCRegion::OCCRegion(GModel *m, TopoDS_Solid _s, int num, TopTools_IndexedMapOfS Msg::Error("Unknown face %d in region %d", index, num); } } - Msg::Info("OCC Region %d with %d edges", num, l_faces.size()); + Msg::Info("OCC Region %d with %d faces", num, l_faces.size()); } GEntity::GeomType OCCRegion::geomType() const diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp index 793b851988e5a207265d8edbf01017216fff14f2..4519ae1279702707b5ce546add66d4f488450dec 100644 --- a/Graphics/Geom.cpp +++ b/Graphics/Geom.cpp @@ -13,6 +13,42 @@ extern Context_T CTX; +class visContext{ + public: + visContext(){} + virtual void transform(double &x, double &y, double &z){} +}; + +class visContextScaled : public visContext { + private: + bool _identityTransform; + double _mat[3][3]; + public: + visContextScaled(double mat[3][3]) : visContext() + { + if(mat[0][0] != 1. || mat[0][1] != 0. || mat[0][2] != 0. || + mat[1][0] != 0. || mat[1][1] != 1. || mat[1][2] != 0. || + mat[2][0] != 0. || mat[2][1] != 0. || mat[2][2] != 1.) + _identityTransform = false; + else + _identityTransform = true; + for(int i = 0; i < 3; i++) + for(int j = 0; j < 3; j++) + _mat[i][j] = mat[i][j]; + } + virtual void transform(double &x, double &y, double &z) + { + if(_identityTransform) return; + double xyz[3] = {x, y, z}; + x = y = z = 0.; + for(int k = 0; k < 3; k++){ + x += _mat[0][k] * xyz[k]; + y += _mat[1][k] * xyz[k]; + z += _mat[2][k] * xyz[k]; + } + } +}; + static void drawBBox(GEntity *e) { return; @@ -25,7 +61,10 @@ static void drawBBox(GEntity *e) } class drawGVertex { + private : + visContext *_ctx; public : + drawGVertex(visContext *ctx) : _ctx(ctx){} void operator () (GVertex *v) { if(!v->getVisibility()) return; @@ -55,18 +94,19 @@ class drawGVertex { glColor4ubv((GLubyte *) & CTX.color.geom.highlight[1]); } + double x = v->x(), y = v->y(), z = v->z(); + _ctx->transform(x, y, z); + if(CTX.geom.points) { if(CTX.geom.point_type > 0) { if(v->getSelection()) - Draw_Sphere(CTX.geom.point_sel_size, v->x(), v->y(), v->z(), - CTX.geom.light); + Draw_Sphere(CTX.geom.point_sel_size, x, y, z, CTX.geom.light); else - Draw_Sphere(CTX.geom.point_size, v->x(), v->y(), v->z(), - CTX.geom.light); + Draw_Sphere(CTX.geom.point_size, x, y, z, CTX.geom.light); } else { glBegin(GL_POINTS); - glVertex3d(v->x(), v->y(), v->z()); + glVertex3d(x, y, z); glEnd(); } } @@ -76,9 +116,9 @@ class drawGVertex { sprintf(Num, "%d", v->tag()); double offset = (0.5 * CTX.geom.point_size + 0.3 * CTX.gl_fontsize) * CTX.pixel_equiv_x; - glRasterPos3d(v->x() + offset / CTX.s[0], - v->y() + offset / CTX.s[1], - v->z() + offset / CTX.s[2]); + glRasterPos3d(x + offset / CTX.s[0], + y + offset / CTX.s[1], + z + offset / CTX.s[2]); Draw_String(Num); } @@ -90,7 +130,10 @@ class drawGVertex { }; class drawGEdge { + private : + visContext *_ctx; public : + drawGEdge(visContext *ctx) : _ctx(ctx){} void operator () (GEdge *e) { if(!e->getVisibility()) return; @@ -136,6 +179,8 @@ class drawGEdge { double x[2] = {p1.x(), p2.x()}; double y[2] = {p1.y(), p2.y()}; double z[2] = {p1.z(), p2.z()}; + _ctx->transform(x[0], y[0], z[0]); + _ctx->transform(x[1], y[1], z[1]); Draw_Cylinder(e->getSelection() ? CTX.geom.line_sel_width : CTX.geom.line_width, x, y, z, CTX.geom.light); } @@ -145,7 +190,9 @@ class drawGEdge { for(int i = 0; i < N; i++) { double t = t_min + (double)i / (double)(N - 1) * (t_max - t_min); GPoint p = e->point(t); - glVertex3d(p.x(), p.y(), p.z()); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + glVertex3d(x, y, z); } glEnd(); } @@ -157,9 +204,11 @@ class drawGEdge { sprintf(Num, "%d", e->tag()); double offset = (0.5 * CTX.geom.line_width + 0.3 * CTX.gl_fontsize) * CTX.pixel_equiv_x; - glRasterPos3d(p.x() + offset / CTX.s[0], - p.y() + offset / CTX.s[1], - p.z() + offset / CTX.s[2]); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + glRasterPos3d(x + offset / CTX.s[0], + y + offset / CTX.s[1], + z + offset / CTX.s[2]); Draw_String(Num); } @@ -171,9 +220,12 @@ class drawGEdge { for(int i = 0; i < 3; i++) der[i] *= CTX.geom.tangents * CTX.pixel_equiv_x / CTX.s[i]; glColor4ubv((GLubyte *) & CTX.color.geom.tangents); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + // FIXME: transform the tangent Draw_Vector(CTX.vector_type, 0, CTX.arrow_rel_head_radius, CTX.arrow_rel_stem_length, CTX.arrow_rel_stem_radius, - p.x(), p.y(), p.z(), der[0], der[1], der[2], CTX.geom.light); + x, y, z, der[0], der[1], der[2], CTX.geom.light); } if(CTX.draw_bbox) drawBBox(e); @@ -187,6 +239,7 @@ class drawGEdge { class drawGFace { private: + visContext *_ctx; void _drawVertexArray(VertexArray *va, bool useNormalArray, int forceColor=0, unsigned int color=0) { @@ -246,13 +299,17 @@ class drawGFace { glBegin(GL_LINE_STRIP); for(int i = 0; i < N; i++) { GPoint p = f->point(ubounds.low() + ud * (double)i / (double)(N - 1), vav); - glVertex3d(p.x(), p.y(), p.z()); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + glVertex3d(x, y, z); } glEnd(); glBegin(GL_LINE_STRIP); for(int i = 0; i < N; i++) { GPoint p = f->point(uav, vbounds.low() + vd * (double)i / (double)(N - 1)); - glVertex3d(p.x(), p.y(), p.z()); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + glVertex3d(x, y, z); } glEnd(); glDisable(GL_LINE_STIPPLE); @@ -265,9 +322,11 @@ class drawGFace { char Num[100]; sprintf(Num, "%d", f->tag()); double offset = 0.3 * CTX.gl_fontsize * CTX.pixel_equiv_x; - glRasterPos3d(p.x() + offset / CTX.s[0], - p.y() + offset / CTX.s[1], - p.z() + offset / CTX.s[2]); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + glRasterPos3d(x + offset / CTX.s[0], + y + offset / CTX.s[1], + z + offset / CTX.s[2]); Draw_String(Num); } @@ -277,9 +336,12 @@ class drawGFace { for(int i = 0; i < 3; i++) n[i] *= CTX.geom.normals * CTX.pixel_equiv_x / CTX.s[i]; glColor4ubv((GLubyte *) & CTX.color.geom.normals); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + // FIXME: transform the normal Draw_Vector(CTX.vector_type, 0, CTX.arrow_rel_head_radius, CTX.arrow_rel_stem_length, CTX.arrow_rel_stem_radius, - p.x(), p.y(), p.z(), n[0], n[1], n[2], CTX.geom.light); + x, y, z, n[0], n[1], n[2], CTX.geom.light); } } void _drawPlaneGFace(GFace *f) @@ -290,13 +352,14 @@ class drawGFace { // reentrant, so we must lock it to avoid race conditions when // redraw events are fired in rapid succession static bool busy = false; - if(!f->cross.size() && !busy) { + if(f->cross.empty() && !busy) { busy = true; f->buildRepresentationCross(); busy = false; } } + //FIXME: cleanup buildGraphicsRep if(CTX.geom.surfaces) { if(CTX.geom.surface_type > 0 && f->va_geom_triangles){ _drawVertexArray(f->va_geom_triangles, CTX.geom.light, @@ -307,8 +370,11 @@ class drawGFace { glLineStipple(1, 0x1F1F); gl2psEnable(GL2PS_LINE_STIPPLE); glBegin(GL_LINES); - for(unsigned int i = 0; i < f->cross.size(); i++) - glVertex3d(f->cross[i].x(), f->cross[i].y(), f->cross[i].z()); + for(unsigned int i = 0; i < f->cross.size(); i++){ + double x = f->cross[i].x(), y = f->cross[i].y(), z = f->cross[i].z(); + _ctx->transform(x, y, z); + glVertex3d(x, y, z); + } glEnd(); glDisable(GL_LINE_STIPPLE); gl2psDisable(GL2PS_LINE_STIPPLE); @@ -321,9 +387,13 @@ class drawGFace { char Num[100]; sprintf(Num, "%d", f->tag()); double offset = 0.3 * CTX.gl_fontsize * CTX.pixel_equiv_x; - glRasterPos3d(0.5 * (f->cross[0].x() + f->cross[1].x()) + offset / CTX.s[0], - 0.5 * (f->cross[0].y() + f->cross[1].y()) + offset / CTX.s[0], - 0.5 * (f->cross[0].z() + f->cross[1].z()) + offset / CTX.s[0]); + double x = 0.5 * (f->cross[0].x() + f->cross[1].x()); + double y = 0.5 * (f->cross[0].y() + f->cross[1].y()); + double z = 0.5 * (f->cross[0].z() + f->cross[1].z()); + _ctx->transform(x, y, z); + glRasterPos3d(x + offset / CTX.s[0], + y + offset / CTX.s[0], + z + offset / CTX.s[0]); Draw_String(Num); } @@ -336,13 +406,17 @@ class drawGFace { for(int i = 0; i < 3; i++) n[i] *= CTX.geom.normals * CTX.pixel_equiv_x / CTX.s[i]; glColor4ubv((GLubyte *) & CTX.color.geom.normals); + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + // FIXME: transform the normal Draw_Vector(CTX.vector_type, 0, CTX.arrow_rel_head_radius, CTX.arrow_rel_stem_length, CTX.arrow_rel_stem_radius, - p.x(), p.y(), p.z(), n[0], n[1], n[2], CTX.geom.light); + x, y, z, n[0], n[1], n[2], CTX.geom.light); } } - -public : + + public : + drawGFace(visContext *ctx) : _ctx(ctx) {} void operator () (GFace *f) { if(!f->getVisibility()) return; @@ -381,7 +455,10 @@ public : }; class drawGRegion { + private : + visContext *_ctx; public : + drawGRegion(visContext *ctx) : _ctx(ctx){} void operator () (GRegion *r) { if(!r->getVisibility()) return; @@ -400,16 +477,19 @@ class drawGRegion { SPoint3 p = r->bounds().center(); const double size = 8.; + double x = p.x(), y = p.y(), z = p.z(); + _ctx->transform(x, y, z); + if(CTX.geom.volumes) - Draw_Sphere(size, p.x(), p.y(), p.z(), CTX.geom.light); + Draw_Sphere(size, x, y, z, CTX.geom.light); if(CTX.geom.volumes_num){ char Num[100]; sprintf(Num, "%d", r->tag()); double offset = (0.5 * size + 0.3 * CTX.gl_fontsize) * CTX.pixel_equiv_x; - glRasterPos3d(p.x() + offset / CTX.s[0], - p.y() + offset / CTX.s[1], - p.z() + offset / CTX.s[2]); + glRasterPos3d(x + offset / CTX.s[0], + y + offset / CTX.s[1], + z + offset / CTX.s[2]); Draw_String(Num); } @@ -436,20 +516,24 @@ void Draw_Geom() glEnable((GLenum)(GL_CLIP_PLANE0 + i)); else glDisable((GLenum)(GL_CLIP_PLANE0 + i)); - + GModel *m = GModel::current(); + visContext ctx; + //double mat[3][3] = {{2, 0, 0}, {0, 1, 0}, {0, 0, 1}}; + //visContextScaled ctx(mat); + if(CTX.geom.points || CTX.geom.points_num) - std::for_each(m->firstVertex(), m->lastVertex(), drawGVertex()); + std::for_each(m->firstVertex(), m->lastVertex(), drawGVertex(&ctx)); if(CTX.geom.lines || CTX.geom.lines_num || CTX.geom.tangents) - std::for_each(m->firstEdge(), m->lastEdge(), drawGEdge()); + std::for_each(m->firstEdge(), m->lastEdge(), drawGEdge(&ctx)); if(CTX.geom.surfaces || CTX.geom.surfaces_num || CTX.geom.normals) - std::for_each(m->firstFace(), m->lastFace(), drawGFace()); + std::for_each(m->firstFace(), m->lastFace(), drawGFace(&ctx)); if(CTX.geom.volumes || CTX.geom.volumes_num) - std::for_each(m->firstRegion(), m->lastRegion(), drawGRegion()); + std::for_each(m->firstRegion(), m->lastRegion(), drawGRegion(&ctx)); for(int i = 0; i < 6; i++) glDisable((GLenum)(GL_CLIP_PLANE0 + i));