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:
-rw-r--r--source/blender/blenkernel/BKE_displist.h2
-rw-r--r--source/blender/blenkernel/intern/displist.c10
-rw-r--r--source/blender/blenkernel/intern/modifier.c135
-rw-r--r--source/blender/render/intern/source/convertblender.c2
-rw-r--r--source/blender/src/buttons_object.c20
5 files changed, 89 insertions, 80 deletions
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index a534dcc3669..9108846330c 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -86,7 +86,7 @@ extern void count_displist(struct ListBase *lb, int *totvert, int *totface);
extern void freedisplist(struct ListBase *lb);
extern int displist_has_faces(struct ListBase *lb);
extern void makeDerivedMesh(struct Object *ob, CustomDataMask dataMask);
-extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int forRender);
+extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int forRender, int forOrco);
extern void makeDispListCurveTypes(struct Object *ob, int forOrco);
extern void makeDispListMBall(struct Object *ob);
extern void shadeDispList(struct Base *base);
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 91eea56c9e7..afc769b0966 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -1356,7 +1356,7 @@ static void displist_surf_indices(DispList *dl)
}
-void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender)
+void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender, int forOrco)
{
ListBase *nubase;
Nurb *nu;
@@ -1375,7 +1375,8 @@ void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender)
nubase= &cu->nurb;
}
- curve_calc_modifiers_pre(ob, nubase, forRender, &originalVerts, &deformedVerts, &numVerts);
+ if(!forOrco)
+ curve_calc_modifiers_pre(ob, nubase, forRender, &originalVerts, &deformedVerts, &numVerts);
for (nu=nubase->first; nu; nu=nu->next) {
if(forRender || nu->hide==0) {
@@ -1429,7 +1430,8 @@ void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender)
tex_space_curve(cu);
}
- curve_calc_modifiers_post(ob, nubase, dispbase, forRender, originalVerts, deformedVerts);
+ if(!forOrco)
+ curve_calc_modifiers_post(ob, nubase, dispbase, forRender, originalVerts, deformedVerts);
}
void makeDispListCurveTypes(Object *ob, int forOrco)
@@ -1445,7 +1447,7 @@ void makeDispListCurveTypes(Object *ob, int forOrco)
freedisplist(dispbase);
if(ob->type==OB_SURF) {
- makeDispListSurf(ob, dispbase, 0);
+ makeDispListSurf(ob, dispbase, 0, forOrco);
}
else if ELEM(ob->type, OB_CURVE, OB_FONT) {
ListBase dlbev;
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index c9f6bc18abd..2c4528f641e 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -114,6 +114,72 @@
#include "RE_shader_ext.h"
+/* Utility */
+
+static int is_last_displist(Object *ob)
+{
+ Curve *cu = ob->data;
+ static int curvecount=0, totcurve=0;
+
+ if(curvecount == 0){
+ DispList *dl;
+
+ totcurve = 0;
+ for(dl=cu->disp.first; dl; dl=dl->next)
+ totcurve++;
+ }
+
+ curvecount++;
+
+ if(curvecount == totcurve){
+ curvecount = 0;
+ return 1;
+ }
+
+ return 0;
+}
+
+static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int orco)
+{
+ DerivedMesh *dm= NULL;
+
+ if(ob->type==OB_MESH) {
+ dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
+
+ if(vertexCos) {
+ CDDM_apply_vert_coords(dm, vertexCos);
+ //CDDM_calc_normals(dm);
+ }
+
+ if(orco)
+ DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
+ }
+ else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
+ Object *tmpobj;
+ Curve *tmpcu;
+
+ if(is_last_displist(ob)) {
+ /* copies object and modifiers (but not the data) */
+ tmpobj= copy_object(ob);
+ tmpcu = (Curve *)tmpobj->data;
+ tmpcu->id.us--;
+
+ /* copies the data */
+ tmpobj->data = copy_curve((Curve *) ob->data);
+
+ makeDispListCurveTypes(tmpobj, 1);
+ nurbs_to_mesh(tmpobj);
+
+ dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
+ //CDDM_calc_normals(dm);
+
+ free_libblock_us(&G.main->object, tmpobj);
+ }
+ }
+
+ return dm;
+}
+
/***/
static int noneModifier_isDisabled(ModifierData *md)
@@ -6037,7 +6103,8 @@ static void surfaceModifier_freeData(ModifierData *md)
MEM_freeN(surmd->bvhtree);
}
- surmd->dm->release(surmd->dm);
+ if(surmd->dm)
+ surmd->dm->release(surmd->dm);
surmd->bvhtree = NULL;
surmd->dm = NULL;
@@ -6061,7 +6128,7 @@ static void surfaceModifier_deformVerts(
/* if possible use/create DerivedMesh */
if(derivedData) surmd->dm = CDDM_copy(derivedData);
- else if(ob->type==OB_MESH) surmd->dm = CDDM_from_mesh(ob->data, ob);
+ else surmd->dm = get_original_dm(ob, NULL, 0);
if(!ob->pd)
{
@@ -6233,70 +6300,6 @@ CustomDataMask particleSystemModifier_requiredDataMask(ModifierData *md)
return dataMask;
}
-static int is_last_displist(Object *ob)
-{
- Curve *cu = ob->data;
- static int curvecount=0, totcurve=0;
-
- if(curvecount==0){
- DispList *dl;
-
- totcurve=0;
- for(dl=cu->disp.first; dl; dl=dl->next){
- totcurve++;
- }
- }
-
- curvecount++;
-
- if(curvecount==totcurve){
- curvecount=0;
- return 1;
- }
-
- return 0;
-}
-
-static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int orco)
-{
- DerivedMesh *dm= NULL;
-
- if(ob->type==OB_MESH) {
- dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
-
- if(vertexCos) {
- CDDM_apply_vert_coords(dm, vertexCos);
- //CDDM_calc_normals(dm);
- }
-
- if(orco)
- DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
- }
- else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
- Object *tmpobj;
- Curve *tmpcu;
-
- if(is_last_displist(ob)) {
- /* copies object and modifiers (but not the data) */
- tmpobj= copy_object(ob);
- tmpcu = (Curve *)tmpobj->data;
- tmpcu->id.us--;
-
- /* copies the data */
- tmpobj->data = copy_curve((Curve *) ob->data);
-
- makeDispListCurveTypes(tmpobj, 1);
- nurbs_to_mesh(tmpobj);
-
- dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
- //CDDM_calc_normals(dm);
-
- free_libblock_us(&G.main->object, tmpobj);
- }
- }
-
- return dm;
-}
/* saves the current emitter state for a particle system and calculates particles */
static void particleSystemModifier_deformVerts(
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 79ab661e578..6f07d44d1fb 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -2562,7 +2562,7 @@ static void init_render_surf(Render *re, ObjectRen *obr)
if(need_orco) orcobase= orco= get_object_orco(re, ob);
displist.first= displist.last= 0;
- makeDispListSurf(ob, &displist, 1);
+ makeDispListSurf(ob, &displist, 1, 0);
dl= displist.first;
/* walk along displaylist and create rendervertices/-faces */
diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c
index 8bf62836888..36517982d9c 100644
--- a/source/blender/src/buttons_object.c
+++ b/source/blender/src/buttons_object.c
@@ -3395,12 +3395,14 @@ static void object_surface__enabletoggle ( void *ob_v, void *arg2 )
if(pd && (pd->flag & PFIELD_SURFACE)
&& ELEM5(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ))
{
- md = modifier_new ( eModifierType_Surface );
- BLI_addtail ( &ob->modifiers, md );
- DAG_scene_sort(G.scene);
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- allqueue(REDRAWBUTSEDIT, 0);
- allqueue(REDRAWVIEW3D, 0);
+ if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE)) {
+ md = modifier_new ( eModifierType_Surface );
+ BLI_addtail ( &ob->modifiers, md );
+ DAG_scene_sort(G.scene);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
}
}
else if(!pd || !(pd->flag & PFIELD_SURFACE)
@@ -3556,8 +3558,10 @@ static void object_panel_fields(Object *ob)
}
if(particles==0 && ELEM5(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ)) {
- but = uiDefButBitS(block, TOG, PFIELD_SURFACE, B_FIELD_CHANGE, "Surface", 10,15,140,20, &pd->flag, 0.0, 0, 0, 0, "Use closest point on surface");
- uiButSetFunc(but, object_surface__enabletoggle, ob, NULL);
+ if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE)) {
+ but = uiDefButBitS(block, TOG, PFIELD_SURFACE, B_FIELD_CHANGE, "Surface", 10,15,140,20, &pd->flag, 0.0, 0, 0, 0, "Use closest point on surface");
+ uiButSetFunc(but, object_surface__enabletoggle, ob, NULL);
+ }
}
uiBlockEndAlign(block);