diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-07-25 21:51:30 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-07-25 21:51:30 +0400 |
commit | cadfac5a0f54c2e7086a6c1cf93f90adcbd1b7bb (patch) | |
tree | 5ac97cdf4b8b6e5a829448ad7de34c59e7c35053 /source/blender | |
parent | cc0abf99632064f9daba60be8867f2addd28b9e8 (diff) | |
parent | 99736f373c12e7ab91f962c738243bddf2d713c6 (diff) |
svn merge -r38000:38200 https://svn.blender.org/svnroot/bf-blender/trunk/blender
Diffstat (limited to 'source/blender')
81 files changed, 463 insertions, 229 deletions
diff --git a/source/blender/avi/AVI_avi.h b/source/blender/avi/AVI_avi.h index 85685e2bd4c..1446971a8ac 100644 --- a/source/blender/avi/AVI_avi.h +++ b/source/blender/avi/AVI_avi.h @@ -55,11 +55,12 @@ #ifndef __AVI_H__ #define __AVI_H__ +#include "MEM_sys_types.h" #include <stdio.h> /* for FILE */ typedef struct _AviChunk { int fcc; - int size; + int64_t size; } AviChunk; typedef struct _AviList { @@ -185,16 +186,16 @@ typedef struct _AviMovie { #define AVI_MOVIE_READ 0 #define AVI_MOVIE_WRITE 1 - unsigned long size; + int64_t size; AviMainHeader *header; AviStreamRec *streams; AviIndexEntry *entries; int index_entries; - int movi_offset; - int read_offset; - long *offset_table; + int64_t movi_offset; + int64_t read_offset; + int64_t *offset_table; /* Local data goes here */ int interlace; diff --git a/source/blender/avi/CMakeLists.txt b/source/blender/avi/CMakeLists.txt index b62e0cc5afd..bae61fd678b 100644 --- a/source/blender/avi/CMakeLists.txt +++ b/source/blender/avi/CMakeLists.txt @@ -27,6 +27,7 @@ set(INC . ../../../intern/guardedalloc + ../blenlib ) set(INC_SYS diff --git a/source/blender/avi/SConscript b/source/blender/avi/SConscript index 0bf8c3c74db..4d2ce8fd845 100644 --- a/source/blender/avi/SConscript +++ b/source/blender/avi/SConscript @@ -3,7 +3,7 @@ Import ('env') sources = env.Glob('intern/*.c') -incs = '. #/intern/guardedalloc' +incs = '. #/intern/guardedalloc ../blenlib' incs += ' ' + env['BF_JPEG_INC'] env.BlenderLib ('bf_avi', sources, Split(incs), [], libtype=['core','player'], priority = [190,120] ) diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index 82bf3a3d21b..ff3aafbf065 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -42,6 +42,9 @@ #include <ctype.h> #include "MEM_guardedalloc.h" +#include "MEM_sys_types.h" + +#include "BLI_winstuff.h" #include "AVI_avi.h" #include "avi_intern.h" @@ -593,7 +596,6 @@ AviError AVI_open_movie (const char *name, AviMovie *movie) { movie->movi_offset = ftell (movie->fp); movie->read_offset = movie->movi_offset; - if (AVI_DEBUG) printf ("movi_offset is %d\n", movie->movi_offset); /* Read in the index if the file has one, otherwise create one */ if (movie->header->Flags & AVIF_HASINDEX) { @@ -707,8 +709,8 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) { AviList list; AviChunk chunk; int i; - int header_pos1, header_pos2; - int stream_pos1, stream_pos2; + int64_t header_pos1, header_pos2; + int64_t stream_pos1, stream_pos2; movie->type = AVI_MOVIE_WRITE; movie->fp = fopen (name, "wb"); @@ -718,7 +720,7 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) { if (movie->fp == NULL) return AVI_ERROR_OPEN; - movie->offset_table = (long *) MEM_mallocN ((1+streams*2) * sizeof (long),"offsettable"); + movie->offset_table = (int64_t *) MEM_mallocN ((1+streams*2) * sizeof (int64_t),"offsettable"); for (i=0; i < 1 + streams*2; i++) movie->offset_table[i] = -1L; @@ -897,7 +899,7 @@ AviError AVI_write_frame (AviMovie *movie, int frame_num, ...) { AviIndexEntry *temp; va_list ap; int stream; - long rec_off; + int64_t rec_off; AviFormat format; void *buffer; int size; diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c index edb708d8a69..96c62843436 100644 --- a/source/blender/avi/intern/options.c +++ b/source/blender/avi/intern/options.c @@ -40,6 +40,8 @@ #include "avi_intern.h" #include "endian.h" +#include "BLI_winstuff.h" + /* avi_set_compress_options gets its own file... now don't WE feel important? */ AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) { diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index cbf7e941387..9261df46338 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -51,7 +51,7 @@ extern "C" { /* used by packaging tools */ /* can be left blank, otherwise a,b,c... etc with no quotes */ -#define BLENDER_VERSION_CHAR +#define BLENDER_VERSION_CHAR a /* alpha/beta/rc/release, docs use this */ #define BLENDER_VERSION_CYCLE release diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index a126f405d09..e44b5d96852 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -88,6 +88,7 @@ typedef struct bNodeType { /* this line is set on startup of blender */ void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); const char *(*labelfunc)(struct bNode *); void (*initfunc)(struct bNode *); @@ -319,9 +320,10 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); #define RRES_OUT_REFRACT 12 #define RRES_OUT_INDIRECT 13 #define RRES_OUT_INDEXOB 14 -#define RRES_OUT_MIST 15 -#define RRES_OUT_EMIT 16 -#define RRES_OUT_ENV 17 +#define RRES_OUT_INDEXMA 15 +#define RRES_OUT_MIST 16 +#define RRES_OUT_EMIT 17 +#define RRES_OUT_ENV 18 /* note: types are needed to restore callbacks, don't change values */ #define CMP_NODE_VIEWER 201 diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c index 1543532c8bd..c9b746cec33 100644 --- a/source/blender/blenkernel/intern/BME_tools.c +++ b/source/blender/blenkernel/intern/BME_tools.c @@ -1003,7 +1003,7 @@ static BME_Mesh *BME_bevel_initialize(BME_Mesh *bm, int options, int UNUSED(defg } /* edge pass */ - threshold = (float)cos((angle + 0.00001) * M_PI / 180.0); + threshold = (float)cos((angle + 0.001) * M_PI / 180.0); for (e=bm->edges.first; e; e=e->next) { e->tflag1 = BME_BEVEL_ORIG; weight = 0.0; diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index be19275e522..09b705dc37b 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -720,12 +720,13 @@ static void group_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, i /* note, if you check on layer here, render goes wrong... it still deforms verts and uses parent imat */ if(go->ob!=ob) { - /* Group Dupli Offset, should apply after everything else */ - if (group->dupli_ofs[0] || group->dupli_ofs[1] || group->dupli_ofs[2]) { + /* group dupli offset, should apply after everything else */ + if(!is_zero_v3(group->dupli_ofs)) { copy_m4_m4(tmat, go->ob->obmat); sub_v3_v3v3(tmat[3], tmat[3], group->dupli_ofs); mul_m4_m4m4(mat, tmat, ob->obmat); - } else { + } + else { mul_m4_m4m4(mat, go->ob->obmat, ob->obmat); } @@ -1392,7 +1393,17 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p if(part->ren_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) { for(go= part->dup_group->gobject.first, b=0; go; go= go->next, b++) { - mul_m4_m4m4(tmat, oblist[b]->obmat, pamat); + + /* group dupli offset, should apply after everything else */ + if(!is_zero_v3(part->dup_group->dupli_ofs)) { + copy_m4_m4(tmat, oblist[b]->obmat); + sub_v3_v3v3(tmat[3], tmat[3], part->dup_group->dupli_ofs); + mul_m4_m4m4(tmat, tmat, pamat); + } + else { + mul_m4_m4m4(tmat, oblist[b]->obmat, pamat); + } + mul_mat3_m4_fl(tmat, size*scale); if(par_space_mat) mul_m4_m4m4(mat, tmat, par_space_mat); diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 334f018efc9..2f29074834b 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -867,6 +867,10 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb) if(ma->strand_surfnor > 0.0f) ma->mode_l |= MA_STR_SURFDIFF; + + /* parses the geom+tex nodes */ + if(ma->nodetree && ma->use_nodes) + ntreeShaderGetTexcoMode(ma->nodetree, r_mode, &ma->texco, &ma->mode_l); } static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode, float *amb) @@ -887,8 +891,6 @@ static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode init_render_nodetree((bNodeTree *)node->id, basemat, r_mode, amb); } } - /* parses the geom+tex nodes */ - ntreeShaderGetTexcoMode(ntree, r_mode, &basemat->texco, &basemat->mode_l); } void init_render_material(Material *mat, int r_mode, float *amb) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 64e374fe4c0..518ee3c341a 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3156,6 +3156,8 @@ static void force_hidden_passes(bNode *node, int passflag) if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB); if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA); + if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT); diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 451e576979a..2cdb5ecd5d3 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3670,7 +3670,7 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra) pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1); birthtime = pa->time; - dietime = birthtime + pa->lifetime; + dietime = pa->dietime; /* store this, so we can do multiple loops over particles */ pa->state.time = dfra; diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 64893bb0b5b..6b92c6e9540 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -2124,7 +2124,8 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra { Object *ob; PointCache *cache; - float offset, time, nexttime; + /* float offset; unused for now */ + float time, nexttime; /* TODO: this has to be sorter out once bsystem_time gets redone, */ /* now caches can handle interpolating etc. too - jahka */ @@ -2152,13 +2153,18 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra *startframe= cache->startframe; *endframe= cache->endframe; - // XXX ipoflag is depreceated - old animation system stuff - if (/*(ob->ipoflag & OB_OFFS_PARENT) &&*/ (ob->partype & PARSLOW)==0) { + /* TODO: time handling with object offsets and simulated vs. cached + * particles isn't particularly easy, so for now what you see is what + * you get. In the future point cache could handle the whole particle + * system timing. */ +#if 0 + if ((ob->partype & PARSLOW)==0) { offset= give_timeoffset(ob); *startframe += (int)(offset+0.5f); *endframe += (int)(offset+0.5f); } +#endif } /* verify cached_frames array is up to date */ diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h index 6ff57b08724..b5bab6f15be 100644 --- a/source/blender/blenlib/BLI_math_base.h +++ b/source/blender/blenlib/BLI_math_base.h @@ -39,6 +39,10 @@ #include <math.h> #include "BLI_math_inline.h" +#ifdef __sun__ +#include <ieeefp.h> /* for finite() */ +#endif + #ifndef M_PI #define M_PI 3.14159265358979323846 #endif diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h index d0eb3c7d67d..e0c819c2dba 100644 --- a/source/blender/blenlib/BLI_winstuff.h +++ b/source/blender/blenlib/BLI_winstuff.h @@ -98,6 +98,15 @@ extern "C" { typedef unsigned int mode_t; #endif +/* use functions that take a 64 bit offset for files larger than 4GB */ +#ifndef FREE_WINDOWS +#include <stdio.h> +#define fseek(stream, offset, origin) _fseeki64(stream, offset, origin) +#define ftell(stream) _ftelli64(stream) +#define lseek(fd, offset, origin) _lseeki64(fd, offset, origin) +#define tell(fd) _telli64(fd) +#endif + /* mingw using _SSIZE_T_ to declare ssize_t type */ #ifndef _SSIZE_T_ #define _SSIZE_T_ diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index adacf916fc1..993af3cd794 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -430,7 +430,7 @@ int isect_line_sphere_v2(const float l1[2], const float l2[2], l2[1] - l1[1] }; - const float a= dot_v3v3(ldir, ldir); + const float a= dot_v2v2(ldir, ldir); const float b= 2.0f * (ldir[0] * (l1[0] - sp[0]) + diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index af87707fb90..80b85661762 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1024,26 +1024,6 @@ static int get_path_system(char *targetpath, const char *folder_name, const char } } -#if defined(WIN32) && BLENDER_VERSION < 258 - -static int path_have_257_script_install(void) -{ - const int ver= BLENDER_VERSION; - char path[FILE_MAX] = ""; - char system_pyfile[FILE_MAX]; - - if (get_path_user(path, "scripts", NULL, "BLENDER_USER_SCRIPTS", ver)) { - BLI_join_dirfile(system_pyfile, sizeof(system_pyfile), path, "modules/bpy_types.py"); - - if (BLI_exists(system_pyfile)) - return 1; - } - - return 0; -} - -#endif - /* get a folder out of the 'folder_id' presets for paths */ /* returns the path if found, NULL string if not */ char *BLI_get_folder(int folder_id, const char *subfolder) @@ -1076,20 +1056,7 @@ char *BLI_get_folder(int folder_id, const char *subfolder) return NULL; case BLENDER_USER_SCRIPTS: -#if defined(WIN32) && BLENDER_VERSION < 258 - /* if we have a 2.57 installation, then we may have system script - * files in the user configuration folder. avoid using that folder - * if they are there, until the version gets bumped to 2.58, so - * we can be sure that folder only has addons etc. */ - if (path_have_257_script_install()) { - if (get_path_local(path, "scripts", subfolder, ver)) break; - } - else -#endif - { - if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break; - } - + if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break; return NULL; case BLENDER_SYSTEM_SCRIPTS: diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index e9db148e992..41eedef8835 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -478,7 +478,7 @@ LinkNode *BLI_read_file_as_lines(const char *name) FILE *fp= fopen(name, "r"); LinkNode *lines= NULL; char *buf; - int size; + int64_t size; if (!fp) return NULL; diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c index d139fb1ab71..be7682a63d4 100644 --- a/source/blender/blenlib/intern/uvproject.c +++ b/source/blender/blenlib/intern/uvproject.c @@ -70,7 +70,7 @@ void project_from_camera(float target[2], float source[3], UvCameraInfo *uci) vec2d[0]= pv4[0]; vec2d[1]= pv4[2]; target[0]= angle * ((float)M_PI / uci->camangle); - target[1]= pv4[1] / (len_v2(vec2d) * uci->camsize); + target[1]= pv4[1] / (len_v2(vec2d) * (uci->camsize * 2.0f)); } } else { @@ -146,7 +146,11 @@ UvCameraInfo *project_camera_info(Object *ob, float (*rotmat)[4], float winx, fl uci.camangle= lens_to_angle(camera->lens) / 2.0f; uci.camsize= uci.do_persp ? tanf(uci.camangle) : camera->ortho_scale; - if (invert_m4_m4(uci.caminv, ob->obmat)) { + /* account for scaled cameras */ + copy_m4_m4(uci.caminv, ob->obmat); + normalize_m4(uci.caminv); + + if (invert_m4(uci.caminv)) { UvCameraInfo *uci_pt; /* normal projection */ @@ -169,8 +173,8 @@ UvCameraInfo *project_camera_info(Object *ob, float (*rotmat)[4], float winx, fl } /* include 0.5f here to move the UVs into the center */ - uci.shiftx = 0.5f - camera->shiftx; - uci.shifty = 0.5f - camera->shifty; + uci.shiftx = 0.5f - (camera->shiftx * uci.xasp); + uci.shifty = 0.5f - (camera->shifty * uci.yasp); uci_pt= MEM_mallocN(sizeof(UvCameraInfo), "UvCameraInfo"); *uci_pt= uci; diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 90c3cfbb001..ad9098db3d8 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -89,14 +89,14 @@ void ArmatureExporter::add_instance_controller(Object *ob) ins.add(); } -void ArmatureExporter::export_controllers(Scene *sce) +void ArmatureExporter::export_controllers(Scene *sce, bool export_selected) { scene = sce; openLibrary(); GeometryFunctor gf; - gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this); + gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this, export_selected); closeLibrary(); } @@ -351,12 +351,17 @@ std::string ArmatureExporter::add_inv_bind_mats_source(Object *ob_arm, ListBase bPoseChannel *pchan = get_pose_channel(pose, def->name); + float pose_mat[4][4]; float mat[4][4]; float world[4][4]; float inv_bind_mat[4][4]; + // pose_mat is the same as pchan->pose_mat, but without the rotation + unit_m4(pose_mat); + translate_m4(pose_mat, pchan->pose_head[0], pchan->pose_head[1], pchan->pose_head[2]); + // make world-space matrix, pose_mat is armature-space - mul_m4_m4m4(world, pchan->pose_mat, ob_arm->obmat); + mul_m4_m4m4(world, pose_mat, ob_arm->obmat); invert_m4_m4(mat, world); converter.mat4_to_dae(inv_bind_mat, mat); diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h index f72e5244a36..f4488942f7b 100644 --- a/source/blender/collada/ArmatureExporter.h +++ b/source/blender/collada/ArmatureExporter.h @@ -65,7 +65,7 @@ public: void add_instance_controller(Object *ob); - void export_controllers(Scene *sce); + void export_controllers(Scene *sce, bool export_selected); void operator()(Object *ob); diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp index f8fa0fd55c0..6ce9eb782d3 100644 --- a/source/blender/collada/CameraExporter.cpp +++ b/source/blender/collada/CameraExporter.cpp @@ -42,24 +42,25 @@ CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){} template<class Functor> -void forEachCameraObjectInScene(Scene *sce, Functor &f) +void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { Object *ob = base->object; - if (ob->type == OB_CAMERA && ob->data) { + if (ob->type == OB_CAMERA && ob->data + && !(export_selected && !(ob->flag & SELECT))) { f(ob, sce); } base= base->next; } } -void CamerasExporter::exportCameras(Scene *sce) +void CamerasExporter::exportCameras(Scene *sce, bool export_selected) { openLibrary(); - forEachCameraObjectInScene(sce, *this); + forEachCameraObjectInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/CameraExporter.h b/source/blender/collada/CameraExporter.h index 922eaf6b1d0..999a6ddd3e5 100644 --- a/source/blender/collada/CameraExporter.h +++ b/source/blender/collada/CameraExporter.h @@ -40,7 +40,7 @@ class CamerasExporter: COLLADASW::LibraryCameras { public: CamerasExporter(COLLADASW::StreamWriter *sw); - void exportCameras(Scene *sce); + void exportCameras(Scene *sce, bool export_selected); void operator()(Object *ob, Scene *sce); }; diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 00daac60281..e6e0953680c 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -170,7 +170,7 @@ public: SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm) {} - void exportScene(Scene *sce) { + void exportScene(Scene *sce, bool export_selected) { // <library_visual_scenes> <visual_scene> std::string id_naming = id_name(sce); openVisualScene(translate_id(id_naming), id_naming); @@ -179,7 +179,7 @@ public: //forEachMeshObjectInScene(sce, *this); //forEachCameraObjectInScene(sce, *this); //forEachLampObjectInScene(sce, *this); - exportHierarchy(sce); + exportHierarchy(sce, export_selected); // </visual_scene> </library_visual_scenes> closeVisualScene(); @@ -187,7 +187,7 @@ public: closeLibrary(); } - void exportHierarchy(Scene *sce) + void exportHierarchy(Scene *sce, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { @@ -198,8 +198,11 @@ public: case OB_MESH: case OB_CAMERA: case OB_LAMP: - case OB_EMPTY: case OB_ARMATURE: + case OB_EMPTY: + if (export_selected && !(ob->flag & SELECT)) { + break; + } // write nodes.... writeNodes(ob, sce); break; @@ -929,7 +932,7 @@ protected: } }; -void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename) +void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool selected) { PointerRNA sceneptr, unit_settings; PropertyRNA *system; /* unused , *scale; */ @@ -1011,31 +1014,31 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename) // <library_cameras> if(has_object_type(sce, OB_CAMERA)) { CamerasExporter ce(&sw); - ce.exportCameras(sce); + ce.exportCameras(sce, selected); } // <library_lights> if(has_object_type(sce, OB_LAMP)) { LightsExporter le(&sw); - le.exportLights(sce); + le.exportLights(sce, selected); } // <library_images> ImagesExporter ie(&sw, filename); - ie.exportImages(sce); + ie.exportImages(sce, selected); // <library_effects> EffectsExporter ee(&sw); - ee.exportEffects(sce); + ee.exportEffects(sce, selected); // <library_materials> MaterialsExporter me(&sw); - me.exportMaterials(sce); + me.exportMaterials(sce, selected); // <library_geometries> if(has_object_type(sce, OB_MESH)) { GeometryExporter ge(&sw); - ge.exportGeom(sce); + ge.exportGeom(sce, selected); } // <library_animations> @@ -1045,12 +1048,12 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename) // <library_controllers> ArmatureExporter arm_exporter(&sw); if(has_object_type(sce, OB_ARMATURE)) { - arm_exporter.export_controllers(sce); + arm_exporter.export_controllers(sce, selected); } // <library_visual_scenes> SceneExporter se(&sw, &arm_exporter); - se.exportScene(sce); + se.exportScene(sce, selected); // <scene> std::string scene_name(translate_id(id_name(sce))); diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h index 9d6d2114cd8..923313c4ed9 100644 --- a/source/blender/collada/DocumentExporter.h +++ b/source/blender/collada/DocumentExporter.h @@ -34,7 +34,7 @@ struct Scene; class DocumentExporter { public: - void exportCurrentScene(Scene *sce, const char* filename); + void exportCurrentScene(Scene *sce, const char* filename, bool selected); void exportScenes(const char* filename); }; diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp index 74756859d3b..f51330165f3 100644 --- a/source/blender/collada/EffectExporter.cpp +++ b/source/blender/collada/EffectExporter.cpp @@ -78,12 +78,12 @@ bool EffectsExporter::hasEffects(Scene *sce) return false; } -void EffectsExporter::exportEffects(Scene *sce) +void EffectsExporter::exportEffects(Scene *sce, bool export_selected) { if(hasEffects(sce)) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene<EffectsExporter>(sce, *this); + mf.forEachMaterialInScene<EffectsExporter>(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h index 2b25d1b889f..86143ae4d07 100644 --- a/source/blender/collada/EffectExporter.h +++ b/source/blender/collada/EffectExporter.h @@ -47,7 +47,7 @@ class EffectsExporter: COLLADASW::LibraryEffects { public: EffectsExporter(COLLADASW::StreamWriter *sw); - void exportEffects(Scene *sce); + void exportEffects(Scene *sce, bool export_selected); void operator()(Material *ma, Object *ob); diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp index 5df5ab99b91..b724844b1ec 100644 --- a/source/blender/collada/GeometryExporter.cpp +++ b/source/blender/collada/GeometryExporter.cpp @@ -47,13 +47,13 @@ GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {} -void GeometryExporter::exportGeom(Scene *sce) +void GeometryExporter::exportGeom(Scene *sce, bool export_selected) { openLibrary(); mScene = sce; GeometryFunctor gf; - gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this); + gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h index 0b9abaebc25..7f3426a1915 100644 --- a/source/blender/collada/GeometryExporter.h +++ b/source/blender/collada/GeometryExporter.h @@ -60,7 +60,7 @@ class GeometryExporter : COLLADASW::LibraryGeometries public: GeometryExporter(COLLADASW::StreamWriter *sw); - void exportGeom(Scene *sce); + void exportGeom(Scene *sce, bool export_selected); void operator()(Object *ob); @@ -102,14 +102,15 @@ struct GeometryFunctor { // f should have // void operator()(Object* ob) template<class Functor> - void forEachMeshObjectInScene(Scene *sce, Functor &f) + void forEachMeshObjectInScene(Scene *sce, Functor &f, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { Object *ob = base->object; - if (ob->type == OB_MESH && ob->data) { + if (ob->type == OB_MESH && ob->data + && !(export_selected && !(ob->flag && SELECT))) { f(ob); } base= base->next; diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp index b7a5ef4c4e4..8e426e9dba8 100644 --- a/source/blender/collada/ImageExporter.cpp +++ b/source/blender/collada/ImageExporter.cpp @@ -71,12 +71,12 @@ bool ImagesExporter::hasImages(Scene *sce) return false; } -void ImagesExporter::exportImages(Scene *sce) +void ImagesExporter::exportImages(Scene *sce, bool export_selected) { if(hasImages(sce)) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene<ImagesExporter>(sce, *this); + mf.forEachMaterialInScene<ImagesExporter>(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/ImageExporter.h b/source/blender/collada/ImageExporter.h index 04e3010dc7a..6b81c099259 100644 --- a/source/blender/collada/ImageExporter.h +++ b/source/blender/collada/ImageExporter.h @@ -47,7 +47,7 @@ class ImagesExporter: COLLADASW::LibraryImages public: ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename); - void exportImages(Scene *sce); + void exportImages(Scene *sce, bool export_selected); void operator()(Material *ma, Object *ob); private: bool hasImages(Scene *sce); diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp index 13eb62ca969..c2cc0c1e157 100644 --- a/source/blender/collada/LightExporter.cpp +++ b/source/blender/collada/LightExporter.cpp @@ -38,13 +38,14 @@ #include "collada_internal.h" template<class Functor> -void forEachLampObjectInScene(Scene *sce, Functor &f) +void forEachLampObjectInScene(Scene *sce, Functor &f, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { Object *ob = base->object; - if (ob->type == OB_LAMP && ob->data) { + if (ob->type == OB_LAMP && ob->data + && !(export_selected && !(ob->flag & SELECT))) { f(ob); } base= base->next; @@ -53,11 +54,11 @@ void forEachLampObjectInScene(Scene *sce, Functor &f) LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){} -void LightsExporter::exportLights(Scene *sce) +void LightsExporter::exportLights(Scene *sce, bool export_selected) { openLibrary(); - forEachLampObjectInScene(sce, *this); + forEachLampObjectInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/LightExporter.h b/source/blender/collada/LightExporter.h index 3706582e52c..2ae1a19fdb1 100644 --- a/source/blender/collada/LightExporter.h +++ b/source/blender/collada/LightExporter.h @@ -41,7 +41,7 @@ class LightsExporter: COLLADASW::LibraryLights { public: LightsExporter(COLLADASW::StreamWriter *sw); - void exportLights(Scene *sce); + void exportLights(Scene *sce, bool export_selected); void operator()(Object *ob); private: bool exportBlenderProfile(COLLADASW::Light &cla, Lamp *la); diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp index 0030f2a6285..a44fa6802f2 100644 --- a/source/blender/collada/MaterialExporter.cpp +++ b/source/blender/collada/MaterialExporter.cpp @@ -35,12 +35,12 @@ MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){} -void MaterialsExporter::exportMaterials(Scene *sce) +void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene<MaterialsExporter>(sce, *this); + mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h index 033c8526346..0a7a276d857 100644 --- a/source/blender/collada/MaterialExporter.h +++ b/source/blender/collada/MaterialExporter.h @@ -49,7 +49,7 @@ class MaterialsExporter: COLLADASW::LibraryMaterials { public: MaterialsExporter(COLLADASW::StreamWriter *sw); - void exportMaterials(Scene *sce); + void exportMaterials(Scene *sce, bool export_selected); void operator()(Material *ma, Object *ob); }; @@ -86,11 +86,11 @@ struct MaterialFunctor { // f should have // void operator()(Material* ma) template<class Functor> - void forEachMaterialInScene(Scene *sce, Functor &f) + void forEachMaterialInScene(Scene *sce, Functor &f, bool export_selected) { ForEachMaterialFunctor<Functor> matfunc(&f); GeometryFunctor gf; - gf.forEachMeshObjectInScene<ForEachMaterialFunctor<Functor> >(sce, matfunc); + gf.forEachMeshObjectInScene<ForEachMaterialFunctor<Functor> >(sce, matfunc, export_selected); } }; diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index d1977d15fb2..760fb2359a4 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -144,15 +144,18 @@ void WVDataWrapper::print() } #endif -void UVDataWrapper::getUV(int uv_index[2], float *uv) +void UVDataWrapper::getUV(int uv_index, float *uv) { + int stride = mVData->getStride(0); + if(stride==0) stride = 2; + switch(mVData->getType()) { case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: { COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues(); if (values->empty()) return; - uv[0] = (*values)[uv_index[0]]; - uv[1] = (*values)[uv_index[1]]; + uv[0] = (*values)[uv_index*stride]; + uv[1] = (*values)[uv_index*stride + 1]; } break; @@ -160,8 +163,8 @@ void UVDataWrapper::getUV(int uv_index[2], float *uv) { COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues(); if (values->empty()) return; - uv[0] = (float)(*values)[uv_index[0]]; - uv[1] = (float)(*values)[uv_index[1]]; + uv[0] = (float)(*values)[uv_index*stride]; + uv[1] = (float)(*values)[uv_index*stride + 1]; } break; @@ -197,54 +200,36 @@ void MeshImporter::rotate_face_indices(MFace *mface) { void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, unsigned int *tris_indices) { - int uv_indices[4][2]; - // per face vertex indices, this means for quad we have 4 indices, not 8 COLLADAFW::UIntValuesArray& indices = index_list.getIndices(); - // make indices into FloatOrDoubleArray - for (int i = 0; i < 3; i++) { - int uv_index = indices[tris_indices[i]]; - uv_indices[i][0] = uv_index * 2; - uv_indices[i][1] = uv_index * 2 + 1; - } - - uvs.getUV(uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_indices[2], mtface->uv[2]); + uvs.getUV(indices[tris_indices[0]], mtface->uv[0]); + uvs.getUV(indices[tris_indices[1]], mtface->uv[1]); + uvs.getUV(indices[tris_indices[2]], mtface->uv[2]); } void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, int index, bool quad) { - int uv_indices[4][2]; - // per face vertex indices, this means for quad we have 4 indices, not 8 COLLADAFW::UIntValuesArray& indices = index_list.getIndices(); - // make indices into FloatOrDoubleArray - for (int i = 0; i < (quad ? 4 : 3); i++) { - int uv_index = indices[index + i]; - uv_indices[i][0] = uv_index * 2; - uv_indices[i][1] = uv_index * 2 + 1; - } - - uvs.getUV(uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_indices[2], mtface->uv[2]); + uvs.getUV(indices[index + 0], mtface->uv[0]); + uvs.getUV(indices[index + 1], mtface->uv[1]); + uvs.getUV(indices[index + 2], mtface->uv[2]); - if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]); + if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]); #ifdef COLLADA_DEBUG /*if (quad) { fprintf(stderr, "face uv:\n" - "((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n" + "((%d, %d, %d, %d))\n" "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n", - uv_indices[0][0], uv_indices[0][1], - uv_indices[1][0], uv_indices[1][1], - uv_indices[2][0], uv_indices[2][1], - uv_indices[3][0], uv_indices[3][1], + indices[index + 0], + indices[index + 1], + indices[index + 2], + indices[index + 3], mtface->uv[0][0], mtface->uv[0][1], mtface->uv[1][0], mtface->uv[1][1], @@ -253,12 +238,12 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, } else { fprintf(stderr, "face uv:\n" - "((%d, %d), (%d, %d), (%d, %d))\n" + "((%d, %d, %d))\n" "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n", - uv_indices[0][0], uv_indices[0][1], - uv_indices[1][0], uv_indices[1][1], - uv_indices[2][0], uv_indices[2][1], + indices[index + 0], + indices[index + 1], + indices[index + 2], mtface->uv[0][0], mtface->uv[0][1], mtface->uv[1][0], mtface->uv[1][1], diff --git a/source/blender/collada/MeshImporter.h b/source/blender/collada/MeshImporter.h index 20fdb0dcc6e..88ee0e46c33 100644 --- a/source/blender/collada/MeshImporter.h +++ b/source/blender/collada/MeshImporter.h @@ -69,7 +69,7 @@ public: void print(); #endif - void getUV(int uv_index[2], float *uv); + void getUV(int uv_index, float *uv); }; class MeshImporter : public MeshImporterBase diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index 51caf62f6e7..c15e608c360 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -51,7 +51,7 @@ extern "C" return 1; } - int collada_export(Scene *sce, const char *filepath) + int collada_export(Scene *sce, const char *filepath, int selected) { DocumentExporter exp; @@ -64,7 +64,7 @@ extern "C" } /* end! */ - exp.exportCurrentScene(sce, filepath); + exp.exportCurrentScene(sce, filepath, selected); return 1; } diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h index a167784e217..915a77354e3 100644 --- a/source/blender/collada/collada.h +++ b/source/blender/collada/collada.h @@ -39,7 +39,7 @@ extern "C" { * both return 1 on success, 0 on error */ int collada_import(bContext *C, const char *filepath); - int collada_export(Scene *sce, const char *filepath); + int collada_export(Scene *sce, const char *filepath, int selected); #ifdef __cplusplus } #endif diff --git a/source/blender/collada/collada_internal.cpp b/source/blender/collada/collada_internal.cpp index 9cb6a227fc9..27397c3008e 100644 --- a/source/blender/collada/collada_internal.cpp +++ b/source/blender/collada/collada_internal.cpp @@ -265,7 +265,7 @@ std::string get_light_id(Object *ob) std::string get_joint_id(Bone *bone, Object *ob_arm) { - return translate_id(bone->name); + return translate_id(/*id_name(ob_arm) + "_" +*/ bone->name); } std::string get_camera_id(Object *ob) diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index c6e55427034..b3338396598 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -50,6 +50,7 @@ #include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" +#include "BKE_screen.h" #include "WM_api.h" #include "WM_types.h" @@ -1416,7 +1417,9 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot) static int ed_marker_camera_bind_exec(bContext *C, wmOperator *UNUSED(op)) { + bScreen *sc= CTX_wm_screen(C); Scene *scene= CTX_data_scene(C); + Object *ob = CTX_data_active_object(C); ListBase *markers= ED_context_get_markers(C); TimeMarker *marker; @@ -1424,10 +1427,15 @@ static int ed_marker_camera_bind_exec(bContext *C, wmOperator *UNUSED(op)) if(marker == NULL) return OPERATOR_CANCELLED; - marker->camera= scene->camera; + marker->camera= ob; + + /* camera may have changes */ + scene_camera_switch_update(scene); + BKE_screen_view3d_scene_sync(sc); WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL); + WM_event_add_notifier(C, NC_SCENE|NA_EDITED, scene); /* so we get view3d redraws */ return OPERATOR_FINISHED; } diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 284bbb2f3de..bfca5453bc5 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3535,6 +3535,11 @@ static int convertspline(short type, Nurb *nu) return 0; } +void ED_nurb_set_spline_type(Nurb *nu, int type) +{ + convertspline(type, nu); +} + static int set_spline_type_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h index 6a92ee2e056..d78d2846572 100644 --- a/source/blender/editors/include/ED_curve.h +++ b/source/blender/editors/include/ED_curve.h @@ -71,6 +71,7 @@ int mouse_nurb (struct bContext *C, const int mval[2], int extend); struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newob); int isNurbsel (struct Nurb *nu); +void ED_nurb_set_spline_type(struct Nurb *nu, int type); int join_curve_exec (struct bContext *C, struct wmOperator *op); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 30c0f552b72..8aed0d58a07 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -74,8 +74,8 @@ #define MENU_ITEM_HEIGHT 20 #define MENU_SEP_HEIGHT 6 -#define PRECISION_FLOAT_MAX 7 -#define PRECISION_FLOAT_MAX_POW 10000000 /* pow(10, PRECISION_FLOAT_MAX) */ +#define PRECISION_FLOAT_MAX 6 +#define PRECISION_FLOAT_MAX_POW 1000000 /* pow(10, PRECISION_FLOAT_MAX) */ /* avoid unneeded calls to ui_get_but_val */ #define UI_BUT_VALUE_UNSET DBL_MAX diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 99a31e039c8..e9ec4ccc66d 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -1895,7 +1895,15 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle } if(event->ascii && (retval == WM_UI_HANDLER_CONTINUE)) { - changed= ui_textedit_type_ascii(but, data, event->ascii); + char ascii = event->ascii; + + /* exception that's useful for number buttons, some keyboard + numpads have a comma instead of a period */ + if(ELEM3(but->type, NUM, NUMABS, NUMSLI)) + if(event->type == PADPERIOD && ascii == ',') + ascii = '.'; + + changed= ui_textedit_type_ascii(but, data, ascii); retval= WM_UI_HANDLER_BREAK; } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 32a20e82d2f..25dbb68a258 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -33,6 +33,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_key_types.h" #include "DNA_scene_types.h" #include "DNA_userdef_types.h" @@ -2104,6 +2105,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe } else if(itemptr->type == &RNA_ShapeKey) { Object *ob= (Object*)activeptr->data; + Key *key= (Key*)itemptr->data; split= uiLayoutSplit(sub, 0.75f, 0); @@ -2111,7 +2113,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe uiBlockSetEmboss(block, UI_EMBOSSN); row= uiLayoutRow(split, 1); - if(i == 0) uiItemL(row, "", ICON_NONE); + if(i == 0 || (key->type != KEY_RELATIVE)) uiItemL(row, "", ICON_NONE); else uiItemR(row, itemptr, "value", 0, "", ICON_NONE); if(ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH)) diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index d89856b4268..e9702af070c 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -402,6 +402,8 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M { ModifierTypeInfo *mti= modifierType_getInfo(md->type); + md->scene= scene; + if (mti->isDisabled && mti->isDisabled(md, 0)) { BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); return 0; @@ -461,6 +463,8 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, { ModifierTypeInfo *mti= modifierType_getInfo(md->type); + md->scene= scene; + if (mti->isDisabled && mti->isDisabled(md, 0)) { BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); return 0; diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index bf21c4c0f62..c5ddcf2b229 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1659,6 +1659,7 @@ void ED_object_single_users(Main *bmain, Scene *scene, int full) if(full) { single_obdata_users(bmain, scene, 0); + single_object_action_users(scene, 0); single_mat_users_expand(bmain); single_tex_users_expand(bmain); } diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 18703bcec6a..48963d9f5db 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -827,6 +827,8 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys if(key->flag & PEK_TAG) mkey->flag |= PEK_TAG; + + mkey->length = key->length; } if(point->flag & PEP_TAG) diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index a55f9101a0f..3256112426b 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -438,8 +438,6 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); if(ibuf) { - short ibuf_free= FALSE; - /* color -> greyscale */ /* editing directly would alter the render view */ if(scene->r.planes == 8) { @@ -447,8 +445,15 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) IMB_color_to_bw(ibuf_bw); // IMB_freeImBuf(ibuf); /* owned by the image */ ibuf= ibuf_bw; - - ibuf_free= TRUE; + } + else { + /* this is lightweight & doesnt re-alloc the buffers, only do this + * to save the correct bit depth since the image is always RGBA */ + ImBuf *ibuf_cpy= IMB_allocImBuf(ibuf->x, ibuf->y, scene->r.planes, 0); + ibuf_cpy->rect= ibuf->rect; + ibuf_cpy->rect_float= ibuf->rect_float; + ibuf_cpy->zbuf_float= ibuf->zbuf_float; + ibuf= ibuf_cpy; } if(BKE_imtype_is_movie(scene->r.imtype)) { @@ -472,9 +477,8 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) } } - if(ibuf_free) { - IMB_freeImBuf(ibuf); - } + /* imbuf knows which rects are not part of ibuf */ + IMB_freeImBuf(ibuf); } BKE_image_release_ibuf(oglrender->ima, lock); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 17cfc7d8f95..1bf2c3d89bd 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -423,6 +423,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA * /* only once called */ static void node_shader_set_butfunc(bNodeType *ntype) { + ntype->uifuncbut = NULL; switch(ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -472,6 +473,7 @@ static void node_shader_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } /* ****************** BUTTON CALLBACKS FOR COMPOSITE NODES ***************** */ @@ -1036,6 +1038,32 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C } } +static void node_composit_buts_colorbalance_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NONE); + + if (RNA_enum_get(ptr, "correction_method")== 0) { + + uiTemplateColorWheel(layout, ptr, "lift", 1, 1, 0, 1); + uiItemR(layout, ptr, "lift", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "gamma", 1, 1, 1, 1); + uiItemR(layout, ptr, "gamma", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "gain", 1, 1, 1, 1); + uiItemR(layout, ptr, "gain", 0, NULL, ICON_NONE); + } else { + uiTemplateColorWheel(layout, ptr, "offset", 1, 1, 0, 1); + uiItemR(layout, ptr, "offset", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "power", 1, 1, 0, 1); + uiItemR(layout, ptr, "power", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "slope", 1, 1, 0, 1); + uiItemR(layout, ptr, "slope", 0, NULL, ICON_NONE); + } +} + static void node_composit_buts_huecorrect(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { @@ -1050,6 +1078,7 @@ static void node_composit_buts_ycc(uiLayout *layout, bContext *UNUSED(C), Pointe /* only once called */ static void node_composit_set_butfunc(bNodeType *ntype) { + ntype->uifuncbut = NULL; switch(ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -1184,6 +1213,7 @@ static void node_composit_set_butfunc(bNodeType *ntype) break; case CMP_NODE_COLORBALANCE: ntype->uifunc=node_composit_buts_colorbalance; + ntype->uifuncbut=node_composit_buts_colorbalance_but; break; case CMP_NODE_HUECORRECT: ntype->uifunc=node_composit_buts_huecorrect; @@ -1198,6 +1228,8 @@ static void node_composit_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; + } /* ****************** BUTTON CALLBACKS FOR TEXTURE NODES ***************** */ @@ -1308,6 +1340,7 @@ static void node_texture_buts_output(uiLayout *layout, bContext *UNUSED(C), Poin /* only once called */ static void node_texture_set_butfunc(bNodeType *ntype) { + ntype->uifuncbut = NULL; if( ntype->type >= TEX_NODE_PROC && ntype->type < TEX_NODE_PROC_MAX ) { ntype->uifunc = node_texture_buts_proc; } @@ -1352,6 +1385,7 @@ static void node_texture_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } /* ******* init draw callbacks for all tree types, only called in usiblender.c, once ************* */ diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index 684961f2606..4b989a78fab 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -118,8 +118,8 @@ static void active_node_panel(const bContext *C, Panel *pa) uiItemS(layout); /* draw this node's settings */ - if (node->typeinfo && node->typeinfo->uifunc) - node->typeinfo->uifunc(layout, (bContext *)C, &ptr); + if (node->typeinfo && node->typeinfo->uifuncbut) + node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr); } /* ******************* node buttons registration ************** */ diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 0ce6b5d2ce2..93dc96cf9c0 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -480,6 +480,10 @@ static void outliner_add_passes(SpaceOops *soops, TreeElement *tenla, ID *id, Sc te->name= "Index Object"; te->directdata= &srl->passflag; + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_INDEXMA)); + te->name= "Index Material"; + te->directdata= &srl->passflag; + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_RGBA)); te->name= "Color"; te->directdata= &srl->passflag; @@ -4902,7 +4906,7 @@ static void outliner_draw_tree(bContext *C, uiBlock *block, Scene *scene, ARegio outliner_draw_selection(ar, soops, &soops->tree, &starty); // grey hierarchy lines - UI_ThemeColorBlend(TH_BACK, TH_TEXT, 0.2f); + UI_ThemeColorBlend(TH_BACK, TH_TEXT, 0.4f); starty= (int)ar->v2d.tot.ymax-UI_UNIT_Y/2-OL_Y_OFFSET; startx= 6; outliner_draw_hierarchy(soops, &soops->tree, startx, &starty); diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 119c5da309e..594d2942e8f 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -643,10 +643,12 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, Sequence *seq, int outline if (G.moving && (seq->flag & SELECT)) { if(seq->flag & SEQ_OVERLAP) { col[0]= 255; col[1]= col[2]= 40; - } else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 120); + } + else + UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 120+outline_tint); } - - UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, outline_tint); + else + UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, outline_tint); glColor3ubv((GLubyte *)col); @@ -969,7 +971,7 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar) /* loop through strips, checking for those that are visible */ for (seq= ed->seqbasep->first; seq; seq= seq->next) { /* boundbox and selection tests for NOT drawing the strip... */ - if ((seq->flag & SELECT) == sel) continue; + if ((seq->flag & SELECT) != sel) continue; else if (seq == last_seq) continue; else if (MIN2(seq->startdisp, seq->start) > v2d->cur.xmax) continue; else if (MAX2(seq->enddisp, seq->start+seq->len) < v2d->cur.xmin) continue; diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index c8965c4d3db..b7a7b6b5412 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -124,6 +124,7 @@ typedef struct TransSeq { int startstill, endstill; int startdisp, enddisp; int startofs, endofs; + int anim_startofs, anim_endofs; /* int final_left, final_right; */ /* UNUSED */ int len; } TransSeq; @@ -729,8 +730,10 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) ts.endstill= seq->endstill; ts.startdisp= seq->startdisp; ts.enddisp= seq->enddisp; - ts.startofs= seq->anim_startofs; - ts.endofs= seq->anim_endofs; + ts.startofs= seq->startofs; + ts.endofs= seq->endofs; + ts.anim_startofs= seq->anim_startofs; + ts.anim_endofs= seq->anim_endofs; ts.len= seq->len; /* First Strip! */ @@ -780,7 +783,7 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) if ((seqn->startstill) && (cutframe == seqn->start + 1)) { seqn->start = ts.start; seqn->startstill= ts.start- cutframe; - seqn->anim_endofs = ts.endofs; + seqn->anim_endofs = ts.anim_endofs; seqn->endstill = ts.endstill; } @@ -789,8 +792,9 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) seqn->start = cutframe; seqn->startstill = 0; seqn->startofs = 0; + seqn->endofs = ts.endofs; seqn->anim_startofs += cutframe - ts.start; - seqn->anim_endofs = ts.endofs; + seqn->anim_endofs = ts.anim_endofs; seqn->endstill = ts.endstill; } @@ -825,6 +829,8 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe) ts.enddisp= seq->enddisp; ts.startofs= seq->startofs; ts.endofs= seq->endofs; + ts.anim_startofs= seq->anim_startofs; + ts.anim_endofs= seq->anim_endofs; ts.len= seq->len; /* First Strip! */ @@ -1778,19 +1784,21 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) /* new seq */ se = give_stripelem(seq, cfra); - seq_new= alloc_sequence(ed->seqbasep, start_ofs, seq->machine); + seq_new= seq_dupli_recursive(scene, scene, seq, SEQ_DUPE_UNIQUE_NAME); + BLI_addtail(&ed->seqbase, seq_new); + + seq_new->start= start_ofs; seq_new->type= SEQ_IMAGE; seq_new->len = 1; seq_new->endstill = step-1; /* new strip */ - seq_new->strip= strip_new= MEM_callocN(sizeof(Strip)*1, "strip"); + strip_new= seq_new->strip; strip_new->len= 1; strip_new->us= 1; - strncpy(strip_new->dir, seq->strip->dir, FILE_MAXDIR-1); /* new stripdata */ - strip_new->stripdata= se_new= MEM_callocN(sizeof(StripElem)*1, "stripelem"); + se_new= strip_new->stripdata; BLI_strncpy(se_new->name, se->name, sizeof(se_new->name)); calc_sequence(scene, seq_new); @@ -1802,8 +1810,6 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) } /* XXX, COPY FCURVES */ - strncpy(seq_new->name+2, seq->name+2, sizeof(seq->name)-2); - seqbase_unique_name_recursive(&scene->ed->seqbase, seq_new); cfra++; start_ofs += step; diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index 02a7ea890f5..ad621257602 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -197,8 +197,7 @@ static short set_pchan_glColor (short colCode, int boneflag, int constflag) case PCHAN_COLOR_CONSTS: { if ( (bcolor == NULL) || (bcolor->flag & TH_WIRECOLOR_CONSTCOLS) ) { - if (constflag & PCHAN_HAS_STRIDE) glColor4ub(0, 0, 200, 80); - else if (constflag & PCHAN_HAS_TARGET) glColor4ub(255, 150, 0, 80); + if (constflag & PCHAN_HAS_TARGET) glColor4ub(255, 150, 0, 80); else if (constflag & PCHAN_HAS_IK) glColor4ub(255, 255, 0, 80); else if (constflag & PCHAN_HAS_SPLINEIK) glColor4ub(200, 255, 0, 80); else if (constflag & PCHAN_HAS_CONST) glColor4ub(0, 255, 120, 80); @@ -269,8 +268,7 @@ static short set_pchan_glColor (short colCode, int boneflag, int constflag) { /* inner part in background color or constraint */ if ( (constflag) && ((bcolor==NULL) || (bcolor->flag & TH_WIRECOLOR_CONSTCOLS)) ) { - if (constflag & PCHAN_HAS_STRIDE) glColor3ub(0, 0, 200); - else if (constflag & PCHAN_HAS_TARGET) glColor3ub(255, 150, 0); + if (constflag & PCHAN_HAS_TARGET) glColor3ub(255, 150, 0); else if (constflag & PCHAN_HAS_IK) glColor3ub(255, 255, 0); else if (constflag & PCHAN_HAS_SPLINEIK) glColor3ub(200, 255, 0); else if (constflag & PCHAN_HAS_CONST) glColor3ub(0, 255, 120); @@ -1865,9 +1863,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, constflag= pchan->constflag; if (pchan->flag & (POSE_ROT|POSE_LOC|POSE_SIZE)) constflag |= PCHAN_HAS_ACTION; - if (pchan->flag & POSE_STRIDE) - constflag |= PCHAN_HAS_STRIDE; - + /* set color-set to use */ set_pchan_colorset(ob, pchan); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index f228653aa79..fa1fcb6c150 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -5407,7 +5407,7 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, void initTimeTranslate(TransInfo *t) { /* this tool is only really available in the Action Editor... */ - if (t->spacetype != SPACE_ACTION) { + if (!ELEM(t->spacetype, SPACE_ACTION, SPACE_SEQ)) { t->state = TRANS_CANCEL; } diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index e9bced385c4..8e72f3405a3 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -699,7 +699,7 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob) for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { bone = pchan->bone; if (PBONE_VISIBLE(arm, bone)) { - if ((bone->flag & BONE_SELECTED) && !(ob->proxy && pchan->bone->layer & arm->layer_protected)) + if ((bone->flag & BONE_SELECTED)) bone->flag |= BONE_TRANSFORM; else bone->flag &= ~BONE_TRANSFORM; diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index 31a7194ea02..218e90af717 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -279,6 +279,7 @@ int calc_manipulator_stats(const bContext *C) ARegion *ar= CTX_wm_region(C); Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); + ToolSettings *ts = CTX_data_tool_settings(C); View3D *v3d= sa->spacedata.first; RegionView3D *rv3d= ar->regiondata; Base *base; @@ -312,6 +313,7 @@ int calc_manipulator_stats(const bContext *C) calc_tw_center(scene, vec); totsel= 1; } else { +#if 1 /* OLD CODE */ /* do vertices for center, and if still no normal found, use vertex normals */ BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) { if(BM_TestHFlag(eve, BM_SELECT)) { @@ -319,6 +321,68 @@ int calc_manipulator_stats(const bContext *C) calc_tw_center(scene, eve->co); } } + +#else // BMESH_TODO + /* do vertices/edges/faces for center depending on selection + mode. note we can't use just vertex selection flag because + it is not flush down on changes */ + if(ts->selectmode & SCE_SELECT_VERTEX) { + for(eve= em->verts.first; eve; eve= eve->next) { + if(eve->f & SELECT) { + totsel++; + calc_tw_center(scene, eve->co); + } + } + } + else if(ts->selectmode & SCE_SELECT_EDGE) { + EditEdge *eed; + + for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0; + for(eed= em->edges.first; eed; eed= eed->next) { + if(eed->h==0 && (eed->f & SELECT)) { + if(!eed->v1->f1) { + eed->v1->f1= 1; + totsel++; + calc_tw_center(scene, eed->v1->co); + } + if(!eed->v2->f1) { + eed->v2->f1= 1; + totsel++; + calc_tw_center(scene, eed->v2->co); + } + } + } + } + else { + EditFace *efa; + + for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0; + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->h==0 && (efa->f & SELECT)) { + if(!efa->v1->f1) { + efa->v1->f1= 1; + totsel++; + calc_tw_center(scene, efa->v1->co); + } + if(!efa->v2->f1) { + efa->v2->f1= 1; + totsel++; + calc_tw_center(scene, efa->v2->co); + } + if(!efa->v3->f1) { + efa->v3->f1= 1; + totsel++; + calc_tw_center(scene, efa->v3->co); + } + if(efa->v4 && !efa->v4->f1) { + efa->v4->f1= 1; + totsel++; + calc_tw_center(scene, efa->v4->co); + } + } + } + } +#endif } } /* end editmesh */ else if (obedit->type==OB_ARMATURE){ diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index fe85f63e109..6db8dcc06cf 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -113,6 +113,7 @@ const char *imb_ext_movie[] = { ".m4v", ".m2v", ".m2t", + ".m2ts", ".mts", ".mv", ".avs", diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 1489593f7f6..060b1bf42d1 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -161,7 +161,7 @@ typedef struct Material { int mapto_textured; /* render-time cache to optimise texture lookups */ short shadowonly_flag; /* "shadowsonly" type */ - short pad; + short index; /* custom index for render passes */ ListBase gpumaterial; /* runtime */ } Material; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 100a66d209f..f351a48b998 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -201,6 +201,7 @@ typedef struct SceneRenderLayer { #define SCE_PASS_RAYHITS (1<<15) #define SCE_PASS_EMIT (1<<16) #define SCE_PASS_ENVIRONMENT (1<<17) +#define SCE_PASS_INDEXMA (1<<18) /* note, srl->passflag is treestore element 'nr' in outliner, short still... */ diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index e83161b8c62..d9fbdd7caf2 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -2839,7 +2839,7 @@ static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *pro } /* editable check */ - if(RNA_property_editable(&itemptr, iprop)) { + if(!set || RNA_property_editable(&itemptr, iprop)) { if(a+itemlen > in.len) { BKE_reportf(reports, RPT_ERROR, "Array length mismatch (got %d, expected more).", in.len); err= 1; diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c index 2060f75f9de..0310ce917d4 100644 --- a/source/blender/makesrna/intern/rna_armature.c +++ b/source/blender/makesrna/intern/rna_armature.c @@ -509,6 +509,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone) prop= RNA_def_property(srna, "head_radius", PROP_FLOAT, PROP_UNSIGNED); if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update"); + else RNA_def_property_update(prop, 0, "rna_Armature_update_data"); RNA_def_property_float_sdna(prop, NULL, "rad_head"); //RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid); RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3); @@ -516,6 +517,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone) prop= RNA_def_property(srna, "tail_radius", PROP_FLOAT, PROP_UNSIGNED); if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update"); + else RNA_def_property_update(prop, 0, "rna_Armature_update_data"); RNA_def_property_float_sdna(prop, NULL, "rad_tail"); //RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid); RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3); diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index 594295ba817..f2811e7320b 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -281,8 +281,7 @@ static int rna_Nurb_length(PointerRNA *ptr) static void rna_Nurb_type_set(PointerRNA *ptr, int value) { Nurb *nu= (Nurb*)ptr->data; - nu->type = value; - // XXX - TODO change datatypes + ED_nurb_set_spline_type(nu, value); } static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) @@ -1448,7 +1447,6 @@ static void rna_def_curve_nurb(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Radius Interpolation", "The type of radius interpolation for Bezier curves"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - // XXX - switching type probably needs comprehensive recalc of data like in 2.4x prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, curve_type_items); RNA_def_property_enum_funcs(prop, NULL, "rna_Nurb_type_set", NULL); diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index b86a91967a6..f407aba82fb 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -1675,7 +1675,12 @@ void RNA_def_material(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Light Group", "Limit lighting to lamps in this Group"); RNA_def_property_update(prop, 0, "rna_Material_update"); - + + prop= RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "index"); + RNA_def_property_ui_text(prop, "Pass Index", "Index # for the IndexMA render pass"); + RNA_def_property_update(prop, NC_OBJECT, NULL); + /* flags */ prop= RNA_def_property(srna, "use_light_group_exclusive", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index bd5a6d823a0..8b85b7e1e28 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -271,11 +271,16 @@ static void rna_Base_select_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Po static void rna_Object_layer_update__internal(Main *bmain, Scene *scene, Base *base, Object *ob) { /* try to avoid scene sort */ - if((ob->lay & scene->lay) && (base->lay & scene->lay)) { + if(scene == NULL) { + /* pass - unlikely but when running scripts on startup it happens */ + } + else if((ob->lay & scene->lay) && (base->lay & scene->lay)) { /* pass */ - } else if((ob->lay & scene->lay)==0 && (base->lay & scene->lay)==0) { + } + else if((ob->lay & scene->lay)==0 && (base->lay & scene->lay)==0) { /* pass */ - } else { + } + else { DAG_scene_sort(bmain, scene); } } @@ -285,7 +290,7 @@ static void rna_Object_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr) Object *ob= (Object*)ptr->id.data; Base *base; - base= object_in_scene(ob, scene); + base= scene ? object_in_scene(ob, scene) : NULL; if(!base) return; diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index 949415fbf29..47c8435cc46 100644 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -585,6 +585,25 @@ static void rna_PoseChannel_matrix_basis_set(PointerRNA *ptr, const float *value pchan_apply_mat4(pchan, (float (*)[4])values, FALSE); /* no compat for predictable result */ } +static void rna_PoseChannel_matrix_set(PointerRNA *ptr, const float *values) +{ + bPoseChannel *pchan= (bPoseChannel*)ptr->data; + Object *ob= (Object*)ptr->id.data; + float umat[4][4]= MAT4_UNITY; + float tmat[4][4]; + + /* recalculate pose matrix with only parent transformations, + * bone loc/sca/rot is ignored, scene and frame are not used. */ + where_is_pose_bone(NULL, ob, pchan, 0.0f, FALSE); + + /* find the matrix, need to remove the bone transforms first so this is + * calculated as a matrix to set rather then a difference ontop of whats + * already there. */ + pchan_apply_mat4(pchan, umat, FALSE); + armature_mat_pose_to_bone(pchan, (float (*)[4])values, tmat); + pchan_apply_mat4(pchan, tmat, FALSE); /* no compat for predictable result */ +} + #else static void rna_def_bone_group(BlenderRNA *brna) @@ -830,8 +849,9 @@ static void rna_def_pose_channel(BlenderRNA *brna) prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX); RNA_def_property_float_sdna(prop, NULL, "pose_mat"); RNA_def_property_multi_array(prop, 2, matrix_dimsize); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_float_funcs(prop, NULL, "rna_PoseChannel_matrix_set", NULL); RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix after constraints and drivers are applied (object space)"); + RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update"); /* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */ prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION); diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 3a6cebef178..e3e3296cb70 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -388,6 +388,7 @@ static void rna_def_render_pass(BlenderRNA *brna) {SCE_PASS_MIST, "MIST", 0, "Mist", ""}, {SCE_PASS_EMIT, "EMIT", 0, "Emit", ""}, {SCE_PASS_ENVIRONMENT, "ENVIRONMENT", 0, "Environment", ""}, + {SCE_PASS_INDEXMA, "MATERIAL_INDEX", 0, "Material Index", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "RenderPass", NULL); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index cdecddbd6c4..904f4cc1b2f 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1517,6 +1517,12 @@ void rna_def_render_layer_common(StructRNA *srna, int scene) if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); + prop= RNA_def_property(srna, "use_pass_material_index", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_INDEXMA); + RNA_def_property_ui_text(prop, "Material Index", "Deliver material index pass"); + if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); + else RNA_def_property_clear_flag(prop, PROP_EDITABLE); + prop= RNA_def_property(srna, "use_pass_color", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_RGBA); RNA_def_property_ui_text(prop, "Color", "Deliver shade-less color pass"); diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c index c2194636cd3..1220c4f34a1 100644 --- a/source/blender/makesrna/intern/rna_scene_api.c +++ b/source/blender/makesrna/intern/rna_scene_api.c @@ -85,9 +85,9 @@ static void rna_SceneRender_get_frame_path(RenderData *rd, int frame, char *name /* don't remove this, as COLLADA exporting cannot be done through operators in render() callback. */ #include "../../collada/collada.h" -static void rna_Scene_collada_export(Scene *scene, const char *filepath) +static void rna_Scene_collada_export(Scene *scene, const char *filepath, int selected) { - collada_export(scene, filepath); + collada_export(scene, filepath, selected); } #endif @@ -112,6 +112,7 @@ void RNA_api_scene(StructRNA *srna) /* don't remove this, as COLLADA exporting cannot be done through operators in render() callback. */ func= RNA_def_function(srna, "collada_export", "rna_Scene_collada_export"); parm= RNA_def_string(func, "filepath", "", FILE_MAX, "File Path", "File path to write Collada file."); + parm= RNA_def_boolean(func, "selected", 0, "Export only selected", "Export only selected elements."); RNA_def_property_flag(parm, PROP_REQUIRED); RNA_def_property_subtype(parm, PROP_FILEPATH); /* allow non utf8 */ RNA_def_function_ui_description(func, "Export to collada file."); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index 3caaad26bae..a5f256054cd 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -53,6 +53,7 @@ static bNodeSocketType cmp_node_rlayers_out[]= { { SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Indirect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Emit", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Environment",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, @@ -211,6 +212,8 @@ static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack * out[RRES_OUT_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB); + if(out[RRES_OUT_INDEXMA]->hasoutput) + out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA); if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST); if(out[RRES_OUT_EMIT]->hasoutput) @@ -326,7 +329,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in CompBuf *buf; int buftype= CB_VEC3; - if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST)) + if(ELEM4(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST, SCE_PASS_INDEXMA)) buftype= CB_VAL; else if(passcode==SCE_PASS_VECTOR) buftype= CB_VEC4; @@ -373,6 +376,8 @@ static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStac out[RRES_OUT_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB); + if(out[RRES_OUT_INDEXMA]->hasoutput) + out[RRES_OUT_INDEXMA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXMA); if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST); if(out[RRES_OUT_EMIT]->hasoutput) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c index d4d77b5fd5a..c58595866af 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c @@ -49,18 +49,18 @@ static bNodeSocketType outputs[]= { static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread) { + Tex *nodetex = (Tex *)node->id; static float red[] = {1,0,0,1}; static float white[] = {1,1,1,1}; - float *co = p->co; - - Tex *nodetex = (Tex *)node->id; + float co[3], dxt[3], dyt[3]; + + copy_v3_v3(co, p->co); + copy_v3_v3(dxt, p->dxt); + copy_v3_v3(dyt, p->dyt); if(node->custom2 || node->need_exec==0) { /* this node refers to its own texture tree! */ - QUATCOPY( - out, - (fabs(co[0] - co[1]) < .01) ? white : red - ); + QUATCOPY(out, (fabs(co[0] - co[1]) < .01) ? white : red ); } else if(nodetex) { TexResult texres; @@ -70,9 +70,9 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor tex_input_rgba(col1, in[0], p, thread); tex_input_rgba(col2, in[1], p, thread); - + texres.nor = nor; - textype = multitex_nodes(nodetex, co, p->dxt, p->dyt, p->osatex, + textype = multitex_nodes(nodetex, co, dxt, dyt, p->osatex, &texres, thread, 0, p->shi, p->mtex); if(textype & TEX_RGB) { diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c index 55c1e69d558..26844a5003d 100644 --- a/source/blender/python/generic/mathutils_geometry.c +++ b/source/blender/python/generic/mathutils_geometry.c @@ -680,7 +680,7 @@ static PyObject *M_Geometry_intersect_line_sphere_2d(PyObject *UNUSED(self), PyO PyObject *ret= PyTuple_New(2); - switch(isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) { + switch(isect_line_sphere_v2(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) { case 1: if(!(!clip || (((lambda= line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE; use_b= FALSE; diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 51bf02ad37f..422d55ecefe 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -209,8 +209,6 @@ void BPY_python_start(int argc, const char **argv) Py_Initialize(); - bpy_intern_string_init(); - // PySys_SetArgv(argc, argv); // broken in py3, not a huge deal /* sigh, why do python guys not have a char** version anymore? :( */ { @@ -233,6 +231,8 @@ void BPY_python_start(int argc, const char **argv) PyImport_ExtendInittab(bpy_internal_modules); #endif + bpy_intern_string_init(); + /* bpy.* and lets us import it */ BPy_init_modules(); diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 1d4014aac3e..b9006b390ab 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -383,6 +383,10 @@ static const char *get_pass_name(int passtype, int channel) if(channel==-1) return "IndexOB"; return "IndexOB.X"; } + if(passtype == SCE_PASS_INDEXMA) { + if(channel==-1) return "IndexMA"; + return "IndexMA.X"; + } if(passtype == SCE_PASS_MIST) { if(channel==-1) return "Mist"; return "Mist.Z"; @@ -448,6 +452,9 @@ static int passtype_from_name(char *str) if(strcmp(str, "IndexOB")==0) return SCE_PASS_INDEXOB; + if(strcmp(str, "IndexMA")==0) + return SCE_PASS_INDEXMA; + if(strcmp(str, "Mist")==0) return SCE_PASS_MIST; @@ -631,7 +638,9 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int render_layer_add_pass(rr, rl, 3, SCE_PASS_REFRACT); if(srl->passflag & SCE_PASS_INDEXOB) render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXOB); - if(srl->passflag & SCE_PASS_MIST) + if(srl->passflag & SCE_PASS_INDEXMA) + render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXMA); + if(srl->passflag & SCE_PASS_MIST) render_layer_add_pass(rr, rl, 1, SCE_PASS_MIST); if(rl->passflag & SCE_PASS_RAYHITS) render_layer_add_pass(rr, rl, 4, SCE_PASS_RAYHITS); diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 6747784b21a..3aca334cffe 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -515,6 +515,14 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset, *fp= (float)shi->obr->ob->index; } break; + case SCE_PASS_INDEXMA: + /* no filter */ + if(shi->vlr) { + fp= rpass->rect + offset; + if(*fp==0.0f) + *fp= (float)shi->mat->index; + } + break; case SCE_PASS_MIST: /* */ col= &shr->mist; @@ -619,6 +627,12 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult *fp= (float)shi->obr->ob->index; } break; + case SCE_PASS_INDEXMA: + if(shi->vlr) { + fp= rpass->rect + offset; + *fp= (float)shi->mat->index; + } + break; case SCE_PASS_MIST: fp= rpass->rect + offset; *fp= shr->mist; diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 2702b7e5145..eab66aaf2ec 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -771,7 +771,8 @@ void shade_input_set_uv(ShadeInput *shi) t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2]; t10= v3[axis1]-v2[axis1]; t11= v3[axis2]-v2[axis2]; - detsh= 1.0f/(t00*t11-t10*t01); + detsh= (t00*t11-t10*t01); + detsh= (detsh != 0.0f)? 1.0f/detsh: 0.0f; t00*= detsh; t01*=detsh; t10*=detsh; t11*=detsh; @@ -1272,8 +1273,9 @@ void shade_input_set_shade_texco(ShadeInput *shi) s11= ho3[1]/ho3[3] - ho2[1]/ho2[3]; detsh= s00*s11-s10*s01; - s00/= detsh; s01/=detsh; - s10/=detsh; s11/=detsh; + detsh= (detsh != 0.0f)? 1.0f/detsh: 0.0f; + s00*= detsh; s01*=detsh; + s10*=detsh; s11*=detsh; /* recalc u and v again */ hox= x/Zmulx -1.0f; @@ -1455,7 +1457,7 @@ int shade_samples(ShadeSample *ssamp, PixStr *ps, int x, int y) shade_samples_do_AO(ssamp); /* if shade (all shadepinputs have same passflag) */ - if(ssamp->shi[0].passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB)) { + if(ssamp->shi[0].passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { for(samp=0; samp<ssamp->tot; samp++, shi++, shr++) { shade_input_set_shade_texco(shi); diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 98dbb796f5b..13d9ead79e8 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -3497,7 +3497,7 @@ static void add_transp_obindex(RenderLayer *rl, int offset, Object *ob) RenderPass *rpass; for(rpass= rl->passes.first; rpass; rpass= rpass->next) { - if(rpass->passtype == SCE_PASS_INDEXOB) { + if(rpass->passtype == SCE_PASS_INDEXOB||rpass->passtype == SCE_PASS_INDEXMA) { float *fp= rpass->rect + offset; *fp= (float)ob->index; break; @@ -3820,7 +3820,7 @@ static int shade_tra_samples(ShadeSample *ssamp, StrandShadeCache *cache, int x, shade_samples_do_AO(ssamp); /* if shade (all shadepinputs have same passflag) */ - if(shi->passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB)) { + if(shi->passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { for(samp=0; samp<ssamp->tot; samp++, shi++, shr++) { shade_input_set_shade_texco(shi); shade_input_do_shade(shi, shr); @@ -4115,7 +4115,14 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas add_transp_obindex(rlpp[a], od, obr->ob); } } - + if(addpassflag & SCE_PASS_INDEXMA) { + ObjectRen *obr= R.objectinstance[zrow[totface-1].obi].obr; + if(obr->ob) { + for(a= 0; a<totfullsample; a++) + add_transp_obindex(rlpp[a], od, obr->ob); + } + } + /* for each mask-sample we alpha-under colors. then in end it's added using filter */ memset(samp_shr, 0, sizeof(ShadeResult)*osa); for(a=0; a<osa; a++) { diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index e0cfb86ce05..aabaf6d4055 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -635,8 +635,9 @@ static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt) char err_out[256]= "unknown"; *thumb_pt= NULL; - - if(G.background || scene->camera==NULL) + + /* scene can be NULL if running a script at startup and calling the save operator */ + if(G.background || scene==NULL || scene->camera==NULL) return NULL; /* gets scaled to BLEN_THUMB_SIZE */ diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index f65485b84dd..35afdf29b53 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2004,6 +2004,8 @@ static void WM_OT_save_mainfile(wmOperatorType *ot) static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) { + int selected = 0; + if(!RNA_property_is_set(op->ptr, "filepath")) { char filepath[FILE_MAX]; BLI_strncpy(filepath, G.main->name, sizeof(filepath)); @@ -2020,6 +2022,7 @@ static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED static int wm_collada_export_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; + int selected; if(!RNA_property_is_set(op->ptr, "filepath")) { BKE_report(op->reports, RPT_ERROR, "No filename given"); @@ -2027,7 +2030,8 @@ static int wm_collada_export_exec(bContext *C, wmOperator *op) } RNA_string_get(op->ptr, "filepath", filename); - if(collada_export(CTX_data_scene(C), filename)) { + selected = RNA_boolean_get(op->ptr, "selected"); + if(collada_export(CTX_data_scene(C), filename, selected)) { return OPERATOR_FINISHED; } else { @@ -2045,6 +2049,8 @@ static void WM_OT_collada_export(wmOperatorType *ot) ot->poll= WM_operator_winactive; WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH); + RNA_def_boolean(ot->srna, "selected", 0, "Export only selected", + "Export only selected elements"); } /* function used for WM_OT_save_mainfile too */ |