"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:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user