[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11507] branches/soc-2007-maike/source/ blender: Added glsl support for some curves and surfaces

Miguel Torres Lima torreslima at gmail.com
Mon Aug 6 20:13:08 CEST 2007


Revision: 11507
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11507
Author:   maike
Date:     2007-08-06 20:13:08 +0200 (Mon, 06 Aug 2007)

Log Message:
-----------
Added glsl support for some curves and surfaces

Modified Paths:
--------------
    branches/soc-2007-maike/source/blender/include/BDR_drawobject.h
    branches/soc-2007-maike/source/blender/src/drawobject.c
    branches/soc-2007-maike/source/blender/src/glsl_drawobject.c

Modified: branches/soc-2007-maike/source/blender/include/BDR_drawobject.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BDR_drawobject.h	2007-08-06 16:34:01 UTC (rev 11506)
+++ branches/soc-2007-maike/source/blender/include/BDR_drawobject.h	2007-08-06 18:13:08 UTC (rev 11507)
@@ -74,6 +74,12 @@
 extern void draw_object_backbufsel(struct Object *ob);
 void draw_object_instance(struct Object *ob, int dt, int outline);
 
+
+void update_index3_nors_incr(int value);
+void update_draw_index_wire(int value);
+void glsl_drawDispListwire(struct ListBase *lb);
+
+
 #ifdef __cplusplus
 }
 #endif

Modified: branches/soc-2007-maike/source/blender/src/drawobject.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/drawobject.c	2007-08-06 16:34:01 UTC (rev 11506)
+++ branches/soc-2007-maike/source/blender/src/drawobject.c	2007-08-06 18:13:08 UTC (rev 11507)
@@ -3738,6 +3738,10 @@
 	      glsl_draw_mball(base);
 	      return;
 	    }
+	    else if(ob->type == OB_SURF || ob->type == OB_CURVE){
+	      glsl_draw_curve(base);
+	      return;
+	    }
 	  }
 	}
 	/* GLSL draw end */
@@ -4492,3 +4496,20 @@
 	if(edm) edm->release(edm);
 	if(dm) dm->release(dm);
 }
+
+
+void update_index3_nors_incr(int value)
+{
+  index3_nors_incr = value;
+}
+
+void update_draw_index_wire(int value)
+{
+  draw_index_wire = value;
+}
+
+
+void glsl_drawDispListwire(ListBase *lb)
+{
+  drawDispListwire(lb);
+}

Modified: branches/soc-2007-maike/source/blender/src/glsl_drawobject.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_drawobject.c	2007-08-06 16:34:01 UTC (rev 11506)
+++ branches/soc-2007-maike/source/blender/src/glsl_drawobject.c	2007-08-06 18:13:08 UTC (rev 11507)
@@ -16,6 +16,7 @@
 #include "DNA_view3d_types.h"
 #include "DNA_vec_types.h"
 #include "DNA_meta_types.h"
+#include "DNA_curve_types.h"
 
 #include "BLI_arithb.h"
 
@@ -26,6 +27,7 @@
 #include "BKE_displist.h"
 
 #include "BDR_drawmesh.h"
+#include "BDR_drawobject.h"
 
 #include "BIF_resources.h"
 #include "BIF_glsl_material.h"
@@ -439,27 +441,105 @@
 }
 
 
