diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-12-08 21:32:37 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-12-08 21:32:37 +0400 |
commit | 980e68175be6f02b4d3e0f3ba9a5902e0cf2719a (patch) | |
tree | 545ba1badd4703f8fe8e3d0ba9f12e06e56ac905 | |
parent | 5c377f5f872df94b77e2e40dbdeceb751e631924 (diff) | |
parent | 7797c1dc424b1f772f23a3b8730a8374012d8c8b (diff) |
svn merge ^/trunk/blender -r42495:42516
-rw-r--r-- | release/scripts/startup/bl_operators/object_randomize_transform.py | 14 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_deform.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/deform.c | 79 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_validate.c | 64 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 15 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_view.c | 8 | ||||
-rw-r--r-- | source/blender/gpu/GPU_draw.h | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_draw.c | 57 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_curve.c | 6 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_tracking.c | 8 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_hook.c | 35 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvg_util.c | 23 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 8 |
16 files changed, 221 insertions, 128 deletions
diff --git a/release/scripts/startup/bl_operators/object_randomize_transform.py b/release/scripts/startup/bl_operators/object_randomize_transform.py index f0d2448b508..ed881fab5fd 100644 --- a/release/scripts/startup/bl_operators/object_randomize_transform.py +++ b/release/scripts/startup/bl_operators/object_randomize_transform.py @@ -20,13 +20,12 @@ import bpy from bpy.types import Operator - +from mathutils import Vector def randomize_selected(seed, delta, loc, rot, scale, scale_even, scale_min): import random from random import uniform - from mathutils import Vector random.seed(seed) @@ -86,6 +85,7 @@ def randomize_selected(seed, delta, loc, rot, scale, scale_even, scale_min): from bpy.props import (IntProperty, BoolProperty, FloatVectorProperty) +from math import pi class RandomizeLocRotSize(Operator): @@ -129,10 +129,10 @@ class RandomizeLocRotSize(Operator): rot = FloatVectorProperty( name="Rotation", description="Maximun rotation over each axis", - min=-180.0, - max=180.0, + min=-pi, + max=pi, default=(0.0, 0.0, 0.0), - subtype='TRANSLATION', + subtype='EULER', ) use_scale = BoolProperty( name="Randomize Scale", @@ -162,14 +162,12 @@ class RandomizeLocRotSize(Operator): ) def execute(self, context): - from math import radians - seed = self.random_seed delta = self.use_delta loc = None if not self.use_loc else self.loc - rot = None if not self.use_rot else self.rot * radians(1.0) + rot = None if not self.use_rot else Vector(self.rot) scale = None if not self.use_scale else self.scale scale_even = self.scale_even diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index ed8ea691134..b08afd9c475 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -52,7 +52,8 @@ void defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob); struct MDeformWeight *defvert_find_index(const struct MDeformVert *dv, const int defgroup); struct MDeformWeight *defvert_verify_index(struct MDeformVert *dv, const int defgroup); -void defvert_remove_index(struct MDeformVert *dvert, int defgroup, struct MDeformWeight *dw); +void defvert_add_index_notest(struct MDeformVert *dv, int defgroup, const float weight); +void defvert_remove_group(struct MDeformVert *dvert, struct MDeformWeight *dw); float defvert_find_weight(const struct MDeformVert *dvert, const int defgroup); float defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index a8bc2323d0f..e1eb34782ff 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -192,7 +192,13 @@ int mesh_center_bounds(struct Mesh *me, float cent[3]); void mesh_translate(struct Mesh *me, float offset[3], int do_keys); /* mesh_validate.c */ -int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, unsigned int totvert, struct MEdge *medges, unsigned int totedge, struct MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes); +int BKE_mesh_validate_arrays( + struct Mesh *me, + struct MVert *mverts, unsigned int totvert, + struct MEdge *medges, unsigned int totedge, + struct MFace *mfaces, unsigned int totface, + struct MDeformVert *dverts, /* assume totvert length */ + const short do_verbose, const short do_fixes); int BKE_mesh_validate(struct Mesh *me, int do_verbose); int BKE_mesh_validate_dm(struct DerivedMesh *dm); diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 79d93f487b1..69758ad66a7 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1279,11 +1279,8 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } } } - if(!dodraw) { - continue; - } - if( numdata != 0 ) { + if(dodraw && numdata != 0 ) { offset = 0; if(attribs.totorco) { copy_v3_v3((float *)&varray[elementsize*curface*3],(float *)attribs.orco.array[mface->v1]); @@ -1325,7 +1322,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } curface++; if(mface->v4) { - if( numdata != 0 ) { + if(dodraw && numdata != 0 ) { offset = 0; if(attribs.totorco) { copy_v3_v3((float *)&varray[elementsize*curface*3],(float *)attribs.orco.array[mface->v3]); diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 49ca4e139cc..088241791a7 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -577,46 +577,61 @@ MDeformWeight *defvert_verify_index(MDeformVert *dvert, const int defgroup) return dw_new; } -/* Removes the given vertex from the vertex group, specified either by its defgrp_idx, - * or directly by its MDeformWeight pointer, if dw is not NULL. - * WARNING: This function frees the given MDeformWeight, do not use it afterward! */ -void defvert_remove_index(MDeformVert *dvert, int defgroup, MDeformWeight *dw) +/* TODO. merge with code above! */ + +/* Adds the given vertex to the specified vertex group, with given weight. + * warning, this does NOT check for existign, assume caller already knows its not there */ +void defvert_add_index_notest(MDeformVert *dvert, int defgroup, const float weight) { MDeformWeight *dw_new; - int i; - /* Get index of removed MDeformWeight. */ - if (dw == NULL) { - dw = dvert->dw; - for (i = dvert->totweight; i > 0; i--, dw++) { - if (dw->def_nr == defgroup) - break; - } - i--; + /* do this check always, this function is used to check for it */ + if (!dvert || defgroup < 0) + return; + + dw_new = BLI_cellalloc_calloc(sizeof(MDeformWeight)*(dvert->totweight+1), "defvert_add_to group, new deformWeight"); + if(dvert->dw) { + memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*dvert->totweight); + BLI_cellalloc_free(dvert->dw); } - else { - i = dw - dvert->dw; + dvert->dw = dw_new; + dw_new += dvert->totweight; + dw_new->weight = weight; + dw_new->def_nr = defgroup; + dvert->totweight++; +} + + +/* Removes the given vertex from the vertex group. + * WARNING: This function frees the given MDeformWeight, do not use it afterward! */ +void defvert_remove_group(MDeformVert *dvert, MDeformWeight *dw) +{ + if (dvert && dw) { + MDeformWeight *dw_new; + int i = dw - dvert->dw; + /* Security check! */ - if(i < 0 || i >= dvert->totweight) + if(i < 0 || i >= dvert->totweight) { return; - } + } - dvert->totweight--; - /* If there are still other deform weights attached to this vert then remove - * this deform weight, and reshuffle the others. - */ - if (dvert->totweight) { - dw_new = BLI_cellalloc_malloc(sizeof(MDeformWeight)*(dvert->totweight), __func__); - if (dvert->dw){ - memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*i); - memcpy(dw_new+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i)); + dvert->totweight--; + /* If there are still other deform weights attached to this vert then remove + * this deform weight, and reshuffle the others. + */ + if (dvert->totweight) { + dw_new = BLI_cellalloc_malloc(sizeof(MDeformWeight)*(dvert->totweight), __func__); + if (dvert->dw){ + memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*i); + memcpy(dw_new+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i)); + BLI_cellalloc_free(dvert->dw); + } + dvert->dw = dw_new; + } + else { + /* If there are no other deform weights left then just remove this one. */ BLI_cellalloc_free(dvert->dw); + dvert->dw = NULL; } - dvert->dw = dw_new; - } - else { - /* If there are no other deform weights left then just remove this one. */ - BLI_cellalloc_free(dvert->dw); - dvert->dw = NULL; } } diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index 509cc821c65..fd19d8461d5 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -45,6 +45,7 @@ #include "MEM_guardedalloc.h" #include "BKE_mesh.h" +#include "BKE_deform.h" #define SELECT 1 @@ -118,7 +119,12 @@ static int search_face_cmp(const void *v1, const void *v2) #define PRINT if(do_verbose) printf -int BKE_mesh_validate_arrays(Mesh *me, MVert *mverts, unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes) +int BKE_mesh_validate_arrays( Mesh *me, + MVert *mverts, unsigned int totvert, + MEdge *medges, unsigned int totedge, + MFace *mfaces, unsigned int totface, + MDeformVert *dverts, /* assume totvert length */ + const short do_verbose, const short do_fixes) { # define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; } # define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_free= 1; } @@ -157,7 +163,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *mverts, unsigned int totvert, MEdg int fix_normal= TRUE; for(j=0; j<3; j++) { - if(isnan(mvert->co[j]) || !finite(mvert->co[j])) { + if(!finite(mvert->co[j])) { PRINT(" vertex %u: has invalid coordinate\n", i); zero_v3(mvert->co); @@ -307,6 +313,43 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *mverts, unsigned int totvert, MEdg BLI_edgehash_free(edge_hash, NULL); MEM_freeN(sort_faces); + + /* fix deform verts */ + if (dverts) { + MDeformVert *dv; + for(i=0, dv= dverts; i<totvert; i++, dv++) { + MDeformWeight *dw= dv->dw; + unsigned int j= 0; + + for(j=0, dw= dv->dw; j < dv->totweight; j++, dw++) { + /* note, greater then max defgroups is accounted for in our code, but not < 0 */ + if (!finite(dw->weight)) { + PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight); + if (do_fixes) { + dw->weight= 0.0f; + } + } + + if (dw->def_nr < 0) { + PRINT(" vertex deform %u, has invalid group %d\n", i, dw->def_nr); + if (do_fixes) { + defvert_remove_group(dv, dw); + if (dv->dw) { + /* re-allocated, the new values compensate for stepping + * within the for loop and may not be valid */ + j--; + dw= dv->dw + j; + } + else { /* all freed */ + break; + } + } + } + } + } + } + + PRINT("BKE_mesh_validate: finished\n\n"); # undef REMOVE_EDGE_TAG @@ -357,7 +400,8 @@ static int mesh_validate_customdata(CustomData *data, short do_verbose, const sh #undef PRINT -static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, short do_verbose, const short do_fixes) +static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, + short do_verbose, const short do_fixes) { int vfixed= 0, efixed= 0, ffixed= 0; @@ -377,14 +421,24 @@ int BKE_mesh_validate(Mesh *me, int do_verbose) } layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->fdata, do_verbose, TRUE); - arrays_fixed= BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE); + arrays_fixed= BKE_mesh_validate_arrays(me, + me->mvert, me->totvert, + me->medge, me->totedge, + me->mface, me->totface, + me->dvert, + do_verbose, TRUE); return layers_fixed || arrays_fixed; } int BKE_mesh_validate_dm(DerivedMesh *dm) { - return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getTessFaceArray(dm), dm->getNumTessFaces(dm), TRUE, FALSE); + return BKE_mesh_validate_arrays(NULL, + dm->getVertArray(dm), dm->getNumVerts(dm), + dm->getEdgeArray(dm), dm->getNumEdges(dm), + dm->getTessFaceArray(dm), dm->getNumTessFaces(dm), + dm->getVertDataArray(dm, CD_MDEFORMVERT), + TRUE, FALSE); } void BKE_mesh_calc_edges(Mesh *mesh, int update) diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index c08c4034cdb..c6a6cf46257 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -2199,7 +2199,10 @@ void OBJECT_OT_vertex_group_remove(wmOperatorType *ot) ot->exec= vertex_group_remove_exec; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + /* redo operator will fail in this case because vertex groups aren't stored + in local edit mode stack and toggling "all" property will lead to + all groups deleted without way to restore them (see [#29527], sergey) */ + ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO; /* properties */ RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups"); @@ -2231,7 +2234,10 @@ void OBJECT_OT_vertex_group_assign(wmOperatorType *ot) ot->exec= vertex_group_assign_exec; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + /* redo operator will fail in this case because vertex group assignment + isn't stored in local edit mode stack and toggling "new" property will + lead to creating plenty of new veretx groups (see [#29527], sergey) */ + ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO; /* properties */ RNA_def_boolean(ot->srna, "new", 0, "New", "Assign vertex to new vertex group"); @@ -2270,7 +2276,10 @@ void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot) ot->exec= vertex_group_remove_from_exec; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + /* redo operator will fail in this case because vertex groups ssignment + isn't stored in local edit mode stack and toggling "all" property will lead to + removing vertices from all groups (see [#29527], sergey) */ + ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO; /* properties */ RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups"); diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index f9c610a54b1..dd6e31ef8c4 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -268,7 +268,7 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt) return (scene->gm.matmode == GAME_MAT_GLSL) && (dt > OB_SOLID); } -static int check_material_alpha(Base *base, int glsl) +static int check_alpha_pass(Base *base) { if(base->flag & OB_FROMDUPLI) return 0; @@ -276,7 +276,7 @@ static int check_material_alpha(Base *base, int glsl) if(G.f & G_PICKSEL) return 0; - return (glsl || (base->object->dtx & OB_DRAWTRANSP)); + return (base->object->dtx & OB_DRAWTRANSP); } /***/ @@ -3367,7 +3367,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D Object *obedit= scene->obedit; Mesh *me= ob->data; BMEditMesh *em= me->edit_btmesh; - int do_alpha_pass= 0, drawlinked= 0, retval= 0, glsl, check_alpha, i; + int do_alpha_after= 0, drawlinked= 0, retval= 0, glsl, check_alpha, i; /* If we are drawing shadows and any of the materials don't cast a shadow, * then don't draw the object */ @@ -3412,11 +3412,11 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D /* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */ if(me->totface<=4 || ED_view3d_boundbox_clip(rv3d, ob->obmat, (ob->bb)? ob->bb: me->bb)) { glsl = draw_glsl_material(scene, ob, v3d, dt); - check_alpha = check_material_alpha(base, glsl); + check_alpha = check_alpha_pass(base); if(dt==OB_SOLID || glsl) { GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, - (check_alpha)? &do_alpha_pass: NULL); + (check_alpha)? &do_alpha_after: NULL); } draw_mesh_fancy(scene, ar, v3d, rv3d, base, dt, flag); @@ -3428,7 +3428,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } /* GPU_begin_object_materials checked if this is needed */ - if(do_alpha_pass) { + if(do_alpha_after) { if(ob->dtx & OB_DRAWXRAY) { add_view3d_after(&v3d->afterdraw_xraytransp, base, flag); } diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index fe8b53f83b3..42b1a3d49fd 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1713,6 +1713,10 @@ static int game_engine_exec(bContext *C, wmOperator *op) if(!ED_view3d_context_activate(C)) return OPERATOR_CANCELLED; + /* redraw to hide any menus/popups, we don't go back to + the window manager until after this operator exits */ + WM_redraw_windows(C); + rv3d= CTX_wm_region_view3d(C); /* sa= CTX_wm_area(C); */ /* UNUSED */ ar= CTX_wm_region(C); @@ -1748,6 +1752,8 @@ static int game_engine_exec(bContext *C, wmOperator *op) CTX_wm_window_set(C, NULL); } + ED_area_tag_redraw(CTX_wm_area(C)); + if(prevwin) { /* restore context, in case it changed in the meantime, for example by working in another window or closing it */ @@ -1761,8 +1767,6 @@ static int game_engine_exec(bContext *C, wmOperator *op) //XXX restore_all_scene_cfra(scene_cfra_store); set_scene_bg(CTX_data_main(C), startscene); //XXX scene_update_for_newframe(bmain, scene, scene->lay); - - ED_area_tag_redraw(CTX_wm_area(C)); return OPERATOR_FINISHED; #else diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h index dc1f80ca903..f73bd402167 100644 --- a/source/blender/gpu/GPU_draw.h +++ b/source/blender/gpu/GPU_draw.h @@ -69,7 +69,7 @@ void GPU_state_print(void); * - after drawing, the material must be disabled again */ void GPU_begin_object_materials(struct View3D *v3d, struct RegionView3D *rv3d, - struct Scene *scene, struct Object *ob, int glsl, int *do_alpha_pass); + struct Scene *scene, struct Object *ob, int glsl, int *do_alpha_after); void GPU_end_object_materials(void); int GPU_enable_material(int nr, void *attribs); diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index afd22fb70a0..3cd3cde8aad 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -942,7 +942,7 @@ static struct GPUMaterialState { GPUBlendMode *alphablend; GPUBlendMode alphablend_fixed[FIXEDMAT]; - int alphapass; + int use_alpha_pass, is_alpha_pass; int lastmatnr, lastretval; GPUBlendMode lastalphablend; @@ -993,7 +993,7 @@ static Material *gpu_active_node_material(Material *ma) return ma; } -void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass) +void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_after) { Material *ma; GPUMaterial *gpumat; @@ -1015,9 +1015,15 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O GMS.gviewmat= rv3d->viewmat; GMS.gviewinv= rv3d->viewinv; - GMS.alphapass = (v3d && v3d->transp); - if(do_alpha_pass) - *do_alpha_pass = 0; + /* alpha pass setup. there's various cases to handle here: + * object transparency on: only solid materials draw in the first pass, + and only transparent in the second 'alpha' pass. + * object transparency off: for glsl we draw both in a single pass, and + for solid we don't use transparency at all. */ + GMS.use_alpha_pass = (do_alpha_after != NULL); + GMS.is_alpha_pass = (v3d && v3d->transp); + if(GMS.use_alpha_pass) + *do_alpha_after = 0; if(GMS.totmat > FIXEDMAT) { GMS.matbuf= MEM_callocN(sizeof(GPUMaterialFixed)*GMS.totmat, "GMS.matbuf"); @@ -1064,20 +1070,23 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O /* fixed function opengl materials */ gpu_material_to_fixed(&GMS.matbuf[a], ma, gamma, ob, new_shading_nodes); - alphablend = (ma->alpha == 1.0f)? GPU_BLEND_SOLID: GPU_BLEND_ALPHA; - if(do_alpha_pass && GMS.alphapass) + if(GMS.use_alpha_pass) { GMS.matbuf[a].diff[3]= ma->alpha; - else + alphablend = (ma->alpha == 1.0f)? GPU_BLEND_SOLID: GPU_BLEND_ALPHA; + } + else { GMS.matbuf[a].diff[3]= 1.0f; + alphablend = GPU_BLEND_SOLID; + } } - /* setting do_alpha_pass = 1 indicates this object needs to be + /* setting do_alpha_after = 1 indicates this object needs to be * drawn in a second alpha pass for improved blending */ - if(do_alpha_pass) { - GMS.alphablend[a]= alphablend; - if(ELEM3(alphablend, GPU_BLEND_ALPHA, GPU_BLEND_ADD, GPU_BLEND_ALPHA_SORT) && !GMS.alphapass) - *do_alpha_pass= 1; - } + if(GMS.use_alpha_pass && !GMS.is_alpha_pass) + if(ELEM3(alphablend, GPU_BLEND_ALPHA, GPU_BLEND_ADD, GPU_BLEND_ALPHA_SORT)) + *do_alpha_after= 1; + + GMS.alphablend[a]= alphablend; } /* let's start with a clean state */ @@ -1122,20 +1131,26 @@ int GPU_enable_material(int nr, void *attribs) /* unbind glsl material */ if(GMS.gboundmat) { - if(GMS.alphapass) glDepthMask(0); + if(GMS.is_alpha_pass) glDepthMask(0); GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat)); GMS.gboundmat= NULL; } /* draw materials with alpha in alpha pass */ GMS.lastmatnr = nr; - GMS.lastretval = ELEM(GMS.alphablend[nr], GPU_BLEND_SOLID, GPU_BLEND_CLIP); - if(GMS.alphapass) - GMS.lastretval = !GMS.lastretval; + GMS.lastretval = 1; + + if(GMS.use_alpha_pass) { + GMS.lastretval = ELEM(GMS.alphablend[nr], GPU_BLEND_SOLID, GPU_BLEND_CLIP); + if(GMS.is_alpha_pass) + GMS.lastretval = !GMS.lastretval; + } + else + GMS.lastretval = !GMS.is_alpha_pass; if(GMS.lastretval) { /* for alpha pass, use alpha blend */ - alphablend = (GMS.alphapass)? GPU_BLEND_ALPHA: GPU_BLEND_SOLID; + alphablend = GMS.alphablend[nr]; if(gattribs && GMS.gmatbuf[nr]) { /* bind glsl material and get attributes */ @@ -1152,7 +1167,7 @@ int GPU_enable_material(int nr, void *attribs) if(mat->game.alpha_blend != GPU_BLEND_SOLID) alphablend= mat->game.alpha_blend; - if(GMS.alphapass) glDepthMask(1); + if(GMS.is_alpha_pass) glDepthMask(1); } else { /* or do fixed function opengl material */ @@ -1188,7 +1203,7 @@ void GPU_disable_material(void) GMS.lastretval= 1; if(GMS.gboundmat) { - if(GMS.alphapass) glDepthMask(0); + if(GMS.is_alpha_pass) glDepthMask(0); GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat)); GMS.gboundmat= NULL; } diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index 4afe0da85fa..5fd67efba1d 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -1286,21 +1286,21 @@ static void rna_def_curve(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Bevel Resolution", "Bevel resolution when depth is non-zero and no specific bevel object has been defined"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH); RNA_def_property_float_sdna(prop, NULL, "width"); RNA_def_property_ui_range(prop, -1.0, 1.0, 0.1, 3); RNA_def_property_float_funcs(prop, "rna_Curve_offset_get", "rna_Curve_offset_set", NULL); RNA_def_property_ui_text(prop, "Offset", "Offset the curve to adjust the width of a text"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH); RNA_def_property_float_sdna(prop, NULL, "ext1"); RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3); RNA_def_property_range(prop, 0.0, FLT_MAX); RNA_def_property_ui_text(prop, "Extrude", "Amount of curve extrusion when not using a bevel object"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH); RNA_def_property_float_sdna(prop, NULL, "ext2"); RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3); RNA_def_property_ui_text(prop, "Bevel Depth", "Bevel depth when not using a bevel object"); diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index 5a2ef54cfc1..2fdf733752b 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -302,17 +302,17 @@ static void rna_def_trackingSettings(BlenderRNA *brna) static EnumPropertyItem refine_items[] = { {0, "NONE", 0, "Nothing", "Do not refine camera intrinsics"}, {REFINE_FOCAL_LENGTH, "FOCAL_LENGTH", 0, "Focal Length", "Refine focal length"}, + {REFINE_FOCAL_LENGTH|REFINE_RADIAL_DISTORTION_K1, "FOCAL_LENGTH_RADIAL_K1", 0, "Focal length, K1", "Refine focal length and radial distortion K1"}, {REFINE_FOCAL_LENGTH| - REFINE_PRINCIPAL_POINT, "FOCAL_LENGTH_PRINCIPAL_POINT", 0, "Focal Length, Optical Center", "Refine focal length and optical center"}, + REFINE_RADIAL_DISTORTION_K1| + REFINE_RADIAL_DISTORTION_K2, "FOCAL_LENGTH_RADIAL_K1_K2", 0, "Focal length, K1, K2", "Refine focal length and radial distortion K1 and K2"}, {REFINE_FOCAL_LENGTH| REFINE_PRINCIPAL_POINT| REFINE_RADIAL_DISTORTION_K1| REFINE_RADIAL_DISTORTION_K2, "FOCAL_LENGTH_PRINCIPAL_POINT_RADIAL_K1_K2", 0, "Focal Length, Optical Center, K1, K2", "Refine focal length, optical center and radial distortion K1 and K2"}, {REFINE_FOCAL_LENGTH| - REFINE_RADIAL_DISTORTION_K1| - REFINE_RADIAL_DISTORTION_K2, "FOCAL_LENGTH_RADIAL_K1_K2", 0, "Focal length, K1. K2", "Refine focal length and radial distortion K1 and K2"}, - {REFINE_FOCAL_LENGTH|REFINE_RADIAL_DISTORTION_K1, "FOCAL_LENGTH_RADIAL_K1", 0, "Focal length, K1", "Refine focal length and radial distortion K1"}, + REFINE_PRINCIPAL_POINT, "FOCAL_LENGTH_PRINCIPAL_POINT", 0, "Focal Length, Optical Center", "Refine focal length and optical center"}, {0, NULL, 0, NULL, NULL} }; diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c index 3aaf0fbe652..e04d5113364 100644 --- a/source/blender/modifiers/intern/MOD_hook.c +++ b/source/blender/modifiers/intern/MOD_hook.c @@ -143,14 +143,9 @@ static float hook_falloff(float *co_1, float *co_2, const float falloff_squared, return fac; } -static void deformVerts(ModifierData *md, Object *ob, - DerivedMesh *dm, - float (*vertexCos)[3], - int numVerts, - int UNUSED(useRenderParams), - int UNUSED(isFinalCalc)) +static void deformVerts_do(HookModifierData *hmd, Object *ob, DerivedMesh *dm, + float (*vertexCos)[3], int numVerts) { - HookModifierData *hmd = (HookModifierData*) md; bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget); float vec[3], mat[4][4], dmat[4][4]; int i, *index_pt; @@ -251,17 +246,29 @@ static void deformVerts(ModifierData *md, Object *ob, } } -static void deformVertsEM( - ModifierData *md, Object *ob, struct BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, + int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { - DerivedMesh *dm = derivedData; + HookModifierData *hmd = (HookModifierData*) md; + DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, 0); - if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data, 0); + deformVerts_do(hmd, ob, dm, vertexCos, numVerts); + + if(derivedData != dm) + dm->release(dm); +} + +static void deformVertsEM(ModifierData *md, Object *ob, struct BMEditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + HookModifierData *hmd = (HookModifierData*) md; + DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, 0); - deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); + deformVerts_do(hmd, ob, dm, vertexCos, numVerts); - if(!derivedData) dm->release(dm); + if(derivedData != dm) + dm->release(dm); } diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index afaa29e9175..adfdaf073d6 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -223,25 +223,6 @@ void weightvg_do_mask(int num, const int *indices, float *org_w, const float *ne } } -/* Adds the given vertex to the specified vertex group, with given weight. */ -static void defvert_add_to_group(MDeformVert *dv, int defgrp_idx, const float weight) -{ - /* TODO, move into deform.c as a generic function. This assumes the vertex - * groups have already been checked, so this has to remain low level. */ - MDeformWeight *newdw; - - newdw = BLI_cellalloc_calloc(sizeof(MDeformWeight)*(dv->totweight+1), "defvert_add_to group, new deformWeight"); - if(dv->dw) { - memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight); - BLI_cellalloc_free(dv->dw); - } - dv->dw = newdw; - dv->dw[dv->totweight].weight = weight; - dv->dw[dv->totweight].def_nr = defgrp_idx; - dv->totweight++; -} - - /* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group. * If dws is not NULL, it must be an array of MDeformWeight pointers of same length as weights (and * defgrp_idx can then have any value). @@ -265,7 +246,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws, /* If the vertex is in this vgroup, remove it if needed, or just update it. */ if(dw != NULL) { if(do_rem && w < rem_thresh) { - defvert_remove_index(dv, defgrp_idx, dw); + defvert_remove_group(dv, dw); } else { dw->weight = w; @@ -273,7 +254,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws, } /* Else, add it if needed! */ else if(do_add && w > add_thresh) { - defvert_add_to_group(dv, defgrp_idx, w); + defvert_add_index_notest(dv, defgrp_idx, w); } } } diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 0bad1a13a5a..d82cff16496 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -3084,7 +3084,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri { bMovieHandle *mh= BKE_get_movie_handle(scene->r.im_format.imtype); int cfrao= scene->r.cfra; - int nfra; + int nfra, totrendered= 0, totskipped= 0; /* do not fully call for each frame, it initializes & pops output window */ if(!render_initialize_from_main(re, bmain, scene, NULL, camera_override, lay, 0, 1)) @@ -3109,6 +3109,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri BLI_exec_cb(re->main, (ID *)scene, BLI_CB_EVT_RENDER_PRE); do_render_all_options(re); + totrendered++; if(re->test_break(re->tbh) == 0) { if(!do_write_image_or_movie(re, bmain, scene, mh, NULL)) @@ -3157,6 +3158,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri if(scene->r.mode & R_NO_OVERWRITE && BLI_exists(name)) { printf("skipping existing frame \"%s\"\n", name); + totskipped++; continue; } if(scene->r.mode & R_TOUCH && !BLI_exists(name)) { @@ -3172,6 +3174,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri do_render_all_options(re); + totrendered++; if(re->test_break(re->tbh) == 0) { if(!G.afbreek) @@ -3201,6 +3204,9 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri /* end movie */ if(BKE_imtype_is_movie(scene->r.im_format.imtype)) mh->end_movie(); + + if(totskipped && totrendered == 0) + BKE_report(re->reports, RPT_INFO, "No frames rendered, skipped to not overwrite"); scene->r.cfra= cfrao; |