diff options
author | Daniel Dunbar <daniel@zuster.org> | 2005-07-15 01:57:18 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2005-07-15 01:57:18 +0400 |
commit | 8da29921baccb4898cd986072d72b2ecdc295a11 (patch) | |
tree | b1416db64989d64318ce614a88990e5e6355c618 /source | |
parent | 0b890467901a32543b874be8eb93a55dff6d3538 (diff) |
- added mesh_get_texspace (should be used instead of direct access)
which calculates texspace on demand if need be.
- removed almost all calls to tex_space_mesh
There may be a few corner cases where this goes wrong (meshes with vertex
keys) but these should get ironed out by coming modifier system.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 17 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/exotic.c | 34 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 60 | ||||
-rw-r--r-- | source/blender/python/api2_2x/NMesh.c | 1 | ||||
-rw-r--r-- | source/blender/radiosity/intern/source/radpostprocess.c | 1 | ||||
-rw-r--r-- | source/blender/src/booleanops.c | 5 | ||||
-rw-r--r-- | source/blender/src/booleanops_mesh.c | 3 | ||||
-rw-r--r-- | source/blender/src/buttons_editing.c | 5 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 56 | ||||
-rw-r--r-- | source/blender/src/editmesh.c | 2 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 15 |
12 files changed, 80 insertions, 120 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 4e4ce341395..c20f0fd3e4e 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -79,6 +79,7 @@ void mesh_delete_material_index(struct Mesh *me, int index); void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth); struct BoundBox *mesh_get_bb(struct Mesh *me); +void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r); void make_edges(struct Mesh *me); diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 55eaf43ab40..49f1736caf9 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1608,6 +1608,7 @@ void mesh_changed(Object *meshOb) { Mesh *me = meshOb->data; + /* also serves as signal to remake texspace */ if (me->bb) { MEM_freeN(me->bb); me->bb = NULL; @@ -1646,8 +1647,6 @@ void makeDispListMesh(Object *ob) me->derived= NULL; } - tex_space_mesh(ob->data); - if (ob!=G.obedit) mesh_modifier(ob, 's'); if (mesh_uses_displist(me)) { /* subsurf */ @@ -2210,6 +2209,8 @@ void imagestodisplist(void) } if(tot) { + float size[3]; + freedisplist(&(ob->disp)); dl= MEM_callocN(sizeof(DispList), "makeDispListimage"); @@ -2222,8 +2223,10 @@ void imagestodisplist(void) xsi= 0.5*(tex->ima->ibuf->x); ysi= 0.5*(tex->ima->ibuf->y); - xfac= me->size[0]/xsi; - yfac= me->size[1]/ysi; + + mesh_get_texspace(me, NULL, NULL, size); + xfac= size[0]/xsi; + yfac= size[1]/ysi; data= dl->verts; seg = wireframe->first; @@ -2258,14 +2261,10 @@ void boundbox_displist(Object *ob) INIT_MINMAX(min, max); if(ob->type==OB_MESH) { - Mesh *me= ob->data; - + bb= mesh_get_bb(ob->data); dl= find_displist(&ob->disp, DL_VERTS); if(!dl) return; - if(me->bb==0) me->bb= MEM_callocN(sizeof(BoundBox), "boundbox"); - bb= me->bb; - vert= dl->verts; for(a=0; a<dl->nr; a++, vert+=3) { DO_MINMAX(vert, min, max); diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index b49143ff48f..76b42aac37f 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -304,8 +304,6 @@ static void read_stl_mesh_binary(char *str) me->totvert = totvert; mesh_add_normals_flags(me); - - tex_space_mesh(me); } waitcursor(1); } @@ -471,7 +469,6 @@ static void read_stl_mesh_ascii(char *str) mesh_add_normals_flags(me); - tex_space_mesh(me); waitcursor(1); } @@ -694,7 +691,7 @@ static void read_videoscape_mesh(char *str) load_editMesh(); free_editMesh(G.editMesh); G.obedit= 0; - tex_space_mesh(me); + waitcursor(1); } @@ -880,7 +877,6 @@ static void read_radiogour(char *str) free_editMesh(G.editMesh); G.obedit= 0; - tex_space_mesh(me); waitcursor(1); } @@ -2260,8 +2256,6 @@ static void displist_to_mesh(DispList *dlfirst) } mesh_add_normals_flags(me); - tex_space_mesh(me); - } static void displist_to_objects(ListBase *lbase) @@ -3771,7 +3765,6 @@ static void dxf_read_point(int noob) { G.obedit= 0; } - tex_space_mesh(me); hasbumped=1; } @@ -3795,7 +3788,6 @@ static void dxf_close_line(void) waitcursor(1); /* patch yah... */ G.obedit= 0; - tex_space_mesh(linehold->data); linehold=NULL; } @@ -3908,19 +3900,18 @@ static short lwasp2d=0; static void dxf_close_2dpoly(void) { - p2dmhold= NULL; - if (p2dhold==NULL) return; + p2dmhold= NULL; + if (p2dhold==NULL) return; - G.obedit= p2dhold; - make_editMesh(); - load_editMesh(); - free_editMesh(G.editMesh); - waitcursor(1); /* patch yah... */ - - G.obedit= 0; - tex_space_mesh(p2dhold->data); + G.obedit= p2dhold; + make_editMesh(); + load_editMesh(); + free_editMesh(G.editMesh); + waitcursor(1); /* patch yah... */ + + G.obedit= 0; - p2dhold=NULL; + p2dhold=NULL; } static void dxf_read_ellipse(int noob) @@ -4527,7 +4518,6 @@ static void dxf_read_polyline(int noob) { waitcursor(1); /* patch yah... */ G.obedit= 0; } - tex_space_mesh(me); } } @@ -4655,7 +4645,6 @@ static void dxf_close_3dface(void) free_editMesh(G.editMesh); waitcursor(1); /* patch yah... */ G.obedit= 0; - tex_space_mesh(f3dhold->data); f3dhold=NULL; } @@ -5048,7 +5037,6 @@ static void dxf_read(char *filename) free_editMesh(G.editMesh); waitcursor(1); /* patch yah... */ G.obedit= 0; - tex_space_mesh(ob->data); } hasbumped=1; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 3ab98b550a2..f9f1285a5be 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -406,23 +406,16 @@ void tex_space_mesh(Mesh *me) } } + for (a=0; a<3; a++) { + if(size[a]==0.0) size[a]= 1.0; + else if(size[a]>0.0 && size[a]<0.00001) size[a]= 0.00001; + else if(size[a]<0.0 && size[a]> -0.00001) size[a]= -0.00001; + } + VECCOPY(me->loc, loc); VECCOPY(me->size, size); me->rot[0]= me->rot[1]= me->rot[2]= 0.0; - - if(me->size[0]==0.0) me->size[0]= 1.0; - else if(me->size[0]>0.0 && me->size[0]<0.00001) me->size[0]= 0.00001; - else if(me->size[0]<0.0 && me->size[0]> -0.00001) me->size[0]= -0.00001; - - if(me->size[1]==0.0) me->size[1]= 1.0; - else if(me->size[1]>0.0 && me->size[1]<0.00001) me->size[1]= 0.00001; - else if(me->size[1]<0.0 && me->size[1]> -0.00001) me->size[1]= -0.00001; - - if(me->size[2]==0.0) me->size[2]= 1.0; - else if(me->size[2]>0.0 && me->size[2]<0.00001) me->size[2]= 0.00001; - else if(me->size[2]<0.0 && me->size[2]> -0.00001) me->size[2]= -0.00001; } - } BoundBox *mesh_get_bb(Mesh *me) @@ -434,15 +427,25 @@ BoundBox *mesh_get_bb(Mesh *me) return me->bb; } +void mesh_get_texspace(Mesh *me, float *loc_r, float *rot_r, float *size_r) +{ + if (!me->bb) { + tex_space_mesh(me); + } + + if (loc_r) VECCOPY(loc_r, me->loc); + if (rot_r) VECCOPY(rot_r, me->rot); + if (size_r) VECCOPY(size_r, me->size); +} + void make_orco_displist_mesh(Object *ob, int subdivlvl) { - Mesh *me; + Mesh *me= ob->data; DerivedMesh *dm; DispListMesh *dlm; + float loc[3], size[3]; int i; - me= ob->data; - if (G.obedit && G.obedit->data==me) { dm= subsurf_make_derived_from_editmesh(G.editMesh, subdivlvl, me->subsurftype, NULL); dlm= dm->convertToDispListMesh(dm); @@ -464,14 +467,13 @@ void make_orco_displist_mesh(Object *ob, int subdivlvl) if (me->orco) MEM_freeN(me->orco); me->orco= MEM_mallocN(dlm->totvert*3*sizeof(float), "mesh displist orco"); + mesh_get_texspace(me, loc, NULL, size); for(i=0; i<dlm->totvert; i++) { float *fp= &me->orco[i*3]; - VECCOPY(fp, dlm->mvert[i].co); - - fp[0]= (fp[0]-me->loc[0])/me->size[0]; - fp[1]= (fp[1]-me->loc[1])/me->size[1]; - fp[2]= (fp[2]-me->loc[2])/me->size[2]; + fp[0]= (dlm->mvert[i].co[0] - loc[0])/size[0]; + fp[1]= (dlm->mvert[i].co[1] - loc[1])/size[1]; + fp[2]= (dlm->mvert[i].co[2] - loc[2])/size[2]; } displistmesh_free(dlm); @@ -483,20 +485,22 @@ void make_orco_mesh(Mesh *me) KeyBlock *kb; float *orco, *fp; int a, totvert; + float loc[3], size[3]; totvert= me->totvert; if(totvert==0) return; orco= me->orco= MEM_mallocN(sizeof(float)*3*totvert, "orco mesh"); + mesh_get_texspace(me, loc, NULL, size); if(me->key && me->texcomesh==0) { kb= me->key->refkey; if (kb) { /***** BUG *****/ fp= kb->data; for(a=0; a<totvert; a++, orco+=3) { - orco[0]= (fp[0]-me->loc[0])/me->size[0]; - orco[1]= (fp[1]-me->loc[1])/me->size[1]; - orco[2]= (fp[2]-me->loc[2])/me->size[2]; + orco[0]= (fp[0]-loc[0])/size[0]; + orco[1]= (fp[1]-loc[1])/size[1]; + orco[2]= (fp[2]-loc[2])/size[2]; /* only increase mvert when totvert <= kb->totelem */ if(a<kb->totelem) fp+=3; @@ -510,9 +514,9 @@ void make_orco_mesh(Mesh *me) mvert= me->mvert; for(a=0; a<totvert; a++, orco+=3) { - orco[0]= (mvert->co[0]-me->loc[0])/me->size[0]; - orco[1]= (mvert->co[1]-me->loc[1])/me->size[1]; - orco[2]= (mvert->co[2]-me->loc[2])/me->size[2]; + orco[0]= (mvert->co[0]-loc[0])/size[0]; + orco[1]= (mvert->co[1]-loc[1])/size[1]; + orco[2]= (mvert->co[2]-loc[2])/size[2]; /* only increase mvert when totvert <= me->totvert */ if(a<me->totvert) mvert++; @@ -1152,8 +1156,6 @@ void nurbs_to_mesh(Object *ob) ob->data= me; ob->type= OB_MESH; - tex_space_mesh(me); - /* other users */ ob1= G.main->object.first; while(ob1) { diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c index 2d2d9cc039c..d1f720e4148 100644 --- a/source/blender/python/api2_2x/NMesh.c +++ b/source/blender/python/api2_2x/NMesh.c @@ -305,7 +305,6 @@ vertex coordinatess.\n"; void mesh_update( Mesh * mesh ) { edge_drawflags_mesh( mesh ); - tex_space_mesh( mesh ); } /*****************************/ diff --git a/source/blender/radiosity/intern/source/radpostprocess.c b/source/blender/radiosity/intern/source/radpostprocess.c index 74b72e3cab6..12a7408a399 100644 --- a/source/blender/radiosity/intern/source/radpostprocess.c +++ b/source/blender/radiosity/intern/source/radpostprocess.c @@ -1014,7 +1014,6 @@ void rad_addmesh(void) } VECCOPY(ob->loc, cent); - tex_space_mesh(me); /* restore colors */ face= RG.facebase[(startf-1)>>10]+((startf-1) & 1023); diff --git a/source/blender/src/booleanops.c b/source/blender/src/booleanops.c index 644813c0e01..bd706dd592b 100644 --- a/source/blender/src/booleanops.c +++ b/source/blender/src/booleanops.c @@ -544,9 +544,6 @@ NewBooleanMesh( &vd_o, inv_mat ); - - // initialize the object - tex_space_mesh(me_new); // free up the memory @@ -785,7 +782,7 @@ ConvertCSGDescriptorsToMeshObject( me->totface = face_it->num_elements; mesh_calculate_vertex_normals(me); - + // thats it! if (user_face_vertex_data) { MEM_freeN(user_face_vertex_data); diff --git a/source/blender/src/booleanops_mesh.c b/source/blender/src/booleanops_mesh.c index 152c1391d71..88f2cb98aac 100644 --- a/source/blender/src/booleanops_mesh.c +++ b/source/blender/src/booleanops_mesh.c @@ -187,9 +187,6 @@ CSG_AddMeshToBlender( inv_mat ); - // initialize the object - tex_space_mesh(me_new); - return 1; } diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 1458ab1b35b..d1db3b5de7e 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -381,7 +381,6 @@ static void decimate_apply(void) load_editMesh(); free_editMesh(G.editMesh); G.obedit= NULL; - tex_space_mesh(me); BIF_undo_push("Apply decimation"); } @@ -560,9 +559,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an case B_AUTOTEX: ob= OBACT; if(ob && G.obedit==0) { - if(ob->type==OB_MESH) tex_space_mesh(ob->data); - else if(ob->type==OB_MBALL) ; - else tex_space_curve(ob->data); + if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) tex_space_curve(ob->data); } break; case B_DOCENTRE: diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 97a4a9d5f59..0b8c52863ac 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -3322,60 +3322,46 @@ static void draw_bounding_volume(Object *ob) static void drawtexspace(Object *ob) { - Mesh *me; - MetaBall *mb; - Curve *cu; - BoundBox bb; - float *vec, *loc, *size; + float vec[8][3], loc[3], size[3]; if(ob->type==OB_MESH) { - me= ob->data; - size= me->size; - loc= me->loc; + mesh_get_texspace(ob->data, loc, NULL, size); } else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) { - cu= ob->data; - size= cu->size; - loc= cu->loc; + Curve *cu= ob->data; + VECCOPY(size, cu->size); + VECCOPY(loc, cu->loc); } else if(ob->type==OB_MBALL) { - mb= ob->data; - size= mb->size; - loc= mb->loc; + MetaBall *mb= ob->data; + VECCOPY(size, mb->size); + VECCOPY(loc, mb->loc); } else return; - bb.vec[0][0]=bb.vec[1][0]=bb.vec[2][0]=bb.vec[3][0]= loc[0]-size[0]; - bb.vec[4][0]=bb.vec[5][0]=bb.vec[6][0]=bb.vec[7][0]= loc[0]+size[0]; + vec[0][0]=vec[1][0]=vec[2][0]=vec[3][0]= loc[0]-size[0]; + vec[4][0]=vec[5][0]=vec[6][0]=vec[7][0]= loc[0]+size[0]; - bb.vec[0][1]=bb.vec[1][1]=bb.vec[4][1]=bb.vec[5][1]= loc[1]-size[1]; - bb.vec[2][1]=bb.vec[3][1]=bb.vec[6][1]=bb.vec[7][1]= loc[1]+size[1]; + vec[0][1]=vec[1][1]=vec[4][1]=vec[5][1]= loc[1]-size[1]; + vec[2][1]=vec[3][1]=vec[6][1]=vec[7][1]= loc[1]+size[1]; - bb.vec[0][2]=bb.vec[3][2]=bb.vec[4][2]=bb.vec[7][2]= loc[2]-size[2]; - bb.vec[1][2]=bb.vec[2][2]=bb.vec[5][2]=bb.vec[6][2]= loc[2]+size[2]; + vec[0][2]=vec[3][2]=vec[4][2]=vec[7][2]= loc[2]-size[2]; + vec[1][2]=vec[2][2]=vec[5][2]=vec[6][2]= loc[2]+size[2]; setlinestyle(2); - - vec= bb.vec[0]; - - glBegin(GL_LINE_STRIP); - glVertex3fv(vec); glVertex3fv(vec+3);glVertex3fv(vec+6); glVertex3fv(vec+9); - glVertex3fv(vec); glVertex3fv(vec+12);glVertex3fv(vec+15); glVertex3fv(vec+18); - glVertex3fv(vec+21); glVertex3fv(vec+12); - glEnd(); glBegin(GL_LINE_STRIP); - glVertex3fv(vec+3); glVertex3fv(vec+15); + glVertex3fv(vec[0]); glVertex3fv(vec[1]);glVertex3fv(vec[2]); glVertex3fv(vec[3]); + glVertex3fv(vec[0]); glVertex3fv(vec[4]);glVertex3fv(vec[5]); glVertex3fv(vec[6]); + glVertex3fv(vec[7]); glVertex3fv(vec[4]); glEnd(); - glBegin(GL_LINE_STRIP); - glVertex3fv(vec+6); glVertex3fv(vec+18); + glBegin(GL_LINES); + glVertex3fv(vec[1]); glVertex3fv(vec[5]); + glVertex3fv(vec[2]); glVertex3fv(vec[6]); + glVertex3fv(vec[3]); glVertex3fv(vec[7]); glEnd(); - glBegin(GL_LINE_STRIP); - glVertex3fv(vec+9); glVertex3fv(vec+21); - glEnd(); - setlinestyle(0); } diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c index 9d942b62b44..f080baa88d6 100644 --- a/source/blender/src/editmesh.c +++ b/source/blender/src/editmesh.c @@ -1126,8 +1126,6 @@ void load_editMesh(void) } } - tex_space_mesh(me); - /* tface block */ if( me->tface && me->totface ) { TFace *tfn, *tf; diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 5714764b694..e25350046ba 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -1703,8 +1703,6 @@ void docentre(int centremode) ob= ob->id.next; } } - /* DO: check all users... */ - tex_space_mesh(me); } else if ELEM(base->object->type, OB_CURVE, OB_SURF) { @@ -2313,7 +2311,6 @@ void convertmenu(void) } mball_to_mesh(&ob->disp, ob1->data); - tex_space_mesh(me); } } } @@ -2572,7 +2569,7 @@ void copy_attr(short event) if(poin1) { memcpy(poin1, poin2, 4+12+12+12); - if(obt->type==OB_MESH) tex_space_mesh(obt->data); + if(obt->type==OB_MESH) ; else if(obt->type==OB_MBALL) tex_space_mball(obt); else tex_space_curve(obt->data); } @@ -4293,8 +4290,6 @@ void image_aspect(void) Object *ob; Material *ma; Tex *tex; - Mesh *me; - Curve *cu; float x, y, space; int a, b, done; @@ -4314,14 +4309,16 @@ void image_aspect(void) if(ma->mtex[b] && ma->mtex[b]->tex) { tex= ma->mtex[b]->tex; if(tex->type==TEX_IMAGE && tex->ima && tex->ima->ibuf) { + /* texturespace */ space= 1.0; if(ob->type==OB_MESH) { - me= ob->data; - space= me->size[0]/me->size[1]; + float size[3]; + mesh_get_texspace(ob->data, NULL, NULL, size); + space= size[0]/size[1]; } else if ELEM3(ob->type, OB_CURVE, OB_FONT, OB_SURF) { - cu= ob->data; + Curve *cu= ob->data; space= cu->size[0]/cu->size[1]; } |