diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2007-12-27 01:40:56 +0300 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2007-12-27 01:40:56 +0300 |
commit | 015007beafeaeec09ba8a7fc859acc40ba6b8b16 (patch) | |
tree | 2922fc9d7e4d2a4ab9e63da1d6421cdd7cafb3ce /source | |
parent | ae976e087a7110c6b25a0fee4f663185b5e4319d (diff) |
== Sculpt ==
Fixed bad level calls in sculptmode.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_bad_level_calls.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_scene.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_sculpt.h | 64 | ||||
-rw-r--r-- | source/blender/blenkernel/bad_level_call_stubs/stubs.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 69 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 123 | ||||
-rw-r--r-- | source/blender/include/BDR_sculptmode.h | 39 | ||||
-rw-r--r-- | source/blender/src/buttons_editing.c | 2 | ||||
-rw-r--r-- | source/blender/src/drawview.c | 1 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 2 | ||||
-rw-r--r-- | source/blender/src/multires.c | 2 | ||||
-rw-r--r-- | source/blender/src/sculptmode-stroke.c | 5 | ||||
-rw-r--r-- | source/blender/src/sculptmode.c | 267 | ||||
-rw-r--r-- | source/blender/src/space.c | 3 | ||||
-rw-r--r-- | source/blender/src/view.c | 1 |
18 files changed, 318 insertions, 289 deletions
diff --git a/source/blender/blenkernel/BKE_bad_level_calls.h b/source/blender/blenkernel/BKE_bad_level_calls.h index 923504dfeab..94eafbf9f71 100644 --- a/source/blender/blenkernel/BKE_bad_level_calls.h +++ b/source/blender/blenkernel/BKE_bad_level_calls.h @@ -207,12 +207,6 @@ void post_layer_create(struct VLayer *vlayer); void post_layer_destroy(struct VLayer *vlayer); void post_server_add(void); -/* sculptmode.c */ -struct SculptData; -void sculpt_reset_curve(struct SculptData *sd); -void sculptmode_free_all(struct Scene *sce); -void sculptmode_init(struct Scene *sce); - /* zbuf.c */ void antialias_tagbuf(int xsize, int ysize, char *rectmove); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index be0a04ba563..b60fd0ce954 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -111,6 +111,11 @@ UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v); void free_uv_vert_map(UvVertMap *vmap); +/* Partial Mesh Visibility */ +struct PartialVisibility *mesh_pmv_copy(struct PartialVisibility *); +void mesh_pmv_free(struct PartialVisibility *); +void mesh_pmv_revert(struct Object *ob, struct Mesh *me); +void mesh_pmv_off(struct Object *ob, struct Mesh *me); /* functions for making menu's from customdata layers */ int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */ diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 1335f250322..61eb796e53d 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -47,7 +47,7 @@ void multires_edge_level_update(struct Object *ob, struct Mesh *me); void multires_free(struct Multires *mr); struct Multires *multires_copy(struct Multires *orig); -void multires_create(struct Mesh *me); +void multires_create(struct Object *ob, struct Mesh *me); /* CustomData */ void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int type, int n); diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 69ff6876acd..30953835406 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -34,11 +34,13 @@ #ifndef BKE_SCENE_H #define BKE_SCENE_H +struct bglMats; struct Scene; struct Object; struct Base; struct AviCodecData; struct QuicktimeCodecData; +struct SculptData; /* sequence related defines */ #define WHILE_SEQ(base) { \ diff --git a/source/blender/blenkernel/BKE_sculpt.h b/source/blender/blenkernel/BKE_sculpt.h new file mode 100644 index 00000000000..61b8dc071aa --- /dev/null +++ b/source/blender/blenkernel/BKE_sculpt.h @@ -0,0 +1,64 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2007 by Nicholas Bishop + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +typedef struct SculptSession { + struct ProjVert *projverts; + + struct bglMats *mats; + + /* An array of lists; array is sized as + large as the number of verts in the mesh, + the list for each vert contains the index + for all the faces that use that vertex */ + struct ListBase *vertex_users; + struct IndexNode *vertex_users_mem; + int vertex_users_size; + + /* Used temporarily per-stroke */ + float *vertexcosnos; + ListBase damaged_rects; + ListBase damaged_verts; + + /* Used to cache the render of the active texture */ + unsigned int texcache_w, texcache_h, *texcache; + + struct PropsetData *propset; + + /* For rotating around a pivot point */ + vec3f pivot; + + struct SculptStroke *stroke; +} SculptSession; + +void sculptdata_init(struct Scene *sce); +void sculptdata_free(struct Scene *sce); +void sculptsession_free(struct Scene *sce); +void sculpt_vertexusers_free(struct SculptSession *ss); +void sculpt_reset_curve(struct SculptData *sd); + diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c index 8885d4db760..1bcbed1efb1 100644 --- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c +++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c @@ -310,10 +310,6 @@ void post_geometry_free_constraint(struct VNode *vnode) {} void post_layer_create(struct VLayer *vlayer) {} void post_layer_destroy(struct VLayer *vlayer) {} void post_server_add(void) {} - /* sculpt stubs */ -void sculpt_reset_curve(struct SculptData *sd) {} -void sculptmode_init(struct Scene *sce) {} -void sculptmode_free_all(struct Scene *sce) {} /* zbuf.c stub */ void antialias_tagbuf(int xsize, int ysize, char *rectmove) {} diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 6156b2bed89..25a391be566 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -55,8 +55,6 @@ #include "DNA_meshdata_types.h" #include "DNA_ipo_types.h" -#include "BDR_sculptmode.h" - #include "BKE_customdata.h" #include "BKE_depsgraph.h" #include "BKE_main.h" @@ -1230,3 +1228,70 @@ void free_uv_vert_map(UvVertMap *vmap) } } +/* Partial Mesh Visibility */ +PartialVisibility *mesh_pmv_copy(PartialVisibility *pmv) +{ + PartialVisibility *n= MEM_dupallocN(pmv); + n->vert_map= MEM_dupallocN(pmv->vert_map); + n->edge_map= MEM_dupallocN(pmv->edge_map); + n->old_edges= MEM_dupallocN(pmv->old_edges); + n->old_faces= MEM_dupallocN(pmv->old_faces); + return n; +} + +void mesh_pmv_free(PartialVisibility *pv) +{ + MEM_freeN(pv->vert_map); + MEM_freeN(pv->edge_map); + MEM_freeN(pv->old_faces); + MEM_freeN(pv->old_edges); + MEM_freeN(pv); +} + +void mesh_pmv_revert(Object *ob, Mesh *me) +{ + if(me->pv) { + unsigned i; + MVert *nve, *old_verts; + + /* Reorder vertices */ + nve= me->mvert; + old_verts = MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts"); + for(i=0; i<me->pv->totvert; ++i) + old_verts[i]= nve[me->pv->vert_map[i]]; + + /* Restore verts, edges and faces */ + 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_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, old_verts, me->pv->totvert); + CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, me->pv->old_edges, me->pv->totedge); + CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, me->pv->old_faces, me->pv->totface); + mesh_update_customdata_pointers(me); + + me->totvert= me->pv->totvert; + me->totedge= me->pv->totedge; + me->totface= me->pv->totface; + + me->pv->old_edges= NULL; + me->pv->old_faces= NULL; + + /* Free maps */ + MEM_freeN(me->pv->edge_map); + me->pv->edge_map= NULL; + MEM_freeN(me->pv->vert_map); + me->pv->vert_map= NULL; + + DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); + } +} + +void mesh_pmv_off(Object *ob, Mesh *me) +{ + if(ob && me->pv) { + mesh_pmv_revert(ob, me); + MEM_freeN(me->pv); + me->pv= NULL; + } +} diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index c402d59f2c0..0874890a2c6 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -35,8 +35,6 @@ #include "DNA_object_types.h" #include "DNA_vec_types.h" -#include "BDR_sculptmode.h" - #include "BIF_editmesh.h" #include "BLI_arithb.h" @@ -348,7 +346,7 @@ void multires_load_cols(Mesh *me) } } -void multires_create(Mesh *me) +void multires_create(Object *ob, Mesh *me) { MultiresLevel *lvl; EditMesh *em= G.obedit ? G.editMesh : NULL; @@ -359,7 +357,7 @@ void multires_create(Mesh *me) lvl= MEM_callocN(sizeof(MultiresLevel), "multires level"); - if(me->pv) sculptmode_pmv_off(me); + if(me->pv) mesh_pmv_off(ob, me); me->mr= MEM_callocN(sizeof(Multires), "multires data"); @@ -1105,7 +1103,7 @@ void multires_add_level(Object *ob, Mesh *me, const char subdiv_type) MVert *oldverts= NULL; lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel"); - if(me->pv) sculptmode_pmv_off(me); + if(me->pv) mesh_pmv_off(ob, me); check_colors(me); multires_update_levels(me, 0); @@ -1271,7 +1269,7 @@ void multires_add_level(Object *ob, Mesh *me, const char subdiv_type) void multires_set_level(Object *ob, Mesh *me, const int render) { - if(me->pv) sculptmode_pmv_off(me); + if(me->pv) mesh_pmv_off(ob, me); check_colors(me); multires_update_levels(me, render); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index ff7b429845d..88dca65f594 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -47,6 +47,7 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" +#include "DNA_color_types.h" #include "DNA_constraint_types.h" #include "DNA_curve_types.h" #include "DNA_group_types.h" @@ -63,6 +64,7 @@ #include "BKE_anim.h" #include "BKE_armature.h" #include "BKE_bad_level_calls.h" +#include "BKE_colortools.h" #include "BKE_constraint.h" #include "BKE_depsgraph.h" #include "BKE_global.h" @@ -75,11 +77,11 @@ #include "BKE_node.h" #include "BKE_object.h" #include "BKE_scene.h" +#include "BKE_sculpt.h" #include "BKE_world.h" #include "BKE_utildefines.h" #include "BIF_previewrender.h" -#include "BDR_sculptmode.h" #include "BPY_extern.h" #include "BLI_arithb.h" @@ -168,7 +170,7 @@ void free_scene(Scene *sce) MEM_freeN(sce->nodetree); } - sculptmode_free_all(sce); + sculptdata_free(sce); } Scene *add_scene(char *name) @@ -259,7 +261,7 @@ Scene *add_scene(char *name) BLI_init_rctf(&sce->r.safety, 0.1f, 0.9f, 0.1f, 0.9f); sce->r.osa= 8; - sculptmode_init(sce); + sculptdata_init(sce); /* note; in header_info.c the scene copy happens..., if you add more to renderdata it has to be checked there */ scene_add_render_layer(sce); @@ -578,3 +580,118 @@ void scene_add_render_layer(Scene *sce) srl->passflag= SCE_PASS_COMBINED|SCE_PASS_Z; } +/* Initialize 'permanent' sculpt data that is saved with file kept after + switching out of sculptmode. */ +void sculptdata_init(Scene *sce) +{ + SculptData *sd; + + if(!sce) + return; + + sd= &sce->sculptdata; + + if(sd->cumap) + curvemapping_free(sd->cumap); + + memset(sd, 0, sizeof(SculptData)); + + sd->drawbrush.size = sd->smoothbrush.size = sd->pinchbrush.size = + sd->inflatebrush.size = sd->grabbrush.size = + sd->layerbrush.size = sd->flattenbrush.size = 50; + sd->drawbrush.strength = sd->smoothbrush.strength = + sd->pinchbrush.strength = sd->inflatebrush.strength = + sd->grabbrush.strength = sd->layerbrush.strength = + sd->flattenbrush.strength = 25; + sd->drawbrush.dir = sd->pinchbrush.dir = sd->inflatebrush.dir = sd->layerbrush.dir= 1; + sd->drawbrush.airbrush = sd->smoothbrush.airbrush = + sd->pinchbrush.airbrush = sd->inflatebrush.airbrush = + sd->layerbrush.airbrush = sd->flattenbrush.airbrush = 0; + sd->drawbrush.view= 0; + sd->brush_type= DRAW_BRUSH; + sd->texact= -1; + sd->texfade= 1; + sd->averaging= 1; + sd->texsep= 0; + sd->texrept= SCULPTREPT_DRAG; + sd->flags= SCULPT_DRAW_BRUSH; + sd->tablet_size=3; + sd->tablet_strength=10; + sd->rake=0; + sculpt_reset_curve(sd); +} + +void sculptdata_free(Scene *sce) +{ + SculptData *sd= &sce->sculptdata; + int a; + + sculptsession_free(sce); + + for(a=0; a<MAX_MTEX; a++) { + MTex *mtex= sd->mtex[a]; + if(mtex) { + if(mtex->tex) mtex->tex->id.us--; + MEM_freeN(mtex); + } + } + + curvemapping_free(sd->cumap); + sd->cumap = NULL; +} + +void sculpt_vertexusers_free(SculptSession *ss) +{ + if(ss && ss->vertex_users){ + MEM_freeN(ss->vertex_users); + MEM_freeN(ss->vertex_users_mem); + ss->vertex_users= NULL; + ss->vertex_users_mem= NULL; + ss->vertex_users_size= 0; + } +} + +void sculptsession_free(Scene *sce) +{ + SculptSession *ss= sce->sculptdata.session; + if(ss) { + if(ss->projverts) + MEM_freeN(ss->projverts); + if(ss->mats) + MEM_freeN(ss->mats); + sculpt_vertexusers_free(ss); + if(ss->texcache) + MEM_freeN(ss->texcache); + MEM_freeN(ss); + sce->sculptdata.session= NULL; + } +} + +/* Default curve approximates 0.5 * (cos(pi * x) + 1), with 0 <= x <= 1 */ +void sculpt_reset_curve(SculptData *sd) +{ + CurveMap *cm = NULL; + + if(!sd->cumap) + sd->cumap = curvemapping_add(1, 0, 0, 1, 1); + + cm = sd->cumap->cm; + + if(cm->curve) + MEM_freeN(cm->curve); + cm->curve= MEM_callocN(6*sizeof(CurveMapPoint), "curve points"); + cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE; + cm->totpoint= 6; + cm->curve[0].x= 0; + cm->curve[0].y= 1; + cm->curve[1].x= 0.1; + cm->curve[1].y= 0.97553; + cm->curve[2].x= 0.3; + cm->curve[2].y= 0.79389; + cm->curve[3].x= 0.9; + cm->curve[3].y= 0.02447; + cm->curve[4].x= 0.7; + cm->curve[4].y= 0.20611; + cm->curve[5].x= 1; + cm->curve[5].y= 0; +} diff --git a/source/blender/include/BDR_sculptmode.h b/source/blender/include/BDR_sculptmode.h index abbb17ac42b..884f1000b1f 100644 --- a/source/blender/include/BDR_sculptmode.h +++ b/source/blender/include/BDR_sculptmode.h @@ -32,8 +32,6 @@ #include "DNA_listBase.h" #include "DNA_vec_types.h" -/* For bglMats */ -#include "BIF_glutil.h" #include "transform.h" struct uiBlock; @@ -55,6 +53,7 @@ typedef enum PropsetMode { PropsetStrength, PropsetTexRot } PropsetMode; + typedef struct PropsetData { PropsetMode mode; unsigned int tex; @@ -68,40 +67,10 @@ typedef struct PropsetData { NumInput num; } PropsetData; -typedef struct SculptSession { - bglMats mats; - - /* An array of lists; array is sized as - large as the number of verts in the mesh, - the list for each vert contains the index - for all the faces that use that vertex */ - struct ListBase *vertex_users; - struct IndexNode *vertex_users_mem; - int vertex_users_size; - - /* Used temporarily per-stroke */ - float *vertexcosnos; - ListBase damaged_rects; - ListBase damaged_verts; - - /* Used to cache the render of the active texture */ - unsigned int texcache_w, texcache_h, *texcache; - - PropsetData *propset; - - /* For rotating around a pivot point */ - vec3f pivot; - - struct SculptStroke *stroke; -} SculptSession; - -SculptSession *sculpt_session(void); +struct SculptSession *sculpt_session(void); struct SculptData *sculpt_data(void); /* Memory */ -void sculpt_reset_curve(struct SculptData *sd); -void sculptmode_init(struct Scene *); -void sculptmode_free_all(struct Scene *); void sculptmode_correct_state(void); /* Interface */ @@ -135,10 +104,6 @@ void sculpt_stroke_draw(); /* Partial Mesh Visibility */ -struct PartialVisibility *sculptmode_copy_pmv(struct PartialVisibility *); -void sculptmode_pmv_free(struct PartialVisibility *); -void sculptmode_revert_pmv(struct Mesh *me); -void sculptmode_pmv_off(struct Mesh *me); void sculptmode_pmv(int mode); #endif diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 0cc3a70d2d1..e1c60f8f493 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -1356,7 +1356,7 @@ static void modifiers_applyModifier(void *obv, void *mdv) return; } - sculptmode_pmv_off(me); + mesh_pmv_off(ob, me); dm = mesh_create_derived_for_modifier(ob, md); if (!dm) { diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c index 5568cc17231..8580774e9dc 100644 --- a/source/blender/src/drawview.c +++ b/source/blender/src/drawview.c @@ -108,6 +108,7 @@ #include "BKE_particle.h" #include "BKE_pointcache.h" #include "BKE_scene.h" +#include "BKE_sculpt.h" #include "BKE_texture.h" #include "BKE_utildefines.h" diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 163417d9f08..354d99095f8 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -1621,7 +1621,7 @@ void enter_editmode(int wc) if(ob->type==OB_MESH) { me= get_mesh(ob); if( me==0 ) return; - if(me->pv) sculptmode_pmv_off(me); + if(me->pv) mesh_pmv_off(ob, me); ok= 1; G.obedit= ob; make_editMesh(); diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c index 56bfad4e4db..67485529525 100644 --- a/source/blender/src/multires.c +++ b/source/blender/src/multires.c @@ -233,7 +233,7 @@ void multires_make(void *ob, void *me_v) multires_check_state(); - multires_create(me); + multires_create(ob, me); allqueue(REDRAWBUTSEDIT, 0); BIF_undo_push("Make multires"); diff --git a/source/blender/src/sculptmode-stroke.c b/source/blender/src/sculptmode-stroke.c index 2f8dac2818c..c2c96b04a1d 100644 --- a/source/blender/src/sculptmode-stroke.c +++ b/source/blender/src/sculptmode-stroke.c @@ -31,11 +31,16 @@ */ #include "MEM_guardedalloc.h" + #include "DNA_listBase.h" #include "DNA_scene_types.h" + +#include "BKE_sculpt.h" #include "BLI_blenlib.h" #include "BIF_gl.h" + #include "BDR_sculptmode.h" + #include <math.h> /* Temporary storage of input stroke control points */ diff --git a/source/blender/src/sculptmode.c b/source/blender/src/sculptmode.c index 010bf6f746c..64f9ad0283e 100644 --- a/source/blender/src/sculptmode.c +++ b/source/blender/src/sculptmode.c @@ -65,6 +65,7 @@ #include "BKE_main.h" #include "BKE_mesh.h" #include "BKE_modifier.h" +#include "BKE_sculpt.h" #include "BKE_texture.h" #include "BKE_utildefines.h" #include "BKE_colortools.h" @@ -168,7 +169,6 @@ typedef struct ProjVert { char inside; } ProjVert; -static ProjVert *projverts= NULL; static Object *active_ob= NULL; SculptData *sculpt_data(void) @@ -192,135 +192,13 @@ SculptSession *sculpt_session(void) * Allocate/initialize/free data */ -// Default curve approximates 0.5 * (cos(pi * x) + 1), with 0 <= x <= 1; -void sculpt_reset_curve(SculptData *sd) -{ - CurveMap *cm = NULL; - - if(!sd->cumap) - sd->cumap = curvemapping_add(1, 0, 0, 1, 1); - - cm = sd->cumap->cm; - - if(cm->curve) - MEM_freeN(cm->curve); - cm->curve= MEM_callocN(6*sizeof(CurveMapPoint), "curve points"); - cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE; - cm->totpoint= 6; - cm->curve[0].x= 0; - cm->curve[0].y= 1; - cm->curve[1].x= 0.1; - cm->curve[1].y= 0.97553; - cm->curve[2].x= 0.3; - cm->curve[2].y= 0.79389; - cm->curve[3].x= 0.9; - cm->curve[3].y= 0.02447; - cm->curve[4].x= 0.7; - cm->curve[4].y= 0.20611; - cm->curve[5].x= 1; - cm->curve[5].y= 0; -} - -/* Initialize 'permanent' sculpt data that is saved with file kept after - switching out of sculptmode. */ -void sculptmode_init(Scene *sce) -{ - SculptData *sd; - - if(!sce) { - error("Unable to initialize sculptmode: bad scene"); - return; - } - - sd= &sce->sculptdata; - - if(sd->cumap) - curvemapping_free(sd->cumap); - - memset(sd, 0, sizeof(SculptData)); - - sd->drawbrush.size = sd->smoothbrush.size = sd->pinchbrush.size = - sd->inflatebrush.size = sd->grabbrush.size = - sd->layerbrush.size = sd->flattenbrush.size = 50; - sd->drawbrush.strength = sd->smoothbrush.strength = - sd->pinchbrush.strength = sd->inflatebrush.strength = - sd->grabbrush.strength = sd->layerbrush.strength = - sd->flattenbrush.strength = 25; - sd->drawbrush.dir = sd->pinchbrush.dir = sd->inflatebrush.dir = sd->layerbrush.dir= 1; - sd->drawbrush.airbrush = sd->smoothbrush.airbrush = - sd->pinchbrush.airbrush = sd->inflatebrush.airbrush = - sd->layerbrush.airbrush = sd->flattenbrush.airbrush = 0; - sd->drawbrush.view= 0; - sd->brush_type= DRAW_BRUSH; - sd->texact= -1; - sd->texfade= 1; - sd->averaging= 1; - sd->texsep= 0; - sd->texrept= SCULPTREPT_DRAG; - sd->flags= SCULPT_DRAW_BRUSH; - sd->tablet_size=3; - sd->tablet_strength=10; - sd->rake=0; - sculpt_reset_curve(sd); -} - -void sculptmode_free_session(Scene *); void sculpt_init_session(void) { if(sculpt_data()->session) - sculptmode_free_session(G.scene); + sculptsession_free(G.scene); sculpt_data()->session= MEM_callocN(sizeof(SculptSession), "SculptSession"); } -void sculptmode_free_vertexusers(SculptSession *ss) -{ - if(ss && ss->vertex_users){ - MEM_freeN(ss->vertex_users); - MEM_freeN(ss->vertex_users_mem); - ss->vertex_users= NULL; - ss->vertex_users_mem= NULL; - ss->vertex_users_size= 0; - } -} - -void sculptmode_propset_end(SculptSession *ss, int); -void sculptmode_free_session(Scene *sce) -{ - SculptSession *ss= sce->sculptdata.session; - if(ss) { - sculptmode_free_vertexusers(ss); - if(ss->texcache) - MEM_freeN(ss->texcache); - sculptmode_propset_end(ss, 1); - MEM_freeN(ss); - sce->sculptdata.session= NULL; - } -} - -void sculptmode_free_all(Scene *sce) -{ - SculptData *sd= &sce->sculptdata; - int a; - - sculptmode_free_session(sce); - - if(projverts) { - MEM_freeN(projverts); - projverts = NULL; - } - - for(a=0; a<MAX_MTEX; a++) { - MTex *mtex= sd->mtex[a]; - if(mtex) { - if(mtex->tex) mtex->tex->id.us--; - MEM_freeN(mtex); - } - } - - curvemapping_free(sd->cumap); - sd->cumap = NULL; -} - /* vertex_users is an array of Lists that store all the faces that use a particular vertex. vertex_users is in the same order as mesh.mvert */ void calc_vertex_users() @@ -330,7 +208,7 @@ void calc_vertex_users() IndexNode *node= NULL; Mesh *me= get_mesh(OBACT); - sculptmode_free_vertexusers(ss); + sculpt_vertexusers_free(ss); /* For efficiency, use vertex_users_mem as a memory pool (may be larger than necessary if mesh has triangles, but only one alloc is needed.) */ @@ -384,7 +262,9 @@ void init_sculptmatrices() glPushMatrix(); glMultMatrixf(OBACT->obmat); - bgl_get_mats(&ss->mats); + if(!ss->mats) + ss->mats = MEM_callocN(sizeof(bglMats), "sculpt bglmats"); + bgl_get_mats(ss->mats); glPopMatrix(); @@ -419,8 +299,8 @@ vec3f unproject(const short x, const short y, const float z) double ux, uy, uz; vec3f p; - gluUnProject(x,y,z, ss->mats.modelview, ss->mats.projection, - (GLint *)ss->mats.viewport, &ux, &uy, &uz ); + gluUnProject(x,y,z, ss->mats->modelview, ss->mats->projection, + (GLint *)ss->mats->viewport, &ux, &uy, &uz ); p.x= ux; p.y= uy; p.z= uz; @@ -433,8 +313,8 @@ void project(const float v[3], short p[2]) SculptSession *ss= sculpt_session(); double ux, uy, uz; - gluProject(v[0],v[1],v[2], ss->mats.modelview, ss->mats.projection, - (GLint *)ss->mats.viewport, &ux, &uy, &uz); + gluProject(v[0],v[1],v[2], ss->mats->modelview, ss->mats->projection, + (GLint *)ss->mats->viewport, &ux, &uy, &uz); p[0]= ux; p[1]= uy; } @@ -867,7 +747,7 @@ float tex_strength(EditData *e, float *point, const float len,const unsigned vin across the symmetry axis in order to project it. This insures that the brush texture will be oriented correctly. */ if(!e->symm) - pv= projverts[vindex]; + pv= ss->projverts[vindex]; else { float co[3]; VecCopyf(co, point); @@ -934,6 +814,7 @@ void sculpt_add_damaged_rect(EditData *e) const float radius= brush_size(); RectNode *rn= MEM_mallocN(sizeof(RectNode),"RectNode"); Mesh *me= get_mesh(OBACT); + SculptSession *ss = sculpt_session(); unsigned i; /* Find center */ @@ -947,10 +828,10 @@ void sculpt_add_damaged_rect(EditData *e) /* Update insides */ for(i=0; i<me->totvert; ++i) { - if(!projverts[i].inside) { - if(projverts[i].co[0] > rn->r.xmin && projverts[i].co[1] > rn->r.ymin && - projverts[i].co[0] < rn->r.xmax && projverts[i].co[1] < rn->r.ymax) { - projverts[i].inside= 1; + if(!ss->projverts[i].inside) { + if(ss->projverts[i].co[0] > rn->r.xmin && ss->projverts[i].co[1] > rn->r.ymin && + ss->projverts[i].co[0] < rn->r.xmax && ss->projverts[i].co[1] < rn->r.ymax) { + ss->projverts[i].inside= 1; } } } @@ -1005,7 +886,7 @@ void do_brush_action(EditData e) if(!e.grabdata || (e.grabdata && e.grabdata->firsttime)) { for(i=0; i<me->totvert; ++i) { /* Projverts.inside provides a rough bounding box */ - if(projverts[i].inside) { + if(ss->projverts[i].inside) { vert= ss->vertexcosnos ? &ss->vertexcosnos[i*6] : me->mvert[i].co; av_dist= VecLenf(&e.center.x,vert); if(av_dist < e.size) { @@ -1172,13 +1053,13 @@ void calc_damaged_verts(ListBase *damaged_verts, GrabData *grabdata) } } -void projverts_clear_inside() +void projverts_clear_inside(SculptSession *ss) { Mesh *me = get_mesh(OBACT); if(me) { int i; for(i = 0; i < me->totvert; ++i) - projverts[i].inside = 0; + ss->projverts[i].inside = 0; } } @@ -1196,7 +1077,7 @@ BrushData *sculptmode_brush(void) sd->brush_type==FLATTEN_BRUSH ? &sd->flattenbrush : NULL); if(!bd) { - sculptmode_init(G.scene); + sculptdata_init(G.scene); bd = &sd->drawbrush; } @@ -1604,19 +1485,20 @@ void sculptmode_selectbrush_menu(void) void sculptmode_update_all_projverts(float *vertcosnos) { + SculptSession *ss = sculpt_session(); Mesh *me= get_mesh(OBACT); unsigned i; - if(!projverts) - projverts = MEM_mallocN(sizeof(ProjVert)*me->totvert,"ProjVerts"); + if(!ss->projverts) + ss->projverts = MEM_mallocN(sizeof(ProjVert)*me->totvert,"ProjVerts"); for(i=0; i<me->totvert; ++i) { - project(vertcosnos ? &vertcosnos[i * 6] : me->mvert[i].co, projverts[i].co); - projverts[i].inside= 0; + project(vertcosnos ? &vertcosnos[i * 6] : me->mvert[i].co, ss->projverts[i].co); + ss->projverts[i].inside= 0; } } -void sculptmode_draw_wires(int only_damaged, Mesh *me) +void sculptmode_draw_wires(SculptSession *ss, int only_damaged, Mesh *me) { int i; @@ -1627,7 +1509,7 @@ void sculptmode_draw_wires(int only_damaged, Mesh *me) for(i=0; i<me->totedge; i++) { MEdge *med= &me->medge[i]; - if((!only_damaged || (projverts[med->v1].inside || projverts[med->v2].inside)) && + if((!only_damaged || (ss->projverts[med->v1].inside || ss->projverts[med->v2].inside)) && (med->flag & ME_EDGEDRAW)) { glDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, &med->v1); } @@ -1641,6 +1523,7 @@ void sculptmode_draw_mesh(int only_damaged) { Mesh *me= get_mesh(OBACT); int i, j, dt, drawCurrentMat = 1, matnr= -1; + SculptSession *ss = sculpt_session(); persp(PERSP_VIEW); mymultmatrix(OBACT->obmat); @@ -1670,7 +1553,7 @@ void sculptmode_draw_mesh(int only_damaged) inside the area(s) modified by the brush */ if(only_damaged) { for(j=0; j<(f->v4?4:3); ++j) { - if(projverts[*((&f->v1)+j)].inside) { + if(ss->projverts[*((&f->v1)+j)].inside) { inside= 1; break; } @@ -1688,7 +1571,7 @@ void sculptmode_draw_mesh(int only_damaged) glColorMask(1,1,1,1); if(dt==OB_WIRE || (OBACT->dtx & OB_DRAWWIRE)) - sculptmode_draw_wires(only_damaged, me); + sculptmode_draw_wires(ss, only_damaged, me); glDisable(GL_DEPTH_TEST); } @@ -1754,11 +1637,11 @@ void sculpt(void) /* Check that vertex users are up-to-date */ if(ob != active_ob || !ss->vertex_users || ss->vertex_users_size != get_mesh(ob)->totvert) { - sculptmode_free_vertexusers(ss); + sculpt_vertexusers_free(ss); calc_vertex_users(); - if(projverts) - MEM_freeN(projverts); - projverts = NULL; + if(ss->projverts) + MEM_freeN(ss->projverts); + ss->projverts = NULL; active_ob= ob; } @@ -1866,7 +1749,7 @@ void sculpt(void) sculptmode_draw_mesh(1); glAccum(GL_LOAD, 1); - projverts_clear_inside(); + projverts_clear_inside(ss); persp(PERSP_WIN); glDisable(GL_DEPTH_TEST); @@ -1951,9 +1834,9 @@ void set_sculptmode(void) G.f &= ~G_SCULPTMODE; - sculptmode_free_session(G.scene); + sculptsession_free(G.scene); if(me && me->pv) - sculptmode_pmv_off(me); + mesh_pmv_off(OBACT, me); } else { G.f |= G_SCULPTMODE; @@ -1974,77 +1857,9 @@ void set_sculptmode(void) } /* Partial Mesh Visibility */ -PartialVisibility *sculptmode_copy_pmv(PartialVisibility *pmv) -{ - PartialVisibility *n= MEM_dupallocN(pmv); - n->vert_map= MEM_dupallocN(pmv->vert_map); - n->edge_map= MEM_dupallocN(pmv->edge_map); - n->old_edges= MEM_dupallocN(pmv->old_edges); - n->old_faces= MEM_dupallocN(pmv->old_faces); - return n; -} - -void sculptmode_pmv_free(PartialVisibility *pv) -{ - MEM_freeN(pv->vert_map); - MEM_freeN(pv->edge_map); - MEM_freeN(pv->old_faces); - MEM_freeN(pv->old_edges); - MEM_freeN(pv); -} - -void sculptmode_revert_pmv(Mesh *me) -{ - if(me->pv) { - unsigned i; - MVert *nve, *old_verts; - - active_ob= NULL; - - /* Reorder vertices */ - nve= me->mvert; - old_verts = MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts"); - for(i=0; i<me->pv->totvert; ++i) - old_verts[i]= nve[me->pv->vert_map[i]]; - - /* Restore verts, edges and faces */ - 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_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, old_verts, me->pv->totvert); - CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, me->pv->old_edges, me->pv->totedge); - CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, me->pv->old_faces, me->pv->totface); - mesh_update_customdata_pointers(me); - - me->totvert= me->pv->totvert; - me->totedge= me->pv->totedge; - me->totface= me->pv->totface; - - me->pv->old_edges= NULL; - me->pv->old_faces= NULL; - - /* Free maps */ - MEM_freeN(me->pv->edge_map); - me->pv->edge_map= NULL; - MEM_freeN(me->pv->vert_map); - me->pv->vert_map= NULL; - - DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA); - } -} - -void sculptmode_pmv_off(Mesh *me) -{ - if(me->pv) { - sculptmode_revert_pmv(me); - MEM_freeN(me->pv); - me->pv= NULL; - } -} /* mode: 0=hide outside selection, 1=hide inside selection */ -void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode) +static void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode) { Mesh *me= get_mesh(ob); vec3f hidebox[6]; @@ -2085,7 +1900,7 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode) for(i=0; i<me->pv->totvert; ++i) { old_map[i]= me->pv->vert_map[i]<me->totvert?0:1; } - sculptmode_revert_pmv(me); + mesh_pmv_revert(ob, me); } /* Kill sculpt data */ @@ -2202,7 +2017,7 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode) DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA); } -rcti sculptmode_pmv_box() +static rcti sculptmode_pmv_box() { short down[2], mouse[2]; rcti ret; @@ -2257,7 +2072,7 @@ void sculptmode_pmv(int mode) sculptmode_do_pmv(ob,&hb_2d,mode); } - else sculptmode_pmv_off(get_mesh(ob)); + else mesh_pmv_off(ob, get_mesh(ob)); scrarea_do_windraw(curarea); diff --git a/source/blender/src/space.c b/source/blender/src/space.c index 486ebfa7010..ca0ee8f90ca 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -89,6 +89,7 @@ #include "BKE_multires.h" #include "BKE_node.h" #include "BKE_scene.h" +#include "BKE_sculpt.h" #include "BKE_texture.h" #include "BKE_utildefines.h" #include "BKE_image.h" /* for IMA_TYPE_COMPOSITE and IMA_TYPE_R_RESULT */ @@ -1509,7 +1510,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) case HKEY: if(G.qual==LR_ALTKEY) { waitcursor(1); - sculptmode_pmv_off(get_mesh(ob)); + mesh_pmv_off(ob, get_mesh(ob)); BIF_undo_push("Partial mesh hide"); allqueue(REDRAWVIEW3D,0); waitcursor(0); diff --git a/source/blender/src/view.c b/source/blender/src/view.c index d23b6f1d8f4..52f9ff06227 100644 --- a/source/blender/src/view.c +++ b/source/blender/src/view.c @@ -66,6 +66,7 @@ #include "BKE_global.h" #include "BKE_main.h" #include "BKE_object.h" +#include "BKE_sculpt.h" #include "BKE_utildefines.h" #include "BIF_editparticle.h" |