Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2007-05-02 04:01:23 +0400
committerCampbell Barton <ideasman42@gmail.com>2007-05-02 04:01:23 +0400
commitc24aa10561c3e301989df0d7f227f478f846143a (patch)
treec0a0f86cc48f4a6f9ecedeaf479ca353abe55fde /source
parent0b0f0b0ffb0075ce889b7515ebfd822bf99426cb (diff)
Made it so blender has an active render layer for Uv and Vertex color mesh layers.
This means changing the active UV/VCol layers wont change what renders. needed to adjust the minor version so old files will copy the active layer to the render-uv/vcol layer. boxpack2d.py - redoen in C now, dont need python version.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_customdata.h2
-rw-r--r--source/blender/blenkernel/intern/customdata.c41
-rw-r--r--source/blender/blenloader/intern/readfile.c19
-rw-r--r--source/blender/include/butspace.h2
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h2
-rw-r--r--source/blender/render/intern/source/convertblender.c8
-rw-r--r--source/blender/src/buttons_editing.c66
8 files changed, 118 insertions, 24 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index a96c1b43170..b40ef215a53 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -44,7 +44,7 @@ struct ListBase;
struct MemFile;
#define BLENDER_VERSION 243
-#define BLENDER_SUBVERSION 1
+#define BLENDER_SUBVERSION 2
#define BLENDER_MINVERSION 240
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index b41c06f046f..4a486e6795f 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -184,6 +184,7 @@ void *CustomData_get_layer_named(const struct CustomData *data, int type,
int CustomData_get_layer_index(const struct CustomData *data, int type);
int CustomData_get_named_layer_index(const struct CustomData *data, int type, char *name);
int CustomData_get_active_layer_index(const struct CustomData *data, int type);
+int CustomData_get_render_layer_index(const struct CustomData *data, int type);
/* copies the data from source to the data element at index in the first
* layer of type
@@ -204,6 +205,7 @@ void *CustomData_set_layer_n(const struct CustomData *data, int type, int n, voi
/* sets the nth layer of type as active */
void CustomData_set_layer_active(struct CustomData *data, int type, int n);
+void CustomData_set_layer_render(struct CustomData *data, int type, int n);
/* adds flag to the layer flags */
void CustomData_set_layer_flag(struct CustomData *data, int type, int flag);
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 68319b799a2..e239583c4eb 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -410,7 +410,7 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
{
const LayerTypeInfo *typeInfo;
CustomDataLayer *layer, *newlayer;
- int i, type, number = 0, lasttype = -1, lastactive = 0;
+ int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0;
for(i = 0; i < source->totlayer; ++i) {
layer = &source->layers[i];
@@ -421,6 +421,7 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
if (type != lasttype) {
number = 0;
lastactive = layer->active;
+ lastrender = layer->active_rnd;
lasttype = type;
}
else
@@ -437,8 +438,10 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
newlayer = customData_add_layer__internal(dest, type, alloctype,
layer->data, totelem, layer->name);
- if(newlayer)
+ if(newlayer) {
newlayer->active = lastactive;
+ newlayer->active_rnd = lastrender;
+ }
}
}
@@ -526,6 +529,17 @@ int CustomData_get_active_layer_index(const CustomData *data, int type)
return -1;
}
+int CustomData_get_render_layer_index(const CustomData *data, int type)
+{
+ int i;
+
+ for(i=0; i < data->totlayer; ++i)
+ if(data->layers[i].type == type)
+ return i + data->layers[i].active_rnd;
+
+ return -1;
+}
+
void CustomData_set_layer_active(CustomData *data, int type, int n)
{
int i;
@@ -535,6 +549,16 @@ void CustomData_set_layer_active(CustomData *data, int type, int n)
data->layers[i].active = n;
}
+void CustomData_set_layer_render(CustomData *data, int type, int n)
+{
+ int i;
+
+ for(i=0; i < data->totlayer; ++i)
+ if(data->layers[i].type == type)
+ data->layers[i].active_rnd = n;
+}
+
+
void CustomData_set_layer_flag(struct CustomData *data, int type, int flag)
{
int i;
@@ -617,11 +641,14 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
else
data->layers[index].name[0] = '\0';
- if(index > 0 && data->layers[index-1].type == type)
+ if(index > 0 && data->layers[index-1].type == type) {
data->layers[index].active = data->layers[index-1].active;
- else
+ data->layers[index].active_rnd = data->layers[index-1].active_rnd;
+ } else {
data->layers[index].active = 0;
-
+ data->layers[index].active_rnd = 0;
+ }
+
customData_update_offsets(data);
return &data->layers[index];
@@ -679,8 +706,10 @@ int CustomData_free_layer(CustomData *data, int type, int totelem, int index)
i = CustomData_get_layer_index(data, type);
if (i >= 0)
- for (; i < data->totlayer && data->layers[i].type == type; i++)
+ for (; i < data->totlayer && data->layers[i].type == type; i++) {
data->layers[i].active--;
+ data->layers[i].active_rnd--;
+ }
}
if (data->totlayer <= data->maxlayer-CUSTOMDATA_GROW)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ceab6863aa6..ace436cf04c 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4316,6 +4316,18 @@ static void customdata_version_242(Mesh *me)
mesh_update_customdata_pointers(me);
}
+/*only copy render texface layer from active*/
+static void customdata_version_243(Mesh *me)
+{
+ CustomDataLayer *layer;
+ int a;
+
+ for (a=0; a < me->fdata.totlayer; a++) {
+ layer= &me->fdata.layers[a];
+ layer->active_rnd = layer->active;
+ }
+}
+
/* struct NodeImageAnim moved to ImageUser, and we make it default available */
static void do_version_ntree_242_2(bNodeTree *ntree)
{
@@ -6416,6 +6428,13 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
+
+ /* render layer added, this is not the active layer */
+ if(main->versionfile <= 243 || main->subversionfile < 2) {
+ Mesh *me;
+ for(me=main->mesh.first; me; me=me->id.next)
+ customdata_version_243(me);
+ }
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h
index bde3db33376..142d2ae1d0b 100644
--- a/source/blender/include/butspace.h
+++ b/source/blender/include/butspace.h
@@ -406,6 +406,8 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_SETTFACE 2079
#define B_SETMCOL 2080
#define B_JOINTRIA 2081
+#define B_SETTFACE_RND 2082
+#define B_SETMCOL_RND 2083
/* *********************** */
#define B_VGROUPBUTS 2100
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index 921554552ef..b9f6ab0e60b 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -38,6 +38,8 @@ typedef struct CustomDataLayer {
int offset; /* in editmode, offset of layer in block */
int flag; /* general purpose flag */
int active; /* number of the active layer of this type */
+ int active_rnd; /* number of the layer to render*/
+ char pad[4];
char name[32]; /* layer name */
void *data; /* layer data */
} CustomDataLayer;
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 29773d5152b..e93a509efd1 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -1757,7 +1757,7 @@ static void use_mesh_edge_lookup(Render *re, DerivedMesh *dm, MEdge *medge, Vlak
if(layer->type == CD_MTFACE && mtfn < MAX_MTFACE) {
mtface= &((MTFace*)layer->data)[edp->f];
- n= vlakren_customdata_layer_num(mtfn++, layer->active);
+ n= vlakren_customdata_layer_num(mtfn++, layer->active_rnd);
mtf= RE_vlakren_get_tface(re, vlr, n, &name, 1);
*mtf= *mtface;
@@ -1769,7 +1769,7 @@ static void use_mesh_edge_lookup(Render *re, DerivedMesh *dm, MEdge *medge, Vlak
}
else if(layer->type == CD_MCOL && mcn < MAX_MCOL) {
mcol= &((MCol*)layer->data)[edp->f*4];
- n= vlakren_customdata_layer_num(mcn++, layer->active);
+ n= vlakren_customdata_layer_num(mcn++, layer->active_rnd);
mc= RE_vlakren_get_mcol(re, vlr, n, &name, 1);
mc[0]= mcol[edp->i1];
@@ -1996,13 +1996,13 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
name= layer->name;
if(layer->type == CD_MTFACE && mtfn < MAX_MTFACE) {
- n= vlakren_customdata_layer_num(mtfn++, layer->active);
+ n= vlakren_customdata_layer_num(mtfn++, layer->active_rnd);
mtf= RE_vlakren_get_tface(re, vlr, n, &name, 1);
mtface= (MTFace*)layer->data;
*mtf= mtface[a];
}
else if(layer->type == CD_MCOL && mcn < MAX_MCOL) {
- n= vlakren_customdata_layer_num(mcn++, layer->active);
+ n= vlakren_customdata_layer_num(mcn++, layer->active_rnd);
mc= RE_vlakren_get_mcol(re, vlr, n, &name, 1);
mcol= (MCol*)layer->data;
memcpy(mc, &mcol[a*4], sizeof(MCol)*4);
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 3700dc17980..b68d81b510d 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -172,7 +172,7 @@
static float editbutweight= 1.0;
float editbutvweight= 1;
-static int actmcol= 0, acttface= 0;
+static int actmcol= 0, acttface= 0, acttface_rnd = 0, actmcol_rnd = 0;
extern ListBase editNurb;
@@ -691,10 +691,10 @@ static void delete_customdata_layer(void *data1, void *data2)
Mesh *me= (Mesh*)data1;
CustomData *data= (G.obedit)? &G.editMesh->fdata: &me->fdata;
CustomDataLayer *layer= (CustomDataLayer*)data2;
- void *actlayerdata, *layerdata=layer->data;
+ void *actlayerdata, *rndlayerdata, *layerdata=layer->data;
int type= layer->type;
int index= CustomData_get_layer_index(data, type);
- int i, actindex;
+ int i, actindex, rndindex;
/*ok, deleting a non-active layer needs to preserve the active layer indices.
to do this, we store a pointer to the .data member of both layer and the active layer,
@@ -704,6 +704,7 @@ static void delete_customdata_layer(void *data1, void *data2)
this is necassary because the deletion functions only support deleting the active
layer. */
actlayerdata = data->layers[CustomData_get_active_layer_index(data, type)].data;
+ rndlayerdata = data->layers[CustomData_get_render_layer_index(data, type)].data;
CustomData_set_layer_active(data, type, layer - &data->layers[index]);
/* Multires is handled seperately because the display data is separate
@@ -741,6 +742,21 @@ static void delete_customdata_layer(void *data1, void *data2)
CustomData_set_layer_active(data, type, actindex);
}
+ if (rndlayerdata != layerdata) {
+ /*find index. . .*/
+ rndindex = CustomData_get_layer_index(data, type);
+ for (i=rndindex; i<data->totlayer; i++) {
+ if (data->layers[i].data == rndlayerdata) {
+ rndindex = i - rndindex;
+ break;
+ }
+ }
+
+ /*set index. . .*/
+ CustomData_set_layer_render(data, type, rndindex);
+ }
+
+
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
if(type == CD_MTFACE)
@@ -753,7 +769,12 @@ static void delete_customdata_layer(void *data1, void *data2)
allqueue(REDRAWBUTSEDIT, 0);
}
-static int customdata_buttons(uiBlock *block, Mesh *me, CustomData *data, int type, int *activep, int setevt, int newevt, char *label, char *shortlabel, char *browsetip, char *newtip, char *deltip, int x, int y)
+static int customdata_buttons(
+ uiBlock *block, Mesh *me, CustomData *data,
+ int type, int *activep, int *renderp,
+ int setevt, int setevt_rnd, int newevt,
+ char *label, char *shortlabel, char *browsetip, char *browsetip_rnd,
+ char *newtip, char *deltip, int x, int y)
{
CustomDataLayer *layer;
uiBut *but;
@@ -777,9 +798,11 @@ static int customdata_buttons(uiBlock *block, Mesh *me, CustomData *data, int ty
if(layer->type == type) {
*activep= layer->active + 1;
+ *renderp= layer->active_rnd + 1;
- uiDefButI(block, ROW, setevt, "", x,y,25,19, activep, 1.0, count, 0, 0, browsetip);
- but=uiDefBut(block, TEX, setevt, "", x+25,y,170,19, layer->name, 0.0, 31.0, 0, 0, label);
+ uiDefButI(block, ROW, setevt, "A", x,y,25,19, activep, 1.0, count, 0, 0, browsetip);
+ uiDefButI(block, ROW, setevt_rnd, "R", x+25,y,25,19, renderp, 1.0, count, 0, 0, browsetip_rnd);
+ but=uiDefBut(block, TEX, setevt, "", x+50,y,145,19, layer->name, 0.0, 31.0, 0, 0, label);
uiButSetFunc(but, verify_customdata_name_func, data, layer);
but= uiDefIconBut(block, BUT, B_NOP, VICON_X, x+195,y,25,19, NULL, 0.0, 0.0, 0.0, 0.0, deltip);
uiButSetFunc(but, delete_customdata_layer, me, layer);
@@ -848,14 +871,14 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me)
uiBlockEndAlign(block);
fdata= (G.obedit)? &G.editMesh->fdata: &me->fdata;
- yco= customdata_buttons(block, me, fdata, CD_MTFACE, &acttface,
- B_SETTFACE, B_NEWTFACE, "UV Texture", "UV Texture:",
- "Set active UV texture", "Creates a new UV texture layer",
+ yco= customdata_buttons(block, me, fdata, CD_MTFACE, &acttface, &acttface_rnd,
+ B_SETTFACE, B_SETTFACE_RND, B_NEWTFACE, "UV Texture", "UV Texture:",
+ "Set active UV texture", "Set rendering UV texture", "Creates a new UV texture layer",
"Removes the current UV texture layer", 190, 130);
- yco= customdata_buttons(block, me, fdata, CD_MCOL, &actmcol,
- B_SETMCOL, B_NEWMCOL, "Vertex Color", "Vertex Color:",
- "Sets active vertex color layer", "Creates a new vertex color layer",
+ yco= customdata_buttons(block, me, fdata, CD_MCOL, &actmcol, &actmcol_rnd,
+ B_SETMCOL, B_SETMCOL_RND, B_NEWMCOL, "Vertex Color", "Vertex Color:",
+ "Sets active vertex color layer", "Sets rendering vertex color layer", "Creates a new vertex color layer",
"Removes the current vertex color layer", 190, yco-5);
if(yco < 0)
@@ -4147,6 +4170,15 @@ void do_meshbuts(unsigned short event)
allqueue(REDRAWBUTSEDIT, 0);
}
break;
+ case B_SETMCOL_RND:
+ if (G.obedit || me) {
+ CustomData *fdata= (G.obedit)? &em->fdata: &me->fdata;
+ CustomData_set_layer_render(fdata, CD_MCOL, actmcol_rnd-1);
+
+ BIF_undo_push("Set Render Vertex Color");
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ break;
case B_NEWTFACE:
if(me)
@@ -4197,7 +4229,15 @@ void do_meshbuts(unsigned short event)
allqueue(REDRAWIMAGE, 0);
}
break;
-
+ case B_SETTFACE_RND:
+ if (G.obedit || me) {
+ CustomData *fdata= (G.obedit)? &em->fdata: &me->fdata;
+ CustomData_set_layer_render(fdata, CD_MTFACE, acttface_rnd-1);
+ BIF_undo_push("Set Render UV Texture");
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ break;
+
case B_FLIPNORM:
if(G.obedit) {
flip_editnormals();