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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiao Xiangquan <xiaoxiangquan@gmail.com>2011-07-29 21:42:53 +0400
committerXiao Xiangquan <xiaoxiangquan@gmail.com>2011-07-29 21:42:53 +0400
commit287b24926fefe078e4baae45808a5453b5c731bc (patch)
treee2336456d73c8b4bb5b9dad80cb475d5ea9c38d5 /source/blender
parente382a373f5c26be3279ce91b119cce1b24bec388 (diff)
parentb948459031dd6d0f1ccc81d607a589fd7d1e8ab2 (diff)
merge with trunk r38787
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/avi/CMakeLists.txt2
-rw-r--r--source/blender/blenfont/CMakeLists.txt8
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_effect.h1
-rw-r--r--source/blender/blenkernel/CMakeLists.txt55
-rw-r--r--source/blender/blenkernel/SConscript1
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c2
-rw-r--r--source/blender/blenkernel/intern/customdata.c1
-rw-r--r--source/blender/blenkernel/intern/effect.c23
-rw-r--r--source/blender/blenkernel/intern/image.c3
-rw-r--r--source/blender/blenkernel/intern/material.c2
-rw-r--r--source/blender/blenkernel/intern/multires.c18
-rw-r--r--source/blender/blenkernel/intern/particle_system.c2
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c2
-rw-r--r--source/blender/blenkernel/intern/sequencer.c3
-rw-r--r--source/blender/blenkernel/intern/text.c10
-rw-r--r--source/blender/blenkernel/intern/writeavi.c7
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c2
-rw-r--r--source/blender/blenlib/BLI_path_util.h1
-rw-r--r--source/blender/blenlib/CMakeLists.txt6
-rw-r--r--source/blender/blenlib/intern/path_util.c6
-rw-r--r--source/blender/blenloader/CMakeLists.txt2
-rw-r--r--source/blender/blenloader/intern/readfile.c37
-rw-r--r--source/blender/blenloader/intern/writefile.c11
-rw-r--r--source/blender/blenpluginapi/CMakeLists.txt6
-rw-r--r--source/blender/collada/CMakeLists.txt6
-rw-r--r--source/blender/collada/MaterialExporter.cpp32
-rw-r--r--source/blender/collada/MaterialExporter.h3
-rw-r--r--source/blender/editors/animation/CMakeLists.txt2
-rw-r--r--source/blender/editors/armature/CMakeLists.txt2
-rw-r--r--source/blender/editors/armature/editarmature.c2
-rw-r--r--source/blender/editors/curve/CMakeLists.txt2
-rw-r--r--source/blender/editors/gpencil/CMakeLists.txt2
-rw-r--r--source/blender/editors/include/ED_node.h3
-rw-r--r--source/blender/editors/interface/CMakeLists.txt2
-rw-r--r--source/blender/editors/interface/interface_handlers.c11
-rw-r--r--source/blender/editors/interface/interface_layout.c12
-rw-r--r--source/blender/editors/interface/interface_panel.c4
-rw-r--r--source/blender/editors/interface/interface_regions.c11
-rw-r--r--source/blender/editors/interface/interface_style.c2
-rw-r--r--source/blender/editors/interface/interface_templates.c20
-rw-r--r--source/blender/editors/interface/resources.c9
-rw-r--r--source/blender/editors/mesh/CMakeLists.txt4
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c2
-rw-r--r--source/blender/editors/metaball/CMakeLists.txt2
-rw-r--r--source/blender/editors/object/CMakeLists.txt4
-rw-r--r--source/blender/editors/object/object_add.c4
-rw-r--r--source/blender/editors/object/object_bake.c11
-rw-r--r--source/blender/editors/object/object_edit.c12
-rw-r--r--source/blender/editors/physics/CMakeLists.txt2
-rw-r--r--source/blender/editors/physics/physics_fluid.c16
-rw-r--r--source/blender/editors/render/CMakeLists.txt8
-rw-r--r--source/blender/editors/render/SConscript2
-rw-r--r--source/blender/editors/render/render_shading.c2
-rw-r--r--source/blender/editors/screen/CMakeLists.txt2
-rw-r--r--source/blender/editors/sculpt_paint/CMakeLists.txt6
-rw-r--r--source/blender/editors/sound/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_action/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_api/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_buttons/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_file/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_file/file_ops.c2
-rw-r--r--source/blender/editors/space_graph/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_image/CMakeLists.txt4
-rw-r--r--source/blender/editors/space_image/image_buttons.c1
-rw-r--r--source/blender/editors/space_image/image_ops.c6
-rw-r--r--source/blender/editors/space_info/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_logic/CMakeLists.txt4
-rw-r--r--source/blender/editors/space_nla/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt4
-rw-r--r--source/blender/editors/space_node/drawnode.c15
-rw-r--r--source/blender/editors/space_node/node_draw.c13
-rw-r--r--source/blender/editors/space_node/node_edit.c168
-rw-r--r--source/blender/editors/space_node/node_header.c2
-rw-r--r--source/blender/editors/space_node/node_ops.c9
-rw-r--r--source/blender/editors/space_node/space_node.c7
-rw-r--r--source/blender/editors/space_outliner/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_script/CMakeLists.txt10
-rw-r--r--source/blender/editors/space_sequencer/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c27
-rw-r--r--source/blender/editors/space_sound/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_text/CMakeLists.txt10
-rw-r--r--source/blender/editors/space_text/text_ops.c21
-rw-r--r--source/blender/editors/space_time/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_userpref/CMakeLists.txt2
-rw-r--r--source/blender/editors/space_view3d/CMakeLists.txt8
-rw-r--r--source/blender/editors/space_view3d/drawobject.c15
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c14
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c1
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c11
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h10
-rw-r--r--source/blender/editors/transform/CMakeLists.txt2
-rw-r--r--source/blender/editors/transform/transform.c2
-rw-r--r--source/blender/editors/transform/transform.h2
-rw-r--r--source/blender/editors/transform/transform_conversions.c14
-rw-r--r--source/blender/editors/transform/transform_generics.c2
-rw-r--r--source/blender/editors/transform/transform_ops.c2
-rw-r--r--source/blender/editors/transform/transform_snap.c28
-rw-r--r--source/blender/editors/util/CMakeLists.txt2
-rw-r--r--source/blender/editors/util/undo.c8
-rw-r--r--source/blender/editors/uvedit/CMakeLists.txt2
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c131
-rw-r--r--source/blender/gpu/CMakeLists.txt2
-rw-r--r--source/blender/gpu/intern/gpu_material.c2
-rw-r--r--source/blender/ikplugin/CMakeLists.txt4
-rw-r--r--source/blender/imbuf/CMakeLists.txt32
-rw-r--r--source/blender/imbuf/IMB_imbuf.h2
-rw-r--r--source/blender/imbuf/intern/cineon/CMakeLists.txt2
-rw-r--r--source/blender/imbuf/intern/dds/CMakeLists.txt3
-rw-r--r--source/blender/imbuf/intern/filter.c219
-rw-r--r--source/blender/imbuf/intern/openexr/CMakeLists.txt7
-rw-r--r--source/blender/makesdna/DNA_image_types.h6
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h1
-rw-r--r--source/blender/makesdna/DNA_node_types.h4
-rw-r--r--source/blender/makesdna/DNA_particle_types.h3
-rw-r--r--source/blender/makesdna/DNA_scene_types.h11
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt12
-rw-r--r--source/blender/makesrna/intern/SConscript3
-rw-r--r--source/blender/makesrna/intern/rna_access.c6
-rw-r--r--source/blender/makesrna/intern/rna_image.c5
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c5
-rw-r--r--source/blender/makesrna/intern/rna_object.c2
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c60
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c4
-rw-r--r--source/blender/makesrna/intern/rna_scene.c8
-rw-r--r--source/blender/makesrna/intern/rna_space.c2
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c1
-rw-r--r--source/blender/makesrna/intern/rna_wm.c2
-rw-r--r--source/blender/modifiers/CMakeLists.txt13
-rw-r--r--source/blender/modifiers/intern/MOD_util.h2
-rw-r--r--source/blender/nodes/CMakeLists.txt8
-rw-r--r--source/blender/nodes/intern/SHD_util.c9
-rw-r--r--source/blender/python/CMakeLists.txt1
-rw-r--r--source/blender/python/SConscript11
-rw-r--r--source/blender/python/generic/CMakeLists.txt18
-rw-r--r--source/blender/python/generic/bgl.c290
-rw-r--r--source/blender/python/intern/CMakeLists.txt9
-rw-r--r--source/blender/python/intern/bpy.c4
-rw-r--r--source/blender/python/intern/bpy_interface.c8
-rw-r--r--source/blender/python/intern/bpy_rna.c4
-rwxr-xr-xsource/blender/python/mathutils/CMakeLists.txt52
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils.c (renamed from source/blender/python/generic/mathutils.c)8
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils.h (renamed from source/blender/python/generic/mathutils.h)6
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Color.c (renamed from source/blender/python/generic/mathutils_Color.c)24
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Color.h (renamed from source/blender/python/generic/mathutils_Color.h)2
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Euler.c (renamed from source/blender/python/generic/mathutils_Euler.c)22
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Euler.h (renamed from source/blender/python/generic/mathutils_Euler.h)2
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Matrix.c (renamed from source/blender/python/generic/mathutils_Matrix.c)145
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Matrix.h (renamed from source/blender/python/generic/mathutils_Matrix.h)2
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Quaternion.c (renamed from source/blender/python/generic/mathutils_Quaternion.c)44
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Quaternion.h (renamed from source/blender/python/generic/mathutils_Quaternion.h)2
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Vector.c (renamed from source/blender/python/generic/mathutils_Vector.c)108
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_Vector.h (renamed from source/blender/python/generic/mathutils_Vector.h)2
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_geometry.c (renamed from source/blender/python/generic/mathutils_geometry.c)576
-rwxr-xr-x[-rw-r--r--]source/blender/python/mathutils/mathutils_geometry.h (renamed from source/blender/python/generic/mathutils_geometry.h)4
-rw-r--r--source/blender/quicktime/CMakeLists.txt12
-rw-r--r--source/blender/render/CMakeLists.txt18
-rw-r--r--source/blender/render/intern/source/convertblender.c12
-rw-r--r--source/blender/render/intern/source/rendercore.c22
-rw-r--r--source/blender/windowmanager/CMakeLists.txt34
-rw-r--r--source/blender/windowmanager/WM_api.h1
-rw-r--r--source/blender/windowmanager/intern/wm.c6
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c8
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c4
165 files changed, 1907 insertions, 994 deletions
diff --git a/source/blender/avi/CMakeLists.txt b/source/blender/avi/CMakeLists.txt
index bae61fd678b..0fd6435ec4e 100644
--- a/source/blender/avi/CMakeLists.txt
+++ b/source/blender/avi/CMakeLists.txt
@@ -26,8 +26,8 @@
set(INC
.
- ../../../intern/guardedalloc
../blenlib
+ ../../../intern/guardedalloc
)
set(INC_SYS
diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt
index 118a081bf69..cc677d39b10 100644
--- a/source/blender/blenfont/CMakeLists.txt
+++ b/source/blender/blenfont/CMakeLists.txt
@@ -24,10 +24,10 @@
set(INC
.
+ ../blenkernel
../blenlib
- ../makesdna
../editors/include
- ../blenkernel
+ ../makesdna
../../../intern/guardedalloc
)
@@ -51,7 +51,9 @@ set(SRC
)
if(WITH_INTERNATIONAL)
- list(APPEND INC_SYS ${GETTEXT_INC})
+ list(APPEND INC_SYS
+ ${GETTEXT_INC}
+ )
add_definitions(-DINTERNATIONAL)
endif()
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 25fb6f9f9ff..18f6ad21333 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -53,7 +53,7 @@ extern "C" {
/* can be left blank, otherwise a,b,c... etc with no quotes */
#define BLENDER_VERSION_CHAR a
/* alpha/beta/rc/release, docs use this */
-#define BLENDER_VERSION_CYCLE release
+#define BLENDER_VERSION_CYCLE beta
struct ListBase;
struct MemFile;
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index 97ac711651b..12f9383cefb 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -105,6 +105,7 @@ typedef struct EffectorCache {
/* precalculated for guides */
struct GuideEffectorData *guide_data;
float guide_loc[4], guide_dir[3], guide_radius;
+ float velocity[3];
float frame;
int flag;
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 92c50242e74..defcef58463 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -32,8 +32,10 @@ endif()
set(INC
.
../avi
+ ../blenfont
../blenlib
../blenloader
+ ../editors/include
../gpu
../ikplugin
../imbuf
@@ -41,18 +43,19 @@ set(INC
../makesrna
../modifiers
../nodes
- ../editors/include
../render/extern/include
- ../../../intern/bsp/extern ../blenfont
+ ../../../intern/bsp/extern
../../../intern/decimation/extern
../../../intern/elbeem/extern
../../../intern/guardedalloc
../../../intern/iksolver/extern
../../../intern/memutil
+ ../../../intern/mikktspace
../../../intern/opennl/extern
../../../intern/smoke/extern
- ../../../intern/mikktspace
- ../../../source/blender/windowmanager # XXX - BAD LEVEL CALL WM_api.h
+
+ # XXX - BAD LEVEL CALL WM_api.h
+ ../windowmanager
)
set(INC_SYS
@@ -243,12 +246,16 @@ if(WITH_AUDASPACE)
endif()
if(WITH_BULLET)
- list(APPEND INC ../../../extern/bullet2/src)
+ list(APPEND INC
+ ../../../extern/bullet2/src
+ )
add_definitions(-DUSE_BULLET)
endif()
if(WITH_MOD_CLOTH_ELTOPO)
- list(APPEND INC ../../../extern/eltopo)
+ list(APPEND INC
+ ../../../extern/eltopo
+ )
add_definitions(-DWITH_ELTOPO)
endif()
@@ -272,25 +279,41 @@ if(WITH_IMAGE_CINEON)
add_definitions(-DWITH_CINEON)
endif()
+if(WITH_IMAGE_FRAMESERVER)
+ add_definitions(-DWITH_FRAMESERVER)
+endif()
+
if(WITH_IMAGE_HDR)
add_definitions(-DWITH_HDR)
endif()
if(WITH_CODEC_QUICKTIME)
- list(APPEND INC ../quicktime)
- list(APPEND INC_SYS ${QUICKTIME_INCLUDE_DIRS})
+ list(APPEND INC
+ ../quicktime
+ )
+ list(APPEND INC_SYS
+ ${QUICKTIME_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_QUICKTIME)
endif()
if(WITH_CODEC_FFMPEG)
- list(APPEND INC ../../../intern/ffmpeg)
- list(APPEND INC_SYS ${FFMPEG_INCLUDE_DIRS})
+ list(APPEND INC
+ ../../../intern/ffmpeg
+ )
+ list(APPEND INC_SYS
+ ${FFMPEG_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_FFMPEG)
endif()
if(WITH_PYTHON)
- list(APPEND INC ../python)
- list(APPEND INC_SYS ${PYTHON_INCLUDE_DIRS})
+ list(APPEND INC
+ ../python
+ )
+ list(APPEND INC_SYS
+ ${PYTHON_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_PYTHON)
if(WITH_PYTHON_SECURITY)
@@ -315,12 +338,16 @@ if(WITH_JACK)
endif()
if(WITH_LZO)
- list(APPEND INC_SYS ../../../extern/lzo/minilzo)
+ list(APPEND INC_SYS
+ ../../../extern/lzo/minilzo
+ )
add_definitions(-DWITH_LZO)
endif()
if(WITH_LZMA)
- list(APPEND INC_SYS ../../../extern/lzma)
+ list(APPEND INC_SYS
+ ../../../extern/lzma
+ )
add_definitions(-DWITH_LZMA)
endif()
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 36afce7946c..5ea42ee65ae 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -22,6 +22,7 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = [ 'GLEW_STATIC' ]
defs.append('WITH_SMOKE') # TODO, make optional
+defs.append('WITH_FRAMESERVER') # TODO, make optional
if env['WITH_BF_PYTHON']:
incs += ' ../python'
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 3abfa05e1fd..662c872b7f1 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1287,6 +1287,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
offset += sizeof(float)*4;
}
+ (void)offset;
}
curface++;
if(mface->v4) {
@@ -1327,6 +1328,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
offset += sizeof(float)*4;
}
+ (void)offset;
}
curface++;
i++;
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 45faba8439c..8d19322c0db 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -466,7 +466,6 @@ static void layerInterp_mdisps(void **sources, float *UNUSED(weights),
MDisps tris[2];
int vindex[4] = {0};
- S = 0;
for(i = 0; i < 2; i++)
for(y = 0; y < 4; y++)
for(x = 0; x < 4; x++)
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index ee46bef6038..4b95c44f55f 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -241,6 +241,16 @@ static void precalculate_effector(EffectorCache *eff)
}
else if(eff->psys)
psys_update_particle_tree(eff->psys, eff->scene->r.cfra);
+
+ /* Store object velocity */
+ if(eff->ob) {
+ float old_vel[3];
+
+ where_is_object_time(eff->scene, eff->ob, cfra - 1.0f);
+ copy_v3_v3(old_vel, eff->ob->obmat[3]);
+ where_is_object_time(eff->scene, eff->ob, cfra);
+ sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel);
+ }
}
static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
{
@@ -680,10 +690,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
Object *ob = eff->ob;
Object obcopy = *ob;
- /* XXX this is not thread-safe, but used from multiple threads by
- particle system */
- where_is_object_time(eff->scene, ob, cfra);
-
/* use z-axis as normal*/
normalize_v3_v3(efd->nor, ob->obmat[2]);
@@ -702,13 +708,8 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
VECCOPY(efd->loc, ob->obmat[3]);
}
- if(real_velocity) {
- VECCOPY(efd->vel, ob->obmat[3]);
-
- where_is_object_time(eff->scene, ob, cfra - 1.0f);
-
- sub_v3_v3v3(efd->vel, efd->vel, ob->obmat[3]);
- }
+ if(real_velocity)
+ copy_v3_v3(efd->vel, eff->velocity);
*eff->ob = obcopy;
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index c48497c45a1..ab67d7e3f25 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -432,6 +432,7 @@ Image *BKE_add_image_size(unsigned int width, unsigned int height, const char *n
ima->gen_x= width;
ima->gen_y= height;
ima->gen_type= uvtestgrid;
+ ima->gen_flag |= (floatbuf ? IMA_GEN_FLOAT : 0);
ibuf= add_ibuf_size(width, height, name, depth, floatbuf, uvtestgrid, color);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
@@ -2172,7 +2173,7 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
/* UV testgrid or black or solid etc */
if(ima->gen_x==0) ima->gen_x= 1024;
if(ima->gen_y==0) ima->gen_y= 1024;
- ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 24, 0, ima->gen_type, color);
+ ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 24, (ima->gen_flag & IMA_GEN_FLOAT) != 0, ima->gen_type, color);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
ima->ok= IMA_OK_LOADED;
}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 962c7fd5e86..3f01c55e935 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -550,7 +550,7 @@ Material *material_pop_id(ID *id, int index)
Material **mat;
if(index + 1 != (*totcol))
- memmove((*matar), (*matar) + 1, sizeof(void *) * ((*totcol) - (index + 1)));
+ memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1)));
(*totcol)--;
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index d833c184274..88a670ecb22 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -465,12 +465,13 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv
return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0);
}
-static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal)
+static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal, int plain_uv)
{
SubsurfModifierData smd= {{NULL}};
smd.levels = smd.renderLevels = lvl;
- smd.flags |= eSubsurfModifierFlag_SubsurfUv;
+ if(!plain_uv)
+ smd.flags |= eSubsurfModifierFlag_SubsurfUv;
if(simple)
smd.subdivType = ME_SIMPLE_SUBSURF;
if(optimal)
@@ -591,7 +592,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
/* subdivide the mesh to highest level without displacements */
cddm = CDDM_from_mesh(me, NULL);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0);
+ origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
cddm->release(cddm);
/* calc disps */
@@ -626,7 +627,7 @@ static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl
/* create subsurf DM from original mesh at high level */
cddm = CDDM_from_mesh(me, NULL);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0);
+ highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
/* create multires DM from original mesh at low level */
lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple);
@@ -830,7 +831,7 @@ static void multiresModifier_update(DerivedMesh *dm)
else cddm = CDDM_from_mesh(me, NULL);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0);
+ highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
/* create multires DM from original mesh and displacements */
lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple);
@@ -884,7 +885,7 @@ static void multiresModifier_update(DerivedMesh *dm)
else cddm = CDDM_from_mesh(me, NULL);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0);
+ subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
cddm->release(cddm);
multiresModifier_disp_run(dm, me, 1, 0, subdm->getGridData(subdm), mmd->totlvl);
@@ -927,7 +928,8 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca
return dm;
result = subsurf_dm_create_local(ob, dm, lvl,
- mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges);
+ mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges,
+ mmd->flags & eMultiresModifierFlag_PlainUv);
if(!local_mmd) {
ccgdm = (CCGDerivedMesh*)result;
@@ -1633,7 +1635,7 @@ static void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
MEM_freeN(vertCos);
/* scaled ccgDM for tangent space of object with applied scale */
- dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0);
+ dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
cddm->release(cddm);
/*numGrids= dm->getNumGrids(dm);*/ /*UNUSED*/
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 63a9c224971..1423f520b95 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3987,7 +3987,7 @@ static void system_step(ParticleSimulationData *sim, float cfra)
BKE_ptcache_id_time(pid, sim->scene, 0.0f, &startframe, &endframe, NULL);
/* clear everythin on start frame */
- if((int)cfra == startframe) {
+ if(cfra == startframe) {
BKE_ptcache_id_reset(sim->scene, pid, PTCACHE_RESET_OUTDATED);
BKE_ptcache_validate(cache, startframe);
cache->flag &= ~PTCACHE_REDO_NEEDED;
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index fbb5a77fa04..8c19b0c15c3 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -2373,7 +2373,7 @@ static void RVBlurBitmap2_float ( float* map, int width,int height,
/* Blancmange (bmange@airdmhor.gen.nz) */
k = -1.0f/(2.0f*(float)M_PI*blur*blur);
- fval=0;
+
for (ix = 0;ix< halfWidth;ix++){
weight = (float)exp(k*(ix*ix));
filter[halfWidth - ix] = weight;
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 265cc3eeb79..d6a152a5280 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -3232,9 +3232,10 @@ int seq_swap(Sequence *seq_a, Sequence *seq_b, const char **error_str)
{
char name[sizeof(seq_a->name)];
- if(seq_a->len != seq_b->len)
+ if(seq_a->len != seq_b->len) {
*error_str= "Strips must be the same length";
return 0;
+ }
/* type checking, could be more advanced but disalow sound vs non-sound copy */
if(seq_a->type != seq_b->type) {
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index da329503c9f..2c507370288 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -400,7 +400,13 @@ Text *add_text(const char *file, const char *relpath)
llen++;
}
- if (llen!=0 || ta->nlines==0) {
+ /* create new line in cases:
+ - rest of line (if last line in file hasn't got \n terminator).
+ in this case content of such line would be used to fill text line buffer
+ - file is empty. in this case new line is needed to start editing from.
+ - last characted in buffer is \n. in this case new line is needed to
+ deal with newline at end of file. (see [#28087]) (sergey) */
+ if (llen!=0 || ta->nlines==0 || buffer[len-1]=='\n') {
tmp= (TextLine*) MEM_mallocN(sizeof(TextLine), "textline");
tmp->line= (char*) MEM_mallocN(llen+1, "textline_string");
tmp->format= NULL;
@@ -1417,6 +1423,8 @@ void txt_insert_buf(Text *text, const char *in_buffer)
}
undoing= u;
+
+ (void)count;
}
/******************/
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index ba7f9bdd415..769a3f9b11e 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -105,13 +105,18 @@ bMovieHandle *BKE_get_movie_handle(int imtype)
mh.get_movie_path = filepath_ffmpeg;
}
#endif
+#ifdef WITH_FRAMESERVER
if (imtype == R_FRAMESERVER) {
mh.start_movie = start_frameserver;
mh.append_movie = append_frameserver;
mh.end_movie = end_frameserver;
mh.get_next_frame = frameserver_loop;
}
-
+#endif
+
+ /* incase all above are disabled */
+ (void)imtype;
+
return &mh;
}
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index 2239f6d3147..d13d15d1269 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -22,6 +22,7 @@
*
*/
+#ifdef WITH_FRAMESERVER
#include <string.h>
#include <stdio.h>
@@ -381,3 +382,4 @@ void end_frameserver(void)
shutdown_socket_system();
}
+#endif /* WITH_FRAMESERVER */
diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h
index 3b27e4dafa0..81fc8a50db6 100644
--- a/source/blender/blenlib/BLI_path_util.h
+++ b/source/blender/blenlib/BLI_path_util.h
@@ -98,7 +98,6 @@ char *BLI_get_folder_version(const int id, const int ver, const int do_check);
#endif
void BLI_setenv(const char *env, const char *val);
-char *BLI_getenv(const char *env);
void BLI_setenv_if_new(const char *env, const char* val);
void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file);
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 2e05ac7892b..b4fc983008c 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -26,10 +26,10 @@
set(INC
.
- ../makesdna
../blenkernel
../blenloader
../gpu
+ ../makesdna
../../../intern/ghost
../../../intern/guardedalloc
)
@@ -138,7 +138,9 @@ set(SRC
)
if(WITH_BINRELOC)
- list(APPEND INC_SYS "${BINRELOC_INCLUDE_DIRS}")
+ list(APPEND INC_SYS
+ ${BINRELOC_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_BINRELOC)
endif()
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 8eab5539390..f89283178ec 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -1172,10 +1172,6 @@ void BLI_setenv(const char *env, const char*val)
#endif
}
-char *BLI_getenv(const char *env)
-{
- return getenv(env);
-}
/**
Only set an env var if already not there.
@@ -1684,7 +1680,7 @@ void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name)
if(GetModuleFileName(0, fullname, maxlen)) {
if(!BLI_exists(fullname)) {
printf("path can't be found: \"%.*s\"\n", maxlen, fullname);
- MessageBox(NULL, "path constains invalid characters or is too long (see console)", "Error", MB_OK);
+ MessageBox(NULL, "path contains invalid characters or is too long (see console)", "Error", MB_OK);
}
return;
}
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index 312a6546e22..be15b191c8a 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -26,8 +26,8 @@
set(INC
.
- ../blenlib
../blenkernel
+ ../blenlib
../makesdna
../makesrna
../render/extern/include
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 2402106306e..4ad99c02b2d 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -75,6 +75,7 @@
#include "DNA_node_types.h"
#include "DNA_object_fluidsim.h" // NT
#include "DNA_packedFile_types.h"
+#include "DNA_particle_types.h"
#include "DNA_property_types.h"
#include "DNA_text_types.h"
#include "DNA_view3d_types.h"
@@ -3161,9 +3162,37 @@ static void lib_link_particlesettings(FileData *fd, Main *main)
if(part->effector_weights)
part->effector_weights->group = newlibadr(fd, part->id.lib, part->effector_weights->group);
- dw = part->dupliweights.first;
- for(; dw; dw=dw->next)
- dw->ob = newlibadr(fd, part->id.lib, dw->ob);
+ if(part->dupliweights.first) {
+ int index_ok = 0;
+ /* check for old files without indices (all indexes 0) */
+ dw = part->dupliweights.first;
+ if(part->dupliweights.first == part->dupliweights.last) {
+ /* special case for only one object in the group */
+ index_ok = 1;
+ }
+ else {
+ for(; dw; dw=dw->next) {
+ if(dw->index > 0) {
+ index_ok = 1;
+ break;
+ }
+ }
+ }
+
+ if(index_ok) {
+ /* if we have indexes, let's use them */
+ dw = part->dupliweights.first;
+ for(; dw; dw=dw->next) {
+ GroupObject *go = (GroupObject *)BLI_findlink(&part->dup_group->gobject, dw->index);
+ dw->ob = go ? go->ob : NULL;
+ }
+ }
+ else {
+ /* otherwise try to get objects from own library (won't work on library linked groups) */
+ for(; dw; dw=dw->next)
+ dw->ob = newlibadr(fd, part->id.lib, dw->ob);
+ }
+ }
if(part->boids) {
BoidState *state = part->boids->states.first;
@@ -10252,8 +10281,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
sce->gm.attrib = sce->r.attrib;
//Stereo
- sce->gm.xsch = sce->r.xsch;
- sce->gm.ysch = sce->r.ysch;
sce->gm.stereomode = sce->r.stereomode;
/* reassigning stereomode NO_STEREO and DOME to a separeted flag*/
if (sce->gm.stereomode == 1){ //1 = STEREO_NOSTEREO
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index ba4395ace9c..bf86527b9d3 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -837,6 +837,7 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase)
{
ParticleSettings *part;
ParticleDupliWeight *dw;
+ GroupObject *go;
int a;
part= idbase->first;
@@ -851,8 +852,16 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase)
writestruct(wd, DATA, "EffectorWeights", 1, part->effector_weights);
dw = part->dupliweights.first;
- for(; dw; dw=dw->next)
+ for(; dw; dw=dw->next) {
+ /* update indices */
+ dw->index = 0;
+ go = part->dup_group->gobject.first;
+ while(go && go->ob != dw->ob) {
+ go=go->next;
+ dw->index++;
+ }
writestruct(wd, DATA, "ParticleDupliWeight", 1, dw);
+ }
if(part->boids && part->phystype == PART_PHYS_BOIDS) {
BoidState *state = part->boids->states.first;
diff --git a/source/blender/blenpluginapi/CMakeLists.txt b/source/blender/blenpluginapi/CMakeLists.txt
index a5af15d7f55..9d398291b85 100644
--- a/source/blender/blenpluginapi/CMakeLists.txt
+++ b/source/blender/blenpluginapi/CMakeLists.txt
@@ -28,9 +28,9 @@ set(INC
.
..
../blenlib
+ ../blenloader
../imbuf
../makesdna
- ../blenloader
../../../intern/guardedalloc
)
@@ -50,7 +50,9 @@ set(SRC
)
if(WITH_CODEC_QUICKTIME)
- list(APPEND INC_SYS ${QUICKTIME_INCLUDE_DIRS})
+ list(APPEND INC_SYS
+ ${QUICKTIME_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_QUICKTIME)
endif()
diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt
index 07da532146f..e2a68d19682 100644
--- a/source/blender/collada/CMakeLists.txt
+++ b/source/blender/collada/CMakeLists.txt
@@ -28,13 +28,13 @@ remove_strict_flags()
set(INC
.
- ../blenlib
../blenkernel
+ ../blenlib
../blenloader
- ../windowmanager
+ ../editors/include
../makesdna
../makesrna
- ../editors/include
+ ../windowmanager
../../../intern/guardedalloc
)
diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp
index a44fa6802f2..9d29177578d 100644
--- a/source/blender/collada/MaterialExporter.cpp
+++ b/source/blender/collada/MaterialExporter.cpp
@@ -37,12 +37,36 @@ MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::Li
void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected)
{
- openLibrary();
+ if(hasMaterials(sce)) {
+ openLibrary();
- MaterialFunctor mf;
- mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, export_selected);
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, export_selected);
- closeLibrary();
+ closeLibrary();
+ }
+}
+
+
+bool MaterialsExporter::hasMaterials(Scene *sce)
+{
+ Base *base = (Base *)sce->base.first;
+
+ while(base) {
+ Object *ob= base->object;
+ int a;
+ for(a = 0; a < ob->totcol; a++)
+ {
+ Material *ma = give_current_material(ob, a+1);
+
+ // no material, but check all of the slots
+ if (!ma) continue;
+
+ return true;
+ }
+ base= base->next;
+ }
+ return false;
}
void MaterialsExporter::operator()(Material *ma, Object *ob)
diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h
index 0a7a276d857..c080e4b0596 100644
--- a/source/blender/collada/MaterialExporter.h
+++ b/source/blender/collada/MaterialExporter.h
@@ -51,6 +51,9 @@ public:
MaterialsExporter(COLLADASW::StreamWriter *sw);
void exportMaterials(Scene *sce, bool export_selected);
void operator()(Material *ma, Object *ob);
+
+private:
+ bool hasMaterials(Scene *sce);
};
// used in forEachMaterialInScene
diff --git a/source/blender/editors/animation/CMakeLists.txt b/source/blender/editors/animation/CMakeLists.txt
index 51387b8b3f3..6195289f2a6 100644
--- a/source/blender/editors/animation/CMakeLists.txt
+++ b/source/blender/editors/animation/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/armature/CMakeLists.txt b/source/blender/editors/armature/CMakeLists.txt
index 0b675ffb4d9..7ecbdc9ebe5 100644
--- a/source/blender/editors/armature/CMakeLists.txt
+++ b/source/blender/editors/armature/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index a1d13f4b4e9..b0432d980dc 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -1480,10 +1480,8 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, wmEvent *e
bArmature *arm;
EditBone *bone, *curBone, *next;
int extend= RNA_boolean_get(op->ptr, "extend");
- ARegion *ar;
Object *obedit= CTX_data_edit_object(C);
arm= obedit->data;
- ar= CTX_wm_region(C);
view3d_operator_needs_opengl(C);
diff --git a/source/blender/editors/curve/CMakeLists.txt b/source/blender/editors/curve/CMakeLists.txt
index bc3d167c17e..6e975e20cd7 100644
--- a/source/blender/editors/curve/CMakeLists.txt
+++ b/source/blender/editors/curve/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index fe5e35cc763..278a185eebd 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index 829ad3217a9..dfa457c22de 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -39,6 +39,7 @@ struct Tex;
struct bContext;
struct bNode;
struct ID;
+struct ScrArea;
/* drawnode.c */
void ED_init_node_butfuncs(void);
@@ -51,6 +52,8 @@ void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct
void ED_node_shader_default(struct Material *ma);
void ED_node_composit_default(struct Scene *sce);
void ED_node_texture_default(struct Tex *tex);
+void ED_node_link_intersect_test(struct ScrArea *sa, int test);
+void ED_node_link_insert(struct ScrArea *sa);
/* node ops.c */
void ED_operatormacros_node(void);
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index 6dd7af70e33..cc4c1eaa21c 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../gpu
../../imbuf
../../makesdna
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 8b84afe9dfd..1a36130b522 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -1879,7 +1879,6 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
if(but->autocomplete_func || data->searchbox) {
changed= ui_textedit_autocomplete(C, but, data);
update= 1; /* do live update for tab key */
- retval= WM_UI_HANDLER_BREAK;
}
/* the hotkey here is not well defined, was G.qual so we check all */
else if(event->shift || event->ctrl || event->alt || event->oskey) {
@@ -2325,8 +2324,8 @@ static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, floa
if(fac != 1.0f) {
/* snap in unit-space */
tempf /= fac;
- softmin /= fac;
- softmax /= fac;
+ /* softmin /= fac; */ /* UNUSED */
+ /* softmax /= fac; */ /* UNUSED */
softrange /= fac;
}
@@ -3469,13 +3468,13 @@ static int ui_numedit_but_CURVE(uiBut *but, uiHandleButtonData *data, int snap,
CurveMapping *cumap= (CurveMapping*)but->poin;
CurveMap *cuma= cumap->cm+cumap->cur;
CurveMapPoint *cmp= cuma->curve;
- float fx, fy, zoomx, zoomy, offsx, offsy;
+ float fx, fy, zoomx, zoomy /*, offsx, offsy */ /* UNUSED */;
int a, changed= 0;
zoomx= (but->x2-but->x1)/(cumap->curr.xmax-cumap->curr.xmin);
zoomy= (but->y2-but->y1)/(cumap->curr.ymax-cumap->curr.ymin);
- offsx= cumap->curr.xmin;
- offsy= cumap->curr.ymin;
+ /* offsx= cumap->curr.xmin; */
+ /* offsy= cumap->curr.ymin; */
if(snap) {
float d[2];
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index dfdce6ce2f5..2d0f49f293b 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -151,10 +151,10 @@ typedef struct uiLayoutItemBx {
uiBut *roundbox;
} uiLayoutItemBx;
-typedef struct uiLayoutItemSplt {
+typedef struct uiLayoutItemSplit {
uiLayout litem;
float percentage;
-} uiLayoutItemSplt;
+} uiLayoutItemSplit;
typedef struct uiLayoutItemRoot {
uiLayout litem;
@@ -1617,7 +1617,7 @@ static void ui_litem_layout_row(uiLayout *litem)
int x, y, w, tot, totw, neww, itemw, minw, itemh, offset;
int fixedw, freew, fixedx, freex, flag= 0, lastw= 0;
- x= litem->x;
+ /* x= litem->x; */ /* UNUSED */
y= litem->y;
w= litem->w;
totw= 0;
@@ -2022,7 +2022,7 @@ static void ui_litem_estimate_split(uiLayout *litem)
static void ui_litem_layout_split(uiLayout *litem)
{
- uiLayoutItemSplt *split= (uiLayoutItemSplt*)litem;
+ uiLayoutItemSplit *split= (uiLayoutItemSplit*)litem;
uiItem *item;
float percentage;
const int tot= BLI_countlist(&litem->items);
@@ -2244,9 +2244,9 @@ uiLayout *uiLayoutOverlap(uiLayout *layout)
uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, int align)
{
- uiLayoutItemSplt *split;
+ uiLayoutItemSplit *split;
- split= MEM_callocN(sizeof(uiLayoutItemSplt), "uiLayoutItemSplt");
+ split= MEM_callocN(sizeof(uiLayoutItemSplit), "uiLayoutItemSplit");
split->litem.item.type= ITEM_LAYOUT_SPLIT;
split->litem.root= layout->root;
split->litem.align= align;
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index c19d9884c8b..01dcdda97a1 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -575,8 +575,8 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, rcti *rect)
ui_draw_tria_rect(&itemrect, 'h');
else
ui_draw_tria_rect(&itemrect, 'v');
-
-
+
+ (void)ofsx;
}
/************************** panel alignment *************************/
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index b6f855d2263..17c064f3ba2 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -484,6 +484,17 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
}
}
}
+ else if (ELEM(but->type, MENU, PULLDOWN)) {
+ if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
+ if(but->menu_create_func && WM_menutype_contains((MenuType *)but->poin)) {
+ MenuType *mt= (MenuType *)but->poin;
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", mt->idname);
+ data->color[data->totline]= 0x888888;
+ data->totline++;
+ }
+ }
+
+ }
assert(data->totline < MAX_TOOLTIP_LINES);
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index dec4afa7894..7d1596459dd 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -251,7 +251,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, const char *str)
}
/* ************** helpers ************************ */
-
+/* XXX: read a style configure */
uiStyle* UI_GetStyle(void)
{
uiStyle *style = NULL;
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 989dee89ac5..c1784da48bd 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -851,7 +851,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
- RNA_warning("uiTemplateModifier: expected modifier on object.\n");
+ RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
return NULL;
}
@@ -859,7 +859,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
md= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateModifier: expected modifier on object.\n");
+ RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
return NULL;
}
@@ -976,9 +976,6 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
block= uiLayoutGetBlock(box);
/* Draw constraint header */
-
- /* rounded header */
- // rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20; // UNUSED
/* open/close */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -1083,7 +1080,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
- RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
+ RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
return NULL;
}
@@ -1091,7 +1088,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
con= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
+ RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
return NULL;
}
@@ -1137,7 +1134,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
PointerRNA texture_ptr;
if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
- RNA_warning("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n");
+ RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n");
return;
}
@@ -2171,14 +2168,14 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
if(prop) {
type= RNA_property_type(prop);
if(type != PROP_COLLECTION) {
- RNA_warning("uiTemplateList: expected collection property.\n");
+ RNA_warning("uiTemplateList: Expected collection property.\n");
return;
}
}
activetype= RNA_property_type(activeprop);
if(activetype != PROP_INT) {
- RNA_warning("uiTemplateList: expected integer property.\n");
+ RNA_warning("uiTemplateList: Expected integer property.\n");
return;
}
@@ -2200,7 +2197,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
/* create list items */
RNA_PROP_BEGIN(ptr, itemptr, prop) {
/* create button */
- if(i == 9)
+ if(!(i % 9))
row= uiLayoutRow(col, 0);
icon= list_item_icon_get(C, &itemptr, rnaicon, 1);
@@ -2215,7 +2212,6 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
}
else if(listtype == 'c') {
/* compact layout */
- found= 0;
row= uiLayoutRow(layout, 1);
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index 3f825762d74..56ef5e9e8cc 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -1115,10 +1115,11 @@ void init_userdef_do_versions(void)
}
if(U.pad_rot_angle==0)
U.pad_rot_angle= 15;
-
- if(U.flag & USER_CUSTOM_RANGE)
- vDM_ColorBand_store(&U.coba_weight); /* signal for derivedmesh to use colorband */
-
+
+ /* signal for derivedmesh to use colorband */
+ /* run incase this was on and is now off in the user prefs [#28096] */
+ vDM_ColorBand_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight):NULL);
+
if (bmain->versionfile <= 191) {
strcpy(U.plugtexdir, U.textudir);
strcpy(U.sounddir, "/");
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 1b08f9cff5c..3c78983f82d 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -23,13 +23,13 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
- ../../windowmanager
../../render/extern/include
+ ../../windowmanager
../../../../intern/guardedalloc
)
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index f941e5243d5..748ce641b24 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -869,7 +869,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op)
Mesh *me= obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
- int selcount = similar_face_select__internal(em, RNA_int_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
+ int selcount = similar_face_select__internal(em, RNA_enum_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
if (selcount) {
/* here was an edge-mode only select flush case, has to be generalized */
diff --git a/source/blender/editors/metaball/CMakeLists.txt b/source/blender/editors/metaball/CMakeLists.txt
index 9093da34519..41ed5da4f09 100644
--- a/source/blender/editors/metaball/CMakeLists.txt
+++ b/source/blender/editors/metaball/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../render/extern/include
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index dae83ad61b5..ff542701a68 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -23,16 +23,16 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../gpu
../../ikplugin
../../imbuf
../../makesdna
../../makesrna
../../python
- ../../windowmanager
../../render/extern/include
+ ../../windowmanager
../../../../intern/guardedalloc
)
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 39f77973876..160df57d5f4 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -808,14 +808,14 @@ static int object_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- int islamp= 0;
+ /* int islamp= 0; */ /* UNUSED */
if(CTX_data_edit_object(C))
return OPERATOR_CANCELLED;
CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
- if(base->object->type==OB_LAMP) islamp= 1;
+ /* if(base->object->type==OB_LAMP) islamp= 1; */
/* deselect object -- it could be used in other scenes */
base->object->flag &= ~SELECT;
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index 57f6c9de88e..679e4e58017 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -860,6 +860,10 @@ static void finish_images(MultiresBakeRender *bkr)
RE_bake_ibuf_filter(ibuf, (char *)ibuf->userdata, bkr->bake_filter);
ibuf->userflags|= IB_BITMAPDIRTY;
+
+ if(ibuf->rect_float)
+ ibuf->userflags|= IB_RECT_INVALID;
+
if(ibuf->mipmap[0]) {
ibuf->userflags|= IB_MIPMAP_INVALID;
imb_freemipmapImBuf(ibuf);
@@ -966,9 +970,10 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
Mesh *me= (Mesh*)ob->data;
- *lvl= mmd->lvl;
+ if(ob->mode==OB_MODE_SCULPT) *lvl= mmd->sculptlvl;
+ else *lvl= mmd->lvl;
- if(mmd->lvl==0) {
+ if(*lvl==0) {
DerivedMesh *tmp_dm= CDDM_from_mesh(me, ob);
dm= CDDM_copy(tmp_dm);
tmp_dm->release(tmp_dm);
@@ -976,7 +981,7 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
MultiresModifierData tmp_mmd= *mmd;
DerivedMesh *cddm= CDDM_from_mesh(me, ob);
- tmp_mmd.lvl= mmd->lvl;
+ tmp_mmd.lvl= *lvl;
dm= multires_dm_create_from_derived(&tmp_mmd, 1, cddm, ob, 0, 0);
cddm->release(cddm);
}
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index bf8ebcea754..9a649477191 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -2164,16 +2164,20 @@ static int game_property_copy_exec(bContext *C, wmOperator *op)
} CTX_DATA_END;
}
}
- else if (ELEM(type, COPY_PROPERTIES_REPLACE, COPY_PROPERTIES_MERGE)) {
+
+ else {
CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
if (ob != ob_iter) {
if (ob->data != ob_iter->data){
- if (type == 2) {/* merge */
+ if (type == COPY_PROPERTIES_REPLACE)
+ copy_properties( &ob_iter->prop, &ob->prop );
+
+ /* merge - the default when calling with no argument */
+ else {
for(prop = ob->prop.first; prop; prop= prop->next ) {
set_ob_property(ob_iter, prop);
}
- } else /* replace */
- copy_properties( &ob_iter->prop, &ob->prop );
+ }
}
}
}
diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt
index 2aa05427223..931c6f9334f 100644
--- a/source/blender/editors/physics/CMakeLists.txt
+++ b/source/blender/editors/physics/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index b573c77c7f3..37309f1e07c 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -722,15 +722,17 @@ typedef struct FluidBakeJob {
static void fluidbake_free(void *customdata)
{
- FluidBakeJob *fb= customdata;
+ FluidBakeJob *fb= (FluidBakeJob *)customdata;
MEM_freeN(fb);
}
/* called by fluidbake, only to check job 'stop' value */
-static int fluidbake_breakjob(void *UNUSED(customdata))
+static int fluidbake_breakjob(void *customdata)
{
- //FluidBakeJob *fb= (FluidBakeJob *)customdata;
- //return *(fb->stop);
+ FluidBakeJob *fb= (FluidBakeJob *)customdata;
+
+ if(fb->stop && *(fb->stop))
+ return 1;
/* this is not nice yet, need to make the jobs list template better
* for identifying/acting upon various different jobs */
@@ -741,7 +743,7 @@ static int fluidbake_breakjob(void *UNUSED(customdata))
/* called by fluidbake, wmJob sends notifier */
static void fluidbake_updatejob(void *customdata, float progress)
{
- FluidBakeJob *fb= customdata;
+ FluidBakeJob *fb= (FluidBakeJob *)customdata;
*(fb->do_update)= 1;
*(fb->progress)= progress;
@@ -749,7 +751,7 @@ static void fluidbake_updatejob(void *customdata, float progress)
static void fluidbake_startjob(void *customdata, short *stop, short *do_update, float *progress)
{
- FluidBakeJob *fb= customdata;
+ FluidBakeJob *fb= (FluidBakeJob *)customdata;
fb->stop= stop;
fb->do_update = do_update;
@@ -764,7 +766,7 @@ static void fluidbake_startjob(void *customdata, short *stop, short *do_update,
static void fluidbake_endjob(void *customdata)
{
- FluidBakeJob *fb= customdata;
+ FluidBakeJob *fb= (FluidBakeJob *)customdata;
if (fb->settings) {
MEM_freeN(fb->settings);
diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt
index 7e497200710..cf6c4290ee0 100644
--- a/source/blender/editors/render/CMakeLists.txt
+++ b/source/blender/editors/render/CMakeLists.txt
@@ -51,8 +51,12 @@ set(SRC
)
if(WITH_CODEC_QUICKTIME)
- list(APPEND INC ../../quicktime)
- list(APPEND INC_SYS ${QUICKTIME_INCLUDE_DIRS})
+ list(APPEND INC
+ ../../quicktime
+ )
+ list(APPEND INC_SYS
+ ${QUICKTIME_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_QUICKTIME)
endif()
diff --git a/source/blender/editors/render/SConscript b/source/blender/editors/render/SConscript
index 2b9737557cd..4404ea2687c 100644
--- a/source/blender/editors/render/SConscript
+++ b/source/blender/editors/render/SConscript
@@ -3,7 +3,7 @@ Import ('env')
sources = env.Glob('*.c')
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs = '../include ../../blenlib ../../blenfont ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../gpu'
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 91babb84477..67f828008e3 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -110,7 +110,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot)
/* identifiers */
ot->name= _("Add Material Slot");
ot->idname= "OBJECT_OT_material_slot_add";
- ot->description=_("Add a new material slot or duplicate the selected one");
+ ot->description=_("Add a new material slot");
/* api callbacks */
ot->exec= material_slot_add_exec;
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index 54341257692..4282110901b 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt
index 6d82dff4283..4438bb4f035 100644
--- a/source/blender/editors/sculpt_paint/CMakeLists.txt
+++ b/source/blender/editors/sculpt_paint/CMakeLists.txt
@@ -23,14 +23,14 @@ set(INC
../include
../../blenfont
../../blenkernel
+ ../../blenlib
../../blenloader
- ../../imbuf
../../gpu
- ../../blenlib
+ ../../imbuf
../../makesdna
../../makesrna
- ../../windowmanager
../../render/extern/include
+ ../../windowmanager
../../../../intern/guardedalloc
)
diff --git a/source/blender/editors/sound/CMakeLists.txt b/source/blender/editors/sound/CMakeLists.txt
index 6d84b49166b..2b3209659fa 100644
--- a/source/blender/editors/sound/CMakeLists.txt
+++ b/source/blender/editors/sound/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_action/CMakeLists.txt b/source/blender/editors/space_action/CMakeLists.txt
index 91da0a4695d..c2e9deca9ac 100644
--- a/source/blender/editors/space_action/CMakeLists.txt
+++ b/source/blender/editors/space_action/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_api/CMakeLists.txt b/source/blender/editors/space_api/CMakeLists.txt
index c2dc2582c82..4cbb290be76 100644
--- a/source/blender/editors/space_api/CMakeLists.txt
+++ b/source/blender/editors/space_api/CMakeLists.txt
@@ -22,8 +22,8 @@
set(INC
../include
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_buttons/CMakeLists.txt b/source/blender/editors/space_buttons/CMakeLists.txt
index 71eee0aaeba..a9aaf6a6d58 100644
--- a/source/blender/editors/space_buttons/CMakeLists.txt
+++ b/source/blender/editors/space_buttons/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt
index afa746ea359..4aa6cdbcf2f 100644
--- a/source/blender/editors/space_file/CMakeLists.txt
+++ b/source/blender/editors/space_file/CMakeLists.txt
@@ -28,8 +28,8 @@ set(INC
../../imbuf
../../makesdna
../../makesrna
- ../../windowmanager
../../render/extern/include
+ ../../windowmanager
../../../../intern/guardedalloc
)
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 913e7486c63..132be9dfbc5 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -1281,7 +1281,7 @@ void FILE_OT_filenum(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
/* props */
- RNA_def_int(ot->srna, "increment", 1, 0, 100, _("Increment"), "", 0,100);
+ RNA_def_int(ot->srna, "increment", 1, -100, 100, _("Increment"), "", -100,100);
}
static int file_rename_exec(bContext *C, wmOperator *UNUSED(op))
diff --git a/source/blender/editors/space_graph/CMakeLists.txt b/source/blender/editors/space_graph/CMakeLists.txt
index 7724a5dcd87..28383b29b36 100644
--- a/source/blender/editors/space_graph/CMakeLists.txt
+++ b/source/blender/editors/space_graph/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt
index 7c2d7ffb47b..0d4408faf49 100644
--- a/source/blender/editors/space_image/CMakeLists.txt
+++ b/source/blender/editors/space_image/CMakeLists.txt
@@ -23,13 +23,13 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
- ../../windowmanager
../../render/extern/include
+ ../../windowmanager
../../../../intern/guardedalloc
)
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 25d4c023d47..ab008296092 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -806,6 +806,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
col= uiLayoutColumn(split, 1);
uiItemR(col, &imaptr, "generated_width", 0, "X", ICON_NONE);
uiItemR(col, &imaptr, "generated_height", 0, "Y", ICON_NONE);
+ uiItemR(col, &imaptr, "use_generated_float", 0, NULL, ICON_NONE);
uiItemR(split, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
}
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 304a01db59b..34d62f35aa5 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -502,7 +502,7 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
Scene *scene;
Object *obedit;
Image *ima;
- float size, min[2], max[2], d[2];
+ float size, min[2], max[2], d[2], aspx, aspy;
int width, height;
/* retrieve state */
@@ -513,6 +513,10 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
ima= ED_space_image(sima);
ED_space_image_size(sima, &width, &height);
+ ED_image_aspect(ima, &aspx, &aspy);
+
+ width= width*aspx;
+ height= height*aspy;
/* get bounds */
if(!ED_uvedit_minmax(scene, ima, obedit, min, max))
diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt
index c6ed1b7bac7..22347df93a3 100644
--- a/source/blender/editors/space_info/CMakeLists.txt
+++ b/source/blender/editors/space_info/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
diff --git a/source/blender/editors/space_logic/CMakeLists.txt b/source/blender/editors/space_logic/CMakeLists.txt
index 39b44f88203..f4bb255e11f 100644
--- a/source/blender/editors/space_logic/CMakeLists.txt
+++ b/source/blender/editors/space_logic/CMakeLists.txt
@@ -23,12 +23,12 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
+ ../../editors/interface
../../makesdna
../../makesrna
../../windowmanager
- ../../editors/interface
../../../../intern/guardedalloc
)
diff --git a/source/blender/editors/space_nla/CMakeLists.txt b/source/blender/editors/space_nla/CMakeLists.txt
index ebeb959bf17..819e80d7b2e 100644
--- a/source/blender/editors/space_nla/CMakeLists.txt
+++ b/source/blender/editors/space_nla/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index 9172bc4e9eb..dcd6bcd3403 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -23,14 +23,14 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
../../nodes
- ../../windowmanager
../../render/extern/include
+ ../../windowmanager
../../../../intern/guardedalloc
../../../../intern/opennl/extern
)
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 1bf2c3d89bd..50e657bbb61 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -1869,10 +1869,17 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
else {
/* check cyclic */
if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
- if(link->fromnode->flag & SELECT)
- th_col1= TH_EDGE_SELECT;
- if(link->tonode->flag & SELECT)
- th_col2= TH_EDGE_SELECT;
+ /* special indicated link, on drop-node */
+ if(link->flag & NODE_LINKFLAG_HILITE) {
+ th_col1= th_col2= TH_ACTIVE;
+ }
+ else {
+ /* regular link */
+ if(link->fromnode->flag & SELECT)
+ th_col1= TH_EDGE_SELECT;
+ if(link->tonode->flag & SELECT)
+ th_col2= TH_EDGE_SELECT;
+ }
do_shaded= 1;
do_triple= 1;
}
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index fc6281db5bc..0cd7d19a658 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -781,14 +781,15 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
}
{ /* always hide/reveal unused sockets */
- int shade;
-
- iconofs-=iconbutw;
// XXX re-enable
- /*if(node_has_hidden_sockets(node))
+ /* int shade;
+ if(node_has_hidden_sockets(node))
shade= -40;
- else*/
- shade= -90;
+ else
+ shade= -90; */
+
+ iconofs-=iconbutw;
+
uiDefIconBut(node->block, LABEL, B_REDR, ICON_PLUS, iconofs, rct->ymax-NODE_DY,
iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
}
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 132ea200c54..3100dc7da26 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -1103,7 +1103,7 @@ void NODE_OT_backimage_move(wmOperatorType *ot)
ot->cancel= snode_bg_viewmove_cancel;
/* flags */
- ot->flag= OPTYPE_BLOCKING;
+ ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
}
static int backimage_zoom(bContext *C, wmOperator *op)
@@ -2002,12 +2002,13 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
/* ****************** Duplicate *********************** */
-static int node_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
+static int node_duplicate_exec(bContext *C, wmOperator *op)
{
SpaceNode *snode= CTX_wm_space_node(C);
bNodeTree *ntree= snode->edittree;
bNode *node, *newnode, *lastnode;
bNodeLink *link, *newlink, *lastlink;
+ int keep_inputs = RNA_boolean_get(op->ptr, "keep_inputs");
ED_preview_kill_jobs(C);
@@ -2035,10 +2036,11 @@ static int node_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
*/
lastlink = ntree->links.last;
for (link=ntree->links.first; link; link=link->next) {
- /* this creates new links between copied nodes,
- * as well as input links from unselected (when fromnode==NULL) !
+ /* This creates new links between copied nodes.
+ * If keep_inputs is set, also copies input links from unselected (when fromnode==NULL)!
*/
- if (link->tonode && (link->tonode->flag & NODE_SELECT)) {
+ if (link->tonode && (link->tonode->flag & NODE_SELECT)
+ && (keep_inputs || (link->fromnode && (link->fromnode->flag & NODE_SELECT)))) {
newlink = MEM_callocN(sizeof(bNodeLink), "bNodeLink");
newlink->flag = link->flag;
newlink->tonode = link->tonode->new_node;
@@ -2098,6 +2100,8 @@ void NODE_OT_duplicate(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "keep_inputs", 0, _("Keep Inputs"), _("Keep the input links to duplicated nodes"));
}
/* *************************** add link op ******************** */
@@ -2116,9 +2120,9 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeL
if(tlink) {
/* try to move the existing link to the next available socket */
if (tlink->tonode) {
- /* is there a free input socket with same type? */
+ /* is there a free input socket with the target type? */
for(sock= tlink->tonode->inputs.first; sock; sock= sock->next) {
- if(sock->type==tlink->fromsock->type)
+ if(sock->type==tlink->tosock->type)
if(nodeCountSocketLinks(snode->edittree, sock) < sock->limit)
break;
}
@@ -2490,6 +2494,151 @@ void NODE_OT_links_cut(wmOperatorType *ot)
RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, _("Cursor"), "", 0, INT_MAX);
}
+/* ********************* automatic node insert on dragging ******************* */
+
+/* assumes sockets in list */
+static bNodeSocket *socket_best_match(ListBase *sockets, int type)
+{
+ bNodeSocket *sock;
+
+ /* first, match type */
+ for(sock= sockets->first; sock; sock= sock->next)
+ if(!(sock->flag & SOCK_HIDDEN))
+ if(type == sock->type)
+ return sock;
+
+ /* then just use first unhidden socket */
+ for(sock= sockets->first; sock; sock= sock->next)
+ if(!(sock->flag & SOCK_HIDDEN))
+ return sock;
+
+ /* OK, let's unhide proper one */
+ for(sock= sockets->first; sock; sock= sock->next) {
+ if(type == sock->type) {
+ sock->flag &= ~SOCK_HIDDEN;
+ return sock;
+ }
+ }
+
+ /* just the first */
+ sock= sockets->first;
+ sock->flag &= ~SOCK_HIDDEN;
+
+ return sockets->first;
+}
+
+/* prevent duplicate testing code below */
+static SpaceNode *ed_node_link_conditions(ScrArea *sa, bNode **select)
+{
+ SpaceNode *snode= sa?sa->spacedata.first:NULL;
+ bNode *node;
+ bNodeLink *link;
+
+ /* no unlucky accidents */
+ if(sa==NULL || sa->spacetype!=SPACE_NODE) return NULL;
+
+ *select= NULL;
+
+ for(node= snode->edittree->nodes.first; node; node= node->next) {
+ if(node->flag & SELECT) {
+ if(*select)
+ break;
+ else
+ *select= node;
+ }
+ }
+ /* only one selected */
+ if(node || *select==NULL) return NULL;
+
+ /* correct node */
+ if((*select)->inputs.first==NULL || (*select)->outputs.first==NULL) return NULL;
+
+ /* test node for links */
+ for(link= snode->edittree->links.first; link; link=link->next) {
+ if(link->tonode == *select || link->fromnode == *select)
+ return NULL;
+ }
+
+ return snode;
+}
+
+/* assumes link with NODE_LINKFLAG_HILITE set */
+void ED_node_link_insert(ScrArea *sa)
+{
+ bNode *node, *select;
+ SpaceNode *snode= ed_node_link_conditions(sa, &select);
+ bNodeLink *link;
+ bNodeSocket *sockto;
+
+ if(snode==NULL) return;
+
+ /* get the link */
+ for(link= snode->edittree->links.first; link; link=link->next)
+ if(link->flag & NODE_LINKFLAG_HILITE)
+ break;
+
+ if(link) {
+ node= link->tonode;
+ sockto= link->tosock;
+
+ link->tonode= select;
+ link->tosock= socket_best_match(&select->inputs, link->fromsock->type);
+ link->flag &= ~NODE_LINKFLAG_HILITE;
+
+ nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
+ ntreeSolveOrder(snode->edittree); /* needed for pointers */
+ snode_tag_changed(snode, select);
+ ED_node_changed_update(snode->id, select);
+ }
+}
+
+
+/* test == 0, clear all intersect flags */
+void ED_node_link_intersect_test(ScrArea *sa, int test)
+{
+ bNode *select;
+ SpaceNode *snode= ed_node_link_conditions(sa, &select);
+ bNodeLink *link, *selink=NULL;
+ float mcoords[6][2];
+
+ if(snode==NULL) return;
+
+ /* clear flags */
+ for(link= snode->edittree->links.first; link; link=link->next)
+ link->flag &= ~NODE_LINKFLAG_HILITE;
+
+ if(test==0) return;
+
+ /* okay, there's 1 node, without links, now intersect */
+ mcoords[0][0]= select->totr.xmin;
+ mcoords[0][1]= select->totr.ymin;
+ mcoords[1][0]= select->totr.xmax;
+ mcoords[1][1]= select->totr.ymin;
+ mcoords[2][0]= select->totr.xmax;
+ mcoords[2][1]= select->totr.ymax;
+ mcoords[3][0]= select->totr.xmin;
+ mcoords[3][1]= select->totr.ymax;
+ mcoords[4][0]= select->totr.xmin;
+ mcoords[4][1]= select->totr.ymin;
+ mcoords[5][0]= select->totr.xmax;
+ mcoords[5][1]= select->totr.ymax;
+
+ /* we only tag a single link for intersect now */
+ /* idea; use header dist when more? */
+ for(link= snode->edittree->links.first; link; link=link->next) {
+
+ if(cut_links_intersect(link, mcoords, 5)) { /* intersect code wants edges */
+ if(selink)
+ break;
+ selink= link;
+ }
+ }
+
+ if(link==NULL && selink)
+ selink->flag |= NODE_LINKFLAG_HILITE;
+}
+
+
/* ******************************** */
// XXX some code needing updating to operators...
@@ -2912,7 +3061,8 @@ void NODE_OT_delete(wmOperatorType *ot)
/* note: in cmp_util.c is similar code, for node_compo_pass_on() */
/* used for disabling node (similar code in node_draw.c for disable line) */
-static void node_delete_reconnect(bNodeTree* tree, bNode* node) {
+static void node_delete_reconnect(bNodeTree* tree, bNode* node)
+{
bNodeLink *link, *next;
bNodeSocket *valsocket= NULL, *colsocket= NULL, *vecsocket= NULL;
bNodeSocket *deliveringvalsocket= NULL, *deliveringcolsocket= NULL, *deliveringvecsocket= NULL;
@@ -3140,3 +3290,5 @@ void NODE_OT_add_file(wmOperatorType *ot)
RNA_def_string(ot->srna, "name", "Image", 24, _("Name"), _("Datablock name to assign."));
}
+
+
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index 23682577b8a..a5646a51347 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -96,8 +96,6 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event)
if(node->flag & NODE_TEST) node->flag |= NODE_SELECT;
}
- snode_autoconnect(snode, 1, 0);
-
/* deselect after autoconnection */
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & NODE_TEST) node->flag &= ~NODE_SELECT;
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 08e506253f8..3a4ca866d41 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -103,11 +103,18 @@ void node_operatortypes(void)
void ED_operatormacros_node(void)
{
wmOperatorType *ot;
+ wmOperatorTypeMacro *mot;
ot= WM_operatortype_append_macro("NODE_OT_duplicate_move", _("Duplicate"), OPTYPE_UNDO|OPTYPE_REGISTER);
WM_operatortype_macro_define(ot, "NODE_OT_duplicate");
WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+ /* modified operator call for duplicating with input links */
+ ot= WM_operatortype_append_macro("NODE_OT_duplicate_move_keep_inputs", _("Duplicate"), OPTYPE_UNDO|OPTYPE_REGISTER);
+ mot = WM_operatortype_macro_define(ot, "NODE_OT_duplicate");
+ RNA_boolean_set(mot->ptr, "keep_inputs", 1);
+ WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+
ot= WM_operatortype_append_macro("NODE_OT_select_link_viewer", _("Link Viewer"), OPTYPE_UNDO);
WM_operatortype_macro_define(ot, "NODE_OT_select");
WM_operatortype_macro_define(ot, "NODE_OT_link_viewer");
@@ -157,6 +164,8 @@ void node_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_menu(keymap, "NODE_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "NODE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
+ /* modified operator call for duplicating with input links */
+ WM_keymap_add_item(keymap, "NODE_OT_duplicate_move_keep_inputs", DKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
WM_keymap_add_item(keymap, "NODE_OT_hide_toggle", HKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NODE_OT_mute_toggle", MKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 029c55d0851..3c5f4a163a2 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -228,6 +228,13 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
else if (wmn->action == NA_SELECTED)
ED_area_tag_redraw(sa);
break;
+ case NC_SCREEN:
+ switch(wmn->data) {
+ case ND_ANIMPLAY:
+ ED_area_tag_refresh(sa);
+ break;
+ }
+ break;
case NC_IMAGE:
if (wmn->action == NA_EDITED) {
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index bda431c0290..f7f6ff96b31 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
diff --git a/source/blender/editors/space_script/CMakeLists.txt b/source/blender/editors/space_script/CMakeLists.txt
index eaa782908a7..c08beed3051 100644
--- a/source/blender/editors/space_script/CMakeLists.txt
+++ b/source/blender/editors/space_script/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
@@ -45,8 +45,12 @@ set(SRC
)
if(WITH_PYTHON)
- list(APPEND INC ../../python)
- list(APPEND INC_SYS ${PYTHON_INCLUDE_DIRS})
+ list(APPEND INC
+ ../../python
+ )
+ list(APPEND INC_SYS
+ ${PYTHON_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_PYTHON)
endif()
diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt
index e7960759c77..9b978dffc39 100644
--- a/source/blender/editors/space_sequencer/CMakeLists.txt
+++ b/source/blender/editors/space_sequencer/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../imbuf
../../makesdna
../../makesrna
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index 66309963609..4cde3632da2 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -103,6 +103,8 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag)
RNA_def_boolean(ot->srna, "replace_sel", 1, _("Replace Selection"), _("replace the current selection"));
+ RNA_def_boolean(ot->srna, "overlap", 0, _("Allow Overlap"), _("Don't correct overlap on new sequence strips"));
+
if(flag & SEQPROP_FILES)
RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, _("Files"), "");
}
@@ -252,7 +254,11 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op)
seq_active_set(scene, seq);
seq->flag |= SELECT;
}
-
+
+ if(RNA_boolean_get(op->ptr, "overlap") == FALSE) {
+ if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+ }
+
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
return OPERATOR_FINISHED;
@@ -307,6 +313,7 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
SeqLoadInfo seq_load;
Sequence *seq;
int tot_files;
+ const short overlap= RNA_boolean_get(op->ptr, "overlap");
seq_load_operator_info(&seq_load, op);
@@ -327,12 +334,20 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
BLI_join_dirfile(seq_load.path, sizeof(seq_load.path), dir_only, file_only);
seq= seq_load_func(C, ed->seqbasep, &seq_load);
+
+ if(overlap == FALSE) {
+ if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+ }
}
RNA_END;
}
else {
/* single file */
seq= seq_load_func(C, ed->seqbasep, &seq_load);
+
+ if(overlap == FALSE) {
+ if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+ }
}
if (seq_load.tot_success==0) {
@@ -508,7 +523,11 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
/* last active name */
strncpy(ed->act_imagedir, strip->dir, FILE_MAXDIR-1);
-
+
+ if(RNA_boolean_get(op->ptr, "overlap") == FALSE) {
+ if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+ }
+
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
return OPERATOR_FINISHED;
@@ -658,7 +677,9 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
}
}
- if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+ if(RNA_boolean_get(op->ptr, "overlap") == FALSE) {
+ if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+ }
update_changed_seq_and_deps(scene, seq, 1, 1); /* runs calc_sequence */
diff --git a/source/blender/editors/space_sound/CMakeLists.txt b/source/blender/editors/space_sound/CMakeLists.txt
index 367d07c0c0b..870065966cc 100644
--- a/source/blender/editors/space_sound/CMakeLists.txt
+++ b/source/blender/editors/space_sound/CMakeLists.txt
@@ -22,8 +22,8 @@
set(INC
../include
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_text/CMakeLists.txt b/source/blender/editors/space_text/CMakeLists.txt
index 0c174225a58..acf00d205a6 100644
--- a/source/blender/editors/space_text/CMakeLists.txt
+++ b/source/blender/editors/space_text/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
@@ -46,8 +46,12 @@ set(SRC
)
if(WITH_PYTHON)
- list(APPEND INC ../../python)
- list(APPEND INC_SYS ${PYTHON_INCLUDE_DIRS})
+ list(APPEND INC
+ ../../python
+ )
+ list(APPEND INC_SYS
+ ${PYTHON_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_PYTHON)
endif()
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 2e8cc6bfe9c..b9f73ffdbf5 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -36,6 +36,7 @@
#include <string.h>
#include <ctype.h> /* ispunct */
#include <sys/stat.h>
+#include <errno.h>
#include "MEM_guardedalloc.h"
@@ -451,15 +452,14 @@ static void txt_write_file(Text *text, ReportList *reports)
FILE *fp;
TextLine *tmp;
struct stat st;
- int res;
- char file[FILE_MAXDIR+FILE_MAXFILE];
+ char filepath[FILE_MAXDIR+FILE_MAXFILE];
- BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.main->name);
+ BLI_strncpy(filepath, text->name, FILE_MAXDIR+FILE_MAXFILE);
+ BLI_path_abs(filepath, G.main->name);
- fp= fopen(file, "w");
+ fp= fopen(filepath, "w");
if(fp==NULL) {
- BKE_report(reports, RPT_ERROR, "Unable to save file.");
+ BKE_reportf(reports, RPT_ERROR, "Unable to save \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error writing file");
return;
}
@@ -473,8 +473,13 @@ static void txt_write_file(Text *text, ReportList *reports)
fclose (fp);
- res= stat(file, &st);
- text->mtime= st.st_mtime;
+ if(stat(filepath, &st) == 0) {
+ text->mtime= st.st_mtime;
+ }
+ else {
+ text->mtime= 0;
+ BKE_reportf(reports, RPT_WARNING, "Unable to stat \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error starrng file");
+ }
if(text->flags & TXT_ISDIRTY)
text->flags ^= TXT_ISDIRTY;
diff --git a/source/blender/editors/space_time/CMakeLists.txt b/source/blender/editors/space_time/CMakeLists.txt
index 965f7e541b8..d6bf4a551ce 100644
--- a/source/blender/editors/space_time/CMakeLists.txt
+++ b/source/blender/editors/space_time/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_userpref/CMakeLists.txt b/source/blender/editors/space_userpref/CMakeLists.txt
index 656a5d2f0ef..43ac90dce94 100644
--- a/source/blender/editors/space_userpref/CMakeLists.txt
+++ b/source/blender/editors/space_userpref/CMakeLists.txt
@@ -22,8 +22,8 @@
set(INC
../include
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt
index 0a12a28af8d..c6e936606c8 100644
--- a/source/blender/editors/space_view3d/CMakeLists.txt
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -23,14 +23,14 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../gpu
../../imbuf
../../makesdna
../../makesrna
- ../../windowmanager
../../render/extern/include
+ ../../windowmanager
../../../../intern/guardedalloc
../../../../intern/smoke/extern
)
@@ -61,7 +61,9 @@ set(SRC
)
if(WITH_GAMEENGINE)
- list(APPEND INC ../../../../source/gameengine/BlenderRoutines)
+ list(APPEND INC
+ ../../../gameengine/BlenderRoutines
+ )
add_definitions(-DWITH_GAMEENGINE)
endif()
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index e314d249e6d..e6889f4563f 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -1335,6 +1335,11 @@ static void draw_focus_cross(float dist, float size)
glEnd();
}
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+float view3d_camera_border_hack_col[4];
+short view3d_camera_border_hack_test= FALSE;
+#endif
+
/* flag similar to draw_object() */
static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int flag)
{
@@ -1348,7 +1353,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
const float scax= 1.0f / len_v3(ob->obmat[0]);
const float scay= 1.0f / len_v3(ob->obmat[1]);
const float scaz= 1.0f / len_v3(ob->obmat[2]);
-
+
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+ if(is_view && !(G.f & G_PICKSEL)) {
+ glGetFloatv(GL_CURRENT_COLOR, view3d_camera_border_hack_col);
+ view3d_camera_border_hack_test= TRUE;
+ return;
+ }
+#endif
+
cam= ob->data;
aspx= (float) scene->r.xsch*scene->r.xasp;
aspy= (float) scene->r.ysch*scene->r.yasp;
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 11d476977b2..cf696a6d063 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -969,7 +969,7 @@ static void v3d_editarmature_buts(uiLayout *layout, Object *ob)
ebone= arm->act_edbone;
if (!ebone || (ebone->layer & arm->layer)==0) {
- uiItemL(col, "Nothing selected", ICON_NONE);
+ uiItemL(layout, "Nothing selected", ICON_NONE);
return;
}
// row= uiLayoutRow(layout, 0);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 0ed62f3953f..d2ff6eef097 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -1007,6 +1007,8 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
/* note: quite un-scientific but without this bit extra
* 0.0001 on the lower left the 2D border sometimes
* obscures the 3D camera border */
+ /* note: with VIEW3D_CAMERA_BORDER_HACK defined this error isn't noticable
+ * but keep it here incase we need to remove the workaround */
x1i= (int)(x1 - 1.0001f);
y1i= (int)(y1 - 1.0001f);
x2i= (int)(x2 + (1.0f-0.0001f));
@@ -1039,7 +1041,17 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
setlinestyle(0);
UI_ThemeColor(TH_BACK);
glRectf(x1i, y1i, x2i, y2i);
-
+
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+ {
+ if(view3d_camera_border_hack_test == TRUE) {
+ glColor4fv(view3d_camera_border_hack_col);
+ glRectf(x1i+1, y1i+1, x2i-1, y2i-1);
+ view3d_camera_border_hack_test= FALSE;
+ }
+ }
+#endif
+
setlinestyle(3);
UI_ThemeColor(TH_WIRE);
glRectf(x1i, y1i, x2i, y2i);
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index fca22dc8c8b..3b760605444 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -131,7 +131,6 @@ void ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
}
else {
ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
- root_parent= v3d->camera;
DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
WM_main_add_notifier(NC_OBJECT|ND_TRANSFORM, v3d->camera);
}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 32c2ba32b93..a4e1081d6cd 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -507,17 +507,6 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
- /* NDOF */
- /* Not implemented yet
- if (G.ndofdevice ==0 ) {
- uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,UI_UNIT_X+10,UI_UNIT_Y, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode");
-
- uiDefIconButC(block, TOG, B_NDOF, ICON_NDOF_DOM,
- 0,0,UI_UNIT_X,UI_UNIT_Y,
- &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis");
- }
- */
-
/* Transform widget / manipulators */
row= uiLayoutRow(layout, 1);
uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index aa92f0d0a59..d3886d48873 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -194,6 +194,16 @@ extern const char *view3d_context_dir[]; /* doc access */
/* draw_volume.c */
void draw_volume(struct ARegion *ar, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow);
+/* workaround for trivial but noticable camera bug caused by imprecision
+ * between view border calculation in 2D/3D space, workaround for bug [#28037].
+ * without this deifne we get the old behavior which is to try and align them
+ * both which _mostly_ works fine, but when the camera moves beyond ~1000 in
+ * any direction it starts to fail */
+#define VIEW3D_CAMERA_BORDER_HACK
+#ifdef VIEW3D_CAMERA_BORDER_HACK
+extern float view3d_camera_border_hack_col[4];
+extern short view3d_camera_border_hack_test;
+#endif
#endif /* ED_VIEW3D_INTERN_H */
diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index 3d9c238470e..0917fb362ab 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index d61397976d3..ec002597922 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -972,7 +972,7 @@ int transformEvent(TransInfo *t, wmEvent *event)
break;
case OKEY:
if (t->flag & T_PROP_EDIT && event->shift) {
- t->prop_mode = (t->prop_mode + 1) % 6;
+ t->prop_mode = (t->prop_mode + 1) % PROP_MODE_MAX;
calculatePropRatio(t);
t->redraw |= TREDRAW_HARD;
}
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index d8e750acb88..d8e42488787 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -96,7 +96,7 @@ typedef struct TransSnap {
short modeSelect;
short align;
char project;
- char project_self;
+ char snap_self;
short peel;
short status;
float snapPoint[3]; /* snapping from this point */
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 16bfc75c979..0a5e290643a 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -87,6 +87,7 @@
#include "ED_object.h"
#include "ED_markers.h"
#include "ED_mesh.h"
+#include "ED_node.h"
#include "ED_types.h"
#include "ED_uvedit.h"
#include "ED_curve.h" /* for ED_curve_editnurbs */
@@ -2182,6 +2183,12 @@ void flushTransNodes(TransInfo *t)
td->loc2d[0]= td->loc[0];
td->loc2d[1]= td->loc[1];
}
+
+ /* handle intersection with noodles */
+ if(t->total==1) {
+ ED_node_link_intersect_test(t->sa, 1);
+ }
+
}
/* *** SEQUENCE EDITOR *** */
@@ -4756,7 +4763,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
else if (t->spacetype == SPACE_NODE) {
- /* pass */
+ if(cancelled == 0)
+ ED_node_link_insert(t->sa);
+
+ /* clear link line */
+ ED_node_link_intersect_test(t->sa, 0);
+
}
else if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 20a26d8c58d..6d0a978700f 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -1070,7 +1070,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
}
}
// Need stuff to take it from edit mesh or whatnot here
- else
+ else if (t->spacetype == SPACE_VIEW3D)
{
if (t->obedit && t->obedit->type == OB_MESH && (((Mesh *)t->obedit->data)->editflag & ME_EDIT_MIRROR_X))
{
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index fdf9e947590..f61cc51de98 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -956,6 +956,8 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index d9d9b0f9102..ca89670dedb 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -392,7 +392,7 @@ static void initSnappingMode(TransInfo *t)
}
else
{
- t->tsnap.modeSelect = t->tsnap.project_self ? SNAP_ALL : SNAP_NOT_OBEDIT;
+ t->tsnap.modeSelect = t->tsnap.snap_self ? SNAP_ALL : SNAP_NOT_OBEDIT;
}
}
/* Particles edit mode*/
@@ -458,23 +458,26 @@ void initSnapping(TransInfo *t, wmOperator *op)
t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project");
}
- if (RNA_struct_find_property(op->ptr, "use_snap_project_self"))
+ if (RNA_struct_find_property(op->ptr, "use_snap_self"))
{
- t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project_self");
+ t->tsnap.snap_self = RNA_boolean_get(op->ptr, "use_snap_self");
}
}
}
/* use scene defaults only when transform is modal */
else if (t->flag & T_MODAL)
{
- if (ts->snap_flag & SCE_SNAP) {
- t->modifiers |= MOD_SNAP;
- }
+ if(ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE))
+ {
+ if (ts->snap_flag & SCE_SNAP) {
+ t->modifiers |= MOD_SNAP;
+ }
- t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE);
- t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
- t->tsnap.project_self = !((t->settings->snap_flag & SCE_SNAP_PROJECT_NO_SELF) == SCE_SNAP_PROJECT_NO_SELF);
- t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
+ t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE);
+ t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
+ t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) == SCE_SNAP_NO_SELF);
+ t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
+ }
}
t->tsnap.target = snap_target;
@@ -1944,6 +1947,11 @@ static void applyGrid(TransInfo *t, float *val, int max_index, float fac[3], Gea
int i;
float asp[3] = {1.0f, 1.0f, 1.0f}; // TODO: Remove hard coded limit here (3)
+ if(max_index > 2) {
+ printf("applyGrid: invalid index %d, clamping\n", max_index);
+ max_index= 2;
+ }
+
// Early bailing out if no need to snap
if (fac[action] == 0.0f)
return;
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index f67056f5b71..e284540c5a6 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index d139a4b5150..4fedf35acd1 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -360,19 +360,25 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
ret= 1;
}
}
+ else {
+ if (G.f & G_DEBUG) {
+ printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+ }
+ }
/* set region back */
CTX_wm_region_set(C, ar);
}
else {
if (G.f & G_DEBUG) {
- printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+ printf("redo_cb: ED_undo_operator_repeat called with NULL 'op'\n");
}
}
return ret;
}
+
void ED_undo_operator_repeat_cb(bContext *C, void *arg_op, void *UNUSED(arg_unused))
{
ED_undo_operator_repeat(C, (wmOperator *)arg_op);
diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt
index d25ee20e5b5..4055585af74 100644
--- a/source/blender/editors/uvedit/CMakeLists.txt
+++ b/source/blender/editors/uvedit/CMakeLists.txt
@@ -23,8 +23,8 @@ set(INC
../include
../../blenfont
../../blenkernel
- ../../blenloader
../../blenlib
+ ../../blenloader
../../makesdna
../../makesrna
../../windowmanager
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index eab35ba29c0..0b042f4c7eb 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -1059,6 +1059,134 @@ static void weld_align_uv(bContext *C, int tool)
}
}
+ if(tool == 's' || tool == 't' || tool == 'u') {
+ /* pass 1&2 variables */
+ int i, j;
+ int starttmpl= -1, connectedtostarttmpl= -1, startcorner;
+ int endtmpl= -1, connectedtoendtmpl= -1, endcorner;
+ MTFace *startface, *endface;
+ int itmpl, jtmpl;
+ EditVert *eve;
+ int pass; /* first 2 passes find endpoints, 3rd pass moves middle points, 4th pass is fail-on-face-selected */
+ EditFace *startefa, *endefa;
+
+ /* pass 3 variables */
+ float startx, starty, firstm, firstb, midx, midy;
+ float endx, endy, secondm, secondb, midmovedx, midmovedy;
+ float IsVertical_check= -1;
+ float IsHorizontal_check= -1;
+
+ for(i= 0, eve= em->verts.first; eve; eve= eve->next, i++) /* give each point a unique name */
+ eve->tmp.l= i;
+ for(pass= 1; pass <= 3; pass++) { /* do this for each endpoint */
+ if(pass == 3){ /* calculate */
+ startx= startface->uv[startcorner][0];
+ starty= startface->uv[startcorner][1];
+ endx= endface->uv[endcorner][0];
+ endy= endface->uv[endcorner][1];
+ firstm= (endy-starty)/(endx-startx);
+ firstb= starty-(firstm*startx);
+ secondm= -1.0f/firstm;
+ if(startx == endx) IsVertical_check= startx;
+ if(starty == endy) IsHorizontal_check= starty;
+ }
+ for(efa= em->faces.first; efa; efa= efa->next) { /* for each face */
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); /* get face */
+ if(uvedit_face_visible(scene, ima, efa, tf)) { /* if you can see it */
+ if(uvedit_face_selected(scene, efa, tf)) { /* if the face is selected, get out now! */
+ pass= 4;
+ break;
+ }
+ for(i= 0; (i < 3 || (i == 3 && efa->v4)); i++) { /* for each point of the face */
+ itmpl= (*(&efa->v1 + i))->tmp.l; /* get unique name for points */
+ if(pass == 3) { /* move */
+ if(uvedit_uv_selected(scene, efa, tf, i)) {
+ if(!(itmpl == starttmpl || itmpl == endtmpl)) {
+ if(IsVertical_check != -1) tf->uv[i][0]= IsVertical_check;
+ if(IsHorizontal_check != -1) tf->uv[i][1]= IsHorizontal_check;
+ if((IsVertical_check == -1) && (IsHorizontal_check == -1)) {
+ midx= tf->uv[i][0];
+ midy= tf->uv[i][1];
+ if(tool == 's') {
+ secondb= midy-(secondm*midx);
+ midmovedx= (secondb-firstb)/(firstm-secondm);
+ midmovedy= (secondm*midmovedx)+secondb;
+ tf->uv[i][0]= midmovedx;
+ tf->uv[i][1]= midmovedy;
+ }
+ else if(tool == 't') {
+ tf->uv[i][0]= (midy-firstb)/firstm; /* midmovedx */
+ }
+ else if(tool == 'u') {
+ tf->uv[i][1]= (firstm*midx)+firstb; /* midmovedy */
+ }
+ }
+ }
+ }
+ }
+ else {
+ for(j= 0; (j < 3 || (j == 3 && efa->v4)); j++) { /* also for each point on the face */
+ jtmpl= (*(&efa->v1 + j))->tmp.l;
+ if(i != j && (!efa->v4 || ABS(i-j) != 2)) { /* if the points are connected */
+ /* quad (0,1,2,3) 0,1 0,3 1,0 1,2 2,1 2,3 3,0 3,2
+ * triangle (0,1,2) 0,1 0,2 1,0 1,2 2,0 2,1 */
+ if(uvedit_uv_selected(scene, efa, tf, i) && uvedit_uv_selected(scene, efa, tf, j)) {
+ /* if the edge is selected */
+ if(pass == 1) { /* if finding first endpoint */
+ if(starttmpl == -1) { /* if the first endpoint isn't found yet */
+ starttmpl= itmpl; /* set unique name for endpoint */
+ connectedtostarttmpl= jtmpl;
+ /* get point that endpoint is connected to */
+ startface= tf; /* get face it's on */
+ startcorner= i; /* what corner of the face? */
+ startefa= efa;
+ efa= em->faces.first;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= -1;
+ break;
+ }
+ if(starttmpl == itmpl && jtmpl != connectedtostarttmpl) {
+ starttmpl= -1; /* not an endpoint */
+ efa= startefa;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= startcorner;
+ break;
+ }
+ }
+ else if(pass == 2) { /* if finding second endpoint */
+ if(endtmpl == -1 && itmpl != starttmpl) {
+ endtmpl= itmpl;
+ connectedtoendtmpl= jtmpl;
+ endface= tf;
+ endcorner= i;
+ endefa= efa;
+ efa= em->faces.first;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= -1;
+ break;
+ }
+ if(endtmpl == itmpl && jtmpl != connectedtoendtmpl) {
+ endtmpl= -1;
+ efa= endefa;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= endcorner;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if(pass == 2 && (starttmpl == -1 || endtmpl == -1)) {
+ /* if endpoints aren't found */
+ pass=4;
+ }
+ }
+ }
+
uvedit_live_unwrap_update(sima, scene, obedit);
DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -1076,6 +1204,9 @@ static int align_exec(bContext *C, wmOperator *op)
static void UV_OT_align(wmOperatorType *ot)
{
static EnumPropertyItem axis_items[] = {
+ {'s', "ALIGN_S", 0, N_("Straighten"), N_("Align UVs along the line defined by the endpoints")},
+ {'t', "ALIGN_T", 0, N_("Straighten X"), N_("Align UVs along the line defined by the endpoints along the X axis")},
+ {'u', "ALIGN_U", 0, N_("Straighten Y"), N_("Align UVs along the line defined by the endpoints along the Y axis")},
{'a', "ALIGN_AUTO", 0, N_("Align Auto"), N_("Automatically choose the axis on which there is most alignment already")},
{'x', "ALIGN_X", 0, N_("Align X"), N_("Align UVs on X axis")},
{'y', "ALIGN_Y", 0, N_("Align Y"), N_("Align UVs on Y axis")},
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 76e347270ba..8f575dfb50b 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -26,8 +26,8 @@
set(INC
.
- ../blenlib
../blenkernel
+ ../blenlib
../blenloader
../imbuf
../makesdna
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 3804aad6848..806c70d841f 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -671,7 +671,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
i = is;
GPU_link(mat, "shade_visifac", i, visifac, shi->refl, &i);
- vn = shi->vn;
+
/*if(ma->mode & MA_TANGENT_VN)
GPU_link(mat, "shade_tangent_v_spec", GPU_attribute(CD_TANGENT, ""), &vn);*/
diff --git a/source/blender/ikplugin/CMakeLists.txt b/source/blender/ikplugin/CMakeLists.txt
index da5c2f69635..dc637aedd6d 100644
--- a/source/blender/ikplugin/CMakeLists.txt
+++ b/source/blender/ikplugin/CMakeLists.txt
@@ -25,10 +25,10 @@
# ***** END GPL LICENSE BLOCK *****
set(INC
+ .
+ ../blenkernel
../blenlib
../makesdna
- ../blenkernel
- ../ikplugin
../../../intern/guardedalloc
../../../intern/iksolver/extern
)
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index c9a8f62a197..18b5eff5c73 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -32,12 +32,12 @@ endif()
set(INC
.
../avi
- ../blenlib
../blenkernel
+ ../blenlib
../blenloader
../makesdna
- ../../../intern/memutil
../../../intern/guardedalloc
+ ../../../intern/memutil
)
set(INC_SYS
@@ -113,29 +113,43 @@ if(WITH_IMAGE_OPENEXR)
endif()
if(WITH_IMAGE_TIFF)
- list(APPEND INC_SYS ${TIFF_INCLUDE_DIR})
+ list(APPEND INC_SYS
+ ${TIFF_INCLUDE_DIR}
+ )
add_definitions(-DWITH_TIFF)
endif()
if(WITH_IMAGE_OPENJPEG)
- list(APPEND INC_SYS ${OPENJPEG_INCLUDE_DIRS})
+ list(APPEND INC_SYS
+ ${OPENJPEG_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_OPENJPEG)
endif()
if(WITH_IMAGE_REDCODE)
- list(APPEND INC_SYS ${REDCODE_INC})
+ list(APPEND INC_SYS
+ ${REDCODE_INC}
+ )
add_definitions(-DWITH_REDCODE)
endif()
if(WITH_CODEC_QUICKTIME)
- list(APPEND INC ../quicktime)
- list(APPEND INC_SYS ${QUICKTIME_INCLUDE_DIRS})
+ list(APPEND INC
+ ../quicktime
+ )
+ list(APPEND INC_SYS
+ ${QUICKTIME_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_QUICKTIME)
endif()
if(WITH_CODEC_FFMPEG)
- list(APPEND INC ../../../intern/ffmpeg)
- list(APPEND INC_SYS ${FFMPEG_INCLUDE_DIRS})
+ list(APPEND INC
+ ../../../intern/ffmpeg
+ )
+ list(APPEND INC_SYS
+ ${FFMPEG_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_FFMPEG)
endif()
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index ff01e3a8a1e..36123592c54 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -252,7 +252,7 @@ void IMB_filter(struct ImBuf *ibuf);
void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
void IMB_mask_filter_extend(char *mask, int width, int height);
void IMB_mask_clear(struct ImBuf *ibuf, char *mask, int val);
-void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
+void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter);
void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
diff --git a/source/blender/imbuf/intern/cineon/CMakeLists.txt b/source/blender/imbuf/intern/cineon/CMakeLists.txt
index 079f34af773..4f7f20beecf 100644
--- a/source/blender/imbuf/intern/cineon/CMakeLists.txt
+++ b/source/blender/imbuf/intern/cineon/CMakeLists.txt
@@ -29,8 +29,8 @@ set(INC
..
../..
../../../blenkernel
- ../../../blenloader
../../../blenlib
+ ../../../blenloader
../../../makesdna
../../../../../intern/guardedalloc
)
diff --git a/source/blender/imbuf/intern/dds/CMakeLists.txt b/source/blender/imbuf/intern/dds/CMakeLists.txt
index fd2b94547b4..53822b830f7 100644
--- a/source/blender/imbuf/intern/dds/CMakeLists.txt
+++ b/source/blender/imbuf/intern/dds/CMakeLists.txt
@@ -28,9 +28,8 @@ set(INC
.
..
../..
- intern/include
- ../../../blenlib
../../../blenkernel
+ ../../../blenlib
../../../makesdna
../../../../../intern/guardedalloc
)
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index d12360e5a7e..1644e653df4 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Morten Mikkelsen.
*
* ***** END GPL LICENSE BLOCK *****
* filter.c
@@ -326,121 +326,132 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val)
}
}
-#define EXTEND_PIXEL(color, w) if((color)[3]) {r+= w*(color)[0]; g+= w*(color)[1]; b+= w*(color)[2]; a+= w*(color)[3]; tot+=w;}
+static int filter_make_index(const int x, const int y, const int w, const int h)
+{
+ if(x<0 || x>=w || y<0 || y>=h) return -1; /* return bad index */
+ else return y*w+x;
+}
+
+static int check_pixel_assigned(const void *buffer, const char *mask, const int index, const int depth, const int is_float)
+{
+ int res = 0;
+
+ if(index>=0) {
+ const int alpha_index = depth*index+(depth-1);
+
+ if(mask!=NULL) {
+ res = mask[index]!=0 ? 1 : 0;
+ }
+ else if( (is_float && ((const float *) buffer)[alpha_index]!=0.0f) ||
+ (!is_float && ((const unsigned char *) buffer)[alpha_index]!=0) ) {
+ res=1;
+ }
+ }
+
+ return res;
+}
/* if alpha is zero, it checks surrounding pixels and averages color. sets new alphas to 1.0
*
* When a mask is given, only effect pixels with a mask value of 1, defined as BAKE_MASK_MARGIN in rendercore.c
* */
-void IMB_filter_extend(struct ImBuf *ibuf, char *mask)
+void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter)
{
- register char *row1, *row2, *row3;
- register char *cp;
- int rowlen, x, y;
-
- rowlen= ibuf->x;
-
-
- if (ibuf->rect_float) {
- float *temprect;
- float *row1f, *row2f, *row3f;
- float *fp;
- temprect= MEM_dupallocN(ibuf->rect_float);
-
- for(y=1; y<=ibuf->y; y++) {
- /* setup rows */
- row1f= (float *)(temprect + (y-2)*rowlen*4);
- row2f= row1f + 4*rowlen;
- row3f= row2f + 4*rowlen;
- if(y==1)
- row1f= row2f;
- else if(y==ibuf->y)
- row3f= row2f;
-
- fp= (float *)(ibuf->rect_float + (y-1)*rowlen*4);
-
- for(x=0; x<rowlen; x++) {
- if((mask==NULL && fp[3]==0.0f) || (mask && mask[((y-1)*rowlen)+x]==1)) {
- int tot= 0;
- float r=0.0f, g=0.0f, b=0.0f, a=0.0f;
-
- EXTEND_PIXEL(row1f, 1);
- EXTEND_PIXEL(row2f, 2);
- EXTEND_PIXEL(row3f, 1);
- EXTEND_PIXEL(row1f+4, 2);
- EXTEND_PIXEL(row3f+4, 2);
- if(x!=rowlen-1) {
- EXTEND_PIXEL(row1f+8, 1);
- EXTEND_PIXEL(row2f+8, 2);
- EXTEND_PIXEL(row3f+8, 1);
- }
- if(tot) {
- fp[0]= r/tot;
- fp[1]= g/tot;
- fp[2]= b/tot;
- fp[3]= a/tot;
+ const int width= ibuf->x;
+ const int height= ibuf->y;
+ const int depth= 4; /* always 4 channels */
+ const int chsize= ibuf->rect_float ? sizeof(float) : sizeof(unsigned char);
+ const int bsize= width*height*depth*chsize;
+ const int is_float= ibuf->rect_float!=NULL;
+ void *dstbuf= (void *) MEM_dupallocN(ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect);
+ char *dstmask= mask==NULL ? NULL : (char *) MEM_dupallocN(mask);
+ void *srcbuf= ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect;
+ char *srcmask= mask;
+ int cannot_early_out= 1, r, n, k, i, j, c;
+ float weight[25];
+
+ /* build a weights buffer */
+ n= 2;
+ k= 0;
+ for(i = -n; i <= n; i++)
+ for(j = -n; j <= n; j++)
+ weight[k++] = sqrt((float) i * i + j * j);
+
+ /* run passes */
+ for(r = 0; cannot_early_out == 1 && r < filter; r++) {
+ int x, y;
+ cannot_early_out = 0;
+
+ for(y= 0; y<height; y++) {
+ for(x= 0; x<width; x++) {
+ const int index= filter_make_index(x, y, width, height);
+
+ /* only update unassigned pixels */
+ if(!check_pixel_assigned(srcbuf, srcmask, index, depth, is_float)) {
+ float tmp[4];
+ float wsum=0;
+ float acc[4]={0,0,0,0};
+ k = 0;
+
+ if (check_pixel_assigned(srcbuf, srcmask, filter_make_index(x-1, y, width, height), depth, is_float) ||
+ check_pixel_assigned(srcbuf, srcmask, filter_make_index(x+1, y, width, height), depth, is_float) ||
+ check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y-1, width, height), depth, is_float) ||
+ check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y+1, width, height), depth, is_float)) {
+ for(i= -n; i<=n; i++) {
+ for(j=-n; j<=n; j++) {
+ if(i != 0 || j != 0) {
+ const int tmpindex= filter_make_index(x+i, y+j, width, height);
+
+ if(check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float)) {
+ if(is_float) {
+ for(c=0; c<depth; c++)
+ tmp[c] = ((const float *) srcbuf)[depth*tmpindex+c];
+ }
+ else {
+ for(c=0; c<depth; c++)
+ tmp[c] = (float) ((const unsigned char *) srcbuf)[depth*tmpindex+c];
+ }
+
+ wsum+= weight[k];
+
+ for(c=0; c<depth; c++)
+ acc[c]+= weight[k] * tmp[c];
+ }
+ }
+ k++;
+ }
+ }
+
+ if(wsum!=0) {
+ for(c=0; c<depth; c++)
+ acc[c]/= wsum;
+
+ if(is_float) {
+ for(c=0; c<depth; c++)
+ ((float *) dstbuf)[depth*index+c] = acc[c];
+ }
+ else {
+ for(c=0; c<depth; c++) {
+ ((unsigned char *) dstbuf)[depth*index+c]= acc[c] > 255 ? 255 : (acc[c] < 0 ? 0 : ((unsigned char) (acc[c]+0.5f)));
+ }
+ }
+
+ if(dstmask!=NULL) dstmask[index]=FILTER_MASK_MARGIN; /* assigned */
+ cannot_early_out = 1;
+ }
}
}
- fp+=4;
-
- if(x!=0) {
- row1f+=4; row2f+=4; row3f+=4;
- }
}
}
- MEM_freeN(temprect);
- }
- else if(ibuf->rect) {
- int *temprect;
-
- /* make a copy, to prevent flooding */
- temprect= MEM_dupallocN(ibuf->rect);
-
- for(y=1; y<=ibuf->y; y++) {
- /* setup rows */
- row1= (char *)(temprect + (y-2)*rowlen);
- row2= row1 + 4*rowlen;
- row3= row2 + 4*rowlen;
- if(y==1)
- row1= row2;
- else if(y==ibuf->y)
- row3= row2;
-
- cp= (char *)(ibuf->rect + (y-1)*rowlen);
-
- for(x=0; x<rowlen; x++) {
- /*if(cp[3]==0) {*/
- if((mask==NULL && cp[3]==0) || (mask && mask[((y-1)*rowlen)+x]==1)) {
- int tot= 0, r=0, g=0, b=0, a=0;
-
- EXTEND_PIXEL(row1, 1);
- EXTEND_PIXEL(row2, 2);
- EXTEND_PIXEL(row3, 1);
- EXTEND_PIXEL(row1+4, 2);
- EXTEND_PIXEL(row3+4, 2);
- if(x!=rowlen-1) {
- EXTEND_PIXEL(row1+8, 1);
- EXTEND_PIXEL(row2+8, 2);
- EXTEND_PIXEL(row3+8, 1);
- }
- if(tot) {
- cp[0]= r/tot;
- cp[1]= g/tot;
- cp[2]= b/tot;
- cp[3]= a/tot;
- }
- }
- cp+=4;
-
- if(x!=0) {
- row1+=4; row2+=4; row3+=4;
- }
- }
- }
-
- MEM_freeN(temprect);
+ /* keep the original buffer up to date. */
+ memcpy(srcbuf, dstbuf, bsize);
+ if(dstmask!=NULL) memcpy(srcmask, dstmask, width*height);
}
+
+ /* free memory */
+ MEM_freeN(dstbuf);
+ if(dstmask!=NULL) MEM_freeN(dstmask);
}
/* threadsafe version, only recreates existing maps */
diff --git a/source/blender/imbuf/intern/openexr/CMakeLists.txt b/source/blender/imbuf/intern/openexr/CMakeLists.txt
index 9ca4dff5bc8..3be5219ae44 100644
--- a/source/blender/imbuf/intern/openexr/CMakeLists.txt
+++ b/source/blender/imbuf/intern/openexr/CMakeLists.txt
@@ -30,9 +30,8 @@ set(INC
../..
../../../blenkernel
../../../blenlib
- intern/include
- ../../../../../intern/guardedalloc
../../../makesdna
+ ../../../../../intern/guardedalloc
)
set(INC_SYS
@@ -44,7 +43,9 @@ set(SRC
)
if(WITH_IMAGE_OPENEXR)
- list(APPEND INC_SYS ${OPENEXR_INCLUDE_DIRS})
+ list(APPEND INC_SYS
+ ${OPENEXR_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_OPENEXR)
endif()
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 99ed2319415..dd033339ca4 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -102,7 +102,8 @@ typedef struct Image {
short animspeed;
/* for generated images */
- short gen_x, gen_y, gen_type;
+ short gen_x, gen_y;
+ char gen_type, gen_flag;
/* display aspect - for UV editing images resized for faster openGL display */
float aspx, aspy;
@@ -136,5 +137,8 @@ typedef struct Image {
#define IMA_MAX_RENDER_TEXT 512
#define IMA_MAX_RENDER_SLOT 8
+/* gen_flag */
+#define IMA_GEN_FLOAT 1
+
#endif
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index d2d8e014015..3787675f339 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -624,6 +624,7 @@ typedef struct MultiresModifierData {
typedef enum {
eMultiresModifierFlag_ControlEdges = (1<<0),
+ eMultiresModifierFlag_PlainUv = (1<<1),
} MultiresModifierFlag;
typedef struct FluidsimModifierData {
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 03387c3a63a..efaf30b02f6 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -179,6 +179,10 @@ typedef struct bNodeLink {
} bNodeLink;
+
+/* link->flag */
+#define NODE_LINKFLAG_HILITE 1
+
/* the basis for a Node tree, all links and nodes reside internal here */
/* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
typedef struct bNodeTree {
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index aace8156e9d..69ee530c0b6 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -89,7 +89,8 @@ typedef struct ParticleDupliWeight {
struct ParticleDupliWeight *next, *prev;
struct Object *ob;
short count;
- short flag, rt[2];
+ short flag;
+ short index, rt; /* only updated on file save and used on file load */
} ParticleDupliWeight;
typedef struct ParticleData {
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index f351a48b998..2211f93a8ae 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -430,7 +430,8 @@ typedef struct GameData {
/*
* Radius of the activity bubble, in Manhattan length. Objects
* outside the box are activity-culled. */
- float activityBoxRadius; //it's not being used ANYWHERE !!!!!!!!!!!!!!
+ float activityBoxRadius;
+
/*
* bit 3: (gameengine): Activity culling is enabled.
* bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling
@@ -447,7 +448,8 @@ typedef struct GameData {
/* stereo/dome mode */
struct GameDome dome;
- short stereoflag, stereomode, xsch, ysch; //xsch and ysch used for backwards compat.
+ short stereoflag, stereomode;
+ short pad2, pad3;
float eyeseparation, pad1;
} GameData;
@@ -1072,7 +1074,7 @@ typedef struct Scene {
#define SCE_SNAP_ROTATE 2
#define SCE_SNAP_PEEL_OBJECT 4
#define SCE_SNAP_PROJECT 8
-#define SCE_SNAP_PROJECT_NO_SELF 16
+#define SCE_SNAP_NO_SELF 16
/* toolsettings->snap_target */
#define SCE_SNAP_TARGET_CLOSEST 0
#define SCE_SNAP_TARGET_CENTER 1
@@ -1105,7 +1107,8 @@ typedef struct Scene {
#define PROP_SHARP 3
#define PROP_LIN 4
#define PROP_CONST 5
-#define PROP_RANDOM 6
+#define PROP_RANDOM 6
+#define PROP_MODE_MAX 7
/* toolsettings->proportional */
#define PROP_EDIT_OFF 0
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 09fb11282f9..be58daa1ac4 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -172,17 +172,25 @@ if(WITH_IMAGE_HDR)
add_definitions(-DWITH_HDR)
endif()
+if(WITH_IMAGE_FRAMESERVER)
+ add_definitions(-DWITH_FRAMESERVER)
+endif()
+
if(WITH_AUDASPACE)
add_definitions(-DWITH_AUDASPACE)
endif()
if(WITH_CODEC_QUICKTIME)
- list(APPEND INC ../../quicktime)
+ list(APPEND INC
+ ../../quicktime
+ )
add_definitions(-DWITH_QUICKTIME)
endif()
if(WITH_CODEC_FFMPEG)
- list(APPEND INC_SYS ${FFMPEG_INCLUDE_DIRS})
+ list(APPEND INC_SYS
+ ${FFMPEG_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_FFMPEG)
endif()
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 421c3a60691..160aeca4a51 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -12,6 +12,7 @@ root_build_dir=normpath(env['BF_BUILDDIR'])
source_files = env.Glob('*.c')
source_files.remove('rna_access.c')
+source_files.append('../../blenfont/intern/blf_gettext.c')
generated_files = source_files[:]
generated_files.remove('rna_define.c')
@@ -54,6 +55,8 @@ if env['WITH_BF_CINEON']:
if env['WITH_BF_HDR']:
defs.append('WITH_HDR')
+defs.append('WITH_FRAMESERVER') # TODO, make optional
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index efa7306124a..b6f38332a3b 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -4488,15 +4488,15 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
if(!(parm->flag & PROP_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) {
switch(parm->type) {
case PROP_BOOLEAN:
- if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size);
+ if(parm->arraydimension) memcpy(data, ((BooleanPropertyRNA*)parm)->defaultarray, size);
else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size);
break;
case PROP_INT:
- if(parm->arraydimension) memcpy(data, &((IntPropertyRNA*)parm)->defaultarray, size);
+ if(parm->arraydimension) memcpy(data, ((IntPropertyRNA*)parm)->defaultarray, size);
else memcpy(data, &((IntPropertyRNA*)parm)->defaultvalue, size);
break;
case PROP_FLOAT:
- if(parm->arraydimension) memcpy(data, &((FloatPropertyRNA*)parm)->defaultarray, size);
+ if(parm->arraydimension) memcpy(data, ((FloatPropertyRNA*)parm)->defaultarray, size);
else memcpy(data, &((FloatPropertyRNA*)parm)->defaultvalue, size);
break;
case PROP_ENUM:
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index a52849b3366..eac4932ac43 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -502,6 +502,11 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Generated Height", "Generated image height");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
+ prop= RNA_def_property(srna, "use_generated_float", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "gen_flag", IMA_GEN_FLOAT);
+ RNA_def_property_ui_text(prop, "Float Buffer", "Generate floating point buffer");
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
+
/* realtime properties */
prop= RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index d2c1b862fee..ba655915fb6 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -805,6 +805,11 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_ControlEdges);
RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_subsurf_uv", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flags", eMultiresModifierFlag_PlainUv);
+ RNA_def_property_ui_text(prop, "Subdivide UVs", "Use subsurf to subdivide UVs");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_lattice(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 61d6a93d147..e2794baad34 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -484,7 +484,7 @@ static PointerRNA rna_Object_active_vertex_group_get(PointerRNA *ptr)
static int rna_Object_active_vertex_group_index_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
- return MAX2(ob->actdef-1, 0);
+ return ob->actdef-1;
}
static void rna_Object_active_vertex_group_index_set(PointerRNA *ptr, int value)
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index d6af04f2475..21fa28af01a 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -45,6 +45,8 @@
// #include "ED_mesh.h"
+#include "BLI_math.h"
+
#ifdef RNA_RUNTIME
#include "BKE_main.h"
@@ -64,8 +66,6 @@
#include "BKE_mball.h"
#include "BKE_modifier.h"
-#include "BLI_math.h"
-
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h"
#include "DNA_meshdata_types.h"
@@ -415,6 +415,41 @@ void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], fl
*index= -1;
}
+void rna_Object_closest_point_on_mesh(Object *ob, ReportList *reports, float point_co[3], float max_dist, float n_location[3], float n_normal[3], int *index)
+{
+ BVHTreeFromMesh treeData= {NULL};
+
+ if(ob->derivedFinal==NULL) {
+ BKE_reportf(reports, RPT_ERROR, "object \"%s\" has no mesh data to be used for finding nearest point.", ob->id.name+2);
+ return;
+ }
+
+ /* no need to managing allocation or freeing of the BVH data. this is generated and freed as needed */
+ bvhtree_from_mesh_faces(&treeData, ob->derivedFinal, 0.0f, 4, 6);
+
+ if(treeData.tree==NULL) {
+ BKE_reportf(reports, RPT_ERROR, "object \"%s\" could not create internal data for finding nearest point", ob->id.name+2);
+ return;
+ }
+ else {
+ BVHTreeNearest nearest;
+
+ nearest.index = -1;
+ nearest.dist = max_dist * max_dist;
+
+ if(BLI_bvhtree_find_nearest(treeData.tree, point_co, &nearest, treeData.nearest_callback, &treeData) != -1) {
+ copy_v3_v3(n_location, nearest.co);
+ copy_v3_v3(n_normal, nearest.no);
+ *index= nearest.index;
+ return;
+ }
+ }
+
+ zero_v3(n_location);
+ zero_v3(n_normal);
+ *index= -1;
+}
+
/* ObjectBase */
void rna_ObjectBase_layers_from_view(Base *base, View3D *v3d)
@@ -501,6 +536,27 @@ void RNA_api_object(StructRNA *srna)
parm= RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when no intersection is found.", 0, 0);
RNA_def_function_output(func, parm);
+ /* Nearest Point */
+ func= RNA_def_function(srna, "closest_point_on_mesh", "rna_Object_closest_point_on_mesh");
+ RNA_def_function_ui_description(func, "Find the nearest point on the object.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+
+ /* location of point for test and max distance */
+ parm= RNA_def_float_vector(func, "point", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_float(func, "max_dist", sqrt(FLT_MAX), 0.0, FLT_MAX, "", "", 0.0, FLT_MAX);
+
+ /* return location and normal */
+ parm= RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "The location on the object closest to the point", -1e4, 1e4);
+ RNA_def_property_flag(parm, PROP_THICK_WRAP);
+ RNA_def_function_output(func, parm);
+ parm= RNA_def_float_vector(func, "normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal", "The face normal at the closest point", -1e4, 1e4);
+ RNA_def_property_flag(parm, PROP_THICK_WRAP);
+ RNA_def_function_output(func, parm);
+
+ parm= RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when no closest point is found.", 0, 0);
+ RNA_def_function_output(func, parm);
+
/* View */
func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible");
RNA_def_function_ui_description(func, "Determine if object is visible in a given scene.");
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index 3ff42e752af..9714b51a986 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -30,9 +30,11 @@
#include <stdlib.h>
#include "RNA_define.h"
-#include "BLF_api.h"
+
#include "rna_internal.h"
+#include "BLF_api.h"
+
#include "DNA_cloth_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index adad1948032..7508b84a0d0 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -136,7 +136,9 @@ EnumPropertyItem image_type_items[] = {
#endif
{R_AVIJPEG, "AVI_JPEG", ICON_FILE_MOVIE, "AVI JPEG", "Output video in AVI JPEG format"},
{R_AVIRAW, "AVI_RAW", ICON_FILE_MOVIE, "AVI Raw", "Output video in AVI Raw format"},
+#ifdef WITH_FRAMESERVER
{R_FRAMESERVER, "FRAMESERVER", ICON_FILE_SCRIPT, "Frame Server", "Output image to a frameserver"},
+#endif
#ifdef WITH_FFMPEG
{R_H264, "H264", ICON_FILE_MOVIE, "H.264", "Output video in H.264 format"},
{R_FFMPEG, "FFMPEG", ICON_FILE_MOVIE, "MPEG", "Output video in MPEG format"},
@@ -1177,9 +1179,9 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_RETOPO, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
- prop= RNA_def_property(srna, "use_snap_project_self", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT_NO_SELF);
- RNA_def_property_ui_text(prop, "Project to Self", "Project into its self (editmode)");
+ prop= RNA_def_property(srna, "use_snap_self", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_NO_SELF);
+ RNA_def_property_ui_text(prop, "Project to Self", "Snap onto its self (editmode)");
RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 833f45ec4cc..68da28788de 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -702,7 +702,7 @@ static void rna_ConsoleLine_cursor_index_range(PointerRNA *ptr, int *min, int *m
ConsoleLine *ci= (ConsoleLine*)ptr->data;
*min= 0;
- *max= ci->len;
+ *max= ci->len; /* intentionally _not_ -1 */
}
/* Space Dopesheet */
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index ff9adfbab0d..3e2feec71d9 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -2464,6 +2464,7 @@ static void rna_def_userdef_system(BlenderRNA *brna)
{23, "GREEK", 0, N_("Greek (Ελληνικά)"), "el_GR"},
{24, "KOREAN", 0, N_("Korean (한국 언어)"), "ko_KR"},
{0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "UserPreferencesSystem", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 0171576b52e..3db4d319420 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -942,7 +942,7 @@ static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void *
rna_Operator_unregister(bmain, ot->ext.srna);
}
- /* create a new menu type */
+ /* create a new operator type */
dummyot.ext.srna= RNA_def_struct(&BLENDER_RNA, dummyot.idname, "Operator");
RNA_def_struct_flag(dummyot.ext.srna, STRUCT_NO_IDPROPERTIES); /* operator properties are registered separately */
dummyot.ext.data= data;
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index 348e2a0ec1d..d1f153265ac 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -25,15 +25,16 @@
# ***** END GPL LICENSE BLOCK *****
set(INC
- . ./intern
+ .
+ intern
+ ../blenkernel
+ ../blenkernel/intern
../blenlib
../blenloader
../makesdna
- ../blenkernel
- ../blenkernel/intern
../render/extern/include
- ../../../intern/guardedalloc
../../../intern/elbeem/extern
+ ../../../intern/guardedalloc
)
set(INC_SYS
@@ -98,7 +99,9 @@ endif()
if(WITH_MOD_DECIMATE)
add_definitions(-DWITH_MOD_DECIMATE)
- list(APPEND INC ../../../intern/decimation/extern)
+ list(APPEND INC
+ ../../../intern/decimation/extern
+ )
endif()
if(NOT WITH_MOD_FLUID)
diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h
index b9b5c8a064a..5e6f377acf1 100644
--- a/source/blender/modifiers/intern/MOD_util.h
+++ b/source/blender/modifiers/intern/MOD_util.h
@@ -52,6 +52,6 @@ void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]);
void validate_layer_name(const struct CustomData *data, int type, char *name, char *outname);
struct DerivedMesh *get_cddm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]);
struct DerivedMesh *get_dm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco);
-void modifier_get_vgroup(struct Object *ob, DerivedMesh *dm, const char *name, struct MDeformVert **dvert, int *defgrp_index);
+void modifier_get_vgroup(struct Object *ob, struct DerivedMesh *dm, const char *name, struct MDeformVert **dvert, int *defgrp_index);
#endif /* MOD_UTIL_H */
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index d2b58d61112..c3bd37c18ee 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -152,8 +152,12 @@ set(SRC
)
if(WITH_PYTHON)
- list(APPEND INC ../python)
- list(APPEND INC_SYS ${PYTHON_INCLUDE_DIRS})
+ list(APPEND INC
+ ../python
+ )
+ list(APPEND INC_SYS
+ ${PYTHON_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_PYTHON)
endif()
diff --git a/source/blender/nodes/intern/SHD_util.c b/source/blender/nodes/intern/SHD_util.c
index cf7c64c9d5e..190f68ce19a 100644
--- a/source/blender/nodes/intern/SHD_util.c
+++ b/source/blender/nodes/intern/SHD_util.c
@@ -83,7 +83,11 @@ void nodestack_get_vec(float *in, short type_in, bNodeStack *ns)
void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
{
ShaderCallData scd;
-
+ /*
+ @note: preserve material from ShadeInput for material id, nodetree execs change it
+ fix for bug "[#28012] Mat ID messy with shader nodes"
+ */
+ Material *mat = shi->mat;
/* convert caller data to struct */
scd.shi= shi;
scd.shr= shr;
@@ -92,7 +96,8 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
memset(shr, 0, sizeof(ShadeResult));
ntreeExecTree(ntree, &scd, shi->thread); /* threads */
-
+ // @note: set material back to preserved material
+ shi->mat = mat;
/* better not allow negative for now */
if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f;
if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f;
diff --git a/source/blender/python/CMakeLists.txt b/source/blender/python/CMakeLists.txt
index fe9e0307703..8071edb378f 100644
--- a/source/blender/python/CMakeLists.txt
+++ b/source/blender/python/CMakeLists.txt
@@ -18,3 +18,4 @@
add_subdirectory(intern)
add_subdirectory(generic)
+add_subdirectory(mathutils)
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index de6b859d259..dec0de4a6ab 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -1,6 +1,6 @@
#!/usr/bin/python
-# TODO, split into 2 files.
+# TODO, split into 3 files.
Import ('env')
@@ -18,7 +18,14 @@ if is_debug:
defs.append('_DEBUG')
sources = env.Glob('generic/*.c')
-env.BlenderLib( libname = 'bf_python_ext', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
+env.BlenderLib( libname = 'bf_python_ext', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [363,165]) # ketsji is 360
+
+
+# mathutils
+defs = []
+
+sources = env.Glob('mathutils/*.c')
+env.BlenderLib( libname = 'bf_python_mathutils', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165])
# bpy
diff --git a/source/blender/python/generic/CMakeLists.txt b/source/blender/python/generic/CMakeLists.txt
index 0889c77f9ad..8dfbf476995 100644
--- a/source/blender/python/generic/CMakeLists.txt
+++ b/source/blender/python/generic/CMakeLists.txt
@@ -20,10 +20,10 @@
set(INC
.
- ../../blenlib
- ../../makesdna
../../blenkernel
+ ../../blenlib
../../blenloader
+ ../../makesdna
../../../../intern/guardedalloc
)
@@ -37,13 +37,6 @@ set(SRC
bgl.c
blf_py_api.c
bpy_internal_import.c
- mathutils.c
- mathutils_Color.c
- mathutils_Euler.c
- mathutils_Matrix.c
- mathutils_Quaternion.c
- mathutils_Vector.c
- mathutils_geometry.c
noise_py_api.c
py_capi_utils.c
@@ -51,13 +44,6 @@ set(SRC
bgl.h
blf_py_api.h
bpy_internal_import.h
- mathutils.h
- mathutils_Color.h
- mathutils_Euler.h
- mathutils_Matrix.h
- mathutils_Quaternion.h
- mathutils_Vector.h
- mathutils_geometry.h
noise_py_api.h
py_capi_utils.h
)
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 1891e13fdc1..09432e0b316 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -48,12 +48,15 @@ static PyObject *Buffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
/* Buffer sequence methods */
-static int Buffer_len(PyObject *self);
-static PyObject *Buffer_item(PyObject *self, int i);
-static PyObject *Buffer_slice(PyObject *self, int begin, int end);
-static int Buffer_ass_item(PyObject *self, int i, PyObject *v);
-static int Buffer_ass_slice(PyObject *self, int begin, int end,
+static int Buffer_len(Buffer *self);
+static PyObject *Buffer_item(Buffer *self, int i);
+static PyObject *Buffer_slice(Buffer *self, int begin, int end);
+static int Buffer_ass_item(Buffer *self, int i, PyObject *v);
+static int Buffer_ass_slice(Buffer *self, int begin, int end,
PyObject *seq);
+static PyObject *Buffer_subscript(Buffer *self, PyObject *item);
+static int Buffer_ass_subscript(Buffer *self, PyObject *item,
+ PyObject *value);
static PySequenceMethods Buffer_SeqMethods = {
(lenfunc) Buffer_len, /*sq_length */
@@ -68,12 +71,80 @@ static PySequenceMethods Buffer_SeqMethods = {
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-static void Buffer_dealloc(PyObject *self);
-static PyObject *Buffer_tolist(PyObject *self, void *arg);
-static PyObject *Buffer_dimensions(PyObject *self, void *arg);
-static PyObject *Buffer_repr(PyObject *self);
-static PyMethodDef Buffer_methods[];
-static PyGetSetDef Buffer_getseters[];
+
+static PyMappingMethods Buffer_AsMapping = {
+ (lenfunc)Buffer_len,
+ (binaryfunc)Buffer_subscript,
+ (objobjargproc)Buffer_ass_subscript
+};
+
+static void Buffer_dealloc(Buffer *self);
+static PyObject *Buffer_repr(Buffer *self);
+
+static PyObject *Buffer_to_list(Buffer *self)
+{
+ int i, len= self->dimensions[0];
+ PyObject *list= PyList_New(len);
+
+ for (i=0; i<len; i++) {
+ PyList_SET_ITEM(list, i, Buffer_item(self, i));
+ }
+
+ return list;
+}
+
+static PyObject *Buffer_to_list_recursive(Buffer *self)
+{
+ PyObject *list;
+
+ if(self->ndimensions > 1) {
+ int i, len= self->dimensions[0];
+ list= PyList_New(len);
+
+ for (i=0; i<len; i++) {
+ Buffer *sub= (Buffer *)Buffer_item(self, i);
+ PyList_SET_ITEM(list, i, Buffer_to_list_recursive(sub));
+ Py_DECREF(sub);
+ }
+ }
+ else {
+ list= Buffer_to_list(self);
+ }
+
+ return list;
+}
+
+/* *DEPRECATED* 2011/7/17 bgl.Buffer.list */
+static PyObject *Buffer_list(Buffer *self, void *UNUSED(arg))
+{
+ fprintf(stderr, "Warning: 'Buffer.list' deprecated, use '[:]' instead\n");
+ return Buffer_to_list(self);
+}
+
+static PyObject *Buffer_dimensions(Buffer *self, void *UNUSED(arg))
+{
+ PyObject *list= PyList_New(self->ndimensions);
+ int i;
+
+ for (i= 0; i<self->ndimensions; i++) {
+ PyList_SET_ITEM(list, i, PyLong_FromLong(self->dimensions[i]));
+ }
+
+ return list;
+}
+
+static PyMethodDef Buffer_methods[] = {
+ {"to_list", (PyCFunction)Buffer_to_list_recursive, METH_NOARGS,
+ "return the buffer as a list"},
+ {NULL, NULL, 0, NULL}
+};
+
+static PyGetSetDef Buffer_getseters[] = {
+ {(char *)"list", (getter)Buffer_list, NULL, NULL, NULL},
+ {(char *)"dimensions", (getter)Buffer_dimensions, NULL, NULL, NULL},
+ {NULL, NULL, NULL, NULL, NULL}
+};
+
PyTypeObject BGL_bufferType = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -88,7 +159,7 @@ PyTypeObject BGL_bufferType = {
(reprfunc) Buffer_repr, /*tp_repr */
NULL, /*tp_as_number */
&Buffer_SeqMethods, /*tp_as_sequence */
- NULL, /* PyMappingMethods *tp_as_mapping; */
+ &Buffer_AsMapping, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
@@ -229,7 +300,8 @@ static PyObject *Buffer_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject
int ndimensions = 0;
if(kwds && PyDict_Size(kwds)) {
- PyErr_SetString(PyExc_TypeError, "bgl.Buffer(): takes no keyword args");
+ PyErr_SetString(PyExc_TypeError,
+ "bgl.Buffer(): takes no keyword args");
return NULL;
}
@@ -286,7 +358,7 @@ static PyObject *Buffer_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject
buffer= BGL_MakeBuffer(type, ndimensions, dimensions, NULL);
if (init && ndimensions) {
- if (Buffer_ass_slice((PyObject *) buffer, 0, dimensions[0], init)) {
+ if (Buffer_ass_slice(buffer, 0, dimensions[0], init)) {
Py_DECREF(buffer);
return NULL;
}
@@ -297,51 +369,48 @@ static PyObject *Buffer_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject
/*@ Buffer sequence methods */
-static int Buffer_len(PyObject *self)
+static int Buffer_len(Buffer *self)
{
- Buffer *buf= (Buffer *) self;
- return buf->dimensions[0];
+ return self->dimensions[0];
}
-static PyObject *Buffer_item(PyObject *self, int i)
+static PyObject *Buffer_item(Buffer *self, int i)
{
- Buffer *buf= (Buffer *) self;
-
- if (i >= buf->dimensions[0]) {
+ if (i >= self->dimensions[0] || i < 0) {
PyErr_SetString(PyExc_IndexError, "array index out of range");
return NULL;
}
- if (buf->ndimensions==1) {
- switch (buf->type) {
- case GL_BYTE: return Py_BuildValue("b", buf->buf.asbyte[i]);
- case GL_SHORT: return Py_BuildValue("h", buf->buf.asshort[i]);
- case GL_INT: return Py_BuildValue("i", buf->buf.asint[i]);
- case GL_FLOAT: return PyFloat_FromDouble(buf->buf.asfloat[i]);
- case GL_DOUBLE: return Py_BuildValue("d", buf->buf.asdouble[i]);
+ if (self->ndimensions==1) {
+ switch (self->type) {
+ case GL_BYTE: return Py_BuildValue("b", self->buf.asbyte[i]);
+ case GL_SHORT: return Py_BuildValue("h", self->buf.asshort[i]);
+ case GL_INT: return Py_BuildValue("i", self->buf.asint[i]);
+ case GL_FLOAT: return PyFloat_FromDouble(self->buf.asfloat[i]);
+ case GL_DOUBLE: return Py_BuildValue("d", self->buf.asdouble[i]);
}
}
else {
Buffer *newbuf;
int j, length, size;
-
+
length= 1;
- for (j=1; j<buf->ndimensions; j++) {
- length*= buf->dimensions[j];
+ for (j=1; j < self->ndimensions; j++) {
+ length *= self->dimensions[j];
}
- size= BGL_typeSize(buf->type);
+ size= BGL_typeSize(self->type);
newbuf= (Buffer *) PyObject_NEW(Buffer, &BGL_bufferType);
Py_INCREF(self);
- newbuf->parent= self;
+ newbuf->parent= (PyObject *)self;
- newbuf->ndimensions= buf->ndimensions-1;
- newbuf->type= buf->type;
- newbuf->buf.asvoid= buf->buf.asbyte + i*length*size;
+ newbuf->ndimensions= self->ndimensions - 1;
+ newbuf->type= self->type;
+ newbuf->buf.asvoid= self->buf.asbyte + i*length*size;
newbuf->dimensions= MEM_mallocN(newbuf->ndimensions*sizeof(int),
"Buffer dimensions");
- memcpy(newbuf->dimensions, buf->dimensions+1,
+ memcpy(newbuf->dimensions, self->dimensions+1,
newbuf->ndimensions*sizeof(int));
return (PyObject *) newbuf;
@@ -350,16 +419,14 @@ static PyObject *Buffer_item(PyObject *self, int i)
return NULL;
}
-static PyObject *Buffer_slice(PyObject *self, int begin, int end)
+static PyObject *Buffer_slice(Buffer *self, int begin, int end)
{
- Buffer *buf= (Buffer *) self;
PyObject *list;
int count;
- if (begin<0) begin= 0;
- if (end>buf->dimensions[0])
- end= buf->dimensions[0];
- if (begin>end) begin= end;
+ if (begin < 0) begin= 0;
+ if (end > self->dimensions[0]) end= self->dimensions[0];
+ if (begin > end) begin= end;
list= PyList_New(end-begin);
@@ -369,21 +436,19 @@ static PyObject *Buffer_slice(PyObject *self, int begin, int end)
return list;
}
-static int Buffer_ass_item(PyObject *self, int i, PyObject *v)
+static int Buffer_ass_item(Buffer *self, int i, PyObject *v)
{
- Buffer *buf= (Buffer *) self;
-
- if (i >= buf->dimensions[0]) {
+ if (i >= self->dimensions[0] || i < 0) {
PyErr_SetString(PyExc_IndexError,
"array assignment index out of range");
return -1;
}
- if (buf->ndimensions!=1) {
- PyObject *row= Buffer_item(self, i);
+ if (self->ndimensions!=1) {
+ Buffer *row= (Buffer *)Buffer_item(self, i);
if (row) {
- int ret= Buffer_ass_slice(row, 0, buf->dimensions[1], v);
+ int ret= Buffer_ass_slice(row, 0, self->dimensions[1], v);
Py_DECREF(row);
return ret;
}
@@ -392,31 +457,30 @@ static int Buffer_ass_item(PyObject *self, int i, PyObject *v)
}
}
- switch(buf->type) {
+ switch(self->type) {
case GL_BYTE:
- return PyArg_Parse(v, "b:Expected ints", &buf->buf.asbyte[i]) ? 0:-1;
+ return PyArg_Parse(v, "b:Expected ints", &self->buf.asbyte[i]) ? 0:-1;
case GL_SHORT:
- return PyArg_Parse(v, "h:Expected ints", &buf->buf.asshort[i]) ? 0:-1;
+ return PyArg_Parse(v, "h:Expected ints", &self->buf.asshort[i]) ? 0:-1;
case GL_INT:
- return PyArg_Parse(v, "i:Expected ints", &buf->buf.asint[i]) ? 0:-1;
+ return PyArg_Parse(v, "i:Expected ints", &self->buf.asint[i]) ? 0:-1;
case GL_FLOAT:
- return PyArg_Parse(v, "f:Expected floats", &buf->buf.asfloat[i]) ? 0:-1;
+ return PyArg_Parse(v, "f:Expected floats", &self->buf.asfloat[i]) ? 0:-1;
case GL_DOUBLE:
- return PyArg_Parse(v, "d:Expected floats", &buf->buf.asdouble[i]) ? 0:-1;
+ return PyArg_Parse(v, "d:Expected floats", &self->buf.asdouble[i]) ? 0:-1;
default:
return 0; /* should never happen */
}
}
-static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq)
+static int Buffer_ass_slice(Buffer *self, int begin, int end, PyObject *seq)
{
- Buffer *buf= (Buffer *) self;
PyObject *item;
int count, err=0;
- if (begin<0) begin= 0;
- if (end>buf->dimensions[0]) end= buf->dimensions[0];
- if (begin>end) begin= end;
+ if (begin < 0) begin= 0;
+ if (end > self->dimensions[0]) end= self->dimensions[0];
+ if (begin > end) begin= end;
if (!PySequence_Check(seq)) {
PyErr_Format(PyExc_TypeError,
@@ -448,62 +512,94 @@ static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq)
return err;
}
-static void Buffer_dealloc(PyObject *self)
+static PyObject *Buffer_subscript(Buffer *self, PyObject *item)
{
- Buffer *buf = (Buffer *)self;
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i;
+ i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ if (i < 0)
+ i += self->dimensions[0];
+ return Buffer_item(self, i);
+ }
+ else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
- if (buf->parent) Py_DECREF(buf->parent);
- else MEM_freeN (buf->buf.asvoid);
+ if (PySlice_GetIndicesEx((void *)item, self->dimensions[0], &start, &stop, &step, &slicelength) < 0)
+ return NULL;
- MEM_freeN (buf->dimensions);
-
- PyObject_DEL(self);
+ if (slicelength <= 0) {
+ return PyTuple_New(0);
+ }
+ else if (step == 1) {
+ return Buffer_slice(self, start, stop);
+ }
+ else {
+ PyErr_SetString(PyExc_IndexError,
+ "slice steps not supported with vectors");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "buffer indices must be integers, not %.200s",
+ Py_TYPE(item)->tp_name);
+ return NULL;
+ }
}
-static PyObject *Buffer_to_list(PyObject *self)
+static int Buffer_ass_subscript(Buffer *self, PyObject *item, PyObject *value)
{
- int i, len= ((Buffer *)self)->dimensions[0];
- PyObject *list= PyList_New(len);
-
- for (i=0; i<len; i++) {
- PyList_SET_ITEM(list, i, Buffer_item(self, i));
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+ if (i < 0)
+ i += self->dimensions[0];
+ return Buffer_ass_item(self, i, value);
}
+ else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
- return list;
+ if (PySlice_GetIndicesEx((void *)item, self->dimensions[0], &start, &stop, &step, &slicelength) < 0)
+ return -1;
+
+ if (step == 1)
+ return Buffer_ass_slice(self, start, stop, value);
+ else {
+ PyErr_SetString(PyExc_IndexError,
+ "slice steps not supported with vectors");
+ return -1;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "buffer indices must be integers, not %.200s",
+ Py_TYPE(item)->tp_name);
+ return -1;
+ }
}
-static PyObject *Buffer_dimensions(PyObject *self, void *UNUSED(arg))
+
+static void Buffer_dealloc(Buffer *self)
{
- Buffer *buffer= (Buffer *) self;
- PyObject *list= PyList_New(buffer->ndimensions);
- int i;
+ if (self->parent) Py_DECREF(self->parent);
+ else MEM_freeN (self->buf.asvoid);
- for (i= 0; i<buffer->ndimensions; i++) {
- PyList_SET_ITEM(list, i, PyLong_FromLong(buffer->dimensions[i]));
- }
+ MEM_freeN(self->dimensions);
- return list;
+ PyObject_DEL(self);
}
-static PyMethodDef Buffer_methods[] = {
- {"to_list", (PyCFunction)Buffer_to_list, METH_NOARGS,
- "return the buffer as a list"},
- {NULL, NULL, 0, NULL}
-};
-
-static PyGetSetDef Buffer_getseters[] = {
- {(char *)"dimensions", (getter)Buffer_dimensions, NULL, NULL, NULL},
- {NULL, NULL, NULL, NULL, NULL}
-};
-static PyObject *Buffer_repr(PyObject *self)
+static PyObject *Buffer_repr(Buffer *self)
{
- PyObject *list= Buffer_to_list(self);
+ PyObject *list= Buffer_to_list_recursive(self);
PyObject *repr;
const char *typestr= "UNKNOWN";
- Buffer *buffer= (Buffer *)self;
- switch(buffer->type) {
+ switch(self->type) {
case GL_BYTE: typestr= "GL_BYTE"; break;
case GL_SHORT: typestr= "GL_SHORT"; break;
case GL_INT: typestr= "GL_BYTE"; break;
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index 287ba45a1cf..93a4b3ec269 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -25,13 +25,13 @@
set(INC
..
+ ../../blenkernel
../../blenlib
+ ../../blenloader
+ ../../editors/include
../../makesdna
../../makesrna
- ../../blenkernel
- ../../blenloader
../../windowmanager
- ../../editors/include
../../../../intern/guardedalloc
)
@@ -88,9 +88,6 @@ if(WITH_PYTHON_SAFETY)
endif()
if(WITH_AUDASPACE)
- list(APPEND INC
- ../../../intern/audaspace/intern
- )
add_definitions(-DWITH_AUDASPACE)
endif()
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index fb4c285a458..3f637feadf7 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -55,10 +55,10 @@
#include "MEM_guardedalloc.h"
/* external util modules */
-#include "../generic/mathutils.h"
+#include "../generic/IDProp.h"
#include "../generic/bgl.h"
#include "../generic/blf_py_api.h"
-#include "../generic/IDProp.h"
+#include "../mathutils/mathutils.h"
PyObject *bpy_package_py= NULL;
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index f091a511e93..8bd6e6c611c 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -66,10 +66,10 @@
#include "../generic/py_capi_utils.h"
/* inittab initialization functions */
-#include "../generic/noise_py_api.h"
-#include "../generic/mathutils.h"
#include "../generic/bgl.h"
#include "../generic/blf_py_api.h"
+#include "../generic/noise_py_api.h"
+#include "../mathutils/mathutils.h"
/* for internal use, when starting and ending python scripts */
@@ -175,8 +175,8 @@ extern PyObject *AUD_initPython(void);
static struct _inittab bpy_internal_modules[]= {
{(char *)"noise", BPyInit_noise},
- {(char *)"mathutils", BPyInit_mathutils},
-// {(char *)"mathutils.geometry", BPyInit_mathutils_geometry},
+ {(char *)"mathutils", PyInit_mathutils},
+// {(char *)"mathutils.geometry", PyInit_mathutils_geometry},
{(char *)"bgl", BPyInit_bgl},
{(char *)"blf", BPyInit_blf},
#ifdef WITH_AUDASPACE
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index 4f6edb02a7c..6e1b9c807f3 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -346,7 +346,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item);
#ifdef USE_MATHUTILS
-#include "../generic/mathutils.h" /* so we can have mathutils callbacks */
+#include "../mathutils/mathutils.h" /* so we can have mathutils callbacks */
static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t length);
static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback);
@@ -4548,7 +4548,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type= {
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL, /* tp_compare */ /* deprecated in python 3.0! */
NULL, /* tp_repr */
/* Method suites for standard classes */
diff --git a/source/blender/python/mathutils/CMakeLists.txt b/source/blender/python/mathutils/CMakeLists.txt
new file mode 100755
index 00000000000..b28496d612e
--- /dev/null
+++ b/source/blender/python/mathutils/CMakeLists.txt
@@ -0,0 +1,52 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Contributor(s): Campbell Barton
+#
+# ***** END GPL LICENSE BLOCK *****
+
+set(INC
+ .
+ ../../blenlib
+ ../../blenkernel
+ ../../makesdna
+ ../../../../intern/guardedalloc
+)
+
+set(INC_SYS
+ ${PYTHON_INCLUDE_DIRS}
+)
+
+set(SRC
+ mathutils.c
+ mathutils_Color.c
+ mathutils_Euler.c
+ mathutils_Matrix.c
+ mathutils_Quaternion.c
+ mathutils_Vector.c
+ mathutils_geometry.c
+
+ mathutils.h
+ mathutils_Color.h
+ mathutils_Euler.h
+ mathutils_Matrix.h
+ mathutils_Quaternion.h
+ mathutils_Vector.h
+ mathutils_geometry.h
+)
+
+
+blender_add_lib(bf_python_mathutils "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/python/generic/mathutils.c b/source/blender/python/mathutils/mathutils.c
index bba08e312b7..4a0fa509a0d 100644..100755
--- a/source/blender/python/generic/mathutils.c
+++ b/source/blender/python/mathutils/mathutils.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils.c 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -75,7 +75,7 @@ static int mathutils_array_parse_fast(float *array, int array_min, int array_max
do {
i--;
if(((array[i]= PyFloat_AsDouble((item= PySequence_Fast_GET_ITEM(value_fast, i)))) == -1.0f) && PyErr_Occurred()) {
- PyErr_Format(PyExc_ValueError,
+ PyErr_Format(PyExc_TypeError,
"%.200s: sequence index %d expected a number, "
"found '%.200s' type, ",
error_prefix, i, Py_TYPE(item)->tp_name);
@@ -345,7 +345,7 @@ static struct PyModuleDef M_Mathutils_module_def = {
NULL, /* m_free */
};
-PyMODINIT_FUNC BPyInit_mathutils(void)
+PyMODINIT_FUNC PyInit_mathutils(void)
{
PyObject *submodule;
PyObject *item;
@@ -371,7 +371,7 @@ PyMODINIT_FUNC BPyInit_mathutils(void)
PyModule_AddObject(submodule, "Color", (PyObject *)&color_Type);
/* submodule */
- PyModule_AddObject(submodule, "geometry", (item=BPyInit_mathutils_geometry()));
+ PyModule_AddObject(submodule, "geometry", (item=PyInit_mathutils_geometry()));
/* XXX, python doesnt do imports with this usefully yet
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
diff --git a/source/blender/python/generic/mathutils.h b/source/blender/python/mathutils/mathutils.h
index 449708d1ac1..300c054c061 100644..100755
--- a/source/blender/python/generic/mathutils.h
+++ b/source/blender/python/mathutils/mathutils.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils.h 38674 2011-07-25 01:44:19Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -67,7 +67,7 @@ int BaseMathObject_traverse(BaseMathObject *self, visitproc visit, void *arg);
int BaseMathObject_clear(BaseMathObject *self);
void BaseMathObject_dealloc(BaseMathObject * self);
-PyMODINIT_FUNC BPyInit_mathutils(void);
+PyMODINIT_FUNC PyInit_mathutils(void);
int EXPP_FloatsAreEqual(float A, float B, int floatSteps);
int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps);
@@ -108,4 +108,6 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix);
+int column_vector_multiplication(float rvec[4], VectorObject *vec, MatrixObject *mat);
+
#endif /* MATHUTILS_H */
diff --git a/source/blender/python/generic/mathutils_Color.c b/source/blender/python/mathutils/mathutils_Color.c
index fd187fd92fd..37730ba4649 100644..100755
--- a/source/blender/python/generic/mathutils_Color.c
+++ b/source/blender/python/mathutils/mathutils_Color.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Color.c 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -259,7 +259,7 @@ static int Color_ass_slice(ColorObject *self, int begin, int end, PyObject *seq)
return -1;
if(size != (end - begin)){
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"color[begin:end] = []: "
"size mismatch in slice assignment");
return -1;
@@ -296,7 +296,7 @@ static PyObject *Color_subscript(ColorObject *self, PyObject *item)
return Color_slice(self, start, stop);
}
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with color");
return NULL;
}
@@ -328,7 +328,7 @@ static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject *valu
if (step == 1)
return Color_ass_slice(self, start, stop, value);
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with color");
return -1;
}
@@ -371,7 +371,7 @@ static PyObject *Color_add(PyObject *v1, PyObject *v2)
float col[COLOR_SIZE];
if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Color addition: "
"arguments not valid for this operation");
return NULL;
@@ -393,7 +393,7 @@ static PyObject *Color_iadd(PyObject *v1, PyObject *v2)
ColorObject *color1 = NULL, *color2 = NULL;
if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Color addition: "
"arguments not valid for this operation");
return NULL;
@@ -418,7 +418,7 @@ static PyObject *Color_sub(PyObject *v1, PyObject *v2)
float col[COLOR_SIZE];
if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Color subtraction: "
"arguments not valid for this operation");
return NULL;
@@ -440,7 +440,7 @@ static PyObject *Color_isub(PyObject *v1, PyObject *v2)
ColorObject *color1= NULL, *color2= NULL;
if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Color subtraction: "
"arguments not valid for this operation");
return NULL;
@@ -555,7 +555,9 @@ static PyObject *Color_imul(PyObject *v1, PyObject *v2)
mul_vn_fl(color->col, COLOR_SIZE, scalar);
}
else {
- PyErr_SetString(PyExc_TypeError, "Color multiplication: arguments not acceptable for this operation");
+ PyErr_SetString(PyExc_TypeError,
+ "Color multiplication: "
+ "arguments not acceptable for this operation");
return NULL;
}
@@ -846,9 +848,7 @@ PyObject *newColorObject(float *col, int type, PyTypeObject *base_type)
self->wrapped = Py_NEW;
}
else {
- PyErr_SetString(PyExc_RuntimeError,
- "Color(): invalid type, internal error");
- return NULL;
+ Py_FatalError("Color(): invalid type!");
}
}
diff --git a/source/blender/python/generic/mathutils_Color.h b/source/blender/python/mathutils/mathutils_Color.h
index 0fc880363f4..0afb0ee4dc1 100644..100755
--- a/source/blender/python/generic/mathutils_Color.h
+++ b/source/blender/python/mathutils/mathutils_Color.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Color.h 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/python/generic/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c
index 2888b0667f1..afff9275aa0 100644..100755
--- a/source/blender/python/generic/mathutils_Euler.c
+++ b/source/blender/python/mathutils/mathutils_Euler.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Euler.c 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -38,10 +38,6 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
-#ifndef int32_t
-#include "BLO_sys_types.h"
-#endif
-
#define EULER_SIZE 3
//----------------------------------mathutils.Euler() -------------------
@@ -89,7 +85,7 @@ static const char *euler_order_str(EulerObject *self)
short euler_order_from_string(const char *str, const char *error_prefix)
{
if((str[0] && str[1] && str[2] && str[3]=='\0')) {
- switch(*((int32_t *)str)) {
+ switch(*((PY_INT32_T *)str)) {
case 'X'|'Y'<<8|'Z'<<16: return EULER_ORDER_XYZ;
case 'X'|'Z'<<8|'Y'<<16: return EULER_ORDER_XZY;
case 'Y'|'X'<<8|'Z'<<16: return EULER_ORDER_YXZ;
@@ -99,7 +95,7 @@ short euler_order_from_string(const char *str, const char *error_prefix)
}
}
- PyErr_Format(PyExc_TypeError,
+ PyErr_Format(PyExc_ValueError,
"%s: invalid euler order '%s'",
error_prefix, str);
return -1;
@@ -209,7 +205,7 @@ static PyObject *Euler_rotate_axis(EulerObject * self, PyObject *args)
return NULL;
}
if(!(ELEM3(*axis, 'X', 'Y', 'Z') && axis[1]=='\0')){
- PyErr_SetString(PyExc_TypeError, "euler.rotate(): "
+ PyErr_SetString(PyExc_ValueError, "euler.rotate(): "
"expected axis to be 'X', 'Y' or 'Z'");
return NULL;
}
@@ -449,7 +445,7 @@ static int Euler_ass_slice(EulerObject *self, int begin, int end, PyObject *seq)
return -1;
if(size != (end - begin)){
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"euler[begin:end] = []: "
"size mismatch in slice assignment");
return -1;
@@ -486,7 +482,7 @@ static PyObject *Euler_subscript(EulerObject *self, PyObject *item)
return Euler_slice(self, start, stop);
}
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with eulers");
return NULL;
}
@@ -519,7 +515,7 @@ static int Euler_ass_subscript(EulerObject *self, PyObject *item, PyObject *valu
if (step == 1)
return Euler_ass_slice(self, start, stop, value);
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with euler");
return -1;
}
@@ -701,9 +697,7 @@ PyObject *newEulerObject(float *eul, short order, int type, PyTypeObject *base_t
self->wrapped = Py_NEW;
}
else {
- PyErr_SetString(PyExc_RuntimeError,
- "Euler(): invalid type, internal error");
- return NULL;
+ Py_FatalError("Euler(): invalid type!");
}
self->order= order;
diff --git a/source/blender/python/generic/mathutils_Euler.h b/source/blender/python/mathutils/mathutils_Euler.h
index 849e16c2bb7..2df3d6198b8 100644..100755
--- a/source/blender/python/generic/mathutils_Euler.h
+++ b/source/blender/python/mathutils/mathutils_Euler.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Euler.h 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/python/generic/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index 4343485bb3a..1a1a9f8aff3 100644..100755
--- a/source/blender/python/generic/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Matrix.c 38674 2011-07-25 01:44:19Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -35,7 +35,6 @@
#include "mathutils.h"
#include "BLI_math.h"
-#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
static PyObject *Matrix_copy(MatrixObject *self);
@@ -225,7 +224,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
if(vec && PyUnicode_Check(vec)) {
axis= _PyUnicode_AsString((PyObject *)vec);
if(axis==NULL || axis[0]=='\0' || axis[1]!='\0' || axis[0] < 'X' || axis[0] > 'Z') {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.RotationMatrix(): "
"3rd argument axis value must be a 3D vector "
"or a string in 'X', 'Y', 'Z'");
@@ -240,19 +239,19 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
angle= angle_wrap_rad(angle);
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.RotationMatrix(): "
"can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
}
if(matSize == 2 && (vec != NULL)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.RotationMatrix(): "
"cannot create a 2x2 rotation matrix around arbitrary axis");
return NULL;
}
if((matSize == 3 || matSize == 4) && (axis == NULL) && (vec == NULL)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.RotationMatrix(): "
"axis of rotation for 3d and 4d matrices is required");
return NULL;
@@ -300,7 +299,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
}
else {
/* should never get here */
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.RotationMatrix(): unknown error");
return NULL;
}
@@ -365,7 +364,7 @@ static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
return NULL;
}
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"Matrix.Scale(): "
"can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
@@ -451,7 +450,7 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
return NULL;
}
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.Matrix.OrthoProjection(): "
"can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
@@ -568,7 +567,7 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
return NULL;
}
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.Matrix.Shear(): "
"can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
@@ -578,7 +577,7 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
float const factor= PyFloat_AsDouble(fac);
if(factor==-1.0f && PyErr_Occurred()) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"mathutils.Matrix.Shear(): "
"the factor to be a float");
return NULL;
@@ -595,7 +594,7 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
mat[1] = factor;
}
else {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"Matrix.Shear(): "
"expected: X, Y or wrong matrix size for shearing plane");
return NULL;
@@ -627,7 +626,7 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
mat[2] = factor[1];
}
else {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"mathutils.Matrix.Shear(): "
"expected: X, Y, XY, XZ, YZ");
return NULL;
@@ -686,7 +685,7 @@ static PyObject *Matrix_to_quaternion(MatrixObject *self)
/*must be 3-4 cols, 3-4 rows, square matrix*/
if((self->col_size < 3) || (self->row_size < 3) || (self->col_size != self->row_size)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"matrix.to_quat(): "
"inappropriate matrix size - expects 3x3 or 4x4 matrix");
return NULL;
@@ -750,7 +749,7 @@ static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
mat= tmat;
}
else {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"matrix.to_euler(): "
"inappropriate matrix size - expects 3x3 or 4x4 matrix");
return NULL;
@@ -879,7 +878,7 @@ static PyObject *Matrix_to_3x3(MatrixObject *self)
return NULL;
if((self->col_size < 3) || (self->row_size < 3)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.to_3x3(): inappropriate matrix size");
return NULL;
}
@@ -903,7 +902,7 @@ static PyObject *Matrix_to_translation(MatrixObject *self)
return NULL;
if((self->col_size < 3) || self->row_size < 4){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.to_translation(): "
"inappropriate matrix size");
return NULL;
@@ -933,7 +932,7 @@ static PyObject *Matrix_to_scale(MatrixObject *self)
/*must be 3-4 cols, 3-4 rows, square matrix*/
if((self->col_size < 3) || (self->row_size < 3)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.to_scale(): "
"inappropriate matrix size, 3x3 minimum size");
return NULL;
@@ -969,7 +968,7 @@ static PyObject *Matrix_invert(MatrixObject *self)
return NULL;
if(self->row_size != self->col_size){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.invert(ed): "
"only square matrices are supported");
return NULL;
@@ -1050,7 +1049,7 @@ static PyObject *Matrix_rotate(MatrixObject *self, PyObject *value)
return NULL;
if(self->col_size != 3 || self->row_size != 3) {
- PyErr_SetString(PyExc_ValueError,
+ PyErr_SetString(PyExc_TypeError,
"Matrix must have 3x3 dimensions");
return NULL;
}
@@ -1082,7 +1081,7 @@ static PyObject *Matrix_decompose(MatrixObject *self)
float size[3];
if(self->col_size != 4 || self->row_size != 4) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.decompose(): "
"inappropriate matrix size - expects 4x4 matrix");
return NULL;
@@ -1125,7 +1124,7 @@ static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
return NULL;
if(self->row_size != mat2->row_size || self->col_size != mat2->col_size) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"matrix.lerp(): "
"expects both matrix objects of the same dimensions");
return NULL;
@@ -1142,7 +1141,7 @@ static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
blend_m3_m3m3((float (*)[3])mat, (float (*)[3])self->contigPtr, (float (*)[3])mat2->contigPtr, fac);
}
else {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"matrix.lerp(): "
"only 3x3 and 4x4 matrices supported");
return NULL;
@@ -1168,7 +1167,7 @@ static PyObject *Matrix_determinant(MatrixObject *self)
return NULL;
if(self->row_size != self->col_size){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.determinant: "
"only square matrices are supported");
return NULL;
@@ -1192,7 +1191,7 @@ static PyObject *Matrix_transpose(MatrixObject *self)
return NULL;
if(self->row_size != self->col_size){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.transpose(d): "
"only square matrices are supported");
return NULL;
@@ -1261,7 +1260,7 @@ static PyObject *Matrix_identity(MatrixObject *self)
return NULL;
if(self->row_size != self->col_size){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix.identity: "
"only square matrices are supported");
return NULL;
@@ -1319,21 +1318,20 @@ static PyObject *Matrix_repr(MatrixObject *self)
}
}
switch(self->row_size) {
- case 2: return PyUnicode_FromFormat("Matrix(%R,\n"
- " %R)", rows[0], rows[1]);
+ case 2: return PyUnicode_FromFormat("Matrix((%R,\n"
+ " %R))", rows[0], rows[1]);
- case 3: return PyUnicode_FromFormat("Matrix(%R,\n"
- " %R,\n"
- " %R)", rows[0], rows[1], rows[2]);
+ case 3: return PyUnicode_FromFormat("Matrix((%R,\n"
+ " %R,\n"
+ " %R))", rows[0], rows[1], rows[2]);
- case 4: return PyUnicode_FromFormat("Matrix(%R,\n"
- " %R,\n"
- " %R,\n"
- " %R)", rows[0], rows[1], rows[2], rows[3]);
+ case 4: return PyUnicode_FromFormat("Matrix((%R,\n"
+ " %R,\n"
+ " %R,\n"
+ " %R))", rows[0], rows[1], rows[2], rows[3]);
}
- PyErr_SetString(PyExc_RuntimeError,
- "internal error!");
+ Py_FatalError("Matrix(): invalid row size!");
return NULL;
}
@@ -1409,7 +1407,7 @@ static int Matrix_ass_item(MatrixObject *self, int i, PyObject *value)
return -1;
if(i >= self->row_size || i < 0){
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"matrix[attribute] = x: bad column");
return -1;
}
@@ -1473,7 +1471,7 @@ static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *va
if(PySequence_Fast_GET_SIZE(value_fast) != size) {
Py_DECREF(value_fast);
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"matrix[begin:end] = []: "
"size mismatch in slice assignment");
return -1;
@@ -1509,7 +1507,7 @@ static PyObject *Matrix_add(PyObject *m1, PyObject *m2)
mat2 = (MatrixObject*)m2;
if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Matrix addition: "
"arguments not valid for this operation");
return NULL;
@@ -1519,7 +1517,7 @@ static PyObject *Matrix_add(PyObject *m1, PyObject *m2)
return NULL;
if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Matrix addition: "
"matrices must have the same dimensions for this operation");
return NULL;
@@ -1540,7 +1538,7 @@ static PyObject *Matrix_sub(PyObject *m1, PyObject *m2)
mat2 = (MatrixObject*)m2;
if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Matrix addition: "
"arguments not valid for this operation");
return NULL;
@@ -1550,7 +1548,7 @@ static PyObject *Matrix_sub(PyObject *m1, PyObject *m2)
return NULL;
if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Matrix addition: "
"matrices must have the same dimensions for this operation");
return NULL;
@@ -1588,32 +1586,24 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
if(mat1 && mat2) {
/*MATRIX * MATRIX*/
- if(mat1->row_size != mat2->col_size){
- PyErr_SetString(PyExc_AttributeError,
- "Matrix multiplication: "
- "matrix A rowsize must equal matrix B colsize");
- return NULL;
- }
- else {
- float mat[16]= {0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- double dot = 0.0f;
- int x, y, z;
-
- for(x = 0; x < mat2->row_size; x++) {
- for(y = 0; y < mat1->col_size; y++) {
- for(z = 0; z < mat1->row_size; z++) {
- dot += (mat1->matrix[z][y] * mat2->matrix[x][z]);
- }
- mat[((x * mat1->col_size) + y)] = (float)dot;
- dot = 0.0f;
+ float mat[16]= {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
+ double dot = 0.0f;
+ int x, y, z;
+
+ for(x = 0; x < mat2->row_size; x++) {
+ for(y = 0; y < mat1->col_size; y++) {
+ for(z = 0; z < mat1->row_size; z++) {
+ dot += (mat1->matrix[z][y] * mat2->matrix[x][z]);
}
+ mat[((x * mat1->col_size) + y)] = (float)dot;
+ dot = 0.0f;
}
-
- return newMatrixObject(mat, mat2->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
}
+
+ return newMatrixObject(mat, mat2->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
}
else if(mat2) {
/*FLOAT/INT * MATRIX */
@@ -1622,8 +1612,20 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
}
}
else if(mat1) {
+ /*VEC * MATRIX */
+ if(VectorObject_Check(m2)) {
+ VectorObject *vec2= (VectorObject *)m2;
+ float tvec[4];
+ if(BaseMath_ReadCallback(vec2) == -1)
+ return NULL;
+ if(column_vector_multiplication(tvec, vec2, mat1) == -1) {
+ return NULL;
+ }
+
+ return newVectorObject(tvec, vec2->size, Py_NEW, Py_TYPE(m2));
+ }
/*FLOAT/INT * MATRIX */
- if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
+ else if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
return matrix_mul_float(mat1, scalar);
}
}
@@ -1683,14 +1685,14 @@ static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
return Matrix_slice(self, start, stop);
}
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with matricies");
return NULL;
}
}
else {
PyErr_Format(PyExc_TypeError,
- "vector indices must be integers, not %.200s",
+ "matrix indices must be integers, not %.200s",
Py_TYPE(item)->tp_name);
return NULL;
}
@@ -1715,7 +1717,7 @@ static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* va
if (step == 1)
return Matrix_ass_slice(self, start, stop, value);
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with matricies");
return -1;
}
@@ -2021,8 +2023,7 @@ PyObject *newMatrixObject(float *mat, const unsigned short rowSize, const unsign
self->wrapped = Py_NEW;
}
else {
- PyErr_SetString(PyExc_RuntimeError,
- "Matrix(): invalid type, internal error");
+ Py_FatalError("Matrix(): invalid type!");
return NULL;
}
}
diff --git a/source/blender/python/generic/mathutils_Matrix.h b/source/blender/python/mathutils/mathutils_Matrix.h
index aa736d1e959..84a92bae2be 100644..100755
--- a/source/blender/python/generic/mathutils_Matrix.h
+++ b/source/blender/python/mathutils/mathutils_Matrix.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Matrix.h 38409 2011-07-15 04:01:47Z campbellbarton $
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/generic/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index 977ff7ccbc7..d43cae9edd7 100644..100755
--- a/source/blender/python/generic/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Quaternion.c 38674 2011-07-25 01:44:19Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -248,7 +248,7 @@ static PyObject *Quaternion_slerp(QuaternionObject *self, PyObject *args)
return NULL;
if(fac > 1.0f || fac < 0.0f) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"quat.slerp(): "
"interpolation factor must be between 0.0 and 1.0");
return NULL;
@@ -582,7 +582,7 @@ static int Quaternion_ass_slice(QuaternionObject *self, int begin, int end, PyOb
return -1;
if(size != (end - begin)){
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"quaternion[begin:end] = []: "
"size mismatch in slice assignment");
return -1;
@@ -620,7 +620,7 @@ static PyObject *Quaternion_subscript(QuaternionObject *self, PyObject *item)
return Quaternion_slice(self, start, stop);
}
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with quaternions");
return NULL;
}
@@ -653,7 +653,7 @@ static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyOb
if (step == 1)
return Quaternion_ass_slice(self, start, stop, value);
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with quaternion");
return -1;
}
@@ -675,7 +675,7 @@ static PyObject *Quaternion_add(PyObject *q1, PyObject *q2)
QuaternionObject *quat1 = NULL, *quat2 = NULL;
if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Quaternion addition: "
"arguments not valid for this operation");
return NULL;
@@ -698,7 +698,7 @@ static PyObject *Quaternion_sub(PyObject *q1, PyObject *q2)
QuaternionObject *quat1 = NULL, *quat2 = NULL;
if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"Quaternion addition: "
"arguments not valid for this operation");
return NULL;
@@ -753,8 +753,30 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
return quat_mul_float(quat2, scalar);
}
}
- else if (quat1) { /* QUAT*FLOAT */
- if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
+ else if (quat1) {
+ /* QUAT * VEC */
+ if (VectorObject_Check(q2)) {
+ VectorObject *vec2 = (VectorObject *)q2;
+ float tvec[3];
+
+ if(vec2->size != 3) {
+ PyErr_SetString(PyExc_ValueError,
+ "Vector multiplication: "
+ "only 3D vector rotations (with quats) "
+ "currently supported");
+ return NULL;
+ }
+ if(BaseMath_ReadCallback(vec2) == -1) {
+ return NULL;
+ }
+
+ copy_v3_v3(tvec, vec2->vec);
+ mul_qt_v3(quat1->quat, tvec);
+
+ return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec2));
+ }
+ /* QUAT * FLOAT */
+ else if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
return quat_mul_float(quat1, scalar);
}
}
@@ -1142,9 +1164,7 @@ PyObject *newQuaternionObject(float *quat, int type, PyTypeObject *base_type)
self->wrapped = Py_NEW;
}
else {
- PyErr_SetString(PyExc_RuntimeError,
- "Quaternion(): invalid type, internal error");
- return NULL;
+ Py_FatalError("Quaternion(): invalid type!");
}
}
return (PyObject *) self;
diff --git a/source/blender/python/generic/mathutils_Quaternion.h b/source/blender/python/mathutils/mathutils_Quaternion.h
index d606621390a..4ba70895680 100644..100755
--- a/source/blender/python/generic/mathutils_Quaternion.h
+++ b/source/blender/python/mathutils/mathutils_Quaternion.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Quaternion.h 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/python/generic/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index b8fdc2f0890..5d0e467f6e8 100644..100755
--- a/source/blender/python/generic/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Vector.c 38674 2011-07-25 01:44:19Z campbellbarton $
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -34,10 +34,11 @@
#include "mathutils.h"
-#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
+extern void PyC_LineSpit(void);
+
#define MAX_DIMENSIONS 4
/* Swizzle axes get packed into a single value that is used as a closure. Each
@@ -442,8 +443,7 @@ static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args)
}
}
else {
- PyErr_SetString(PyExc_ValueError,
- axis_err_msg);
+ PyErr_SetString(PyExc_ValueError, axis_err_msg);
return NULL;
}
}
@@ -667,7 +667,7 @@ static PyObject *Vector_rotation_difference(VectorObject *self, PyObject *value)
float quat[4], vec_a[3], vec_b[3];
if(self->size < 3) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"vec.difference(value): "
"expects both vectors to be size 3 or 4");
return NULL;
@@ -1083,7 +1083,7 @@ static PyObject *Vector_isub(PyObject *v1, PyObject *v2)
* note: vector/matrix multiplication IS NOT COMMUTATIVE!!!!
* note: assume read callbacks have been done first.
*/
-static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
+int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
{
float vec_cpy[MAX_DIMENSIONS];
double dot = 0.0f;
@@ -1094,7 +1094,7 @@ static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject
vec_cpy[3] = 1.0f;
}
else {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_TypeError,
"matrix * vector: "
"matrix.row_size and len(vector) must be the same, "
"except for 3D vector * 4x4 matrix.");
@@ -1147,7 +1147,7 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
double dot = 0.0f;
if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"Vector multiplication: "
"vectors must have the same dimensions for this operation");
return NULL;
@@ -1161,8 +1161,29 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
}
else if (vec1) {
if (MatrixObject_Check(v2)) {
+ extern void PyC_LineSpit(void);
+
/* VEC * MATRIX */
+ /* this is deprecated!, use the reverse instead */
float tvec[MAX_DIMENSIONS];
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector * Matrix) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds)");
+ return NULL;
+#else
+ printf("Warning: (Vector * Matrix) is now deprecated, "
+ "reverse the multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
if(BaseMath_ReadCallback((MatrixObject *)v2) == -1)
return NULL;
if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) {
@@ -1177,7 +1198,7 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
float tvec[3];
if(vec1->size != 3) {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"Vector multiplication: "
"only 3D vector rotations (with quats) currently supported");
return NULL;
@@ -1185,6 +1206,24 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
if(BaseMath_ReadCallback(quat2) == -1) {
return NULL;
}
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector * Quat) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds)");
+ return NULL;
+#else
+ printf("Warning: (Vector * Quat) is now deprecated, "
+ "reverse the multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
copy_v3_v3(tvec, vec1->vec);
mul_qt_v3(quat2->quat, tvec);
return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1));
@@ -1228,6 +1267,24 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1)
return NULL;
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector *= Matrix) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds) "
+ "and uses the non in-place multiplication.");
+ return NULL;
+#else
+ printf("Warning: (Vector *= Matrix) is now deprecated, "
+ "reverse the (non in-place) multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
memcpy(vec->vec, rvec, sizeof(float) * vec->size);
}
else if (QuaternionObject_Check(v2)) {
@@ -1235,7 +1292,7 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
QuaternionObject *quat2 = (QuaternionObject*)v2;
if(vec->size != 3) {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"Vector multiplication: "
"only 3D vector rotations (with quats) currently supported");
return NULL;
@@ -1244,6 +1301,25 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
if(BaseMath_ReadCallback(quat2) == -1) {
return NULL;
}
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector *= Quat) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds) "
+ "and uses the non in-place multiplication.");
+ return NULL;
+#else
+ printf("Warning: (Vector *= Quat) is now deprecated, "
+ "reverse the (non in-place) multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
mul_qt_v3(quat2->quat, vec->vec);
}
else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC *= FLOAT */
@@ -1485,7 +1561,7 @@ static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
return Vector_slice(self, start, stop);
}
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
return NULL;
}
@@ -1517,7 +1593,7 @@ static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* va
if (step == 1)
return Vector_ass_slice(self, start, stop, value);
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
return -1;
}
@@ -1620,7 +1696,7 @@ static int Vector_setLength(VectorObject *self, PyObject *value)
}
if (param < 0.0) {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_ValueError,
"cannot set a vectors length to a negative value");
return -1;
}
@@ -2174,7 +2250,7 @@ static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObj
if(mat->colSize != vec_size){
if(mat->colSize == 4 && vec_size != 3){
- PyErr_SetString(PyExc_AttributeError,
+ PyErr_SetString(PyExc_ValueError,
"vector * matrix: matrix column size "
"and the vector size must be the same");
return -1;
@@ -2390,9 +2466,7 @@ PyObject *newVectorObject(float *vec, const int size, const int type, PyTypeObje
self->wrapped = Py_NEW;
}
else {
- PyErr_SetString(PyExc_RuntimeError,
- "Vector(): invalid type, internal error");
- return NULL;
+ Py_FatalError("Vector(): invalid type!");
}
}
return (PyObject *) self;
diff --git a/source/blender/python/generic/mathutils_Vector.h b/source/blender/python/mathutils/mathutils_Vector.h
index 0ede836ce44..e430a100836 100644..100755
--- a/source/blender/python/generic/mathutils_Vector.h
+++ b/source/blender/python/mathutils/mathutils_Vector.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_Vector.h 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index 4c359a15a09..acfb8a91416 100644..100755
--- a/source/blender/python/generic/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -1,5 +1,5 @@
-/*
- * $Id$
+/*
+ * $Id: mathutils_geometry.c 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -37,16 +37,16 @@
#include "mathutils_geometry.h"
/* Used for PolyFill */
-#include "MEM_guardedalloc.h"
+#ifndef MATH_STANDALONE /* define when building outside blender */
+# include "MEM_guardedalloc.h"
+# include "BLI_blenlib.h"
+# include "BLI_boxpack2d.h"
+# include "BKE_displist.h"
+# include "BKE_curve.h"
+#endif
-#include "BLI_blenlib.h"
-#include "BLI_boxpack2d.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
-
-#include "BKE_displist.h"
-
-#include "BKE_curve.h"
#define SWAP_FLOAT(a, b, tmp) tmp=a; a=b; b=tmp
#define eps 0.000001
@@ -346,132 +346,6 @@ static PyObject *M_Geometry_area_tri(PyObject *UNUSED(self), PyObject* args)
}
}
-/*----------------------------------geometry.PolyFill() -------------------*/
-PyDoc_STRVAR(M_Geometry_tesselate_polygon_doc,
-".. function:: tesselate_polygon(veclist_list)\n"
-"\n"
-" Takes a list of polylines (each point a vector) and returns the point indices for a polyline filled with triangles.\n"
-"\n"
-" :arg veclist_list: list of polylines\n"
-" :rtype: list\n"
-);
-/* PolyFill function, uses Blenders scanfill to fill multiple poly lines */
-static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *polyLineSeq)
-{
- PyObject *tri_list; /*return this list of tri's */
- PyObject *polyLine, *polyVec;
- int i, len_polylines, len_polypoints, ls_error= 0;
-
- /* display listbase */
- ListBase dispbase={NULL, NULL};
- DispList *dl;
- float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
- int index, *dl_face, totpoints=0;
-
- if(!PySequence_Check(polyLineSeq)) {
- PyErr_SetString(PyExc_TypeError,
- "expected a sequence of poly lines");
- return NULL;
- }
-
- len_polylines= PySequence_Size(polyLineSeq);
-
- for(i= 0; i < len_polylines; ++i) {
- polyLine= PySequence_GetItem(polyLineSeq, i);
- if (!PySequence_Check(polyLine)) {
- freedisplist(&dispbase);
- Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/
- PyErr_SetString(PyExc_TypeError,
- "One or more of the polylines is not a sequence of mathutils.Vector's");
- return NULL;
- }
-
- len_polypoints= PySequence_Size(polyLine);
- if (len_polypoints>0) { /* dont bother adding edges as polylines */
-#if 0
- if (EXPP_check_sequence_consistency(polyLine, &vector_Type) != 1) {
- freedisplist(&dispbase);
- Py_DECREF(polyLine);
- PyErr_SetString(PyExc_TypeError,
- "A point in one of the polylines is not a mathutils.Vector type");
- return NULL;
- }
-#endif
- dl= MEM_callocN(sizeof(DispList), "poly disp");
- BLI_addtail(&dispbase, dl);
- dl->type= DL_INDEX3;
- dl->nr= len_polypoints;
- dl->type= DL_POLY;
- dl->parts= 1; /* no faces, 1 edge loop */
- dl->col= 0; /* no material */
- dl->verts= fp= MEM_callocN(sizeof(float)*3*len_polypoints, "dl verts");
- dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index");
-
- for(index= 0; index<len_polypoints; ++index, fp+=3) {
- polyVec= PySequence_GetItem(polyLine, index);
- if(VectorObject_Check(polyVec)) {
-
- if(BaseMath_ReadCallback((VectorObject *)polyVec) == -1)
- ls_error= 1;
-
- fp[0]= ((VectorObject *)polyVec)->vec[0];
- fp[1]= ((VectorObject *)polyVec)->vec[1];
- if(((VectorObject *)polyVec)->size > 2)
- fp[2]= ((VectorObject *)polyVec)->vec[2];
- else
- fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */
- }
- else {
- ls_error= 1;
- }
-
- totpoints++;
- Py_DECREF(polyVec);
- }
- }
- Py_DECREF(polyLine);
- }
-
- if(ls_error) {
- freedisplist(&dispbase); /* possible some dl was allocated */
- PyErr_SetString(PyExc_TypeError,
- "A point in one of the polylines "
- "is not a mathutils.Vector type");
- return NULL;
- }
- else if (totpoints) {
- /* now make the list to return */
- filldisplist(&dispbase, &dispbase, 0);
-
- /* The faces are stored in a new DisplayList
- thats added to the head of the listbase */
- dl= dispbase.first;
-
- tri_list= PyList_New(dl->parts);
- if(!tri_list) {
- freedisplist(&dispbase);
- PyErr_SetString(PyExc_RuntimeError,
- "failed to make a new list");
- return NULL;
- }
-
- index= 0;
- dl_face= dl->index;
- while(index < dl->parts) {
- PyList_SET_ITEM(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]));
- dl_face+= 3;
- index++;
- }
- freedisplist(&dispbase);
- }
- else {
- /* no points, do this so scripts dont barf */
- freedisplist(&dispbase); /* possible some dl was allocated */
- tri_list= PyList_New(0);
- }
-
- return tri_list;
-}
PyDoc_STRVAR(M_Geometry_intersect_line_line_2d_doc,
".. function:: intersect_line_line_2d(lineA_p1, lineA_p2, lineB_p1, lineB_p2)\n"
@@ -556,7 +430,7 @@ static PyObject *M_Geometry_intersect_line_plane(PyObject *UNUSED(self), PyObjec
}
if(ELEM4(2, line_a->size, line_b->size, plane_co->size, plane_no->size)) {
- PyErr_SetString(PyExc_RuntimeError,
+ PyErr_SetString(PyExc_ValueError,
"geometry.intersect_line_plane(...): "
" can't use 2D Vectors");
return NULL;
@@ -614,7 +488,7 @@ static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObje
}
if(ELEM3(2, line_a->size, line_b->size, sphere_co->size)) {
- PyErr_SetString(PyExc_RuntimeError,
+ PyErr_SetString(PyExc_ValueError,
"geometry.intersect_line_sphere(...): "
" can't use 2D Vectors");
return NULL;
@@ -844,25 +718,288 @@ static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyOb
return PyLong_FromLong(isect_point_quad_v2(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
}
+PyDoc_STRVAR(M_Geometry_barycentric_transform_doc,
+".. function:: barycentric_transform(point, tri_a1, tri_a2, tri_a3, tri_b1, tri_b2, tri_b3)\n"
+"\n"
+" Return a transformed point, the transformation is defined by 2 triangles.\n"
+"\n"
+" :arg point: The point to transform.\n"
+" :type point: :class:`mathutils.Vector`\n"
+" :arg tri_a1: source triangle vertex.\n"
+" :type tri_a1: :class:`mathutils.Vector`\n"
+" :arg tri_a2: source triangle vertex.\n"
+" :type tri_a2: :class:`mathutils.Vector`\n"
+" :arg tri_a3: source triangle vertex.\n"
+" :type tri_a3: :class:`mathutils.Vector`\n"
+" :arg tri_a1: target triangle vertex.\n"
+" :type tri_a1: :class:`mathutils.Vector`\n"
+" :arg tri_a2: target triangle vertex.\n"
+" :type tri_a2: :class:`mathutils.Vector`\n"
+" :arg tri_a3: target triangle vertex.\n"
+" :type tri_a3: :class:`mathutils.Vector`\n"
+" :return: The transformed point\n"
+" :rtype: :class:`mathutils.Vector`'s\n"
+);
+static PyObject *M_Geometry_barycentric_transform(PyObject *UNUSED(self), PyObject *args)
+{
+ VectorObject *vec_pt;
+ VectorObject *vec_t1_tar, *vec_t2_tar, *vec_t3_tar;
+ VectorObject *vec_t1_src, *vec_t2_src, *vec_t3_src;
+ float vec[3];
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!O!O!O!:barycentric_transform",
+ &vector_Type, &vec_pt,
+ &vector_Type, &vec_t1_src,
+ &vector_Type, &vec_t2_src,
+ &vector_Type, &vec_t3_src,
+ &vector_Type, &vec_t1_tar,
+ &vector_Type, &vec_t2_tar,
+ &vector_Type, &vec_t3_tar)
+ ) {
+ return NULL;
+ }
+
+ if( vec_pt->size != 3 ||
+ vec_t1_src->size != 3 ||
+ vec_t2_src->size != 3 ||
+ vec_t3_src->size != 3 ||
+ vec_t1_tar->size != 3 ||
+ vec_t2_tar->size != 3 ||
+ vec_t3_tar->size != 3)
+ {
+ PyErr_SetString(PyExc_ValueError,
+ "One of more of the vector arguments wasn't a 3D vector");
+ return NULL;
+ }
+
+ barycentric_transform(vec, vec_pt->vec,
+ vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec,
+ vec_t1_src->vec, vec_t2_src->vec, vec_t3_src->vec);
+
+ return newVectorObject(vec, 3, Py_NEW, NULL);
+}
+
+#ifndef MATH_STANDALONE
+
+PyDoc_STRVAR(M_Geometry_interpolate_bezier_doc,
+".. function:: interpolate_bezier(knot1, handle1, handle2, knot2, resolution)\n"
+"\n"
+" Interpolate a bezier spline segment.\n"
+"\n"
+" :arg knot1: First bezier spline point.\n"
+" :type knot1: :class:`mathutils.Vector`\n"
+" :arg handle1: First bezier spline handle.\n"
+" :type handle1: :class:`mathutils.Vector`\n"
+" :arg handle2: Second bezier spline handle.\n"
+" :type handle2: :class:`mathutils.Vector`\n"
+" :arg knot2: Second bezier spline point.\n"
+" :type knot2: :class:`mathutils.Vector`\n"
+" :arg resolution: Number of points to return.\n"
+" :type resolution: int\n"
+" :return: The interpolated points\n"
+" :rtype: list of :class:`mathutils.Vector`'s\n"
+);
+static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *vec_k1, *vec_h1, *vec_k2, *vec_h2;
+ int resolu;
+ int dims;
+ int i;
+ float *coord_array, *fp;
+ PyObject *list;
+
+ float k1[4]= {0.0, 0.0, 0.0, 0.0};
+ float h1[4]= {0.0, 0.0, 0.0, 0.0};
+ float k2[4]= {0.0, 0.0, 0.0, 0.0};
+ float h2[4]= {0.0, 0.0, 0.0, 0.0};
+
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!i:interpolate_bezier",
+ &vector_Type, &vec_k1,
+ &vector_Type, &vec_h1,
+ &vector_Type, &vec_h2,
+ &vector_Type, &vec_k2, &resolu)
+ ) {
+ return NULL;
+ }
+
+ if(resolu <= 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "resolution must be 2 or over");
+ return NULL;
+ }
+
+ if(BaseMath_ReadCallback(vec_k1) == -1 || BaseMath_ReadCallback(vec_h1) == -1 || BaseMath_ReadCallback(vec_k2) == -1 || BaseMath_ReadCallback(vec_h2) == -1)
+ return NULL;
+
+ dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
+
+ for(i=0; i < vec_k1->size; i++) k1[i]= vec_k1->vec[i];
+ for(i=0; i < vec_h1->size; i++) h1[i]= vec_h1->vec[i];
+ for(i=0; i < vec_k2->size; i++) k2[i]= vec_k2->vec[i];
+ for(i=0; i < vec_h2->size; i++) h2[i]= vec_h2->vec[i];
+
+ coord_array= MEM_callocN(dims * (resolu) * sizeof(float), "interpolate_bezier");
+ for(i=0; i<dims; i++) {
+ forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array+i, resolu-1, sizeof(float)*dims);
+ }
+
+ list= PyList_New(resolu);
+ fp= coord_array;
+ for(i=0; i<resolu; i++, fp= fp+dims) {
+ PyList_SET_ITEM(list, i, newVectorObject(fp, dims, Py_NEW, NULL));
+ }
+ MEM_freeN(coord_array);
+ return list;
+}
+
+
+PyDoc_STRVAR(M_Geometry_tesselate_polygon_doc,
+".. function:: tesselate_polygon(veclist_list)\n"
+"\n"
+" Takes a list of polylines (each point a vector) and returns the point indices for a polyline filled with triangles.\n"
+"\n"
+" :arg veclist_list: list of polylines\n"
+" :rtype: list\n"
+);
+/* PolyFill function, uses Blenders scanfill to fill multiple poly lines */
+static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *polyLineSeq)
+{
+ PyObject *tri_list; /*return this list of tri's */
+ PyObject *polyLine, *polyVec;
+ int i, len_polylines, len_polypoints, ls_error= 0;
+
+ /* display listbase */
+ ListBase dispbase={NULL, NULL};
+ DispList *dl;
+ float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
+ int index, *dl_face, totpoints=0;
+
+ if(!PySequence_Check(polyLineSeq)) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a sequence of poly lines");
+ return NULL;
+ }
+
+ len_polylines= PySequence_Size(polyLineSeq);
+
+ for(i= 0; i < len_polylines; ++i) {
+ polyLine= PySequence_GetItem(polyLineSeq, i);
+ if (!PySequence_Check(polyLine)) {
+ freedisplist(&dispbase);
+ Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/
+ PyErr_SetString(PyExc_TypeError,
+ "One or more of the polylines is not a sequence of mathutils.Vector's");
+ return NULL;
+ }
+
+ len_polypoints= PySequence_Size(polyLine);
+ if (len_polypoints>0) { /* dont bother adding edges as polylines */
+#if 0
+ if (EXPP_check_sequence_consistency(polyLine, &vector_Type) != 1) {
+ freedisplist(&dispbase);
+ Py_DECREF(polyLine);
+ PyErr_SetString(PyExc_TypeError,
+ "A point in one of the polylines is not a mathutils.Vector type");
+ return NULL;
+ }
+#endif
+ dl= MEM_callocN(sizeof(DispList), "poly disp");
+ BLI_addtail(&dispbase, dl);
+ dl->type= DL_INDEX3;
+ dl->nr= len_polypoints;
+ dl->type= DL_POLY;
+ dl->parts= 1; /* no faces, 1 edge loop */
+ dl->col= 0; /* no material */
+ dl->verts= fp= MEM_callocN(sizeof(float)*3*len_polypoints, "dl verts");
+ dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index");
+
+ for(index= 0; index<len_polypoints; ++index, fp+=3) {
+ polyVec= PySequence_GetItem(polyLine, index);
+ if(VectorObject_Check(polyVec)) {
+
+ if(BaseMath_ReadCallback((VectorObject *)polyVec) == -1)
+ ls_error= 1;
+
+ fp[0]= ((VectorObject *)polyVec)->vec[0];
+ fp[1]= ((VectorObject *)polyVec)->vec[1];
+ if(((VectorObject *)polyVec)->size > 2)
+ fp[2]= ((VectorObject *)polyVec)->vec[2];
+ else
+ fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */
+ }
+ else {
+ ls_error= 1;
+ }
+
+ totpoints++;
+ Py_DECREF(polyVec);
+ }
+ }
+ Py_DECREF(polyLine);
+ }
+
+ if(ls_error) {
+ freedisplist(&dispbase); /* possible some dl was allocated */
+ PyErr_SetString(PyExc_TypeError,
+ "A point in one of the polylines "
+ "is not a mathutils.Vector type");
+ return NULL;
+ }
+ else if (totpoints) {
+ /* now make the list to return */
+ filldisplist(&dispbase, &dispbase, 0);
+
+ /* The faces are stored in a new DisplayList
+ thats added to the head of the listbase */
+ dl= dispbase.first;
+
+ tri_list= PyList_New(dl->parts);
+ if(!tri_list) {
+ freedisplist(&dispbase);
+ PyErr_SetString(PyExc_RuntimeError,
+ "failed to make a new list");
+ return NULL;
+ }
+
+ index= 0;
+ dl_face= dl->index;
+ while(index < dl->parts) {
+ PyList_SET_ITEM(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]));
+ dl_face+= 3;
+ index++;
+ }
+ freedisplist(&dispbase);
+ }
+ else {
+ /* no points, do this so scripts dont barf */
+ freedisplist(&dispbase); /* possible some dl was allocated */
+ tri_list= PyList_New(0);
+ }
+
+ return tri_list;
+}
+
+
static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
{
int len, i;
PyObject *list_item, *item_1, *item_2;
boxPack *box;
-
-
+
+
/* Error checking must already be done */
if(!PyList_Check(value)) {
PyErr_SetString(PyExc_TypeError,
"can only back a list of [x, y, w, h]");
return -1;
}
-
+
len= PyList_Size(value);
-
+
(*boxarray)= MEM_mallocN(len*sizeof(boxPack), "boxPack box");
-
-
+
+
for(i= 0; i < len; i++) {
list_item= PyList_GET_ITEM(value, i);
if(!PyList_Check(list_item) || PyList_Size(list_item) < 4) {
@@ -871,16 +1008,17 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
"can only pack a list of [x, y, w, h]");
return -1;
}
-
+
box= (*boxarray)+i;
-
+
item_1= PyList_GET_ITEM(list_item, 2);
item_2= PyList_GET_ITEM(list_item, 3);
-
+
box->w= (float)PyFloat_AsDouble(item_1);
box->h= (float)PyFloat_AsDouble(item_2);
box->index= i;
+ /* accounts for error case too and overwrites with own error */
if (box->w < 0.0f || box->h < 0.0f) {
MEM_freeN(*boxarray);
PyErr_SetString(PyExc_TypeError,
@@ -899,9 +1037,9 @@ static void boxPack_ToPyObject(PyObject *value, boxPack **boxarray)
int len, i;
PyObject *list_item;
boxPack *box;
-
+
len= PyList_Size(value);
-
+
for(i= 0; i < len; i++) {
box= (*boxarray)+i;
list_item= PyList_GET_ITEM(value, box->index);
@@ -927,7 +1065,7 @@ static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlis
int len;
PyObject *ret;
-
+
if(!PyList_Check(boxlist)) {
PyErr_SetString(PyExc_TypeError,
"expected a list of boxes [[x, y, w, h], ... ]");
@@ -953,138 +1091,8 @@ static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlis
return ret;
}
-PyDoc_STRVAR(M_Geometry_interpolate_bezier_doc,
-".. function:: interpolate_bezier(knot1, handle1, handle2, knot2, resolution)\n"
-"\n"
-" Interpolate a bezier spline segment.\n"
-"\n"
-" :arg knot1: First bezier spline point.\n"
-" :type knot1: :class:`mathutils.Vector`\n"
-" :arg handle1: First bezier spline handle.\n"
-" :type handle1: :class:`mathutils.Vector`\n"
-" :arg handle2: Second bezier spline handle.\n"
-" :type handle2: :class:`mathutils.Vector`\n"
-" :arg knot2: Second bezier spline point.\n"
-" :type knot2: :class:`mathutils.Vector`\n"
-" :arg resolution: Number of points to return.\n"
-" :type resolution: int\n"
-" :return: The interpolated points\n"
-" :rtype: list of :class:`mathutils.Vector`'s\n"
-);
-static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject* args)
-{
- VectorObject *vec_k1, *vec_h1, *vec_k2, *vec_h2;
- int resolu;
- int dims;
- int i;
- float *coord_array, *fp;
- PyObject *list;
-
- float k1[4]= {0.0, 0.0, 0.0, 0.0};
- float h1[4]= {0.0, 0.0, 0.0, 0.0};
- float k2[4]= {0.0, 0.0, 0.0, 0.0};
- float h2[4]= {0.0, 0.0, 0.0, 0.0};
-
-
- if(!PyArg_ParseTuple(args, "O!O!O!O!i:interpolate_bezier",
- &vector_Type, &vec_k1,
- &vector_Type, &vec_h1,
- &vector_Type, &vec_h2,
- &vector_Type, &vec_k2, &resolu)
- ) {
- return NULL;
- }
-
- if(resolu <= 1) {
- PyErr_SetString(PyExc_ValueError,
- "resolution must be 2 or over");
- return NULL;
- }
-
- if(BaseMath_ReadCallback(vec_k1) == -1 || BaseMath_ReadCallback(vec_h1) == -1 || BaseMath_ReadCallback(vec_k2) == -1 || BaseMath_ReadCallback(vec_h2) == -1)
- return NULL;
-
- dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
-
- for(i=0; i < vec_k1->size; i++) k1[i]= vec_k1->vec[i];
- for(i=0; i < vec_h1->size; i++) h1[i]= vec_h1->vec[i];
- for(i=0; i < vec_k2->size; i++) k2[i]= vec_k2->vec[i];
- for(i=0; i < vec_h2->size; i++) h2[i]= vec_h2->vec[i];
-
- coord_array= MEM_callocN(dims * (resolu) * sizeof(float), "interpolate_bezier");
- for(i=0; i<dims; i++) {
- forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array+i, resolu-1, sizeof(float)*dims);
- }
-
- list= PyList_New(resolu);
- fp= coord_array;
- for(i=0; i<resolu; i++, fp= fp+dims) {
- PyList_SET_ITEM(list, i, newVectorObject(fp, dims, Py_NEW, NULL));
- }
- MEM_freeN(coord_array);
- return list;
-}
-
-PyDoc_STRVAR(M_Geometry_barycentric_transform_doc,
-".. function:: barycentric_transform(point, tri_a1, tri_a2, tri_a3, tri_b1, tri_b2, tri_b3)\n"
-"\n"
-" Return a transformed point, the transformation is defined by 2 triangles.\n"
-"\n"
-" :arg point: The point to transform.\n"
-" :type point: :class:`mathutils.Vector`\n"
-" :arg tri_a1: source triangle vertex.\n"
-" :type tri_a1: :class:`mathutils.Vector`\n"
-" :arg tri_a2: source triangle vertex.\n"
-" :type tri_a2: :class:`mathutils.Vector`\n"
-" :arg tri_a3: source triangle vertex.\n"
-" :type tri_a3: :class:`mathutils.Vector`\n"
-" :arg tri_a1: target triangle vertex.\n"
-" :type tri_a1: :class:`mathutils.Vector`\n"
-" :arg tri_a2: target triangle vertex.\n"
-" :type tri_a2: :class:`mathutils.Vector`\n"
-" :arg tri_a3: target triangle vertex.\n"
-" :type tri_a3: :class:`mathutils.Vector`\n"
-" :return: The transformed point\n"
-" :rtype: :class:`mathutils.Vector`'s\n"
-);
-static PyObject *M_Geometry_barycentric_transform(PyObject *UNUSED(self), PyObject *args)
-{
- VectorObject *vec_pt;
- VectorObject *vec_t1_tar, *vec_t2_tar, *vec_t3_tar;
- VectorObject *vec_t1_src, *vec_t2_src, *vec_t3_src;
- float vec[3];
+#endif /* MATH_STANDALONE */
- if(!PyArg_ParseTuple(args, "O!O!O!O!O!O!O!:barycentric_transform",
- &vector_Type, &vec_pt,
- &vector_Type, &vec_t1_src,
- &vector_Type, &vec_t2_src,
- &vector_Type, &vec_t3_src,
- &vector_Type, &vec_t1_tar,
- &vector_Type, &vec_t2_tar,
- &vector_Type, &vec_t3_tar)
- ) {
- return NULL;
- }
-
- if( vec_pt->size != 3 ||
- vec_t1_src->size != 3 ||
- vec_t2_src->size != 3 ||
- vec_t3_src->size != 3 ||
- vec_t1_tar->size != 3 ||
- vec_t2_tar->size != 3 ||
- vec_t3_tar->size != 3)
- {
- PyErr_SetString(PyExc_ValueError,
- "One of more of the vector arguments wasnt a 3D vector");
- return NULL;
- }
-
- barycentric_transform(vec, vec_pt->vec,
- vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec,
- vec_t1_src->vec, vec_t2_src->vec, vec_t3_src->vec);
-
- return newVectorObject(vec, 3, Py_NEW, NULL);
-}
static PyMethodDef M_Geometry_methods[]= {
{"intersect_ray_tri", (PyCFunction) M_Geometry_intersect_ray_tri, METH_VARARGS, M_Geometry_intersect_ray_tri_doc},
@@ -1096,12 +1104,14 @@ static PyMethodDef M_Geometry_methods[]= {
{"intersect_line_plane", (PyCFunction) M_Geometry_intersect_line_plane, METH_VARARGS, M_Geometry_intersect_line_plane_doc},
{"intersect_line_sphere", (PyCFunction) M_Geometry_intersect_line_sphere, METH_VARARGS, M_Geometry_intersect_line_sphere_doc},
{"intersect_line_sphere_2d", (PyCFunction) M_Geometry_intersect_line_sphere_2d, METH_VARARGS, M_Geometry_intersect_line_sphere_2d_doc},
- {"interpolate_bezier", (PyCFunction) M_Geometry_interpolate_bezier, METH_VARARGS, M_Geometry_interpolate_bezier_doc},
{"area_tri", (PyCFunction) M_Geometry_area_tri, METH_VARARGS, M_Geometry_area_tri_doc},
{"normal", (PyCFunction) M_Geometry_normal, METH_VARARGS, M_Geometry_normal_doc},
+ {"barycentric_transform", (PyCFunction) M_Geometry_barycentric_transform, METH_VARARGS, M_Geometry_barycentric_transform_doc},
+#ifndef MATH_STANDALONE
+ {"interpolate_bezier", (PyCFunction) M_Geometry_interpolate_bezier, METH_VARARGS, M_Geometry_interpolate_bezier_doc},
{"tesselate_polygon", (PyCFunction) M_Geometry_tesselate_polygon, METH_O, M_Geometry_tesselate_polygon_doc},
{"box_pack_2d", (PyCFunction) M_Geometry_box_pack_2d, METH_O, M_Geometry_box_pack_2d_doc},
- {"barycentric_transform", (PyCFunction) M_Geometry_barycentric_transform, METH_VARARGS, M_Geometry_barycentric_transform_doc},
+#endif
{NULL, NULL, 0, NULL}
};
@@ -1118,7 +1128,7 @@ static struct PyModuleDef M_Geometry_module_def= {
};
/*----------------------------MODULE INIT-------------------------*/
-PyMODINIT_FUNC BPyInit_mathutils_geometry(void)
+PyMODINIT_FUNC PyInit_mathutils_geometry(void)
{
PyObject *submodule= PyModule_Create(&M_Geometry_module_def);
return submodule;
diff --git a/source/blender/python/generic/mathutils_geometry.h b/source/blender/python/mathutils/mathutils_geometry.h
index 929b8cc8d75..0b07fc12c69 100644..100755
--- a/source/blender/python/generic/mathutils_geometry.h
+++ b/source/blender/python/mathutils/mathutils_geometry.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_geometry.h 38409 2011-07-15 04:01:47Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -38,6 +38,6 @@
#include "mathutils.h"
-PyMODINIT_FUNC BPyInit_mathutils_geometry(void);
+PyMODINIT_FUNC PyInit_mathutils_geometry(void);
#endif /* MATHUTILS_GEOMETRY_H */
diff --git a/source/blender/quicktime/CMakeLists.txt b/source/blender/quicktime/CMakeLists.txt
index 6ce4954f053..b647466d2a8 100644
--- a/source/blender/quicktime/CMakeLists.txt
+++ b/source/blender/quicktime/CMakeLists.txt
@@ -26,17 +26,15 @@
set(INC
.
- ../quicktime
- ../makesdna
- ../makesrna
- ../blenlib
- ../blenkernel
../avi
+ ../blenkernel
+ ../blenlib
+ ../blenloader
../imbuf
../imbuf/intern
- ../blenloader
+ ../makesdna
+ ../makesrna
../render/extern/include
- ../include
../windowmanager
../../../intern/guardedalloc
)
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 003f0b839f8..90aef816e2c 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -26,17 +26,17 @@
set(INC
- intern/include
extern/include
+ intern/include
+ ../blenkernel
../blenlib
../blenloader
+ ../imbuf
../makesdna
../makesrna
- ../blenkernel
- ../imbuf
- ../../../intern/smoke/extern
- ../../../intern/mikktspace
../../../intern/guardedalloc
+ ../../../intern/mikktspace
+ ../../../intern/smoke/extern
)
set(INC_SYS
@@ -125,8 +125,12 @@ if(WITH_MOD_SMOKE)
endif()
if(WITH_CODEC_QUICKTIME)
- list(APPEND INC ../quicktime)
- list(APPEND INC_SYS ${QUICKTIME_INCLUDE_DIRS})
+ list(APPEND INC
+ ../quicktime
+ )
+ list(APPEND INC_SYS
+ ${QUICKTIME_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_QUICKTIME)
endif()
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 583b792f240..b385b507707 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -3375,7 +3375,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
/* test for 100% transparant */
ok= 1;
- if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP)) {
+ if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP) && (ma->mode & MA_RAYMIRROR)==0) {
ok= 0;
/* texture on transparency? */
for(a=0; a<MAX_MTEX; a++) {
@@ -5685,7 +5685,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
Object *camera;
float mat[4][4];
float amb[3];
- const short onlyselected= !ELEM3(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW);
+ const short onlyselected= !ELEM4(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW, RE_BAKE_AO);
const short nolamps= ELEM3(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT);
re->main= bmain;
@@ -5778,6 +5778,14 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
if(re->r.mode & R_RAYTRACE)
makeraytree(re);
+ /* point density texture */
+ if(!re->test_break(re->tbh))
+ make_pointdensities(re);
+
+ /* voxel data texture */
+ if(!re->test_break(re->tbh))
+ make_voxeldata(re);
+
/* occlusion */
if((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh))
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 3aca334cffe..a7e19c8db4f 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -2577,27 +2577,7 @@ void RE_bake_ibuf_filter(ImBuf *ibuf, char *mask, const int filter)
/* Margin */
if(filter) {
- char *temprect;
- int i;
-
- /* extend the mask +2 pixels from the image,
- * this is so colors dont blend in from outside */
-
- for(i=0; i< filter; i++)
- IMB_mask_filter_extend(mask, ibuf->x, ibuf->y);
-
- temprect = MEM_dupallocN(mask);
-
- /* expand twice to clear this many pixels, so they blend back in */
- IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
- IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
-
- /* clear all pixels in the margin */
- IMB_mask_clear(ibuf, temprect, FILTER_MASK_MARGIN);
- MEM_freeN(temprect);
-
- for(i= 0; i < filter; i++)
- IMB_filter_extend(ibuf, mask);
+ IMB_filter_extend(ibuf, mask, filter);
}
/* if the bake results in new alpha then change the image setting */
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index f9c1d800c02..20ac3ba7077 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -26,23 +26,23 @@
set(INC
.
- ../nodes
- ../gpu
../blenfont
- ../blenlib
- ../makesdna
- ../makesrna
../blenkernel
- ../imbuf
+ ../blenlib
../blenloader
../editors/include
+ ../gpu
+ ../imbuf
+ ../makesdna
+ ../makesrna
+ ../nodes
../render/extern/include
- ../../../intern/guardedalloc
- ../../../intern/memutil
+ ../../gameengine/BlenderRoutines
../../../intern/elbeem/extern
../../../intern/ghost
+ ../../../intern/guardedalloc
+ ../../../intern/memutil
../../../intern/opennl/extern
- ../../../source/gameengine/BlenderRoutines
)
set(INC_SYS
@@ -89,18 +89,26 @@ if(WITH_OPENCOLLADA)
endif()
if(WITH_CODEC_QUICKTIME)
- list(APPEND INC ../quicktime)
- list(APPEND INC_SYS ${QUICKTIME_INCLUDE_DIRS})
+ list(APPEND INC
+ ../quicktime
+ )
+ list(APPEND INC_SYS
+ ${QUICKTIME_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_QUICKTIME)
endif()
if(WITH_CODEC_FFMPEG)
- list(APPEND INC_SYS ${FFMPEG_INCLUDE_DIRS})
+ list(APPEND INC_SYS
+ ${FFMPEG_INCLUDE_DIRS}
+ )
add_definitions(-DWITH_FFMPEG)
endif()
if(WITH_PYTHON)
- list(APPEND INC ../python)
+ list(APPEND INC
+ ../python
+ )
add_definitions(-DWITH_PYTHON)
if(WITH_PYTHON_SECURITY)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 98ffaac004e..fc41c2b37a1 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -273,6 +273,7 @@ void WM_operator_py_idname(char *to, const char *from);
/* *************** menu types ******************** */
struct MenuType *WM_menutype_find(const char *idname, int quiet);
int WM_menutype_add(struct MenuType* mt);
+int WM_menutype_contains(struct MenuType* mt);
void WM_menutype_freelink(struct MenuType* mt);
void WM_menutype_free(void);
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index bcd5cf38f88..a535c0bc1f8 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -175,6 +175,12 @@ int WM_menutype_add(MenuType* mt)
return 1;
}
+/* inefficient but only used for tooltip code */
+int WM_menutype_contains(MenuType* mt)
+{
+ return (mt != NULL && BLI_findindex(&menutypes, mt) != -1);
+}
+
void WM_menutype_freelink(MenuType* mt)
{
BLI_freelinkN(&menutypes, mt);
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 26d1b4454bd..daaaee771fd 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -139,15 +139,15 @@ void WM_init(bContext *C, int argc, const char **argv)
RNA_types_init_gettext();
wm_operatortype_init();
-
+
set_free_windowmanager_cb(wm_close_and_free); /* library.c */
set_blender_test_break_cb(wm_window_testbreak); /* blender.c */
DAG_editors_update_cb(ED_render_id_flush_update); /* depsgraph.c */
-
+
ED_spacetypes_init(); /* editors/space_api/spacetype.c */
-
+
ED_file_init(); /* for fsmenu */
- ED_init_node_butfuncs();
+ ED_init_node_butfuncs();
WM_read_homefile_proc(C, &wmbase);
/* note: there is a bug where python needs initializing before loading the
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 3067d298567..ea8e6d9bb31 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -3567,10 +3567,12 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
/* items for modal map */
WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL);
+ /* Note: cancel only on press otherwise you cannot map this to RMB-gesture */
+ WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL);
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN);
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_SELECT);
+ WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_SELECT);
#if 0 // Durian guys like this
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_SHIFT, 0, GESTURE_MODAL_BEGIN);