diff options
author | Miika Hamalainen <blender@miikah.org> | 2011-11-10 14:24:34 +0400 |
---|---|---|
committer | Miika Hamalainen <blender@miikah.org> | 2011-11-10 14:24:34 +0400 |
commit | afeb0eeaf0e8caf5e46a5dd6fbea3786e9fb1354 (patch) | |
tree | 36ab74ff3fa36d27c0f35527d3b55e68e3d27fe5 /source/blender/editors/space_view3d | |
parent | 1e035381d10068eb17345a88d42cebc0d579adf3 (diff) | |
parent | 1b4a54ad73c058baa59ffdc9e5f18b0b79030fb0 (diff) |
Dynamic Paint merge:
Commit Dynamic Paint from "soc-2011-carrot" branch into trunk.
End-user documentation:
http://wiki.blender.org/index.php/Doc:2.6/Manual/Modifiers/Simulation/Dynamic_Paint
GSoC wiki page:
http://wiki.blender.org/index.php/User:MiikaH/GSoC-2011-DynamicPaint
Diffstat (limited to 'source/blender/editors/space_view3d')
-rw-r--r-- | source/blender/editors/space_view3d/drawmesh.c | 28 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 63 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_intern.h | 4 |
3 files changed, 79 insertions, 16 deletions
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c index e23824a2210..ade3a65054f 100644 --- a/source/blender/editors/space_view3d/drawmesh.c +++ b/source/blender/editors/space_view3d/drawmesh.c @@ -402,6 +402,13 @@ static int draw_tface__set_draw_legacy(MTFace *tface, int has_mcol, int matnr) return 1; /* Set color from mcol */ } } + +static int draw_mcol__set_draw_legacy(MTFace *tface, int has_mcol, int matnr) +{ + if (has_mcol) return 1; + else return 2; +} + static int draw_tface__set_draw(MTFace *tface, int has_mcol, int matnr) { Material *ma= give_current_material(Gtexdraw.ob, matnr+1); @@ -622,7 +629,7 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl) ddm->release(ddm); } -void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int faceselect) +void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags) { Mesh *me= ob->data; @@ -644,7 +651,7 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, &data); } - else if(faceselect) { + else if(draw_flags & DRAW_FACE_SELECT) { if(ob->mode & OB_MODE_WEIGHT_PAINT) dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1, GPU_enable_material, NULL); else @@ -652,7 +659,10 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec } else { if(GPU_buffer_legacy(dm)) { - dm->drawFacesTex(dm, draw_tface__set_draw_legacy); + if (draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW) + dm->drawFacesTex(dm, draw_mcol__set_draw_legacy); + else + dm->drawFacesTex(dm, draw_tface__set_draw_legacy); } else { if(!CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL)) @@ -669,7 +679,7 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec draw_textured_end(); /* draw edges and selected faces over textured mesh */ - if(!(ob == scene->obedit) && faceselect) + if(!(ob == scene->obedit) && (draw_flags & DRAW_FACE_SELECT)) draw_mesh_face_select(rv3d, me, dm); /* reset from negative scale correction */ @@ -778,10 +788,10 @@ static int tex_mat_set_face_editmesh_cb(void *UNUSED(userData), int index) return !(efa->h); } -void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int faceselect) +void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags) { - if(!scene_use_new_shading_nodes(scene)) { - draw_mesh_textured_old(scene, v3d, rv3d, ob, dm, faceselect); + if((!scene_use_new_shading_nodes(scene)) || (draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW)) { + draw_mesh_textured_old(scene, v3d, rv3d, ob, dm, draw_flags); return; } @@ -807,7 +817,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o /* face hiding callback depending on mode */ if(ob == scene->obedit) set_face_cb= tex_mat_set_face_editmesh_cb; - else if(faceselect) + else if(draw_flags & DRAW_FACE_SELECT) set_face_cb= tex_mat_set_face_mesh_cb; else set_face_cb= NULL; @@ -851,7 +861,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o glMatrixMode(GL_MODELVIEW); /* faceselect mode drawing over textured mesh */ - if(!(ob == scene->obedit) && faceselect) + if(!(ob == scene->obedit) && (draw_flags & DRAW_FACE_SELECT)) draw_mesh_face_select(rv3d, ob->data, dm); } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 8e592ad9f68..d66197549d9 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -36,6 +36,7 @@ #include "DNA_camera_types.h" #include "DNA_curve_types.h" #include "DNA_constraint_types.h" // for drawing constraint +#include "DNA_dynamicpaint_types.h" #include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_material_types.h" @@ -2911,13 +2912,29 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D Mesh *me = ob->data; Material *ma= give_current_material(ob, 1); const short hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO)); - const short is_paint_sel= (ob==OBACT && paint_facesel_test(ob)); int draw_wire = 0; int /* totvert,*/ totedge, totface; DerivedMesh *dm= mesh_get_derived_final(scene, ob, scene->customdata_mask); + ModifierData *md = NULL; + int draw_flags = (ob==OBACT && paint_facesel_test(ob)) ? DRAW_FACE_SELECT : 0; if(!dm) return; + + /* check to draw dynamic paint colors */ + if ((md = modifiers_findByType(ob, eModifierType_DynamicPaint))) + { + /* check if target has an active dpaint modifier */ + if(md && (md->mode & eModifierMode_Realtime)) + { + DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md; + /* if canvas is ready to preview vertex colors */ + if (pmd->canvas && pmd->canvas->flags & MOD_DPAINT_PREVIEW_READY && + DM_get_face_data_layer(dm, CD_WEIGHT_MCOL)) { + draw_flags |= DRAW_DYNAMIC_PAINT_PREVIEW; + } + } + } if (ob->dtx&OB_DRAWWIRE) { draw_wire = 2; /* draw wire after solid using zoffset and depth buffer adjusment */ @@ -2931,7 +2948,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW); // Unwanted combination. - if (is_paint_sel) draw_wire = 0; + if (draw_flags & DRAW_FACE_SELECT) draw_wire = 0; if(dt==OB_BOUNDBOX) { if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) @@ -2945,14 +2962,14 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D else if(dt==OB_WIRE || totface==0) { draw_wire = 1; /* draw wire only, no depth buffer stuff */ } - else if( (is_paint_sel || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) || + else if( (draw_flags & DRAW_FACE_SELECT || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) || CHECK_OB_DRAWTEXTURE(v3d, dt)) { - if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || is_paint_sel) && !draw_wire) { + if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || (draw_flags & DRAW_FACE_SELECT)) && !draw_wire) { draw_mesh_object_outline(v3d, ob, dm); } - if(draw_glsl_material(scene, ob, v3d, dt)) { + if(draw_glsl_material(scene, ob, v3d, dt) && !(draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW)) { glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW); dm->drawFacesGLSL(dm, GPU_enable_material); @@ -2963,10 +2980,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D glFrontFace(GL_CCW); } else { - draw_mesh_textured(scene, v3d, rv3d, ob, dm, is_paint_sel); + draw_mesh_textured(scene, v3d, rv3d, ob, dm, draw_flags); } - if(!is_paint_sel) { + if(!(draw_flags & DRAW_FACE_SELECT)) { if(base->flag & SELECT) UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT); else @@ -3002,6 +3019,38 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D /* since we already draw wire as wp guide, dont draw over the top */ draw_wire= 0; } + else if (draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW) { + /* for object selection draws no shade */ + if (flag & (DRAW_PICKING|DRAW_CONSTCOLOR)) { + dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); + } + else { + /* draw outline */ + if((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire && !ob->sculpt) + draw_mesh_object_outline(v3d, ob, dm); + + /* materials arent compatible with vertex colors */ + GPU_end_object_materials(); + + GPU_enable_material(0, NULL); + + /* set default spec */ + glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR); + glEnable(GL_COLOR_MATERIAL); /* according manpages needed */ + glColor3ub(120, 120, 120); + glDisable(GL_COLOR_MATERIAL); + /* diffuse */ + glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); + glEnable(GL_LIGHTING); + glEnable(GL_COLOR_MATERIAL); + + dm->drawMappedFaces(dm, NULL, NULL, 1, GPU_enable_material, NULL); + glDisable(GL_COLOR_MATERIAL); + glDisable(GL_LIGHTING); + + GPU_disable_material(); + } + } else { Paint *p; diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 5aa8d95912d..fa2d5db21df 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -58,6 +58,10 @@ struct wmNDOFMotionData; #define DRAW_CONSTCOLOR 2 #define DRAW_SCENESET 4 +/* draw_mesh_fancy/draw_mesh_textured draw_flags */ +#define DRAW_DYNAMIC_PAINT_PREVIEW 1 +#define DRAW_FACE_SELECT 2 + /* view3d_header.c */ void view3d_header_buttons(const struct bContext *C, struct ARegion *ar); void VIEW3D_OT_layers(struct wmOperatorType *ot); |