Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-12-08 21:32:37 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-12-08 21:32:37 +0400
commit980e68175be6f02b4d3e0f3ba9a5902e0cf2719a (patch)
tree545ba1badd4703f8fe8e3d0ba9f12e06e56ac905
parent5c377f5f872df94b77e2e40dbdeceb751e631924 (diff)
parent7797c1dc424b1f772f23a3b8730a8374012d8c8b (diff)
svn merge ^/trunk/blender -r42495:42516
-rw-r--r--release/scripts/startup/bl_operators/object_randomize_transform.py14
-rw-r--r--source/blender/blenkernel/BKE_deform.h3
-rw-r--r--source/blender/blenkernel/BKE_mesh.h8
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c7
-rw-r--r--source/blender/blenkernel/intern/deform.c79
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c64
-rw-r--r--source/blender/editors/object/object_vgroup.c15
-rw-r--r--source/blender/editors/space_view3d/drawobject.c12
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c8
-rw-r--r--source/blender/gpu/GPU_draw.h2
-rw-r--r--source/blender/gpu/intern/gpu_draw.c57
-rw-r--r--source/blender/makesrna/intern/rna_curve.c6
-rw-r--r--source/blender/makesrna/intern/rna_tracking.c8
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c35
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.c23
-rw-r--r--source/blender/render/intern/source/pipeline.c8
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;