[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13002] trunk/blender/source/blender: == Multires ==
Nicholas Bishop
nicholasbishop at gmail.com
Wed Dec 26 11:43:51 CET 2007
Revision: 13002
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13002
Author: nicholasbishop
Date: 2007-12-26 11:43:51 +0100 (Wed, 26 Dec 2007)
Log Message:
-----------
== Multires ==
Fixed bad level calls within multires usage.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_multires.h
trunk/blender/source/blender/blenkernel/intern/multires.c
trunk/blender/source/blender/include/multires.h
trunk/blender/source/blender/python/api2_2x/Mesh.c
trunk/blender/source/blender/src/buttons_editing.c
trunk/blender/source/blender/src/multires.c
trunk/blender/source/blender/src/space.c
Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h 2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h 2007-12-26 10:43:51 UTC (rev 13002)
@@ -53,6 +53,7 @@
void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int type, int n);
void multires_add_layer(struct Mesh *me, struct CustomData *cd, const int type, const int n);
void multires_del_lower_customdata(struct Multires *mr, struct MultiresLevel *cr_lvl);
+void multires_to_mcol(struct MultiresColFace *f, MCol mcol[4]);
/* After adding or removing vcolor layers, run this */
void multires_load_cols(struct Mesh *me);
Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c 2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c 2007-12-26 10:43:51 UTC (rev 13002)
@@ -994,19 +994,6 @@
return -1;
}
-static void medge_flag_to_eed(const short flag, const char crease, EditEdge *eed)
-{
- if(!eed) return;
-
- if(flag & ME_SEAM) eed->seam= 1;
- if(flag & ME_SHARP) eed->sharp = 1;
- if(flag & SELECT) eed->f |= SELECT;
- if(flag & ME_FGON) eed->h= EM_FGON;
- if(flag & ME_HIDE) eed->h |= 1;
-
- eed->crease= ((float)crease)/255.0;
-}
-
static float clamp_component(const float c)
{
if(c<0) return 0;
@@ -1014,7 +1001,7 @@
else return c;
}
-static void multires_to_mcol(MultiresColFace *f, MCol mcol[4])
+void multires_to_mcol(MultiresColFace *f, MCol mcol[4])
{
unsigned char j;
for(j=0; j<4; ++j) {
@@ -1031,88 +1018,51 @@
MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
int i;
EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
- EditVert **eves= NULL;
- EditEdge *eed= NULL;
- if(em) {
- /* Remove editmesh elements */
- free_editMesh(em);
+ if(em)
+ return;
+
+ CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
+ CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
+ CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
+ CustomData_free_layers(&me->fdata, CD_MTFACE, me->totface);
+ CustomData_free_layers(&me->fdata, CD_MCOL, me->totface);
- eves= MEM_callocN(sizeof(EditVert*)*lvl->totvert, "editvert pointers");
- } else {
- CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
- CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
- CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
- CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
- CustomData_free_layers(&me->fdata, CD_MTFACE, me->totface);
- CustomData_free_layers(&me->fdata, CD_MCOL, me->totface);
-
- me->totvert= lvl->totvert;
- me->totface= lvl->totface;
- me->totedge= lvl->totedge;
+ me->totvert= lvl->totvert;
+ me->totface= lvl->totface;
+ me->totedge= lvl->totedge;
- CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
- CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge);
- CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
- mesh_update_customdata_pointers(me);
- }
+ CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
+ CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge);
+ CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
+ mesh_update_customdata_pointers(me);
/* Vertices/Edges/Faces */
for(i=0; i<lvl->totvert; ++i) {
- if(em) {
- eves[i]= addvertlist(me->mr->verts[i].co, NULL);
- if(me->mr->verts[i].flag & 1) eves[i]->f |= SELECT;
- if(me->mr->verts[i].flag & ME_HIDE) eves[i]->h= 1;
- eves[i]->data= NULL;
- }
- else
- me->mvert[i]= me->mr->verts[i];
+ me->mvert[i]= me->mr->verts[i];
}
for(i=0; i<lvl->totedge; ++i) {
- if(em) {
- addedgelist(eves[lvl->edges[i].v[0]], eves[lvl->edges[i].v[1]], NULL);
- } else {
- me->medge[i].v1= lvl->edges[i].v[0];
- me->medge[i].v2= lvl->edges[i].v[1];
- me->medge[i].flag &= ~ME_HIDE;
- }
+ me->medge[i].v1= lvl->edges[i].v[0];
+ me->medge[i].v2= lvl->edges[i].v[1];
+ me->medge[i].flag &= ~ME_HIDE;
}
for(i=0; i<lvl->totface; ++i) {
- if(em) {
- EditVert *eve4= lvl->faces[i].v[3] ? eves[lvl->faces[i].v[3]] : NULL;
- EditFace *efa= addfacelist(eves[lvl->faces[i].v[0]], eves[lvl->faces[i].v[1]],
- eves[lvl->faces[i].v[2]], eve4, NULL, NULL);
- efa->flag= lvl->faces[i].flag & ~ME_HIDE;
- efa->mat_nr= lvl->faces[i].mat_nr;
- if(lvl->faces[i].flag & ME_FACE_SEL)
- efa->f |= SELECT;
- if(lvl->faces[i].flag & ME_HIDE) efa->h= 1;
- efa->data= NULL;
- }
- else {
- me->mface[i].v1= lvl->faces[i].v[0];
- me->mface[i].v2= lvl->faces[i].v[1];
- me->mface[i].v3= lvl->faces[i].v[2];
- me->mface[i].v4= lvl->faces[i].v[3];
- me->mface[i].flag= lvl->faces[i].flag;
- me->mface[i].flag &= ~ME_HIDE;
- me->mface[i].mat_nr= lvl->faces[i].mat_nr;
- }
+ me->mface[i].v1= lvl->faces[i].v[0];
+ me->mface[i].v2= lvl->faces[i].v[1];
+ me->mface[i].v3= lvl->faces[i].v[2];
+ me->mface[i].v4= lvl->faces[i].v[3];
+ me->mface[i].flag= lvl->faces[i].flag;
+ me->mface[i].flag &= ~ME_HIDE;
+ me->mface[i].mat_nr= lvl->faces[i].mat_nr;
}
/* Edge flags */
- if(em) eed= em->edges.first;
if(lvl==me->mr->levels.first) {
for(i=0; i<lvl->totedge; ++i) {
- if(em) {
- medge_flag_to_eed(me->mr->edge_flags[i], me->mr->edge_creases[i], eed);
- eed= eed->next;
- }
- else {
- me->medge[i].flag= me->mr->edge_flags[i];
- me->medge[i].crease= me->mr->edge_creases[i];
- }
+ me->medge[i].flag= me->mr->edge_flags[i];
+ me->medge[i].crease= me->mr->edge_creases[i];
}
} else {
MultiresLevel *lvl1= me->mr->levels.first;
@@ -1120,67 +1070,32 @@
for(i=0; i<last; ++i) {
const int ndx= i / pow(2, me->mr->current-1);
- if(em) {
- medge_flag_to_eed(me->mr->edge_flags[ndx], me->mr->edge_creases[ndx], eed);
- eed= eed->next;
- }
- else {
- me->medge[i].flag= me->mr->edge_flags[ndx];
- me->medge[i].crease= me->mr->edge_creases[ndx];
- }
+ me->medge[i].flag= me->mr->edge_flags[ndx];
+ me->medge[i].crease= me->mr->edge_creases[ndx];
}
}
- if(em) {
- eed= em->edges.first;
- for(i=0, eed= em->edges.first; i<lvl->totedge; ++i, eed= eed->next) {
- eed->h= me->mr->verts[lvl->edges[i].v[0]].flag & ME_HIDE ||
- me->mr->verts[lvl->edges[i].v[1]].flag & ME_HIDE;
- }
- }
-
- EM_select_flush();
-
multires_customdata_to_mesh(me, em, lvl, &me->mr->vdata, em ? &em->vdata : &me->vdata, CD_MDEFORMVERT);
multires_customdata_to_mesh(me, em, lvl, &me->mr->fdata, em ? &em->fdata : &me->fdata, CD_MTFACE);
/* Colors */
if(me->mr->use_col) {
- MCol c[4];
- EditFace *efa= NULL;
- CustomData *src= em ? &em->fdata : &me->fdata;
- if(em) {
- if(me->mr->use_col) EM_add_data_layer(src, CD_MCOL);
- efa= em->faces.first;
- }
- else {
- if(me->mr->use_col) me->mcol= CustomData_add_layer(src, CD_MCOL, CD_CALLOC, NULL, me->totface);
- }
+ CustomData *src= &me->fdata;
+ if(me->mr->use_col) me->mcol= CustomData_add_layer(src, CD_MCOL, CD_CALLOC, NULL, me->totface);
+
for(i=0; i<lvl->totface; ++i) {
- if(em) {
- if(me->mr->use_col) {
- multires_to_mcol(&lvl->colfaces[i], c);
- CustomData_em_set(src, efa->data, CD_MCOL, c);
- }
- efa= efa->next;
- }
- else if(me->mr->use_col) multires_to_mcol(&lvl->colfaces[i], &me->mcol[i*4]);
+ if(me->mr->use_col)
+ multires_to_mcol(&lvl->colfaces[i], &me->mcol[i*4]);
}
}
mesh_update_customdata_pointers(me);
- if(em) {
- MEM_freeN(eves);
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- recalc_editnormals();
- } else {
- multires_edge_level_update(ob,me);
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
- }
+ multires_edge_level_update(ob,me);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
}
void multires_add_level(Object *ob, Mesh *me, const char subdiv_type)
Modified: trunk/blender/source/blender/include/multires.h
===================================================================
--- trunk/blender/source/blender/include/multires.h 2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/include/multires.h 2007-12-26 10:43:51 UTC (rev 13002)
@@ -47,6 +47,7 @@
void multires_make(void *ob, void *me);
void multires_delete(void *ob, void *me);
+void multires_level_to_editmesh(struct Object *ob, struct Mesh *me, const int render);
void multires_subdivide(void *ob, void *me);
void multires_del_lower(void *ob, void *me);
void multires_del_higher(void *ob, void *me);
Modified: trunk/blender/source/blender/python/api2_2x/Mesh.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Mesh.c 2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/python/api2_2x/Mesh.c 2007-12-26 10:43:51 UTC (rev 13002)
@@ -7161,7 +7161,7 @@
switch ((int)type) {
case MESH_MULTIRES_LEVEL:
self->mesh->mr->newlvl = i;
- multires_set_level(self->object, self->mesh, 0);
+ multires_set_level_cb(self->object, self->mesh);
break;
case MESH_MULTIRES_EDGE:
self->mesh->mr->edgelvl = i;
Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c 2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/src/buttons_editing.c 2007-12-26 10:43:51 UTC (rev 13002)
@@ -737,6 +737,7 @@
from the data stored in multires */
if(me && me->mr) {
multires_delete_layer(me, &me->mr->fdata, type, layer - &data->layers[index]);
+ multires_level_to_editmesh(OBACT, me, 0);
}
else if(G.obedit) {
EM_free_data_layer(data, type);
@@ -4468,6 +4469,7 @@
if(me && me->mr) {
multires_add_layer(me, &me->mr->fdata, CD_MTFACE, layernum);
+ multires_level_to_editmesh(ob, me, 0);
}
else if(G.obedit) {
EM_add_data_layer(&em->fdata, CD_MTFACE);
Modified: trunk/blender/source/blender/src/multires.c
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list