This commit is contained in:
2011-08-30 00:23:11 +00:00
9 changed files with 82 additions and 25 deletions

View File

@@ -338,7 +338,8 @@ struct DerivedMesh {
int (*setDrawOptions)(void *userData, int index, int (*setDrawOptions)(void *userData, int index,
int *drawSmooth_r), int *drawSmooth_r),
void *userData, int useColors, void *userData, int useColors,
int (*setMaterial)(int, void *attribs)); int (*setMaterial)(int, void *attribs),
int (*compareDrawOptions)(void *userData, int cur_index, int next_index));
/* Draw mapped faces using MTFace /* Draw mapped faces using MTFace
* o Drawing options too complicated to enumerate, look at code. * o Drawing options too complicated to enumerate, look at code.

View File

@@ -874,7 +874,8 @@ static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tfa
cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL); cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
} }
static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs)) static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs),
int (*compareDrawOptions)(void *userData, int cur_index, int next_index))
{ {
CDDerivedMesh *cddm = (CDDerivedMesh*) dm; CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
MVert *mv = cddm->mvert; MVert *mv = cddm->mvert;
@@ -991,6 +992,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
MFace *mface= mf + actualFace; MFace *mface= mf + actualFace;
int drawSmooth= (mface->flag & ME_SMOOTH); int drawSmooth= (mface->flag & ME_SMOOTH);
int draw = 1; int draw = 1;
int flush = 0;
if(i != tottri-1) if(i != tottri-1)
next_actualFace= dm->drawObject->triangle_to_mface[i+1]; next_actualFace= dm->drawObject->triangle_to_mface[i+1];
@@ -1005,11 +1007,28 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
/* Goal is to draw as long of a contiguous triangle /* Goal is to draw as long of a contiguous triangle
array as possible, so draw when we hit either an array as possible, so draw when we hit either an
invisible triangle or at the end of the array */ invisible triangle or at the end of the array */
if(!draw || i == tottri - 1 || mf[actualFace].mat_nr != mf[next_actualFace].mat_nr) {
if(prevstart != i) /* flush buffer if current triangle isn't drawable or it's last triangle... */
/* Add one to the length (via `draw') flush= !draw || i == tottri - 1;
if we're drawing at the end of the array */
glDrawArrays(GL_TRIANGLES,prevstart*3, (i-prevstart+draw)*3); /* ... or when material setting is dissferent */
flush|= mf[actualFace].mat_nr != mf[next_actualFace].mat_nr;
if(!flush && compareDrawOptions) {
int next_orig= (index==NULL) ? next_actualFace : index[next_actualFace];
/* also compare draw options and flush buffer if they're different
need for face selection highlight in edit mode */
flush|= compareDrawOptions(userData, orig, next_orig) == 0;
}
if(flush) {
int first= prevstart*3;
int count= (i-prevstart+(draw ? 1 : 0))*3; /* Add one to the length if we're drawing at the end of the array */
if(count)
glDrawArrays(GL_TRIANGLES, first, count);
prevstart = i + 1; prevstart = i + 1;
} }
} }

View File

