From 6d6f22c92f080486b4d91aa7a706c4b18a0304b2 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Tue, 5 Feb 2008 21:26:42 +0000
Subject: [PATCH] fix surf stl drawing

---
 Graphics/Geom.cpp | 48 +++++++++++++++++++++++++++++++++++++----------
 Graphics/Mesh.cpp |  6 +++---
 2 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp
index 251096419f..434ba30a5e 100644
--- a/Graphics/Geom.cpp
+++ b/Graphics/Geom.cpp
@@ -1,4 +1,4 @@
-// $Id: Geom.cpp,v 1.147 2008-02-05 15:59:34 geuzaine Exp $
+// $Id: Geom.cpp,v 1.148 2008-02-05 21:26:42 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -23,6 +23,7 @@
 #include "Draw.h"
 #include "Context.h"
 #include "gl2ps.h"
+#include "VertexArray.h"
 #include "GModel.h"
 #include "SBoundingBox3d.h"
 
@@ -200,14 +201,11 @@ class drawGEdge {
   }
 };
 
-void drawArrays(GEntity *e, VertexArray *va, GLint type, bool useNormalArray, 
-		int forceColor=0, unsigned int color=0);
-
 class drawGFace {
  private:
   void _drawNonPlaneGFace(GFace *f)
   {
-    if(CTX.geom.surfaces) {
+    if(CTX.geom.surfaces && !f->va_geom_triangles) {
       glEnable(GL_LINE_STIPPLE);
       glLineStipple(1, 0x1F1F);
       gl2psEnable(GL2PS_LINE_STIPPLE);
@@ -386,7 +384,7 @@ class drawGFace {
 
     if(f->cross.size() < 2) return;
 
-    if(CTX.geom.surfaces) {
+    if(CTX.geom.surfaces && !f->va_geom_triangles) {
       glEnable(GL_LINE_STIPPLE);
       glLineStipple(1, 0x1F1F);
       gl2psEnable(GL2PS_LINE_STIPPLE);
@@ -422,6 +420,35 @@ class drawGFace {
 		  p.x(), p.y(), p.z(), n[0], n[1], n[2], CTX.geom.light);
     }
   }
+  void _drawVertexArray(VertexArray *va, bool useNormalArray, int forceColor=0, 
+			unsigned int color=0)
+  {
+    if(!va) return;
+    glVertexPointer(3, GL_FLOAT, 0, va->getVertexArray());
+    glNormalPointer(GL_BYTE, 0, va->getNormalArray());
+    glColorPointer(4, GL_UNSIGNED_BYTE, 0, va->getColorArray());
+    glEnableClientState(GL_VERTEX_ARRAY);
+    if(useNormalArray){
+      glEnable(GL_LIGHTING);
+      glEnableClientState(GL_NORMAL_ARRAY);
+    }
+    else
+      glDisableClientState(GL_NORMAL_ARRAY);
+    if(forceColor){
+      glDisableClientState(GL_COLOR_ARRAY);
+      glColor4ubv((GLubyte *) & color);
+    }
+    else{
+      glEnableClientState(GL_COLOR_ARRAY);
+    }
+    if(CTX.polygon_offset) glEnable(GL_POLYGON_OFFSET_FILL);
+    glDrawArrays(GL_TRIANGLES, 0, va->getNumVertices());
+    glDisable(GL_POLYGON_OFFSET_FILL);
+    glDisable(GL_LIGHTING);
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_NORMAL_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+  }
   
 public :
   void operator () (GFace *f)
@@ -447,10 +474,11 @@ public :
       glColor4ubv((GLubyte *) & CTX.color.geom.surface);
     }
 
-    if(f->va_geom_triangles)
-      drawArrays(f, f->va_geom_triangles, GL_TRIANGLES, CTX.geom.light, 
-		 CTX.geom.surfaces, CTX.color.geom.surface);
-    else if(f->geomType() == GEntity::Plane)
+    if(CTX.geom.surfaces && f->va_geom_triangles)
+      _drawVertexArray(f->va_geom_triangles, CTX.geom.light, f->getSelection(), 
+		       CTX.color.geom.selection);
+    
+    if(f->geomType() == GEntity::Plane)
       _drawPlaneGFace(f);
     else if(f->geomType() == GEntity::ProjectionFace ||
 	    f->geomType() == GEntity::ParametricSurface)
diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index 3c8b9306e4..2e9c40552c 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Mesh.cpp,v 1.213 2008-02-05 15:59:34 geuzaine Exp $
+// $Id: Mesh.cpp,v 1.214 2008-02-05 21:26:42 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -440,8 +440,8 @@ static void addElementsInArrays(GEntity *e, std::vector<T*> &elements,
   }
 }
 
-void drawArrays(GEntity *e, VertexArray *va, GLint type, bool useNormalArray, 
-		int forceColor=0, unsigned int color=0)
+static void drawArrays(GEntity *e, VertexArray *va, GLint type, bool useNormalArray, 
+		       int forceColor=0, unsigned int color=0)
 {
   if(!va) return;
 
-- 
GitLab