[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