@@ -583,7 +583,8 @@ static void bmDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *use
static void bmDM_drawMappedFaces(DerivedMesh *dm, static void bmDM_drawMappedFaces(DerivedMesh *dm,
int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r),
void *userData, int useColors, void *userData, int useColors,
int (*setMaterial)(int, void *attribs)) int (*setMaterial)(int, void *attribs),
int (*compareDrawOptions)(void *userData, int cur_index, int next_index))
{ {
EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm; EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm;
BMFace *efa; BMFace *efa;
@@ -592,7 +593,11 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm,
/*BMESH_TODO*/ /*BMESH_TODO*/
(void)useColors; (void)useColors;
(void)setMaterial;
(void)setMaterial; /* UNUSED */
/* currently unused -- each original face is handled separately */
(void)compareDrawOptions;
if (bmdm->vertexCos) { if (bmdm->vertexCos) {
BMVert *eve; BMVert *eve;

View File

@@ -1998,7 +1998,8 @@ static void cgdm_drawUVEdges(DerivedMesh *dm)
} }
} }
static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs)) { static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs),
int (*compareDrawOptions)(void *userData, int cur_index, int next_index)) {
CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = cgdm->ss; CCGSubSurf *ss = cgdm->ss;
MCol *mcol= NULL; MCol *mcol= NULL;
@@ -2006,6 +2007,9 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
char *faceFlags = cgdm->faceFlags; char *faceFlags = cgdm->faceFlags;
int gridFaces = gridSize - 1, totface; int gridFaces = gridSize - 1, totface;
/* currently unused -- each original face is handled separately */
(void)compareDrawOptions;
if(useColors) { if(useColors) {
mcol = dm->getTessFaceDataArray(dm, CD_WEIGHT_MCOL); mcol = dm->getTessFaceDataArray(dm, CD_WEIGHT_MCOL);
if(!mcol) if(!mcol)

View File

@@ -90,8 +90,8 @@ void outliner_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0); WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_RELEASE, 0, 0)->ptr, "extend", 0); RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, 0, 0)->ptr, "extend", 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0)->ptr, "extend", 1);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0)->ptr, "all", 0); RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0)->ptr, "all", 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "all", 1); RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "all", 1);

View File

@@ -634,7 +634,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
} }
else if(faceselect) { else if(faceselect) {
if(ob->mode & OB_MODE_WEIGHT_PAINT) if(ob->mode & OB_MODE_WEIGHT_PAINT)
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1, GPU_enable_material); dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1, GPU_enable_material, NULL);
else else
dm->drawMappedFacesTex(dm, me->mface ? draw_tface_mapped__set_draw : NULL, me); dm->drawMappedFacesTex(dm, me->mface ? draw_tface_mapped__set_draw : NULL, me);
} }

View File

@@ -2070,6 +2070,28 @@ static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNU
return 0; return 0;
} }
static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int next_index)
{
struct { unsigned char *cols[3]; BMEditMesh *em; BMFace *efa_act; Mesh *me;} * data = userData;
BMFace *efa = EDBM_get_face_for_index(data->em, index);
BMFace *next_efa = EDBM_get_face_for_index(data->em, next_index);
unsigned char *col, *next_col;
if(efa == next_efa)
return 1;
if(efa == data->efa_act || next_efa == data->efa_act)
return 0;
col = data->cols[BM_TestHFlag(efa, BM_SELECT)?1:0];
next_col = data->cols[BM_TestHFlag(next_efa, BM_SELECT)?1:0];
if(col[3]==0 || next_col[3]==0)
return 0;
return col == next_col;
}
/* also draws the active face */ /* also draws the active face */
static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *baseCol, static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *baseCol,
unsigned char *selCol, unsigned char *actCol, BMFace *efa_act, Mesh *me) unsigned char *selCol, unsigned char *actCol, BMFace *efa_act, Mesh *me)
@@ -2083,7 +2105,7 @@ static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *ba
data.efa_act = efa_act; data.efa_act = efa_act;
data.me = me; data.me = me;
dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0, GPU_enable_material); dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0, GPU_enable_material, draw_dm_faces_sel__compareDrawOptions);
} }
static int draw_dm_creases__setDrawOptions(void *userData, int index) static int draw_dm_creases__setDrawOptions(void *userData, int index)
@@ -2517,7 +2539,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW); glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, me->edit_btmesh, 0, GPU_enable_material); finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, me->edit_btmesh, 0, GPU_enable_material, NULL);
glFrontFace(GL_CCW); glFrontFace(GL_CCW);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
@@ -2746,7 +2768,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
/* weight paint in solid mode, special case. focus on making the weights clear /* weight paint in solid mode, special case. focus on making the weights clear
* rather than the shading, this is also forced in wire view */ * rather than the shading, this is also forced in wire view */
GPU_enable_material(0, NULL); GPU_enable_material(0, NULL);
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material); dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material, NULL);
bglPolygonOffset(rv3d->dist, 1.0); bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better glDepthMask(0); // disable write in zbuffer, selected edge wires show better
@@ -2826,7 +2848,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL); glEnable(GL_COLOR_MATERIAL);
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material); dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material, NULL);
glDisable(GL_COLOR_MATERIAL); glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
@@ -2834,10 +2856,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
} }
else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_TEXTURE_PAINT)) { else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_TEXTURE_PAINT)) {
if(me->mcol) if(me->mcol)
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1, GPU_enable_material); dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1, GPU_enable_material, NULL);
else { else {
glColor3f(1.0f, 1.0f, 1.0f); glColor3f(1.0f, 1.0f, 1.0f);
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0, GPU_enable_material); dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0, GPU_enable_material, NULL);
} }
} }
} }
@@ -6537,7 +6559,7 @@ static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d,
if (facecol) { if (facecol) {
ptrs[1] = (void*)(intptr_t) 1; ptrs[1] = (void*)(intptr_t) 1;
dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0, GPU_enable_material); dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0, GPU_enable_material, NULL);
if(check_ob_drawface_dot(scene, v3d, ob->dt)) { if(check_ob_drawface_dot(scene, v3d, ob->dt)) {
glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE)); glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE));
@@ -6548,7 +6570,7 @@ static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d,
} }
} else { } else {
dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0, GPU_enable_material); dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0, GPU_enable_material, NULL);
} }
} }
@@ -6577,8 +6599,8 @@ static void bbs_mesh_solid(Scene *scene, Object *ob)
glColor3ub(0, 0, 0); glColor3ub(0, 0, 0);
if((me->editflag & ME_EDIT_PAINT_MASK)) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, me, 0, GPU_enable_material); if((me->editflag & ME_EDIT_PAINT_MASK)) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, me, 0, GPU_enable_material, NULL);
else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, me, 0, GPU_enable_material); else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, me, 0, GPU_enable_material, NULL);
dm->release(dm); dm->release(dm);
} }
@@ -6685,7 +6707,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
GPU_end_object_materials(); GPU_end_object_materials();
} }
else if(edm) else if(edm)
edm->drawMappedFaces(edm, NULL, NULL, 0, GPU_enable_material); edm->drawMappedFaces(edm, NULL, NULL, 0, GPU_enable_material, NULL);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
} }

