[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22117] branches/soc-2009-imbusy/source/ blender: selected faces in editmode work
Lukas Steiblys
imbusy at imbusy.org
Sat Aug 1 12:54:22 CEST 2009
Revision: 22117
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22117
Author: imbusy
Date: 2009-08-01 12:54:22 +0200 (Sat, 01 Aug 2009)
Log Message:
-----------
selected faces in editmode work
Modified Paths:
--------------
branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-08-01 10:36:05 UTC (rev 22116)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-08-01 10:54:22 UTC (rev 22117)
@@ -491,7 +491,7 @@
}
glEnd();
} else {
- GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*3*2*emdm->em->totedge, 0 );
+ /*GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*3*2*emdm->em->totedge, 0 );
float *varray;
if( (varray = GPU_buffer_lock( buffer )) ) {
int prevdraw = 0;
@@ -525,7 +525,7 @@
glDrawArrays(GL_LINES,0,numedges*2);
}
GPU_buffer_unbind();
- } else {
+ } else {*/
glBegin(GL_LINES);
for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
if(!setDrawOptions || setDrawOptions(userData, i)) {
@@ -534,8 +534,8 @@
}
}
glEnd();
- }
- GPU_buffer_free( buffer, 0 );
+ /*}
+ GPU_buffer_free( buffer, 0 );*/
}
}
static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
@@ -697,7 +697,7 @@
}
} else {
/* 3 floats for position, 3 for normal and times two because the faces may actually be quads instead of triangles */
- GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*6*emdm->em->totface*3*2, 0 );
+ /*GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*6*emdm->em->totface*3*2, 0 );
float *varray;
if( (varray = GPU_buffer_lock( buffer )) ) {
int prevdraw = 0;
@@ -784,7 +784,7 @@
}
}
GPU_buffer_unbind();
- } else {
+ } else {*/
for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
int drawSmooth = (efa->flag & ME_SMOOTH);
draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
@@ -820,8 +820,8 @@
glDisable(GL_POLYGON_STIPPLE);
}
}
- }
- GPU_buffer_free( buffer, 0 );
+ /*}
+ GPU_buffer_free( buffer, 0 );*/
}
}
Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c 2009-08-01 10:36:05 UTC (rev 22116)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c 2009-08-01 10:54:22 UTC (rev 22117)
@@ -1602,18 +1602,23 @@
col0[3] + (col1[3]-col0[3])*t);
}
+/* originally defined in DerivedMesh.c */
typedef struct {
DerivedMesh dm;
EditMesh *em;
-} EMDM;
+ float (*vertexCos)[3];
+ float (*vertexNos)[3];
+ float (*faceNos)[3];
+} EditMeshDerivedMesh;
static void draw_dm_edges_sel_interp(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
{
unsigned char *cols[2];
int elemsize = sizeof(float)*3+sizeof(unsigned char)*4;
- EditMesh *em= *((EditMesh **)(dm+1));
- char *varray;
+ EditMeshDerivedMesh *emdm = (EditMeshDerivedMesh *)dm;
+ EditMesh *em= emdm->em;
+ unsigned char *varray;
int i;
GPUBuffer *buffer;
cols[0] = baseCol;
@@ -1632,9 +1637,19 @@
unsigned char *col0 = cols[(eed->v1->f&SELECT)?1:0];
unsigned char *col1 = cols[(eed->v2->f&SELECT)?1:0];
- VECCOPY(((float *)&varray[elemsize*numedges*2]),eed->v1->co);
+ if( emdm->vertexCos ) {
+ VECCOPY(((float *)&varray[elemsize*numedges*2]),emdm->vertexCos[(int) eed->v1->tmp.l]);
+ }
+ else {
+ VECCOPY(((float *)&varray[elemsize*numedges*2]),eed->v1->co);
+ }
QUATCOPY(&varray[elemsize*numedges*2+sizeof(float)*3],col0);
- VECCOPY(((float *)&varray[elemsize*numedges*2+elemsize]),eed->v2->co);
+ if( emdm->vertexCos ) {
+ VECCOPY(((float *)&varray[elemsize*numedges*2+elemsize]),emdm->vertexCos[(int) eed->v2->tmp.l]);
+ }
+ else {
+ VECCOPY(((float *)&varray[elemsize*numedges*2+elemsize]),eed->v2->co);
+ }
QUATCOPY(&varray[elemsize*numedges*2+elemsize+sizeof(float)*3],col1);
numedges++;
}
@@ -1700,44 +1715,237 @@
static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditFace *efa_act)
{
struct { unsigned char *cols[3]; EditFace *efa_act; } data;
+ EditMeshDerivedMesh *emdm = (EditMeshDerivedMesh *)dm;
+ EditFace *efa;
+ unsigned char *col;
unsigned char *colors;
- int i,j;
+ GPUBuffer *buffer;
+ unsigned char *varray;
+ unsigned char black[] = { 0, 0, 0, 0 };
+ int i,j,draw=0;
+ int elemsize = (sizeof(float)*6+sizeof(unsigned char)*4);
data.cols[0] = baseCol;
data.cols[1] = selCol;
data.cols[2] = actCol;
data.efa_act = efa_act;
- /* TODO: check this later. not this function... */
- /*colors = MEM_mallocN((sizeof(unsigned char)*dm->getNumFaces(dm)*16),"draw_dm_faces_sel");
- for(i=0; i < dm->getNumFaces(dm); i++) {
- EditFace *efa = EM_get_face_for_index(i);
- unsigned char *col;
- if (efa->h==0) {
- if (efa == efa_act) {
- for(j=0;j<4;j++) {
- colors[i*16+j*4] = data.cols[2][0];
- colors[i*16+j*4+1] = data.cols[2][1];
- colors[i*16+j*4+2] = data.cols[2][2];
- colors[i*16+j*4+3] = data.cols[2][3];
+
+ buffer = GPU_buffer_alloc( elemsize*emdm->em->totface*3*2, 0 );
+ if( (varray = GPU_buffer_lock( buffer )) ) {
+ int prevdraw = 0;
+ int numfaces = 0;
+ int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_N3F, GPU_BUFFER_INTER_C4UB, GPU_BUFFER_INTER_END };
+ GPU_buffer_unlock( buffer );
+ GPU_interleaved_setup( buffer, datatype );
+ glShadeModel(GL_SMOOTH);
+ GPU_buffer_lock( buffer );
+ for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+ int drawSmooth = (efa->flag & ME_SMOOTH);
+ if (efa->h==0) {
+ if (efa == data.efa_act) {
+ draw = 2;
+ } else {
+ col = data.cols[(efa->f&SELECT)?1:0];
+ if (col[3]==0) draw = 0;
+ else draw = 1;
}
- } else {
- col = data.cols[(efa->f&SELECT)?1:0];
- if (col[3]==0) memset(&colors[i*16],0,sizeof(unsigned char)*16);
- for(j=0;j<4;j++) {
- colors[i*16+j*4] = col[0];
- colors[i*16+j*4+1] = col[1];
- colors[i*16+j*4+2] = col[2];
- colors[i*16+j*4+3] = col[3];
+ }
+ else {
+ draw = 0;
+ }
+ if( prevdraw != draw && prevdraw != 0 && numfaces > 0) {
+ if( prevdraw==2 ) {
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
}
+ GPU_buffer_unlock( buffer );
+ glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+ if( prevdraw==2 ) {
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ varray = GPU_buffer_lock( buffer );
+ numfaces = 0;
}
- } else
- {
- memset(&colors[i*16],0,sizeof(unsigned char)*16);
+
+ if( draw != 0 ) {
+ if(!drawSmooth) {
+ if (emdm->vertexCos) {
+ VECCOPY((float *)&varray[elemsize*3*numfaces],emdm->vertexCos[(int) efa->v1->tmp.l]);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],emdm->faceNos[i]);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],emdm->vertexCos[(int) efa->v2->tmp.l]);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],emdm->faceNos[i]);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],emdm->vertexCos[(int) efa->v3->tmp.l]);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],emdm->faceNos[i]);
+ }
+ else {
+ VECCOPY((float *)&varray[elemsize*3*numfaces],efa->v1->co);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],efa->n);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],efa->v2->co);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],efa->n);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],efa->v3->co);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],efa->n);
+ }
+ if( draw == 2 ) {
+ QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[2]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[2]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[2]);
+ }
+ else if( draw == 1 ) {
+ QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+ }
+ else {
+ QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],black);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],black);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],black);
+ }
+
+ numfaces++;
+ if( efa->v4 ) {
+ if (emdm->vertexCos) {
+ VECCOPY((float *)&varray[elemsize*3*numfaces],emdm->vertexCos[(int) efa->v3->tmp.l]);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],emdm->faceNos[i]);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],emdm->vertexCos[(int) efa->v4->tmp.l]);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],emdm->faceNos[i]);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],emdm->vertexCos[(int) efa->v1->tmp.l]);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],emdm->faceNos[i]);
+ }
+ else {
+ VECCOPY((float *)&varray[elemsize*3*numfaces],efa->v3->co);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],efa->n);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],efa->v4->co);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],efa->n);
+
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],efa->v1->co);
+ VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],efa->n);
+ }
+
+ if( draw == 2 ) {
+ QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[2]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[2]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[2]);
+ }
+ else if( draw == 1 ) {
+ QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+ QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+ }
+ else {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list