+void glsl_draw_curve(Base *base)
+{
+  Object *ob = base->object;
+  Curve *cu = ob->data;
+  DispList *dl;
+  ListBase *lb;
+
+  if(cu->disp.first == NULL) makeDispListCurveTypes(ob, 0);
+
+  if(boundbox_clip(ob->obmat, cu->bb)) {
+
+    switch(ob->type)
+      {
+      case OB_CURVE:
+	lb= &cu->disp;
+	
+	dl= lb->first;
+	if(dl==NULL) return;
+	
+	if(dl->nors==0) addnormalsDispList(ob, lb);
+	update_index3_nors_incr(0);
+	
+	if( displist_has_faces(lb)==0) {
+	  update_draw_index_wire(0);
+	  glsl_drawDispListwire(lb);
+	  update_draw_index_wire(1);
+	}
+	else {
+	  if(ob->disp.first==0) shadeDispList(base);
+	  glsl_draw_dispList(ob, dl);
+
+	  if(ob==G.obedit && cu->bevobj==NULL && cu->taperobj==NULL) {
+	    cpack(0);
+	    update_draw_index_wire(0);
+	    glsl_drawDispListwire(lb);
+	    update_draw_index_wire(1);
+	  }
+	}
+	update_index3_nors_incr(1);
+	break;
+      case OB_SURF:	
+	lb= &((Curve *)ob->data)->disp;
+	
+	dl= lb->first;
+	if(dl==NULL) return;
+	  
+	if(dl->nors==NULL) addnormalsDispList(ob, lb);
+	if(ob->disp.first==0) shadeDispList(base);
+
+	glsl_draw_dispList(ob, dl);
+	 
+	break;  
+      }
+
+    /*if(cu->path)
+      curve_draw_speed(ob);*/
+  }
+}
+
+
 void glsl_draw_mball(Base *base)
 {
   Object *ob = base->object;
-  GLSL_Program program = NULL;
-  Material *mat = give_current_material(ob, 0);
   DispList *dl;
   ListBase *lb;
-  int i;
-  void *verts, *nors;
 
-
   lb = &ob->disp;
   if(lb->first == NULL) makeDispListMBall(ob);
   if(lb->first == NULL) return;
   
   dl = lb->first;
 
+  glsl_draw_dispList(ob, dl);
+}
+
+
+void glsl_draw_dispList(Object *ob, DispList *dl)
+{
+  GLSL_Program program = NULL;
+  Material *mat;
+  unsigned int *cdata;
+  DispList *dlob;
+  int i;
+
+  switch(ob->type)
+    {
+    case OB_MBALL:
+      mat = give_current_material(ob, 0);
+      break;
+    default:
+      mat = give_current_material(ob, dl->col + 1);
+      break;
+    }
+
+
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glMultMatrixf(ob->obmat);
-
+  
   if(mat && mat->mode & MA_SHLESS){
     glUseProgram(0);
     glColor4f(mat->r, mat->g, mat->b, mat->alpha);
@@ -479,14 +559,54 @@
       glsl_update_colorband_tex_uniforms(program->program, mat, 0);
   }
 
+
+
   glEnableClientState(GL_NORMAL_ARRAY);
 
-  while(dl){
-    glVertexPointer(3, GL_FLOAT, 0, dl->verts);
-    glNormalPointer(GL_FLOAT, 0, dl->nors);
-    glDrawElements(GL_QUADS, 4 * dl->parts, GL_UNSIGNED_INT, dl->index);
-    
+  if(!ob->type == OB_MBALL)
+    glEnableClientState(GL_COLOR_ARRAY);
+
+  dlob = ob->disp.first;
+
+  while(dl && dlob){
+    if(ob->type != OB_MBALL){
+      cdata = dlob->col1;
+      if(cdata == NULL) break;
+    }
+
+    switch(dl->type)
+      {
+      case DL_INDEX3:
+	glVertexPointer(3, GL_FLOAT, 0, dl->verts);
+	glNormalPointer(GL_FLOAT, 0, dl->nors);
+	
+	if(!ob->type == OB_MBALL)
+	  glColorPointer(4, GL_UNSIGNED_BYTE, 0, cdata);
+
+	glDrawElements(GL_TRIANGLES, 3 * dl->parts, GL_UNSIGNED_INT, dl->index);
+	break;
+      case DL_SURF:
+	glVertexPointer(3, GL_FLOAT, 0, dl->verts);
+	glNormalPointer(GL_FLOAT, 0, dl->nors);
+
+	if(!ob->type == OB_MBALL)
+	  glColorPointer(4, GL_UNSIGNED_BYTE, 0, cdata);
+
+	glDrawElements(GL_QUADS, 4 * dl->totindex, GL_UNSIGNED_INT, dl->index);
+	break;
+      case DL_INDEX4:
+	glVertexPointer(3, GL_FLOAT, 0, dl->verts);  
+	glNormalPointer(GL_FLOAT, 0, dl->nors);
+
+	if(!ob->type == OB_MBALL)
+	  glColorPointer(4, GL_UNSIGNED_BYTE, 0, cdata);
+
+	glDrawElements(GL_QUADS, 4 * dl->parts, GL_UNSIGNED_INT, dl->index);
+	break;
+      }
+
     dl = dl->next;
+    dlob = dlob->next;
   }
 
   glPopMatrix();
@@ -499,7 +619,10 @@
   }
   glUseProgram(0);  
 
+
   glDisableClientState(GL_NORMAL_ARRAY);
+  if(!ob->type == OB_MBALL)
+    glDisableClientState(GL_COLOR_ARRAY);
 }
 
 





More information about the Bf-blender-cvs mailing list