"Make Local" menu (Lkey) now has as first option to make only Objects

local, keeping all Data stuff (Mesh, Materials) from Library.

The animation stuff on Object becomes local though;
- Ipo
- Action
- NLA
This commit is contained in:
2005-12-05 17:06:58 +00:00
parent dd1f6c649a
commit 863234481e
4 changed files with 105 additions and 32 deletions

View File

@@ -55,6 +55,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_nla_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_object_fluidsim.h"
@@ -888,6 +889,7 @@ Object *copy_object(Object *ob)
void expand_local_object(Object *ob)
{
bActionStrip *strip;
int a;
id_lib_extern((ID *)ob->action);
@@ -897,6 +899,10 @@ void expand_local_object(Object *ob)
for(a=0; a<ob->totcol; a++) {
id_lib_extern((ID *)ob->mat[a]);
}
for (strip=ob->nlastrips.first; strip; strip=strip->next) {
id_lib_extern((ID *)strip->act);
}
}
void make_local_object(Object *ob)

View File

@@ -2272,3 +2272,44 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
}
/* only when face points away from lamp, in direction of lamp, trace ray and find first exit point */
void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co)
{
Isect isec;
float lampco[3];
/* setup isec */
isec.mode= DDA_SHADOW_TRA;
if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1;
if(lar->type==LA_SUN || lar->type==LA_HEMI) {
lampco[0]= shi->co[0] - g_oc.ocsize*lar->vec[0];
lampco[1]= shi->co[1] - g_oc.ocsize*lar->vec[1];
lampco[2]= shi->co[2] - g_oc.ocsize*lar->vec[2];
}
else {
VECCOPY(lampco, lar->co);
}
isec.vlrorig= shi->vlr;
/* set up isec vec */
VECCOPY(isec.start, shi->co);
VECCOPY(isec.end, lampco);
if( d3dda(&isec)) {
/* we got a face */
/* render co */
co[0]= isec.start[0]+isec.labda*(isec.vec[0]);
co[1]= isec.start[1]+isec.labda*(isec.vec[1]);
co[2]= isec.start[2]+isec.labda*(isec.vec[2]);
*distfac= VecLength(isec.vec);
}
else
*distfac= 0.0f;
}

View File

@@ -1705,6 +1705,22 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
}
if(R.r.mode & R_RAYTRACE) {
extern void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co);
float co[3], distfac;
ray_translucent(shi, lar, &distfac, co);
if(distfac<0.01f*G.rt) {
// printf("distfac %f\n", distfac);
distfac= 1.0f - distfac/(0.01f*G.rt);
shr->diff[0]+= distfac;
shr->diff[1]+= distfac;
shr->diff[2]+= distfac;
}
}
/* specularity */
if(shadfac[3]>0.0 && shi->spec!=0.0 && !(lar->mode & LA_NO_SPEC)) {
@@ -2385,6 +2401,7 @@ void *shadepixel(float x, float y, int z, int facenr, int mask, float *col, floa
VecMulf(shi.vn, -1.0);
VecMulf(shi.facenor, -1.0);
shade_lamp_loop(&shi, &shr_t);
shr.diff[0]+= shi.translucency*shr_t.diff[0];
shr.diff[1]+= shi.translucency*shr_t.diff[1];
shr.diff[2]+= shi.translucency*shr_t.diff[2];

View File

@@ -71,6 +71,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
#include "DNA_nla_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_scene_types.h"
@@ -4033,6 +4034,7 @@ void make_local(void)
{
Base *base;
Object *ob;
bActionStrip *strip;
Material *ma, ***matarar;
Lamp *la;
Curve *cu;
@@ -4043,14 +4045,14 @@ void make_local(void)
if(G.scene->id.lib) return;
mode= pupmenu("Make Local%t|Selected %x1|All %x2");
mode= pupmenu("Make Local%t|Selected Objects %x1|Selected Objects and Data %x2|All %x3");
if(mode==2) {
if(mode==3) {
all_local(NULL); // NULL is all libs
allqueue(REDRAWALL, 0);
return;
}
else if(mode!=1) return;
else if(mode<1) return;
clear_id_newpoins();
@@ -4085,7 +4087,7 @@ void make_local(void)
id= ob->data;
if(id) {
if(id && mode>1) {
switch(ob->type) {
case OB_LAMP:
@@ -4129,44 +4131,51 @@ void make_local(void)
id= (ID *)ob->action;
if(id && id->lib) make_local_action(ob->action);
for (strip=ob->nlastrips.first; strip; strip=strip->next) {
if(strip->act && strip->act->id.lib)
make_local_action(strip->act);
}
}
base= base->next;
}
base= FIRSTBASE;
while(base) {
ob= base->object;
if(base->flag & SELECT ) {
if(mode>1) {
base= FIRSTBASE;
while(base) {
ob= base->object;
if(base->flag & SELECT ) {
if(ob->type==OB_LAMP) {
la= ob->data;
for(b=0; b<MAX_MTEX; b++) {
if(la->mtex[b] && la->mtex[b]->tex) {
make_local_texture(la->mtex[b]->tex);
if(ob->type==OB_LAMP) {
la= ob->data;
for(b=0; b<MAX_MTEX; b++) {
if(la->mtex[b] && la->mtex[b]->tex) {
make_local_texture(la->mtex[b]->tex);
}
}
}
else {
for(a=0; a<ob->totcol; a++) {
ma= ob->mat[a];
if(ma)
make_local_makelocalmaterial(ma);
}
matarar= (Material ***)give_matarar(ob);
for(a=0; a<ob->totcol; a++) {
ma= (*matarar)[a];
if(ma)
make_local_makelocalmaterial(ma);
}
}
}
else {
for(a=0; a<ob->totcol; a++) {
ma= ob->mat[a];
if(ma)
make_local_makelocalmaterial(ma);
}
matarar= (Material ***)give_matarar(ob);
for(a=0; a<ob->totcol; a++) {
ma= (*matarar)[a];
if(ma)
make_local_makelocalmaterial(ma);
}
}
base= base->next;
}
base= base->next;
}
allqueue(REDRAWALL, 0);
BIF_undo_push("Make local");
}