View File

@@ -51,6 +51,7 @@ struct Curve;
struct EditBone; struct EditBone;
struct EditFace; struct EditFace;
struct EditMesh; struct EditMesh;
struct EnvMap;
struct ID; struct ID;
struct FCurve; struct FCurve;
struct ImBuf; struct ImBuf;
@@ -163,6 +164,7 @@ double elbeemEstimateMemreq(int res, float sx, float sy, float sz, int refine, c
struct Render *RE_NewRender(const char *name){return (struct Render*) NULL;} struct Render *RE_NewRender(const char *name){return (struct Render*) NULL;}
void RE_SwapResult(struct Render *re, struct RenderResult **rr){} void RE_SwapResult(struct Render *re, struct RenderResult **rr){}
void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame){} void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame){}
int RE_WriteEnvmapResult(struct ReportList *reports, struct Scene *scene, struct EnvMap *env, const char *relpath, int imtype, float layout[12]) { return 0; }
/* rna */ /* rna */
float *give_cursor(struct Scene *scene, struct View3D *v3d){return (float *) NULL;} float *give_cursor(struct Scene *scene, struct View3D *v3d){return (float *) NULL;}

View File

@@ -210,7 +210,11 @@ void BL_ConvertControllers(
CIntValue* uniqueval = new CIntValue(uniqueint); CIntValue* uniqueval = new CIntValue(uniqueint);
uniquename += uniqueval->GetText(); uniquename += uniqueval->GetText();
uniqueval->Release(); uniqueval->Release();
gamecontroller->SetName(uniquename); //unique name was never implemented for sensors and actuators, only for controllers
//and it's producing difference in the keys for the lists: obj.controllers/sensors/actuators
//at some point it should either be implemented globally (and saved as a separate var) or removed.
//gamecontroller->SetName(uniquename);
gamecontroller->SetName(bcontr->name);
gameobj->AddController(gamecontroller); gameobj->AddController(gamecontroller);
converter->RegisterGameController(gamecontroller, bcontr); converter->RegisterGameController(gamecontroller, bcontr);