-> UV and VCOL support for bevel (editmode)
BMesh and the bevel code now support UVs/VCOLS. The offset is fixed at this time, but will be made dynamic later.
This commit is contained in:
@@ -41,6 +41,7 @@ extern const CustomDataMask CD_MASK_MESH;
|
||||
extern const CustomDataMask CD_MASK_EDITMESH;
|
||||
extern const CustomDataMask CD_MASK_DERIVEDMESH;
|
||||
extern const CustomDataMask CD_MASK_BMESH;
|
||||
extern const CustomDataMask CD_MASK_FACECORNERS;
|
||||
|
||||
/* for ORIGINDEX layer type, indicates no original index for this element */
|
||||
#define ORIGINDEX_NONE -1
|
||||
@@ -264,4 +265,8 @@ void CustomData_set_layer_unique_name(struct CustomData *data, int index);
|
||||
/* for file reading compatibility, returns false if the layer was freed,
|
||||
only after this test passes, layer->data should be assigned */
|
||||
int CustomData_verify_versions(struct CustomData *data, int index);
|
||||
|
||||
void CustomData_to_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
|
||||
void CustomData_from_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
|
||||
void CustomData_bmesh_init_pool(struct CustomData *data, int allocsize);
|
||||
#endif
|
||||
|
||||
@@ -55,14 +55,104 @@
|
||||
#include "bmesh_private.h"
|
||||
|
||||
#include "BSE_edit.h"
|
||||
/*Converts an EditMesh to a BME_Mesh.*/
|
||||
static void bmesh_init_cdPool(CustomData *data, int allocsize){
|
||||
if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize);
|
||||
|
||||
static void BME_corners_to_loops(BME_Mesh *bm, CustomData *facedata, void *face_block, BME_Poly *f,int numCol, int numTex){
|
||||
int i, j;
|
||||
BME_Loop *l;
|
||||
MTFace *texface;
|
||||
MTexPoly *texpoly;
|
||||
MCol *mcol;
|
||||
MLoopCol *mloopcol;
|
||||
MLoopUV *mloopuv;
|
||||
|
||||
for(i=0; i < numTex; i++){
|
||||
texface = CustomData_em_get_n(facedata, face_block, CD_MTFACE, i);
|
||||
texpoly = CustomData_bmesh_get_n(&bm->pdata, f->data, CD_MTEXPOLY, i);
|
||||
|
||||
texpoly->tpage = texface->tpage;
|
||||
texpoly->flag = texface->flag;
|
||||
texpoly->transp = texface->transp;
|
||||
texpoly->mode = texface->mode;
|
||||
texpoly->tile = texface->tile;
|
||||
texpoly->unwrap = texface->unwrap;
|
||||
|
||||
j = 0;
|
||||
l = f->loopbase;
|
||||
do{
|
||||
mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->data, CD_MLOOPUV, i);
|
||||
mloopuv->uv[0] = texface->uv[j][0];
|
||||
mloopuv->uv[1] = texface->uv[j][1];
|
||||
j++;
|
||||
l = l->next;
|
||||
}while(l!=f->loopbase);
|
||||
|
||||
}
|
||||
for(i=0; i < numCol; i++){
|
||||
mcol = CustomData_em_get_n(facedata, face_block, CD_MCOL, i);
|
||||
j = 0;
|
||||
l = f->loopbase;
|
||||
do{
|
||||
mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->data, CD_MLOOPCOL, i);
|
||||
mloopcol->r = mcol[j].r;
|
||||
mloopcol->g = mcol[j].g;
|
||||
mloopcol->b = mcol[j].b;
|
||||
mloopcol->a = mcol[j].a;
|
||||
j++;
|
||||
l = l->next;
|
||||
}while(l!=f->loopbase);
|
||||
}
|
||||
}
|
||||
|
||||
static void BME_loops_to_corners(BME_Mesh *bm, CustomData *facedata, void *face_block, BME_Poly *f,int numCol, int numTex){
|
||||
int i, j;
|
||||
BME_Loop *l;
|
||||
MTFace *texface;
|
||||
MTexPoly *texpoly;
|
||||
MCol *mcol;
|
||||
MLoopCol *mloopcol;
|
||||
MLoopUV *mloopuv;
|
||||
|
||||
for(i=0; i < numTex; i++){
|
||||
texface = CustomData_em_get_n(facedata, face_block, CD_MTFACE, i);
|
||||
texpoly = CustomData_bmesh_get_n(&bm->pdata, f->data, CD_MTEXPOLY, i);
|
||||
|
||||
texface->tpage = texpoly->tpage;
|
||||
texface->flag = texpoly->flag;
|
||||
texface->transp = texpoly->transp;
|
||||
texface->mode = texpoly->mode;
|
||||
texface->tile = texpoly->tile;
|
||||
texface->unwrap = texpoly->unwrap;
|
||||
|
||||
j = 0;
|
||||
l = f->loopbase;
|
||||
do{
|
||||
mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->data, CD_MLOOPUV, i);
|
||||
texface->uv[j][0] = mloopuv->uv[0];
|
||||
texface->uv[j][1] = mloopuv->uv[1];
|
||||
j++;
|
||||
l = l->next;
|
||||
}while(l!=f->loopbase);
|
||||
|
||||
}
|
||||
for(i=0; i < numCol; i++){
|
||||
mcol = CustomData_em_get_n(facedata, face_block, CD_MCOL, i);
|
||||
j = 0;
|
||||
l = f->loopbase;
|
||||
do{
|
||||
mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->data, CD_MLOOPCOL, i);
|
||||
mcol[j].r = mloopcol->r;
|
||||
mcol[j].g = mloopcol->g;
|
||||
mcol[j].b = mloopcol->b;
|
||||
mcol[j].a = mloopcol->a;
|
||||
j++;
|
||||
l = l->next;
|
||||
}while(l!=f->loopbase);
|
||||
}
|
||||
}
|
||||
/*move the EditMesh conversion functions to editmesh_tools.c*/
|
||||
BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em) {
|
||||
BME_Mesh *bm;
|
||||
int allocsize[4] = {512,512,2048,512};
|
||||
int allocsize[4] = {512,512,2048,512}, numTex, numCol;
|
||||
BME_Vert *v1, *v2;
|
||||
BME_Edge *e, *edar[4];
|
||||
BME_Poly *f;
|
||||
@@ -74,8 +164,21 @@ BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em) {
|
||||
int len;
|
||||
bm = BME_make_mesh(allocsize);
|
||||
|
||||
/*copy custom data layout*/
|
||||
CustomData_copy(&em->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
bmesh_init_cdPool(&bm->vdata, allocsize[0]);
|
||||
CustomData_copy(&em->edata, &bm->edata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
CustomData_copy(&em->fdata, &bm->pdata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
|
||||
/*copy face corner data*/
|
||||
CustomData_to_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata);
|
||||
/*initialize memory pools*/
|
||||
CustomData_bmesh_init_pool(&bm->vdata, allocsize[0]);
|
||||
CustomData_bmesh_init_pool(&bm->edata, allocsize[1]);
|
||||
CustomData_bmesh_init_pool(&bm->ldata, allocsize[2]);
|
||||
CustomData_bmesh_init_pool(&bm->pdata, allocsize[3]);
|
||||
/*needed later*/
|
||||
numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
|
||||
numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);
|
||||
|
||||
BME_model_begin(bm);
|
||||
/*add verts*/
|
||||
@@ -86,7 +189,6 @@ BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em) {
|
||||
v1->flag = eve->f;
|
||||
v1->h = eve->h;
|
||||
v1->bweight = eve->bweight;
|
||||
|
||||
/*Copy Custom Data*/
|
||||
CustomData_bmesh_copy_data(&em->vdata, &bm->vdata, eve->data, &v1->data);
|
||||
eve->tmp.v = (EditVert*)v1;
|
||||
@@ -106,15 +208,10 @@ BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em) {
|
||||
if(eed->seam) e->flag |= ME_SEAM;
|
||||
if(eed->h & EM_FGON) e->flag |= ME_FGON;
|
||||
if(eed->h & 1) e->flag |= ME_HIDE;
|
||||
|
||||
/* link the edges for face construction;
|
||||
* kind of a dangerous thing - remember to cast back to BME_Edge before using! */
|
||||
/*Copy CustomData*/
|
||||
|
||||
eed->tmp.e = (EditEdge*)e;
|
||||
CustomData_bmesh_copy_data(&em->edata, &bm->edata, eed->data, &e->data);
|
||||
eed = eed->next;
|
||||
}
|
||||
|
||||
/*add faces.*/
|
||||
efa= em->faces.first;
|
||||
while(efa) {
|
||||
@@ -143,12 +240,13 @@ BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em) {
|
||||
if(efa->f & 1) f->flag |= ME_FACE_SEL;
|
||||
else f->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
CustomData_bmesh_copy_data(&em->fdata, &bm->pdata, efa->data, &f->data);
|
||||
BME_corners_to_loops(bm, &em->fdata, efa->data, f,numCol,numTex);
|
||||
efa = efa->next;
|
||||
}
|
||||
BME_model_end(bm);
|
||||
return bm;
|
||||
}
|
||||
|
||||
/* adds the geometry in the bmesh to G.editMesh (does not free G.editMesh)
|
||||
* if td != NULL, the transdata will be mapped to the EditVert's co */
|
||||
EditMesh *BME_bmesh_to_editmesh(BME_Mesh *bm, BME_TransData_Head *td) {
|
||||
@@ -163,7 +261,7 @@ EditMesh *BME_bmesh_to_editmesh(BME_Mesh *bm, BME_TransData_Head *td) {
|
||||
EditEdge *eed;
|
||||
EditFace *efa;
|
||||
|
||||
int totvert, len, i;
|
||||
int totvert, len, i, numTex, numCol;
|
||||
|
||||
em = G.editMesh;
|
||||
|
||||
@@ -171,6 +269,13 @@ EditMesh *BME_bmesh_to_editmesh(BME_Mesh *bm, BME_TransData_Head *td) {
|
||||
|
||||
|
||||
CustomData_copy(&bm->vdata, &em->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
CustomData_copy(&bm->edata, &em->edata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
CustomData_copy(&bm->pdata, &em->fdata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
CustomData_from_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata);
|
||||
numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
|
||||
numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);
|
||||
|
||||
|
||||
/* convert to EditMesh */
|
||||
/* make editverts */
|
||||
totvert = BLI_countlist(&(bm->verts));
|
||||
@@ -202,6 +307,8 @@ EditMesh *BME_bmesh_to_editmesh(BME_Mesh *bm, BME_TransData_Head *td) {
|
||||
if(e->flag & ME_HIDE) eed->h |= 1;
|
||||
if(G.scene->selectmode==SCE_SELECT_EDGE)
|
||||
EM_select_edge(eed, eed->f & SELECT);
|
||||
|
||||
CustomData_em_copy_data(&bm->edata, &em->edata, e->data, &eed->data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,6 +335,8 @@ EditMesh *BME_bmesh_to_editmesh(BME_Mesh *bm, BME_TransData_Head *td) {
|
||||
if(f->flag & ME_HIDE) efa->h= 1;
|
||||
if((G.f & G_FACESELECT) && (efa->f & SELECT))
|
||||
EM_select_face(efa, 1); /* flush down */
|
||||
CustomData_em_copy_data(&bm->pdata, &em->fdata, f->data, &efa->data);
|
||||
BME_loops_to_corners(bm, &em->fdata, efa->data, f,numCol,numTex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "DNA_mesh_types.h"
|
||||
|
||||
#include "BKE_utildefines.h"
|
||||
#include "BKE_customdata.h"
|
||||
#include "BKE_bmesh.h"
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
@@ -618,8 +619,8 @@ BME_Poly *BME_SFME(BME_Mesh *bm, BME_Poly *f, BME_Vert *v1, BME_Vert *v2, BME_Lo
|
||||
BME_disk_append_edge(e, v2);
|
||||
|
||||
f2 = BME_addpolylist(bm,f);
|
||||
f1loop = BME_create_loop(bm,v2,e,f,NULL);
|
||||
f2loop = BME_create_loop(bm,v1,e,f2,NULL);
|
||||
f1loop = BME_create_loop(bm,v2,e,f,v2loop);
|
||||
f2loop = BME_create_loop(bm,v1,e,f2,v1loop);
|
||||
|
||||
f1loop->prev = v2loop->prev;
|
||||
f2loop->prev = v1loop->prev;
|
||||
@@ -663,16 +664,16 @@ BME_Poly *BME_SFME(BME_Mesh *bm, BME_Poly *f, BME_Vert *v1, BME_Vert *v2, BME_Lo
|
||||
* Takes a an edge and pointer to one of its vertices and collapses
|
||||
* the edge on that vertex.
|
||||
*
|
||||
* Before: OE KE
|
||||
* Before: OE KE
|
||||
* ------- -------
|
||||
* | || |
|
||||
* OV KV TV
|
||||
* OV KV TV
|
||||
*
|
||||
*
|
||||
* After: OE
|
||||
* ---------------
|
||||
* | |
|
||||
* OV TV
|
||||
* OV TV
|
||||
*
|
||||
*
|
||||
* Restrictions:
|
||||
@@ -723,6 +724,8 @@ int BME_JEKV(BME_Mesh *bm, BME_Edge *ke, BME_Vert *kv)
|
||||
/*remove ke from tv's disk cycle*/
|
||||
BME_disk_remove_edge(ke, tv);
|
||||
|
||||
|
||||
|
||||
/*deal with radial cycle of ke*/
|
||||
if(ke->loop){
|
||||
/*first step, fix the neighboring loops of all loops in ke's radial cycle*/
|
||||
@@ -763,6 +766,7 @@ int BME_JEKV(BME_Mesh *bm, BME_Edge *ke, BME_Vert *kv)
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*Validate disk cycles*/
|
||||
diskbase = BME_disk_getpointer(ov->edge,ov);
|
||||
edok = BME_cycle_validate(valance1, diskbase);
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_linklist.h"
|
||||
#include "BLI_ghash.h"
|
||||
|
||||
/**
|
||||
* MISC utility functions.
|
||||
*
|
||||
|
||||
@@ -215,10 +215,42 @@ static void BME_data_interp_from_verts(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2,
|
||||
src[1]= v2->data;
|
||||
w[0] = 1.0f-fac;
|
||||
w[1] = fac;
|
||||
CustomData_em_interp(&bm->vdata, src, w, NULL, 2, v->data);
|
||||
CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, v->data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void BME_data_facevert_edgesplit(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2, BME_Vert *v, BME_Edge *e1, float fac){
|
||||
void *src[2];
|
||||
float w[2];
|
||||
BME_Loop *l=NULL, *v1loop = NULL, *vloop = NULL, *v2loop = NULL;
|
||||
|
||||
w[0] = 1.0f - fac;
|
||||
w[1] = fac;
|
||||
|
||||
if(!e1->loop) return;
|
||||
l = e1->loop;
|
||||
do{
|
||||
if(l->v == v1){
|
||||
v1loop = l;
|
||||
vloop = v1loop->next;
|
||||
v2loop = vloop->next;
|
||||
}else if(l->v == v){
|
||||
v1loop = l->next;
|
||||
vloop = l;
|
||||
v2loop = l->prev;
|
||||
|
||||
}
|
||||
|
||||
src[0] = v1loop->data;
|
||||
src[1] = v2loop->data;
|
||||
|
||||
CustomData_bmesh_interp(&bm->ldata, src,w, NULL, 2, vloop->data);
|
||||
l = l->radial.next->data;
|
||||
}while(l!=e1->loop);
|
||||
}
|
||||
|
||||
|
||||
/* a wrapper for BME_SEMV that transfers element flags */ /*add custom data interpolation in here!*/
|
||||
static BME_Vert *BME_split_edge(BME_Mesh *bm, BME_Vert *v, BME_Edge *e, BME_Edge **ne, float percent) {
|
||||
BME_Vert *nv, *v2;
|
||||
@@ -238,9 +270,37 @@ static BME_Vert *BME_split_edge(BME_Mesh *bm, BME_Vert *v, BME_Edge *e, BME_Edge
|
||||
(*ne)->crease = e->crease;
|
||||
(*ne)->bweight = e->bweight;
|
||||
}
|
||||
/*v->nv->v2*/
|
||||
BME_data_facevert_edgesplit(bm,v2, v, nv, e, 0.75);
|
||||
return nv;
|
||||
}
|
||||
|
||||
static void BME_collapse_vert(BME_Mesh *bm, BME_Edge *ke, BME_Vert *kv, float fac){
|
||||
void *src[2];
|
||||
float w[2];
|
||||
BME_Loop *l=NULL, *kvloop=NULL, *tvloop=NULL;
|
||||
BME_Vert *tv = BME_edge_getothervert(ke,kv);
|
||||
|
||||
w[0] = 1.0f - fac;
|
||||
w[1] = fac;
|
||||
|
||||
if(ke->loop){
|
||||
l = ke->loop;
|
||||
do{
|
||||
if(l->v == tv && l->next->v == kv){
|
||||
tvloop = l;
|
||||
kvloop = l->next;
|
||||
|
||||
src[0] = kvloop->data;
|
||||
src[1] = tvloop->data;
|
||||
CustomData_bmesh_interp(&bm->ldata, src,w, NULL, 2, kvloop->data);
|
||||
}
|
||||
l=l->radial.next->data;
|
||||
}while(l!=ke->loop);
|
||||
}
|
||||
BME_JEKV(bm,ke,kv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int BME_bevel_is_split_vert(BME_Loop *l) {
|
||||
@@ -367,6 +427,8 @@ static BME_Vert *BME_bevel_split_edge(BME_Mesh *bm, BME_Vert *v, BME_Vert *v1, B
|
||||
ov = BME_edge_getothervert(e1,v);
|
||||
sv = BME_split_edge(bm,v,e1,&ne,0);
|
||||
//BME_data_interp_from_verts(bm, v, ov, sv, 0.25); /*this is technically wrong...*/
|
||||
//BME_data_interp_from_faceverts(bm, v, ov, sv, 0.25);
|
||||
//BME_data_interp_from_faceverts(bm, ov, v, sv, 0.25);
|
||||
BME_assign_transdata(td, bm, sv, sv->co, sv->co, NULL, sv->co, 0, -1, -1, NULL); /* quick default */
|
||||
sv->tflag1 |= BME_BEVEL_BEVEL;
|
||||
ne->tflag1 = BME_BEVEL_ORIG; /* mark edge as original, even though it isn't */
|
||||
@@ -408,6 +470,8 @@ static BME_Vert *BME_bevel_split_edge(BME_Mesh *bm, BME_Vert *v, BME_Vert *v1, B
|
||||
ov = BME_edge_getothervert(l->e,v);
|
||||
sv = BME_split_edge(bm,v,l->e,&ne,0);
|
||||
//BME_data_interp_from_verts(bm, v, ov, sv, 0.25); /*this is technically wrong...*/
|
||||
//BME_data_interp_from_faceverts(bm, v, ov, sv, 0.25);
|
||||
//BME_data_interp_from_faceverts(bm, ov, v, sv, 0.25);
|
||||
BME_assign_transdata(td, bm, sv, sv->co, sv->co, NULL, sv->co, 0, -1, -1, NULL); /* quick default */
|
||||
sv->tflag1 |= BME_BEVEL_BEVEL;
|
||||
ne->tflag1 = BME_BEVEL_ORIG; /* mark edge as original, even though it isn't */
|
||||
@@ -586,12 +650,15 @@ static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int opti
|
||||
if (kl->v == kv) {
|
||||
BME_split_face(bm,kl->f,kl->prev->v,kl->next->v,&nl,kl->prev->e);
|
||||
BME_JFKE(bm,((BME_Loop*)kl->prev->radial.next->data)->f,kl->f,kl->prev->e);
|
||||
BME_JEKV(bm,kl->e,kv);
|
||||
BME_collapse_vert(bm, kl->e, kv, 1.0);
|
||||
//BME_JEKV(bm,kl->e,kv);
|
||||
|
||||
}
|
||||
else {
|
||||
BME_split_face(bm,kl->f,kl->next->next->v,kl->v,&nl,kl->next->e);
|
||||
BME_JFKE(bm,((BME_Loop*)kl->next->radial.next->data)->f,kl->f,kl->next->e);
|
||||
BME_JEKV(bm,kl->e,kv);
|
||||
BME_collapse_vert(bm, kl->e, kv, 1.0);
|
||||
//BME_JEKV(bm,kl->e,kv);
|
||||
}
|
||||
l = l->prev;
|
||||
}
|
||||
@@ -620,12 +687,14 @@ static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int opti
|
||||
if (kl->v == kv) {
|
||||
BME_split_face(bm,kl->f,kl->prev->v,kl->next->v,&nl,kl->prev->e);
|
||||
BME_JFKE(bm,((BME_Loop*)kl->prev->radial.next->data)->f,kl->f,kl->prev->e);
|
||||
BME_JEKV(bm,kl->e,kv);
|
||||
BME_collapse_vert(bm, kl->e, kv, 1.0);
|
||||
//BME_JEKV(bm,kl->e,kv);
|
||||
}
|
||||
else {
|
||||
BME_split_face(bm,kl->f,kl->next->next->v,kl->v,&nl,kl->next->e);
|
||||
BME_JFKE(bm,((BME_Loop*)kl->next->radial.next->data)->f,kl->f,kl->next->e);
|
||||
BME_JEKV(bm,kl->e,kv);
|
||||
BME_collapse_vert(bm, kl->e, kv, 1.0);
|
||||
//BME_JEKV(bm,kl->e,kv);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1092,7 +1161,8 @@ static void bmesh_dissolve_disk(BME_Mesh *bm, BME_Vert *v){
|
||||
e = BME_disk_nextedge(e,v);
|
||||
}while(e != v->edge);
|
||||
}
|
||||
BME_JEKV(bm,v->edge,v);
|
||||
BME_collapse_vert(bm, v->edge, v, 1.0);
|
||||
//BME_JEKV(bm,v->edge,v);
|
||||
}
|
||||
}
|
||||
static BME_Mesh *BME_bevel_mesh(BME_Mesh *bm, float value, int res, int options, int defgrp_index, BME_TransData_Head *td) {
|
||||
|
||||
@@ -360,8 +360,80 @@ static void layerDefault_origspace_face(void *data, int count)
|
||||
}
|
||||
/* --------- */
|
||||
|
||||
static void layerDefault_mloopcol(void *data, int count)
|
||||
{
|
||||
static MLoopCol default_mloopcol = {255,255,255,255};
|
||||
MLoopCol *mlcol = (MLoopCol*)data;
|
||||
int i;
|
||||
for(i = 0; i < count; i++)
|
||||
mlcol[i] = default_mloopcol;
|
||||
|
||||
}
|
||||
|
||||
static void layerInterp_mloopcol(void **sources, float *weights,
|
||||
float *sub_weights, int count, void *dest)
|
||||
{
|
||||
MLoopCol *mc = dest;
|
||||
int i;
|
||||
float *sub_weight;
|
||||
struct {
|
||||
float a;
|
||||
float r;
|
||||
float g;
|
||||
float b;
|
||||
} col;
|
||||
col.a = col.r = col.g = col.b = 0;
|
||||
|
||||
sub_weight = sub_weights;
|
||||
for(i = 0; i < count; ++i){
|
||||
float weight = weights ? weights[i] : 1;
|
||||
MLoopCol *src = sources[i];
|
||||
if(sub_weights){
|
||||
col.a += src->a * (*sub_weight) * weight;
|
||||
col.r += src->r * (*sub_weight) * weight;
|
||||
col.g += src->g * (*sub_weight) * weight;
|
||||
col.b += src->b * (*sub_weight) * weight;
|
||||
sub_weight++;
|
||||
} else {
|
||||
col.a += src->a * weight;
|
||||
col.r += src->r * weight;
|
||||
col.g += src->g * weight;
|
||||
col.b += src->b * weight;
|
||||
}
|
||||
}
|
||||
mc->a = (int)col.a;
|
||||
mc->r = (int)col.r;
|
||||
mc->g = (int)col.g;
|
||||
mc->b = (int)col.b;
|
||||
}
|
||||
static void layerInterp_mloopuv(void **sources, float *weights,
|
||||
float *sub_weights, int count, void *dest)
|
||||
{
|
||||
MLoopUV *mluv = dest;
|
||||
int i;
|
||||
float *sub_weight;
|
||||
struct {
|
||||
float u;
|
||||
float v;
|
||||
}uv;
|
||||
uv.u = uv.v = 0.0;
|
||||
|
||||
sub_weight = sub_weights;
|
||||
for(i = 0; i < count; ++i){
|
||||
float weight = weights ? weights[i] : 1;
|
||||
MLoopUV *src = sources[i];
|
||||
if(sub_weights){
|
||||
uv.u += src->uv[0] * (*sub_weight) * weight;
|
||||
uv.v += src->uv[1] * (*sub_weight) * weight;
|
||||
sub_weight++;
|
||||
} else {
|
||||
uv.u += src->uv[0] * weight;
|
||||
uv.v += src->uv[1] * weight;
|
||||
}
|
||||
}
|
||||
mluv->uv[0] = uv.u;
|
||||
mluv->uv[1] = uv.v;
|
||||
}
|
||||
|
||||
static void layerInterp_mcol(void **sources, float *weights,
|
||||
float *sub_weights, int count, void *dest)
|
||||
@@ -433,6 +505,8 @@ static void layerDefault_mcol(void *data, int count)
|
||||
mcol[i] = default_mcol;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
|
||||
{sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL},
|
||||
{sizeof(MSticky), "MSticky", 1, NULL, NULL, NULL, layerInterp_msticky, NULL,
|
||||
@@ -457,8 +531,8 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
|
||||
layerInterp_origspace_face, layerSwap_origspace_face, layerDefault_origspace_face},
|
||||
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
||||
{sizeof(MTexPoly), "MTexPoly", 1, "Face Texture", NULL, NULL, NULL, NULL, NULL},
|
||||
{sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, NULL, NULL, NULL},
|
||||
{sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, NULL, NULL, NULL}
|
||||
{sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL},
|
||||
{sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, layerDefault_mloopcol}
|
||||
};
|
||||
|
||||
const char *LAYERTYPENAMES[CD_NUMTYPES] = {
|
||||
@@ -480,7 +554,11 @@ const CustomDataMask CD_MASK_DERIVEDMESH =
|
||||
CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
|
||||
CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO;
|
||||
const CustomDataMask CD_MASK_BMESH =
|
||||
CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL;
|
||||
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
|
||||
const CustomDataMask CD_MASK_FACECORNERS =
|
||||
CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
|
||||
CD_MASK_MLOOPCOL;
|
||||
|
||||
|
||||
static const LayerTypeInfo *layerType_getInfo(int type)
|
||||
{
|
||||
@@ -1456,6 +1534,36 @@ void CustomData_from_em_block(const CustomData *source, CustomData *dest,
|
||||
}
|
||||
|
||||
/*Bmesh functions*/
|
||||
|
||||
void CustomData_to_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i < fdata->totlayer; i++){
|
||||
if(fdata->layers[i].type == CD_MTFACE){
|
||||
CustomData_add_layer(pdata, CD_MTEXPOLY, CD_CALLOC, &(fdata->layers[i].name), 0);
|
||||
CustomData_add_layer(ldata, CD_MLOOPUV, CD_CALLOC, &(fdata->layers[i].name), 0);
|
||||
}
|
||||
else if(fdata->layers[i].type == CD_MCOL)
|
||||
CustomData_add_layer(ldata, CD_MLOOPCOL, CD_CALLOC, &(fdata->layers[i].name), 0);
|
||||
}
|
||||
}
|
||||
void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata){
|
||||
int i;
|
||||
for(i=0; i < pdata->totlayer; i++){
|
||||
if(pdata->layers[i].type == CD_MTEXPOLY)
|
||||
CustomData_add_layer(fdata, CD_MTFACE, CD_CALLOC, &(pdata->layers[i].name), 0);
|
||||
}
|
||||
for(i=0; i < ldata->totlayer; i++){
|
||||
if(ldata->layers[i].type == CD_MLOOPCOL)
|
||||
CustomData_add_layer(fdata, CD_MCOL, CD_CALLOC, &(ldata->layers[i].name), 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CustomData_bmesh_init_pool(CustomData *data, int allocsize){
|
||||
if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize);
|
||||
}
|
||||
|
||||
void CustomData_bmesh_free_block(CustomData *data, void **block)
|
||||
{
|
||||
const LayerTypeInfo *typeInfo;
|
||||
@@ -1484,7 +1592,7 @@ static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
|
||||
CustomData_bmesh_free_block(data, block);
|
||||
|
||||
if (data->totsize > 0)
|
||||
*block = BLI_mempool_alloc(data->pool);
|
||||
*block = BLI_mempool_calloc(data->pool);
|
||||
else
|
||||
*block = NULL;
|
||||
}
|
||||
@@ -1601,7 +1709,6 @@ void CustomData_bmesh_interp(CustomData *data, void **src_blocks, float *weights
|
||||
for(i = 0; i < data->totlayer; ++i) {
|
||||
CustomDataLayer *layer = &data->layers[i];
|
||||
const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
|
||||
|
||||
if(typeInfo->interp) {
|
||||
for(j = 0; j < count; ++j)
|
||||
sources[j] = (char *)src_blocks[j] + layer->offset;
|
||||
|
||||
@@ -36,7 +36,9 @@ typedef struct BLI_mempool BLI_mempool;
|
||||
|
||||
BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk);
|
||||
void *BLI_mempool_alloc(BLI_mempool *pool);
|
||||
void *BLI_mempool_calloc(BLI_mempool *pool);
|
||||
void BLI_mempool_free(BLI_mempool *pool, void *addr);
|
||||
void BLI_mempool_destroy(BLI_mempool *pool);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -89,7 +89,6 @@ BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk)
|
||||
curnode->next = NULL;
|
||||
return pool;
|
||||
}
|
||||
|
||||
void *BLI_mempool_alloc(BLI_mempool *pool){
|
||||
void *retval=NULL;
|
||||
BLI_freenode *curnode=NULL;
|
||||
@@ -117,6 +116,16 @@ void *BLI_mempool_alloc(BLI_mempool *pool){
|
||||
//memset(retval, 0, pool->esize);
|
||||
return retval;
|
||||
}
|
||||
|
||||
void *BLI_mempool_calloc(BLI_mempool *pool){
|
||||
void *retval=NULL;
|
||||
retval = BLI_mempool_alloc(pool);
|
||||
memset(retval, 0, pool->esize);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void BLI_mempool_free(BLI_mempool *pool, void *addr){ //doesnt protect against double frees, dont be stupid!
|
||||
BLI_freenode *newhead = addr;
|
||||
newhead->next = pool->free;
|
||||
@@ -128,4 +137,4 @@ void BLI_mempool_destroy(BLI_mempool *pool)
|
||||
for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) MEM_freeN(mpchunk->data);
|
||||
BLI_freelistN(&(pool->chunks));
|
||||
MEM_freeN(pool);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user