bbe6ae748ee98b9dc4d1ba8c669eb9113fbeccdd
[blender.git] / source / blender / bmesh / intern / bmesh_interp.c
1 /**
2  * BME_interp.c    August 2008
3  *
4  *      BM interpolation functions.
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  * about this.  
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2007 Blender Foundation.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): Geoffrey Bantle.
29  *
30  * ***** END GPL LICENSE BLOCK *****
31  */
32
33 #include "MEM_guardedalloc.h"
34
35 #include "DNA_mesh_types.h"
36 #include "DNA_meshdata_types.h"
37
38 #include "BKE_customdata.h" 
39 #include "BKE_utildefines.h"
40
41 #include "bmesh.h"
42 #include "bmesh_private.h"
43
44 /*
45  * BME_INTERP.C
46  *
47  * Functions for interpolating data across the surface of a mesh.
48  *
49 */
50
51 /**
52  *                      bmesh_data_interp_from_verts
53  *
54  *  Interpolates per-vertex data from two sources to a target.
55  * 
56  *  Returns -
57  *      Nothing
58  */
59 void BM_Data_Interp_From_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, float fac)
60 {
61         void *src[2];
62         float w[2];
63         if (v1->head.data && v2->head.data) {
64                 src[0]= v1->head.data;
65                 src[1]= v2->head.data;
66                 w[0] = 1.0f-fac;
67                 w[1] = fac;
68                 CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, v->head.data);
69         }
70 }
71
72 /**
73  *                      bmesh_data_facevert_edgeinterp
74  *
75  *  Walks around the faces of an edge and interpolates the per-face-edge
76  *  data between two sources to a target.
77  * 
78  *  Returns -
79  *      Nothing
80 */
81  
82 void BM_Data_Facevert_Edgeinterp(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, BMEdge *e1, float fac){
83         void *src[2];
84         float w[2];
85         BMLoop *l=NULL, *v1loop = NULL, *vloop = NULL, *v2loop = NULL;
86         
87         w[1] = 1.0f - fac;
88         w[0] = fac;
89
90         if(!e1->loop) return;
91         l = e1->loop;
92         do{
93                 if(l->v == v1){ 
94                         v1loop = l;
95                         vloop = (BMLoop*)(v1loop->head.next);
96                         v2loop = (BMLoop*)(vloop->head.next);
97                 }else if(l->v == v){
98                         v1loop = (BMLoop*)(l->head.next);
99                         vloop = l;
100                         v2loop = (BMLoop*)(l->head.prev);
101                         
102                 }
103
104                 src[0] = v1loop->head.data;
105                 src[1] = v2loop->head.data;                                     
106
107                 CustomData_bmesh_interp(&bm->ldata, src,w, NULL, 2, vloop->head.data);                          
108                 l = l->radial.next->data;
109         }while(l!=e1->loop);
110 }
111
112 void BM_loops_to_corners(BMesh *bm, Mesh *me, int findex,
113                          BMFace *f, int numTex, int numCol) 
114 {
115         int i, j;
116         BMLoop *l;
117         BMIter iter;
118         MTFace *texface;
119         MTexPoly *texpoly;
120         MCol *mcol;
121         MLoopCol *mloopcol;
122         MLoopUV *mloopuv;
123
124         for(i=0; i < numTex; i++){
125                 texface = CustomData_get_n(&me->fdata, CD_MTFACE, findex, i);
126                 texpoly = CustomData_bmesh_get_n(&bm->pdata, f->head.data, CD_MTEXPOLY, i);
127                 
128                 texface->tpage = texpoly->tpage;
129                 texface->flag = texpoly->flag;
130                 texface->transp = texpoly->transp;
131                 texface->mode = texpoly->mode;
132                 texface->tile = texpoly->tile;
133                 texface->unwrap = texpoly->unwrap;
134
135                 j = 0;
136                 BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
137                         mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPUV, i);
138                         texface->uv[j][0] = mloopuv->uv[0];
139                         texface->uv[j][1] = mloopuv->uv[1];
140
141                         j++;
142                 }
143
144         }
145
146         for(i=0; i < numCol; i++){
147                 mcol = CustomData_get_n(&me->fdata, CD_MCOL, findex, i);
148
149                 j = 0;
150                 BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
151                         mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPCOL, i);
152                         mcol[j].r = mloopcol->r;
153                         mcol[j].g = mloopcol->g;
154                         mcol[j].b = mloopcol->b;
155                         mcol[j].a = mloopcol->a;
156
157                         j++;
158                 }
159         }
160 }
161
162 //static void bmesh_data_interp_from_face(BME_Mesh *bm, BMFace *source, BMFace *target)
163 //{
164 //
165 //}
166 /*insert BM_data_interp_from_face here for mean value coordinates...*/