Merged revision(s) 59035-59107 from trunk/blender into soc-2013-dingto.
authorThomas Dinges <blender@dingto.org>
Tue, 13 Aug 2013 09:15:03 +0000 (09:15 +0000)
committerThomas Dinges <blender@dingto.org>
Tue, 13 Aug 2013 09:15:03 +0000 (09:15 +0000)
Skipping 59034 (Non-Progressive on GPU).

97 files changed:
build_files/build_environment/install_deps.sh
build_files/cmake/cmake_static_check_cppcheck.py
doc/python_api/rst/bge.logic.rst
intern/cycles/blender/addon/ui.py
intern/cycles/blender/blender_object.cpp
intern/cycles/device/device_cuda.cpp
intern/cycles/kernel/kernel.cpp
intern/cycles/kernel/kernel.cu
intern/cycles/kernel/kernel_bvh.h
intern/cycles/kernel/kernel_bvh_traversal.h
intern/cycles/kernel/kernel_curve.h
intern/cycles/kernel/kernel_passes.h
intern/cycles/kernel/kernel_path.h
intern/cycles/kernel/kernel_shader.h
intern/cycles/kernel/kernel_sse2.cpp
intern/cycles/kernel/kernel_sse3.cpp
intern/cycles/kernel/kernel_types.h
intern/cycles/kernel/shaders/node_texture.h
intern/cycles/kernel/shaders/node_wave_texture.osl
intern/cycles/kernel/svm/svm_texture.h
intern/cycles/kernel/svm/svm_types.h
intern/cycles/kernel/svm/svm_wave.h
intern/cycles/render/curves.cpp
intern/cycles/render/graph.cpp
intern/cycles/render/session.cpp
intern/cycles/render/svm.cpp
intern/cycles/render/tile.cpp
release/scripts/modules/bpy/path.py
release/scripts/modules/bpy_extras/image_utils.py
release/scripts/startup/bl_operators/add_mesh_torus.py
release/text/GPL3-license.txt [new file with mode: 0644]
release/text/jemalloc-license.txt [new file with mode: 0644]
source/blender/avi/intern/avi.c
source/blender/blenfont/intern/blf_glyph.c
source/blender/blenkernel/BKE_screen.h
source/blender/blenkernel/intern/action.c
source/blender/blenkernel/intern/armature.c
source/blender/blenkernel/intern/camera.c
source/blender/blenkernel/intern/curve.c
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/mask.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/screen.c
source/blender/blenlib/intern/BLI_kdtree.c
source/blender/blenloader/intern/readfile.c
source/blender/bmesh/bmesh.h
source/blender/bmesh/intern/bmesh_construct.c
source/blender/bmesh/intern/bmesh_construct.h
source/blender/bmesh/intern/bmesh_core.c
source/blender/bmesh/intern/bmesh_core.h
source/blender/bmesh/intern/bmesh_marking.c
source/blender/bmesh/intern/bmesh_marking.h
source/blender/bmesh/operators/bmo_inset.c
source/blender/bmesh/operators/bmo_split_edges.c
source/blender/bmesh/operators/bmo_subdivide.c
source/blender/bmesh/operators/bmo_subdivide_edgering.c
source/blender/bmesh/tools/bmesh_edgesplit.c
source/blender/bmesh/tools/bmesh_edgesplit.h
source/blender/editors/armature/pose_edit.c
source/blender/editors/interface/interface_draw.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/mask/mask_draw.c
source/blender/editors/mask/mask_ops.c
source/blender/editors/mesh/editmesh_knife.c
source/blender/editors/mesh/editmesh_rip.c
source/blender/editors/mesh/editmesh_tools.c
source/blender/editors/object/object_edit.c
source/blender/editors/space_graph/graph_buttons.c
source/blender/editors/space_outliner/space_outliner.c
source/blender/editors/space_time/space_time.c
source/blender/editors/space_view3d/drawarmature.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/editors/space_view3d/view3d_view.c
source/blender/freestyle/intern/geometry/FitCurve.cpp
source/blender/freestyle/intern/stroke/StrokeRep.cpp
source/blender/freestyle/intern/view_map/SteerableViewMap.cpp
source/blender/freestyle/intern/view_map/ViewMapIO.cpp
source/blender/gpu/GPU_buffers.h
source/blender/gpu/intern/gpu_buffers.c
source/blender/gpu/intern/gpu_draw.c
source/blender/imbuf/intern/bmp.c
source/blender/makesdna/DNA_image_types.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_internal.h
source/blender/modifiers/intern/MOD_edgesplit.c
source/blender/modifiers/intern/MOD_ocean.c
source/blender/python/bmesh/bmesh_py_utils.c
source/blender/render/intern/source/convertblender.c
source/blender/render/intern/source/occlusion.c
source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.h
source/gameengine/Ketsji/KX_PythonInit.cpp
source/gameengine/Ketsji/KX_PythonInitTypes.cpp

index 0444f9d288a3b229b58014221e8334e806f808d7..ae16b4efaac67157a81c4e91adb744f2a8f4fc64 100755 (executable)
@@ -237,6 +237,7 @@ OSL_SKIP=false
 # Version??
 OPENCOLLADA_VERSION="1.3"
 OPENCOLLADA_SOURCE="https://github.com/KhronosGroup/OpenCOLLADA.git"
+OPENCOLLADA_REPO_UID="828b60384552b83e55d2af7055f07d2c40b4d3f4"
 OPENCOLLADA_FORCE_REBUILD=false
 OPENCOLLADA_SKIP=false
 
@@ -1632,7 +1633,7 @@ clean_OpenCOLLADA() {
 
 compile_OpenCOLLADA() {
   # To be changed each time we make edits that would modify the compiled results!
-  opencollada_magic=6
+  opencollada_magic=7
   _init_opencollada
 
   # Clean install if needed!
@@ -1657,7 +1658,7 @@ compile_OpenCOLLADA() {
     git pull origin master
 
     # Stick to same rev as windows' libs...
-    git checkout e886e196673222f2f4bc32b936dc96419fff815f
+    git checkout $OPENCOLLADA_REPO_UID
     git reset --hard
 
     # Always refresh the whole build!
index 25e39376dd24d597897037db2a863ea0e5bf0d84..aac522dfdd3f664658f8cebd6be3d37f88358430 100644 (file)
@@ -52,6 +52,7 @@ if USE_QUIET:
 
 def main():
     source_info = project_source_info.build_info(ignore_prefix_list=CHECKER_IGNORE_PREFIX)
+    source_defines = project_source_info.build_defines_as_args()
 
     check_commands = []
     for c, inc_dirs, defs in source_info:
@@ -59,7 +60,8 @@ def main():
                CHECKER_ARGS +
                [c] +
                [("-I%s" % i) for i in inc_dirs] +
-               [("-D%s" % d) for d in defs]
+               [("-D%s" % d) for d in defs] +
+               source_defines
                )
 
         check_commands.append((c, cmd))
index 4dd0614700e8133d52467483d17ecae8bb48b866..c7915ee5279d60f5a0d42f096513c571f6d6ca5d 100644 (file)
@@ -362,9 +362,9 @@ Utility functions
 
    Use / as directory separator in path
    You can use '//' at the start of the string to define a relative path;
-   Blender replaces that string by the directory of the startup .blend or runtime file
-   to make a full path name (doesn't change during the game, even if you load other .blend).
-   The function also converts the directory separator to the local file system format.
+   Blender replaces that string by the directory of the current .blend or runtime file
+   to make a full path name. The function also converts the directory separator to
+   the local file system format.
 
    :arg path: The path string to be converted/expanded.
    :type path: string
index 1d54915dd35be6638769fc0b1800dfec857ebd70..64fda3ef53562b460ac214ad8d5e8b56f7adc55e 100644 (file)
@@ -353,7 +353,9 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
         col.prop(rl, "use_pass_uv")
         col.prop(rl, "use_pass_object_index")
         col.prop(rl, "use_pass_material_index")
+        col.separator()
         col.prop(rl, "use_pass_shadow")
+        col.prop(rl, "use_pass_ambient_occlusion")
 
         col = split.column()
         col.label(text="Diffuse:")
@@ -380,7 +382,6 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
         col.separator()
         col.prop(rl, "use_pass_emit", text="Emission")
         col.prop(rl, "use_pass_environment")
-        col.prop(rl, "use_pass_ambient_occlusion")
 
 
 class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
index a5a2f1529a2562761126f2e5670d0c0cc79f6cef..3410c73fbde5a02e25a8805e641850b5ad44e771 100644 (file)
@@ -373,7 +373,7 @@ static bool object_render_hide(BL::Object b_ob, bool top_level, bool parent_hide
        
        if(show_emitter) {
                hide_triangles = false;
-               return (hide_as_dupli_parent || hide_as_dupli_child_original);
+               return false;
        }
        else if(hair_present) {
                hide_triangles = true;
index 722d0380c2211d7b617dc6e6abe623b6d126ea53..9cf0879742e5cf6b24a6f3a3ce78082bcedffeee 100644 (file)
@@ -572,8 +572,11 @@ public:
                /* get kernel function */
                if(progressive)
                        cuda_assert(cuModuleGetFunction(&cuPathTrace, cuModule, "kernel_cuda_path_trace_progressive"))
-               else
+               else {
                        cuda_assert(cuModuleGetFunction(&cuPathTrace, cuModule, "kernel_cuda_path_trace_non_progressive"))
+                       if(have_error())
+                               return;
+               }
                
                /* pass in parameters */
                int offset = 0;
index 88a8b2aa569043774ad2534b0829e3785f6d98ca..589c9e1e073ae74c51c43ab3a3cf2bfd3a161050 100644 (file)
@@ -90,10 +90,12 @@ void kernel_tex_copy(KernelGlobals *kg, const char *name, device_ptr mem, size_t
 
 void kernel_cpu_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride)
 {
-       if(kernel_data.integrator.progressive)
-               kernel_path_trace_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
-       else
+#ifdef __NON_PROGRESSIVE__
+       if(!kernel_data.integrator.progressive)
                kernel_path_trace_non_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
+       else
+#endif
+               kernel_path_trace_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
 }
 
 /* Tonemapping */
index e3fe23d3a377730f1f96ac513716206fa4a6d6fe..df865aa1b7e55fc8f4b4d6e45207011d64bdb2a5 100644 (file)
@@ -35,6 +35,7 @@ extern "C" __global__ void kernel_cuda_path_trace_progressive(float *buffer, uin
                kernel_path_trace_progressive(NULL, buffer, rng_state, sample, x, y, offset, stride);
 }
 
+#ifdef __NON_PROGRESSIVE__
 extern "C" __global__ void kernel_cuda_path_trace_non_progressive(float *buffer, uint *rng_state, int sample, int sx, int sy, int sw, int sh, int offset, int stride)
 {
        int x = sx + blockDim.x*blockIdx.x + threadIdx.x;
@@ -43,6 +44,7 @@ extern "C" __global__ void kernel_cuda_path_trace_non_progressive(float *buffer,
        if(x < sx + sw && y < sy + sh)
                kernel_path_trace_non_progressive(NULL, buffer, rng_state, sample, x, y, offset, stride);
 }
+#endif
 
 extern "C" __global__ void kernel_cuda_tonemap(uchar4 *rgba, float *buffer, int sample, int sx, int sy, int sw, int sh, int offset, int stride)
 {
index 9f6d79e13fbb209d726bb920d62bc42e80760c2d..c9e14645d47e0a47414494577e48137687de5824 100644 (file)
@@ -215,12 +215,12 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
        float3 P, float3 idir, uint visibility, int object, int curveAddr, int segment, uint *lcg_state, float difl, float extmax)
 {
        float epsilon = 0.0f;
-       int depth = kernel_data.curve_kernel_data.subdivisions;
+       int depth = kernel_data.curve.subdivisions;
 
        /* curve Intersection check */
        float3 dir = 1.0f/idir;
        
-       int flags = kernel_data.curve_kernel_data.curveflags;
+       int flags = kernel_data.curve.curveflags;
 
        int prim = kernel_tex_fetch(__prim_index, curveAddr);
 
@@ -525,7 +525,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
        float3 P, float3 idir, uint visibility, int object, int curveAddr, int segment, uint *lcg_state, float difl, float extmax)
 {
        /* curve Intersection check */
-       int flags = kernel_data.curve_kernel_data.curveflags;
+       int flags = kernel_data.curve.curveflags;
 
        int prim = kernel_tex_fetch(__prim_index, curveAddr);
        float4 v00 = kernel_tex_fetch(__curves, prim);
@@ -649,7 +649,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
 
                        if (flags & CURVE_KN_ENCLOSEFILTER) {
 
-                               float enc_ratio = kernel_data.curve_kernel_data.encasing_ratio;
+                               float enc_ratio = kernel_data.curve.encasing_ratio;
                                if((dot(P - p1, tg) > -r1 * enc_ratio) && (dot(P - p2, tg) < r2 * enc_ratio)) {
                                        float a2 = 1.0f - (dirz*dirz*(1 + gd*gd*enc_ratio*enc_ratio));
                                        float c2 = dot(dif,dif) - difz * difz * (1 + gd*gd*enc_ratio*enc_ratio) - r1*r1*enc_ratio*enc_ratio - 2*r1*difz*gd*enc_ratio;
@@ -1009,7 +1009,7 @@ __device_inline float3 curvepoint(float t, float3 p0, float3 p1, float3 p2, floa
 
 __device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const Intersection *isect, const Ray *ray, float t)
 {
-       int flag = kernel_data.curve_kernel_data.curveflags;
+       int flag = kernel_data.curve.curveflags;
        float3 P = ray->P;
        float3 D = ray->D;
 
@@ -1062,7 +1062,7 @@ __device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const
                sd->v = 0.0f;
 #endif
 
-               if(kernel_data.curve_kernel_data.curveflags & CURVE_KN_RIBBONS)
+               if(kernel_data.curve.curveflags & CURVE_KN_RIBBONS)
                        sd->Ng = normalize(-(D - tg * (dot(tg,D))));
                else {
                        sd->Ng = normalize(P - p_curr);
@@ -1080,7 +1080,7 @@ __device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const
 #endif
 
                if (flag & CURVE_KN_TRUETANGENTGNORMAL) {
-                       sd->Ng = -(D - tg * (dot(tg,D) * kernel_data.curve_kernel_data.normalmix));
+                       sd->Ng = -(D - tg * (dot(tg,D) * kernel_data.curve.normalmix));
                        sd->Ng = normalize(sd->Ng);
                        if (flag & CURVE_KN_NORMALCORRECTION) {
                                sd->Ng = sd->Ng - gd * tg;
@@ -1098,7 +1098,7 @@ __device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const
                sd->N = sd->Ng;
 
                if (flag & CURVE_KN_TANGENTGNORMAL && !(flag & CURVE_KN_TRUETANGENTGNORMAL)) {
-                       sd->N = -(D - tg * (dot(tg,D) * kernel_data.curve_kernel_data.normalmix));
+                       sd->N = -(D - tg * (dot(tg,D) * kernel_data.curve.normalmix));
                        sd->N = normalize(sd->N);
                        if (flag & CURVE_KN_NORMALCORRECTION) {
                                sd->N = sd->N - gd * tg;
index 8d423b7e7ce31e233ebda546bbc3ba33ddd07769..cfca405e7a53f3fe0059217fc5f060262a898cab 100644 (file)
@@ -258,7 +258,7 @@ __device bool BVH_FUNCTION_NAME
 #if !FEATURE(BVH_SUBSURFACE)
                                                        if(segment != ~0) {
 
-                                                               if(kernel_data.curve_kernel_data.curveflags & CURVE_KN_INTERPOLATE) 
+                                                               if(kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE) 
 #if FEATURE(BVH_HAIR_MINIMUM_WIDTH)
                                                                        hit = bvh_cardinal_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment, lcg_state, difl, extmax);
                                                                else
index e065717888ca9e51ad8ef28ecb2c21c283ca790d..b9637e7df8b230e3710470cdee0d2a7301fbb093 100644 (file)
@@ -120,14 +120,14 @@ __device float3 curve_tangent_normal(KernelGlobals *kg, ShaderData *sd)
        float3 tgN = make_float3(0.0f,0.0f,0.0f);
 
        if(sd->segment != ~0) {
-               float normalmix = kernel_data.curve_kernel_data.normalmix;
+               float normalmix = kernel_data.curve.normalmix;
 
                tgN = -(-sd->I - sd->dPdu * (dot(sd->dPdu,-sd->I) * normalmix / len_squared(sd->dPdu)));
                tgN = normalize(tgN);
 
                /* need to find suitable scaled gd for corrected normal */
 #if 0
-               if (kernel_data.curve_kernel_data.use_tangent_normal_correction)
+               if (kernel_data.curve.use_tangent_normal_correction)
                        tgN = normalize(tgN - gd * sd->dPdu);
 #endif
        }
index 0b45e2432831ea52a8921f4af6d45852cba1a3d1..4b8d6f84faa258cbe5a74df669f49877d1e6f89b 100644 (file)
@@ -48,7 +48,7 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
        if(!(flag & PASS_ALL))
                return;
        
-       /* todo: add alpha treshold */
+       /* todo: add alpha threshold */
        if(!(path_flag & PATH_RAY_TRANSPARENT)) {
                if(sample == 0) {
                        if(flag & PASS_DEPTH) {
index 48df60162b10dc2bd2f6c99ee7aa99fd7cafda4e..bf06f8dd5f6e49484e29c7f338bc79aeed05c333 100644 (file)
@@ -271,10 +271,10 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample,
                        if((kernel_data.cam.resolution == 1) && (state.flag & PATH_RAY_CAMERA)) {       
                                float3 pixdiff = ray.dD.dx + ray.dD.dy;
                                /*pixdiff = pixdiff - dot(pixdiff, ray.D)*ray.D;*/
-                               difl = kernel_data.curve_kernel_data.minimum_width * len(pixdiff) * 0.5f;
+                               difl = kernel_data.curve.minimum_width * len(pixdiff) * 0.5f;
                        }
 
-                       extmax = kernel_data.curve_kernel_data.maximum_width;
+                       extmax = kernel_data.curve.maximum_width;
                        lcg_state = lcg_init(*rng + rng_offset + sample*0x51633e2d);
                }
 
@@ -990,10 +990,10 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam
                        if((kernel_data.cam.resolution == 1) && (state.flag & PATH_RAY_CAMERA)) {       
                                float3 pixdiff = ray.dD.dx + ray.dD.dy;
                                /*pixdiff = pixdiff - dot(pixdiff, ray.D)*ray.D;*/
-                               difl = kernel_data.curve_kernel_data.minimum_width * len(pixdiff) * 0.5f;
+                               difl = kernel_data.curve.minimum_width * len(pixdiff) * 0.5f;
                        }
 
-                       extmax = kernel_data.curve_kernel_data.maximum_width;
+                       extmax = kernel_data.curve.maximum_width;
                        lcg_state = lcg_init(*rng + rng_offset + sample*0x51633e2d);
                }
 
@@ -1194,6 +1194,7 @@ __device void kernel_path_trace_progressive(KernelGlobals *kg,
        path_rng_end(kg, rng_state, rng);
 }
 
+#ifdef __NON_PROGRESSIVE__
 __device void kernel_path_trace_non_progressive(KernelGlobals *kg,
        __global float *buffer, __global uint *rng_state,
        int sample, int x, int y, int offset, int stride)
@@ -1215,11 +1216,7 @@ __device void kernel_path_trace_non_progressive(KernelGlobals *kg,
        float4 L;
 
        if (ray.t != 0.0f)
-#ifdef __NON_PROGRESSIVE__
                L = kernel_path_non_progressive(kg, &rng, sample, ray, buffer);
-#else
-               L = kernel_path_progressive(kg, &rng, sample, ray, buffer);
-#endif
        else
                L = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 
@@ -1228,6 +1225,7 @@ __device void kernel_path_trace_non_progressive(KernelGlobals *kg,
 
        path_rng_end(kg, rng_state, rng);
 }
+#endif
 
 CCL_NAMESPACE_END
 
index 5fb349ff1ee16fae4b4ac7f1e1507be2628d35ac..d8ff662c505a0d80482958e1553a1be7b6ef3829 100644 (file)
@@ -91,7 +91,7 @@ void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
                sd->segment = isect->segment;
 
                float tcorr = isect->t;
-               if(kernel_data.curve_kernel_data.curveflags & CURVE_KN_POSTINTERSECTCORRECTION) {
+               if(kernel_data.curve.curveflags & CURVE_KN_POSTINTERSECTCORRECTION) {
                        tcorr = (isect->u < 0)? tcorr + sqrtf(isect->v) : tcorr - sqrtf(isect->v);
                        sd->ray_length = tcorr;
                }
@@ -193,7 +193,7 @@ __device_inline void shader_setup_from_subsurface(KernelGlobals *kg, ShaderData
                sd->segment = isect->segment;
 
                float tcorr = isect->t;
-               if(kernel_data.curve_kernel_data.curveflags & CURVE_KN_POSTINTERSECTCORRECTION)
+               if(kernel_data.curve.curveflags & CURVE_KN_POSTINTERSECTCORRECTION)
                        tcorr = (isect->u < 0)? tcorr + sqrtf(isect->v) : tcorr - sqrtf(isect->v);
 
                sd->P = bvh_curve_refine(kg, sd, isect, ray, tcorr);
index 8321c679f07dbb113d17aa7857eb0bd9c5d95dac..344d530396b373faa56a6f2ba6764778b5d3e0e6 100644 (file)
@@ -39,10 +39,12 @@ CCL_NAMESPACE_BEGIN
 
 void kernel_cpu_sse2_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride)
 {
-       if(kernel_data.integrator.progressive)
-               kernel_path_trace_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
-       else
+#ifdef __NON_PROGRESSIVE__
+       if(!kernel_data.integrator.progressive)
                kernel_path_trace_non_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
+       else
+#endif
+               kernel_path_trace_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
 }
 
 /* Tonemapping */
index 35a816f7da95658fc2e754276c18b32952a8e920..a25c0bca93a170ecd860864549d1a960f52d0dfa 100644 (file)
@@ -41,10 +41,12 @@ CCL_NAMESPACE_BEGIN
 
 void kernel_cpu_sse3_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride)
 {
-       if(kernel_data.integrator.progressive)
-               kernel_path_trace_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
-       else
+#ifdef __NON_PROGRESSIVE__
+       if(!kernel_data.integrator.progressive)
                kernel_path_trace_non_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
+       else
+#endif
+               kernel_path_trace_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
 }
 
 /* Tonemapping */
index 0608dad5c05a02326410e7cb37867aefbe9d6d05..836eacf7cb6d8fa16036b2273ecc8a98d5c92b0c 100644 (file)
@@ -222,7 +222,7 @@ enum PathRayFlag {
        PATH_RAY_CURVE = 1024,
 
        /* this gives collisions with localview bits
-        * see: CYCLES_LOCAL_LAYER_HACK(), grr - Campbell */
+        * see: blender_util.h, grr - Campbell */
        PATH_RAY_LAYER_SHIFT = (32-20)
 };
 
@@ -279,8 +279,6 @@ typedef enum PassType {
 
 #ifdef __PASSES__
 
-typedef float3 PathThroughput;
-
 typedef struct PathRadiance {
        int use_light_pass;
 
@@ -328,7 +326,6 @@ typedef struct BsdfEval {
 
 #else
 
-typedef float3 PathThroughput;
 typedef float3 PathRadiance;
 typedef float3 BsdfEval;
 
@@ -600,7 +597,7 @@ typedef struct ShaderData {
 #endif
 } ShaderData;
 
-/* Constrant Kernel Data
+/* Constant Kernel Data
  *
  * These structs are passed from CPU to various devices, and the struct layout
  * must match exactly. Structs are padded to ensure 16 byte alignment, and we
@@ -774,8 +771,10 @@ typedef struct KernelIntegrator {
        int transmission_samples;
        int ao_samples;
        int mesh_light_samples;
-       int use_lamp_mis;
        int subsurface_samples;
+       
+       /* mis */
+       int use_lamp_mis;
 
        /* sampler */
        int sampling_pattern;
@@ -821,7 +820,6 @@ typedef struct KernelCurves {
        float maximum_width;
        float curve_epsilon;
        int pad1;
-
 } KernelCurves;
 
 typedef struct KernelBSSRDF {
@@ -843,7 +841,7 @@ typedef struct KernelData {
        KernelSunSky sunsky;
        KernelIntegrator integrator;
        KernelBVH bvh;
-       KernelCurves curve_kernel_data;
+       KernelCurves curve;
        KernelBSSRDF bssrdf;
        KernelBlackbody blackbody;
 } KernelData;
index 645be23c6a5a04ae990b28c0a3fcdb227b6c0403..3997803ec0825590012276704817c996714d6a6e 100644 (file)
 
 float voronoi_distance(string distance_metric, vector d, float e)
 {
+#if 0
        if (distance_metric == "Distance Squared")
+#endif
                return dot(d, d);
+#if 0
        if (distance_metric == "Actual Distance")
                return length(d);
        if (distance_metric == "Manhattan")
@@ -34,6 +37,7 @@ float voronoi_distance(string distance_metric, vector d, float e)
                return pow(pow(fabs(d[0]), e) + pow(fabs(d[1]), e) + pow(fabs(d[2]), e), 1.0 / e);
        
        return 0.0;
+#endif
 }
 
 /* Voronoi / Worley like */
@@ -198,31 +202,6 @@ float noise_basis_hard(point p, string basis, int hard)
        return (hard) ? fabs(2.0 * t - 1.0) : t;
 }
 
-/* Waves */
-
-float noise_wave(string wave, float a)
-{
-       if (wave == "Sine") {
-               return 0.5 + 0.5 * sin(a);
-       }
-       if (wave == "Saw") {
-               float b = 2 * M_PI;
-               int n = (int)(a / b);
-               a -= n * b;
-               if (a < 0) a += b;
-
-               return a / b;
-       }
-       if (wave == "Tri") {
-               float b = 2 * M_PI;
-               float rmax = 1.0;
-
-               return rmax - 2.0 * fabs(floor((a * (1.0 / b)) + 0.5) - (a * (1.0 / b)));
-       }
-
-       return 0.0;
-}
-
 /* Turbulence */
 
 float noise_turbulence(point p, string basis, float details, int hard)
index 12b837bc4483f84a5f673ccd87d835f4539dc2bb..93d45ded9c34abfd9727d3420af32633afb97a03 100644 (file)
@@ -39,7 +39,7 @@ float wave(point p, float scale, string type, float detail, float distortion, fl
        if (distortion != 0.0) {
                n = n + (distortion * noise_turbulence(p * dscale, "Perlin", detail, 0));
        }
-       return noise_wave("Sine", n);
+       return 0.5 + 0.5 * sin(n);
 }
 
 shader node_wave_texture(
index 3347b6235068160b709d88f98bdcf94535c6afd2..02fb3e5b86ec4f2580887aec517bc4c0dc8d8d10 100644 (file)
@@ -22,8 +22,11 @@ CCL_NAMESPACE_BEGIN
 
 __device float voronoi_distance(NodeDistanceMetric distance_metric, float3 d, float e)
 {
+#if 0
        if(distance_metric == NODE_VORONOI_DISTANCE_SQUARED)
+#endif
                return dot(d, d);
+#if 0
        if(distance_metric == NODE_VORONOI_ACTUAL_DISTANCE)
                return len(d);
        if(distance_metric == NODE_VORONOI_MANHATTAN)
@@ -38,6 +41,7 @@ __device float voronoi_distance(NodeDistanceMetric distance_metric, float3 d, fl
                return powf(powf(fabsf(d.x), e) + powf(fabsf(d.y), e) + powf(fabsf(d.z), e), 1.0f/e);
        
        return 0.0f;
+#endif
 }
 
 /* Voronoi / Worley like */
@@ -177,31 +181,6 @@ __device float noise_basis_hard(float3 p, NodeNoiseBasis basis, int hard)
        return (hard)? fabsf(2.0f*t - 1.0f): t;
 }
 
-/* Waves */
-
-__device float noise_wave(NodeWaveBasis wave, float a)
-{
-       if(wave == NODE_WAVE_SINE) {
-               return 0.5f + 0.5f * sinf(a);
-       }
-       else if(wave == NODE_WAVE_SAW) {
-               float b = M_2PI_F;
-               int n = float_to_int(a / b);
-               a -= n*b;
-               if(a < 0.0f) a += b;
-
-               return a / b;
-       }
-       else if(wave == NODE_WAVE_TRI) {
-               float b = M_2PI_F;
-               float rmax = 1.0f;
-
-               return rmax - 2.0f*fabsf(floorf((a*(1.0f/b))+0.5f) - (a*(1.0f/b)));
-       }
-
-       return 0.0f;
-}
-
 /* Turbulence */
 
 __device_noinline float noise_turbulence(float3 p, NodeNoiseBasis basis, float octaves, int hard)
index dd95f19f175fc6a54fb4c52981b6a56657900cc1..939decf80a9fe90e9a464549475cf0db116c3e06 100644 (file)
@@ -274,12 +274,6 @@ typedef enum NodeNoiseBasis {
        NODE_NOISE_CELL_NOISE
 } NodeNoiseBasis;
 
-typedef enum NodeWaveBasis {
-       NODE_WAVE_SINE,
-       NODE_WAVE_SAW,
-       NODE_WAVE_TRI
-} NodeWaveBasis;
-
 typedef enum NodeMusgraveType {
        NODE_MUSGRAVE_MULTIFRACTAL,
        NODE_MUSGRAVE_FBM,
index d2d808e40631ebbc65bdf312b30df06630e67213..33c1694283de620c6ae0dd8e61da1b41280c987a 100644 (file)
@@ -22,21 +22,19 @@ CCL_NAMESPACE_BEGIN
 
 __device_noinline float svm_wave(NodeWaveType type, float3 p, float scale, float detail, float distortion, float dscale)
 {
-       float w, n;
+       float n;
 
        p *= scale;
 
        if(type == NODE_WAVE_BANDS)
                n = (p.x + p.y + p.z) * 10.0f;
-       else /* if(type == NODE_WAVE_RINGS) */
+       else /* NODE_WAVE_RINGS */
                n = len(p) * 20.0f;
        
        if(distortion != 0.0f)
                n += distortion * noise_turbulence(p*dscale, NODE_NOISE_PERLIN, detail, 0);
 
-       w = noise_wave(NODE_WAVE_SINE, n);
-
-       return w;
+       return 0.5f + 0.5f * sinf(n);
 }
 
 __device void svm_node_tex_wave(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
index 3fcd78b01526a473bc7ffe5a210cf2d99b7e3f12..502bed069304d1acf4fa7989f3c571e6c8f5ba7e 100644 (file)
@@ -119,7 +119,7 @@ void CurveSystemManager::device_update(Device *device, DeviceScene *dscene, Scen
 
        progress.set_status("Updating Hair settings", "Copying Hair settings to device");
 
-       KernelCurves *kcurve= &dscene->data.curve_kernel_data;
+       KernelCurves *kcurve= &dscene->data.curve;
 
        kcurve->curveflags = 0;
 
index 2e8bc77b9c9ae663878679c272400b77569e8724..4c6e64a1fb5231a51b9674fe191faaa9dc348375 100644 (file)
@@ -255,7 +255,7 @@ void ShaderGraph::finalize(bool do_bump, bool do_osl, bool do_multi_transform)
 
 void ShaderGraph::find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input)
 {
-       /* find all nodes that this input dependes on directly and indirectly */
+       /* find all nodes that this input depends on directly and indirectly */
        ShaderNode *node = (input->link)? input->link->parent: NULL;
 
        if(node) {
index 13c199f879ba14cea7876f1f32e47183d4d28c71..87f5722d144ebecc0bcd4ee4337f322c2b6db610 100644 (file)
@@ -135,7 +135,7 @@ void Session::reset_gpu(BufferParams& buffer_params, int samples)
 {
        thread_scoped_lock pause_lock(pause_mutex);
 
-       /* block for buffer acces and reset immediately. we can't do this
+       /* block for buffer access and reset immediately. we can't do this
         * in the thread, because we need to allocate an OpenGL buffer, and
         * that only works in the main thread */
        thread_scoped_lock display_lock(display_mutex);
index 9e887aeadf261ed30590139c4d4b5f8bfa343edc..4e6171554654fe56685865bddf3b793ec92fdd37 100644 (file)
@@ -504,7 +504,7 @@ void SVMCompiler::generate_closure(ShaderNode *node, set<ShaderNode*>& done)
 
 void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, set<ShaderNode*>& closure_done)
 {
-       /* todo: the weaks point here is that unlike the single closure sampling 
+       /* todo: the weak point here is that unlike the single closure sampling 
         * we will evaluate all nodes even if they are used as input for closures
         * that are unused. it's not clear what would be the best way to skip such
         * nodes at runtime, especially if they are tangled up  */
index 55bbfeb3f1b471f3ee56cb9f865d3e01a602345b..ea938943f93871fac352833a3b13dafefd9ed78c 100644 (file)
@@ -189,7 +189,7 @@ list<Tile>::iterator TileManager::next_background_tile(int device, int tile_orde
 
        int64_t cordx = max(1, params.width/resolution);
        int64_t cordy = max(1, params.height/resolution);
-       int64_t mindist = cordx * cordy;
+       int64_t mindist = INT_MAX;
        
        int64_t centx = cordx / 2, centy = cordy / 2;
 
index cfc0f4742157e00915bdbad4d3e52017bfa7d47b..33039fa84942e3f7eb76cecfdeb3322bff3978c2 100644 (file)
@@ -35,6 +35,7 @@ __all__ = (
     "extensions_audio",
     "is_subdir",
     "module_names",
+    "reduce_dirs",
     "relpath",
     "resolve_ncase",
     )
@@ -304,3 +305,27 @@ def basename(path):
     Use for Windows compatibility.
     """
     return _os.path.basename(path[2:] if path[:2] in {"//", b"//"} else path)
+
+
+def reduce_dirs(dirs):
+    """
+    Given a sequence of directories, remove duplicates and
+    any directories nested in one of the other paths.
+    (Useful for recursive path searching).
+
+    :arg dirs: Sequence of directory paths.
+    :type dirs: sequence
+    :return: A unique list of paths.
+    :rtype: list
+    """
+    dirs = list({_os.path.normpath(_os.path.abspath(d)) for d in dirs})
+    dirs.sort(key=lambda d: len(d))
+    for i in range(len(dirs) -1, -1, -1):
+        for j in range(i):
+            print(i, j)
+            if len(dirs[i]) == len(dirs[j]):
+                break
+            elif is_subdir(dirs[i], dirs[j]):
+                del dirs[i]
+                break
+    return dirs
index 5c63ce1218e2d8947b3fa8b59096ce98af2aff1b..551689c5a75c7708ceabfaa685867888887e045a 100644 (file)
@@ -66,8 +66,6 @@ def load_image(imagepath,
     import os
     import bpy
 
-    # TODO: recursive
-
     # -------------------------------------------------------------------------
     # Utility Functions
 
@@ -111,6 +109,18 @@ def load_image(imagepath,
 
         return image
 
+    def _recursive_search(paths, filename_check):
+        for path in paths:
+            for dirpath, dirnames, filenames in os.walk(path):
+
+                # skip '.svn'
+                if dirpath[0] in {".", b'.'}:
+                    continue
+
+                for filename in filenames:
+                    if filename_check(filename):
+                        yield os.path.join(dirpath, filename)
+
     # -------------------------------------------------------------------------
 
     if verbose:
@@ -138,6 +148,28 @@ def load_image(imagepath,
             if os.path.exists(nfilepath):
                 return _image_load(nfilepath)
 
+    if recursive:
+        search_paths = []
+
+        for dirpath_test in (os.path.dirname(imagepath), dirname):
+            if os.path.exists(dirpath_test):
+                search_paths.append(dirpath_test)
+        search_paths[:] = bpy.path.reduce_dirs(search_paths)
+
+        imagepath_base = bpy.path.basename(imagepath)
+        if ncase_cmp:
+            imagepath_base = imagepath_base.lower()
+
+            def image_filter(fn):
+                return (imagepath_base == fn.lower())
+        else:
+            def image_filter(fn):
+                return (imagepath_base == fn)
+
+        nfilepath = next(_recursive_search(search_paths, image_filter), None)
+        if nfilepath is not None:
+            return _image_load(nfilepath)
+
     # None of the paths exist so return placeholder
     if place_holder:
         return _image_load_placeholder(imagepath)
index 6b2f8be49d1162ea866149930364b4c506c868c8..08dfc2bf8b545a09702c909546acbac850f6b25c 100644 (file)
@@ -87,6 +87,31 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
     bl_label = "Add Torus"
     bl_options = {'REGISTER', 'UNDO', 'PRESET'}
 
+    def mode_update_callback(self, context):
+        if self.mode == 'EXT_INT':
+            self.abso_major_rad = self.major_radius + self.minor_radius
+            self.abso_minor_rad = self.major_radius - self.minor_radius
+
+    major_segments = IntProperty(
+            name="Major Segments",
+            description="Number of segments for the main ring of the torus",
+            min=3, max=256,
+            default=48,
+            )
+    minor_segments = IntProperty(
+            name="Minor Segments",
+            description="Number of segments for the minor ring of the torus",
+            min=3, max=256,
+            default=12,
+            )
+    mode = bpy.props.EnumProperty(
+            name="Torus Dimentions",
+            items=(("MAJOR_MINOR", "Major/Minor", 
+                    "Use the major/minor radiuses for torus dimensions"),
+                   ("EXT_INT", "Exterior/Interior", 
+                    "Use the exterior/interior radiuses for torus dimensions")),
+            update=mode_update_callback,
+            )
     major_radius = FloatProperty(
             name="Major Radius",
             description=("Radius from the origin to the "
@@ -104,47 +129,69 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
             subtype='DISTANCE',
             unit='LENGTH',
             )
-    major_segments = IntProperty(
-            name="Major Segments",
-            description="Number of segments for the main ring of the torus",
-            min=3, max=256,
-            default=48,
-            )
-    minor_segments = IntProperty(
-            name="Minor Segments",
-            description="Number of segments for the minor ring of the torus",
-            min=3, max=256,
-            default=12,
-            )
-    use_abso = BoolProperty(
-            name="Use Int+Ext Controls",
-            description="Use the Int / Ext controls for torus dimensions",
-            default=False,
-            )
     abso_major_rad = FloatProperty(
             name="Exterior Radius",
             description="Total Exterior Radius of the torus",
             min=0.01, max=100.0,
-            default=1.0,
+            default=1.25,
             subtype='DISTANCE',
             unit='LENGTH',
             )
     abso_minor_rad = FloatProperty(
-            name="Inside Radius",
+            name="Interior Radius",
             description="Total Interior Radius of the torus",
             min=0.01, max=100.0,
-            default=0.5,
+            default=0.75,
             subtype='DISTANCE',
             unit='LENGTH',
             )
 
+    def draw(self, context):
+        layout = self.layout
+        col = layout.column(align=True)
+        col.prop(self, 'view_align')
+        col = layout.column(align=True)
+
+        col.label(text="Location")
+        col.prop(self, 'location', text="")
+        col = layout.column(align=True)
+
+        col.label(text="Rotation")
+        col.prop(self, 'rotation', text="")
+
+        col = layout.column(align=True)
+        col.label(text="Major Segments")
+        col.prop(self, 'major_segments', text="")
+        col = layout.column(align=True)
+        col.label(text="Minor Segments")
+        col.prop(self, 'minor_segments', text="")
+
+        col = layout.column(align=True)
+        col.label(text="Torus Dimentions")
+        col.row().prop(self, 'mode', expand=True)
+
+        if self.mode == 'MAJOR_MINOR':
+            col = layout.column(align=True)
+            col.label(text="Major Radius")
+            col.prop(self, 'major_radius', text="")
+            col = layout.column(align=True)
+            col.label(text="Minor Radius")
+            col.prop(self, 'minor_radius', text="")
+        else:
+            col = layout.column(align=True)
+            col.label(text="Exterior Radius")
+            col.prop(self, 'abso_major_rad', text="")
+            col = layout.column(align=True)
+            col.label(text="Interior Radius")
+            col.prop(self, 'abso_minor_rad', text="")
+
     def invoke(self, context, event):
         object_utils.object_add_grid_scale_apply_operator(self, context)
         return self.execute(context)
 
     def execute(self, context):
 
-        if self.use_abso is True:
+        if self.mode == 'EXT_INT':
             extra_helper = (self.abso_major_rad - self.abso_minor_rad) * 0.5
             self.major_radius = self.abso_minor_rad + extra_helper
             self.minor_radius = extra_helper
diff --git a/release/text/GPL3-license.txt b/release/text/GPL3-license.txt
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 3 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, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/release/text/jemalloc-license.txt b/release/text/jemalloc-license.txt
new file mode 100644 (file)
index 0000000..cc6be93
--- /dev/null
@@ -0,0 +1,29 @@
+jemalloc is released under the terms of the following BSD-derived license:
+
+Copyright (C) 2002-2013 Jason Evans <jasone@canonware.com>.
+All rights reserved.
+Copyright (C) 2007-2012 Mozilla Foundation.  All rights reserved.
+Copyright (C) 2009-2013 Facebook, Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright notice(s),
+   this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice(s),
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
+EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (C) 2013 Jason Evans <jasone@canonware.com>.
+
+Last updated 2013/03/07.
index 6f819d438df21f18238b36d5d070c6c5804dc5fd..dd52a27c022da20eb31b36298df5d520537bbfc5 100644 (file)
@@ -975,7 +975,7 @@ AviError AVI_write_frame(AviMovie *movie, int frame_num, ...)
 
        /* Allocate the new memory for the index entry */
 
-       if (frame_num + 1 > movie->index_entries) {
+       if (frame_num >= movie->index_entries) {
                const size_t entry_size = (movie->header->Streams + 1) * sizeof(AviIndexEntry);
                movie->entries = (AviIndexEntry *)MEM_recallocN(movie->entries, (frame_num + 1) * entry_size);
                movie->index_entries = frame_num + 1;
index 55424145b43455f827f043fd3bdb37cc3d04569f..37e874fa396429007279fa9fa4dff40ebcc29ae5 100644 (file)
@@ -152,7 +152,7 @@ void blf_glyph_cache_free(GlyphCacheBLF *gc)
                }
        }
 
-       if (gc->cur_tex + 1 > 0)
+       if (gc->cur_tex > -1)
                glDeleteTextures(gc->cur_tex + 1, gc->textures);
        MEM_freeN((void *)gc->textures);
        MEM_freeN(gc);
index b5a6c6fb8212de3194d18f3d64ada403fd4bf5b1..c883bdf74e06d4ad1dc74eaeeb387c98cca22c84 100644 (file)
@@ -254,6 +254,7 @@ struct SpaceType *BKE_spacetype_from_id(int spaceid);
 struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
 const struct ListBase *BKE_spacetypes_list(void);
 void BKE_spacetype_register(struct SpaceType *st);
+int BKE_spacetype_exists(int spaceid);
 void BKE_spacetypes_free(void); /* only for quitting blender */
 
 /* spacedata */
index 80e40efd1fb3a839c74ccd919f9ec33b0614c0ec..bfef3542c4599e42bc96443e3d6383f02dcbe1d7 100644 (file)
@@ -613,7 +613,6 @@ void BKE_pose_channels_hash_free(bPose *pose)
        }
 }
 
-
 void BKE_pose_channel_free(bPoseChannel *pchan)
 {
        if (pchan->custom) {
@@ -731,6 +730,9 @@ void BKE_pose_channel_copy_data(bPoseChannel *pchan, const bPoseChannel *pchan_f
 
        /* custom shape */
        pchan->custom = pchan_from->custom;
+       if (pchan->custom) {
+               id_us_plus(&pchan->custom->id);
+       }
 }
 
 
index d37ccae308951ec2380e89d17c66b50b3d9ba733..eca607c08df4731e0936531c9d388d9d7b0bbb7e 100644 (file)
@@ -1652,10 +1652,16 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
                        
                        /* copy data in temp back over to the cleaned-out (but still allocated) original channel */
                        *pchan = pchanw;
+                       if (pchan->custom) {
+                               id_us_plus(&pchan->custom->id);
+                       }
                }
                else {
                        /* always copy custom shape */
                        pchan->custom = pchanp->custom;
+                       if (pchan->custom) {
+                               id_us_plus(&pchan->custom->id);
+                       }
                        if (pchanp->custom_tx)
                                pchan->custom_tx = BKE_pose_channel_find_name(pose, pchanp->custom_tx->name);
 
index e86561d687d200211a61a280e598adc6ef699ed1..f9444ca2cf9ddb66a64a970771a323e112f41f84 100644 (file)
@@ -462,7 +462,7 @@ typedef struct CameraViewFrameData {
        unsigned int tot;
 } CameraViewFrameData;
 
-static void BKE_camera_to_frame_view_cb(const float co[3], void *user_data)
+static void camera_to_frame_view_cb(const float co[3], void *user_data)
 {
        CameraViewFrameData *data = (CameraViewFrameData *)user_data;
        unsigned int i;
@@ -526,7 +526,7 @@ int BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
        data_cb.tot = 0;
        /* run callback on all visible points */
        BKE_scene_foreach_display_point(scene, v3d, BA_SELECT,
-                                       BKE_camera_to_frame_view_cb, &data_cb);
+                                       camera_to_frame_view_cb, &data_cb);
 
        if (data_cb.tot <= 1) {
                return FALSE;
index 849c1c0d3e10c6a0368be8696beb99fe7098bdac..26ae1b94aeea27f13cbb11ecb70afb832124aa8d 100644 (file)
@@ -2408,6 +2408,23 @@ static void make_bevel_list_2D(BevList *bl)
        }
 }
 
+static void bevlist_firstlast_direction_calc_from_bpoint(Nurb *nu, BevList *bl)
+{
+       if (nu->pntsu > 1) {
+               BPoint *first_bp = nu->bp, *last_bp = nu->bp + (nu->pntsu - 1);
+               BevPoint *first_bevp, *last_bevp;
+
+               first_bevp = (BevPoint *)(bl + 1);
+               last_bevp = first_bevp + (bl->nr - 1);
+
+               sub_v3_v3v3(first_bevp->dir, (first_bp + 1)->vec, first_bp->vec);
+               normalize_v3(first_bevp->dir);
+
+               sub_v3_v3v3(last_bevp->dir, last_bp->vec, (last_bp - 1)->vec);
+               normalize_v3(last_bevp->dir);
+       }
+}
+
 void BKE_curve_bevelList_make(Object *ob)
 {
        /*
@@ -2491,6 +2508,10 @@ void BKE_curve_bevelList_make(Object *ob)
                                        bevp++;
                                        bp++;
                                }
+
+                               if ((nu->flagu & CU_NURB_CYCLIC) == 0) {
+                                       bevlist_firstlast_direction_calc_from_bpoint(nu, bl);
+                               }
                        }
                        else if (nu->type == CU_BEZIER) {
                                /* in case last point is not cyclic */
@@ -2601,6 +2622,10 @@ void BKE_curve_bevelList_make(Object *ob)
                                                           do_radius    ? &bevp->radius : NULL,
                                                           do_weight    ? &bevp->weight : NULL,
                                                           resolu, sizeof(BevPoint));
+
+                                       if ((nu->flagu & CU_NURB_CYCLIC) == 0) {
+                                               bevlist_firstlast_direction_calc_from_bpoint(nu, bl);
+                                       }
                                }
                        }
                }
index 71289457ae9328bab75a0f968f37093b7528c921..86382c64ed37cb98c9d47c444525a579886e9f5d 100644 (file)
@@ -723,6 +723,7 @@ Image *BKE_image_add_generated(Main *bmain, unsigned int width, unsigned int hei
                ima->gen_y = height;
                ima->gen_type = gen_type;
                ima->gen_flag |= (floatbuf ? IMA_GEN_FLOAT : 0);
+               ima->gen_depth = depth;
 
                ibuf = add_ibuf_size(width, height, ima->name, depth, floatbuf, gen_type, color, &ima->colorspace_settings);
                image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
@@ -2996,7 +2997,8 @@ static ImBuf *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, (ima->gen_flag & IMA_GEN_FLOAT) != 0, ima->gen_type,
+                       if (ima->gen_depth == 0) ima->gen_depth = 24;
+                       ibuf = add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, ima->gen_depth, (ima->gen_flag & IMA_GEN_FLOAT) != 0, ima->gen_type,
                                             color, &ima->colorspace_settings);
                        image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
                        ima->ok = IMA_OK_LOADED;
index 21e7fb3116e92c3d9a7f95cd380d291b82842f12..e3f30bad5cf3981dd5961c86d849d742313dc0e0 100644 (file)
@@ -602,7 +602,7 @@ float BKE_mask_point_weight(MaskSpline *spline, MaskSplinePoint *point, const fl
                float cur_u = 0.0f, cur_w = 0.0f, next_u = 0.0f, next_w = 0.0f, fac; /* Quite warnings */
                int i;
 
-               for (i = 0; i < point->tot_uw + 1; i++) {
+               for (i = 0; i <= point->tot_uw; i++) {
 
                        if (i == 0) {
                                cur_u = 0.0f;
index 150c20d047db2d400b9e8cb5ee96b3be17c43336..962209bef87dcf616be3d33619463cba2901d572 100644 (file)
@@ -2543,7 +2543,7 @@ void BKE_scene_foreach_display_point(
        Object *ob;
 
        for (base = FIRSTBASE; base; base = base->next) {
-               if (BASE_VISIBLE(v3d, base) && (base->flag & flag) == flag) {
+               if (BASE_VISIBLE_BGMODE(v3d, scene, base) && (base->flag & flag) == flag) {
                        ob = base->object;
 
                        if ((ob->transflag & OB_DUPLI) == 0) {
index 01f57b9537817e2228a7440990502b31a357523f..fe2f52d79fd06193326fde9196fd35afba13c2cc 100644 (file)
@@ -136,6 +136,11 @@ void BKE_spacetype_register(SpaceType *st)
        BLI_addtail(&spacetypes, st);
 }
 
+int BKE_spacetype_exists(int spaceid)
+{
+       return BKE_spacetype_from_id(spaceid) != NULL;
+}
+
 /* ***************** Space handling ********************** */
 
 void BKE_spacedata_freelist(ListBase *lb)
index 0e7602b7e6bd730109c448231d2ed3990f092651..dd54fe681b0bf252eb314be01beb27946670dd71 100644 (file)
@@ -349,7 +349,7 @@ static void add_in_range(KDTreeNearest **ptn, int found, int *totfoundstack, int
 {
        KDTreeNearest *to;
 
-       if (found + 1 > *totfoundstack) {
+       if (found >= *totfoundstack) {
                KDTreeNearest *temp = MEM_callocN((*totfoundstack + 50) * sizeof(KDTreeNode), "psys_treefoundstack");
                memcpy(temp, *ptn, *totfoundstack * sizeof(KDTreeNearest));
                if (*ptn)
index 66fd58c42dc1a5cf7076729e44b6e0673b62a7ea..1f8bbfbec8894fec25360e81b20fb698d8e48f8a 100644 (file)
@@ -6138,20 +6138,26 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
                ui_list->type = NULL;
        }
 
-       ar->regiondata = newdataadr(fd, ar->regiondata);
-       if (ar->regiondata) {
-               if (spacetype == SPACE_VIEW3D) {
-                       RegionView3D *rv3d = ar->regiondata;
-                       
-                       rv3d->localvd = newdataadr(fd, rv3d->localvd);
-                       rv3d->clipbb = newdataadr(fd, rv3d->clipbb);
-                       
-                       rv3d->depths = NULL;
-                       rv3d->gpuoffscreen = NULL;
-                       rv3d->ri = NULL;
-                       rv3d->render_engine = NULL;
-                       rv3d->sms = NULL;
-                       rv3d->smooth_timer = NULL;
+       if (spacetype == SPACE_EMPTY) {
+               /* unkown space type, don't leak regiondata */
+               ar->regiondata = NULL;
+       }
+       else {
+               ar->regiondata = newdataadr(fd, ar->regiondata);
+               if (ar->regiondata) {
+                       if (spacetype == SPACE_VIEW3D) {
+                               RegionView3D *rv3d = ar->regiondata;
+
+                               rv3d->localvd = newdataadr(fd, rv3d->localvd);
+                               rv3d->clipbb = newdataadr(fd, rv3d->clipbb);
+
+                               rv3d->depths = NULL;
+                               rv3d->gpuoffscreen = NULL;
+                               rv3d->ri = NULL;
+                               rv3d->render_engine = NULL;
+                               rv3d->sms = NULL;
+                               rv3d->smooth_timer = NULL;
+                       }
                }
        }
        
@@ -6238,6 +6244,11 @@ static bool direct_link_screen(FileData *fd, bScreen *sc)
                sa->handlers.first = sa->handlers.last = NULL;
                sa->type = NULL;        /* spacetype callbacks */
                sa->region_active_win = -1;
+
+               /* if we do not have the spacetype registered (game player), we cannot
+                * free it, so don't allocate any new memory for such spacetypes. */
+               if (!BKE_spacetype_exists(sa->spacetype))
+                       sa->spacetype = SPACE_EMPTY;
                
                for (ar = sa->regionbase.first; ar; ar = ar->next)
                        direct_link_region(fd, ar, sa->spacetype);
@@ -6255,7 +6266,12 @@ static bool direct_link_screen(FileData *fd, bScreen *sc)
                
                for (sl = sa->spacedata.first; sl; sl = sl->next) {
                        link_list(fd, &(sl->regionbase));
-                       
+
+                       /* if we do not have the spacetype registered (game player), we cannot
+                        * free it, so don't allocate any new memory for such spacetypes. */
+                       if (!BKE_spacetype_exists(sl->spacetype))
+                               sl->spacetype = SPACE_EMPTY;
+
                        for (ar = sl->regionbase.first; ar; ar = ar->next)
                                direct_link_region(fd, ar, sl->spacetype);
                        
index 022dfe452e78070cae619eb937dfb1ee37546eb4..d1d93bbfd1d1b8def77e8373c5566e1bcacf9e26 100644 (file)
@@ -271,6 +271,7 @@ extern "C" {
 
 #include "tools/bmesh_bevel.h"
 #include "tools/bmesh_decimate.h"
+#include "tools/bmesh_edgesplit.h"
 #include "tools/bmesh_path.h"
 #include "tools/bmesh_triangulate.h"
 
index 35a5a2230ada102c55dfff6b03e8bfce396e8cde..f5856ee94b3d972c4d0f040eb0d7e549ef8a5dff 100644 (file)
@@ -869,10 +869,10 @@ void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src, void
        BM_elem_attrs_copy_ex(bm_src, bm_dst, ele_src, ele_dst, BM_ELEM_SELECT);
 }
 
-void BM_elem_select_copy(BMesh *UNUSED(bm_src), BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v)
+void BM_elem_select_copy(BMesh *bm_dst, BMesh *UNUSED(bm_src), void *ele_dst_v, const void *ele_src_v)
 {
-       const BMHeader *ele_src = ele_src_v;
        BMHeader *ele_dst = ele_dst_v;
+       const BMHeader *ele_src = ele_src_v;
 
        BLI_assert(ele_src->htype == ele_dst->htype);
 
index 9552ef6f5a4ad5dfb31547b5c65f1720080162d4..f0bd7b316e9be61ccf2ce306d77d5c4940fc4ecf 100644 (file)
@@ -53,7 +53,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type);
 void BM_elem_attrs_copy_ex(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v,
                            const char hflag_mask);
 void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v);
-void BM_elem_select_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v);
+void BM_elem_select_copy(BMesh *bm_dst, BMesh *bm_src, void *ele_dst_v, const void *ele_src_v);
 
 void   BM_mesh_copy_init_customdata(BMesh *bm_dst, BMesh *bm_src, const struct BMAllocTemplate *allocsize);
 BMesh *BM_mesh_copy(BMesh *bm_old);
index 8d3c47d2cd13eb98d357865925a092e6c19331b0..b296c3675751e60936f44a55dd500d6e9ac65aa1 100644 (file)
@@ -1915,7 +1915,8 @@ bool BM_vert_splice(BMesh *bm, BMVert *v, BMVert *v_target)
  *
  * \return Success
  */
-bool bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
+void bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
+                         const bool copy_select)
 {
        const int v_edgetot = BM_vert_face_count(v);
        BMEdge **stack = BLI_array_alloca(stack, v_edgetot);
@@ -1970,6 +1971,9 @@ bool bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len
        verts[0] = v;
        for (i = 1; i < maxindex; i++) {
                verts[i] = BM_vert_create(bm, v->co, v, 0);
+               if (copy_select) {
+                       BM_elem_select_copy(bm, bm, verts[i], v);
+               }
        }
 
        /* Replace v with the new verts in each group */
@@ -2039,14 +2043,12 @@ bool bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len
        if (r_vout != NULL) {
                *r_vout = verts;
        }
-
-       return true;
 }
 
 /**
  * High level function which wraps both #bmesh_vert_separate and #bmesh_edge_separate
  */
-bool BM_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
+void BM_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
                      BMEdge **e_in, int e_in_len)
 {
        int i;
@@ -2054,11 +2056,11 @@ bool BM_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
        for (i = 0; i < e_in_len; i++) {
                BMEdge *e = e_in[i];
                if (e->l && BM_vert_in_edge(e, v)) {
-                       bmesh_edge_separate(bm, e, e->l);
+                       bmesh_edge_separate(bm, e, e->l, false);
                }
        }
 
-       return bmesh_vert_separate(bm, v, r_vout, r_vout_len);
+       bmesh_vert_separate(bm, v, r_vout, r_vout_len, false);
 }
 
 /**
@@ -2114,18 +2116,20 @@ bool BM_edge_splice(BMesh *bm, BMEdge *e, BMEdge *e_target)
  * \note Does nothing if \a l_sep is already the only loop in the
  * edge radial.
  */
-bool bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep)
+void bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep,
+                         const bool copy_select)
 {
        BMEdge *e_new;
-       int radlen;
+#ifndef NDEBUG
+       const int radlen = bmesh_radial_length(e->l);
+#endif
 
        BLI_assert(l_sep->e == e);
        BLI_assert(e->l);
        
-       radlen = bmesh_radial_length(e->l);
-       if (radlen < 2) {
+       if (BM_edge_is_boundary(e)) {
                /* no cut required */
-               return true;
+               return;
        }
 
        if (l_sep == e->l) {
@@ -2137,13 +2141,15 @@ bool bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep)
        bmesh_radial_append(e_new, l_sep);
        l_sep->e = e_new;
 
+       if (copy_select) {
+               BM_elem_select_copy(bm, bm, e_new, e);
+       }
+
        BLI_assert(bmesh_radial_length(e->l) == radlen - 1);
        BLI_assert(bmesh_radial_length(e_new->l) == 1);
 
        BM_CHECK_ELEMENT(e_new);
        BM_CHECK_ELEMENT(e);
-
-       return true;
 }
 
 /**
@@ -2162,8 +2168,8 @@ BMVert *bmesh_urmv_loop(BMesh *bm, BMLoop *l_sep)
 
        /* peel the face from the edge radials on both sides of the
         * loop vert, disconnecting the face from its fan */
-       bmesh_edge_separate(bm, l_sep->e, l_sep);
-       bmesh_edge_separate(bm, l_sep->prev->e, l_sep->prev);
+       bmesh_edge_separate(bm, l_sep->e, l_sep, false);
+       bmesh_edge_separate(bm, l_sep->prev->e, l_sep->prev, false);
 
        if (bmesh_disk_count(v_sep) == 2) {
                /* If there are still only two edges out of v_sep, then
@@ -2181,7 +2187,7 @@ BMVert *bmesh_urmv_loop(BMesh *bm, BMLoop *l_sep)
 
        /* Split all fans connected to the vert, duplicating it for
         * each fans. */
-       bmesh_vert_separate(bm, v_sep, &vtar, &len);
+       bmesh_vert_separate(bm, v_sep, &vtar, &len, false);
 
        /* There should have been at least two fans cut apart here,
         * otherwise the early exit would have kicked in. */
index 6e691a9a0b577ae5994717d9f350799593382e90..c9e806335ddf9c8379ffb5328354d4c4a004ee6c 100644 (file)
@@ -50,16 +50,18 @@ void    BM_face_kill(BMesh *bm, BMFace *f);
 void    BM_edge_kill(BMesh *bm, BMEdge *e);
 void    BM_vert_kill(BMesh *bm, BMVert *v);
 
-bool    bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep);
+void    bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep,
+                            const bool copy_select);
 bool    BM_edge_splice(BMesh *bm, BMEdge *e, BMEdge *e_target);
 bool    BM_vert_splice(BMesh *bm, BMVert *v, BMVert *v_target);
 
-bool    bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len);
+void    bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
+                            const bool copy_select);
 
 bool    bmesh_loop_reverse(BMesh *bm, BMFace *f);
 
 BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const bool do_del);
-bool    BM_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
+void    BM_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
                          BMEdge **e_in, int e_in_len);
 
 /* EULER API - For modifying structure */
index d66e478cf226a5b0433165b357356cdc30ce0292..bec301acaa91d82d8d9f1521b5ae161da048ed27 100644 (file)
@@ -69,6 +69,79 @@ static void recount_totsels(BMesh *bm)
        }
 }
 
+/**
+ * \brief Select Mode Clean
+ *
+ * Remove isolated selected elements when in a mode doesn't support them.
+ * eg: in edge-mode a selected vertex must be connected to a selected edge.
+ *
+ * \note this could be made apart of #BM_mesh_select_mode_flush_ex
+ */
+void BM_mesh_select_mode_clean_ex(BMesh *bm, const short selectmode)
+{
+       if (selectmode & SCE_SELECT_VERTEX) {
+               /* pass */
+       }
+       else if (selectmode & SCE_SELECT_EDGE) {
+               BMIter iter;
+
+               if (bm->totvertsel) {
+                       BMVert *v;
+                       BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+                               BM_elem_flag_disable(v, BM_ELEM_SELECT);
+                       }
+                       bm->totvertsel = 0;
+               }
+
+               if (bm->totedgesel) {
+                       BMEdge *e;
+                       BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+                               if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+                                       BM_vert_select_set(bm, e->v1, true);
+                                       BM_vert_select_set(bm, e->v2, true);
+                               }
+                       }
+               }
+       }
+       else if (selectmode & SCE_SELECT_FACE) {
+               BMIter iter;
+
+               if (bm->totvertsel) {
+                       BMVert *v;
+                       BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+                               BM_elem_flag_disable(v, BM_ELEM_SELECT);
+                       }
+                       bm->totvertsel = 0;
+               }
+
+               if (bm->totedgesel) {
+                       BMEdge *e;
+                       BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+                               BM_elem_flag_disable(e, BM_ELEM_SELECT);
+                       }
+                       bm->totedgesel = 0;
+               }
+
+               if (bm->totfacesel) {
+                       BMFace *f;
+                       BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+                               if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
+                                       BMLoop *l_iter, *l_first;
+                                       l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+                                       do {
+                                               BM_edge_select_set(bm, l_iter->e, true);
+                                       } while ((l_iter = l_iter->next) != l_first);
+                               }
+                       }
+               }
+       }
+}
+
+void BM_mesh_select_mode_clean(BMesh *bm)
+{
+       BM_mesh_select_mode_clean_ex(bm, bm->selectmode);
+}
+
 /**
  * \brief Select Mode Flush
  *
@@ -329,18 +402,15 @@ void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
                if (BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel -= 1;
                BM_elem_flag_disable(e, BM_ELEM_SELECT);
 
-               if (bm->selectmode == SCE_SELECT_EDGE ||
-                   bm->selectmode == SCE_SELECT_FACE ||
-                   bm->selectmode == (SCE_SELECT_EDGE | SCE_SELECT_FACE))
-               {
-
+               if ((bm->selectmode & SCE_SELECT_VERTEX) == 0) {
                        BMIter iter;
                        BMVert *verts[2] = {e->v1, e->v2};
                        BMEdge *e2;
                        int i;
 
+                       /* check if the vert is used by a selected edge */
                        for (i = 0; i < 2; i++) {
-                               int deselect = 1;
+                               bool deselect = true;
 
                                for (e2 = BM_iter_new(&iter, bm, BM_EDGES_OF_VERT, verts[i]); e2; e2 = BM_iter_step(&iter)) {
                                        if (e2 == e) {
@@ -348,7 +418,7 @@ void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
                                        }
 
                                        if (BM_elem_flag_test(e2, BM_ELEM_SELECT)) {
-                                               deselect = 0;
+                                               deselect = false;
                                                break;
                                        }
                                }
index b7040e63458769ed7e565d0a35e50ac6e020bfdb..062de4f69e1fafe2b16fceb6b2ba8637ed10c8ea 100644 (file)
@@ -59,6 +59,9 @@ void BM_vert_select_set(BMesh *bm, BMVert *v, const bool select);
 void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select);
 void BM_face_select_set(BMesh *bm, BMFace *f, const bool select);
 
+void BM_mesh_select_mode_clean_ex(BMesh *bm, const short selectmode);
+void BM_mesh_select_mode_clean(BMesh *bm);
+
 void BM_mesh_select_mode_set(BMesh *bm, int selectmode);
 void BM_mesh_select_mode_flush_ex(BMesh *bm, const short selectmode);
 void BM_mesh_select_mode_flush(BMesh *bm);
index 60fdf075d18abda1baad802c6de05927c0f41525..a7b98cda2b31327850f931d0a9c8da5a553bda75 100644 (file)
@@ -457,7 +457,7 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
 
 
                /* run the separate arg */
-               bmesh_edge_separate(bm, es->e_old, es->l);
+               bmesh_edge_separate(bm, es->e_old, es->l, false);
 
                /* calc edge-split info */
                es->e_new = es->l->e;
@@ -535,7 +535,7 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
                                /* disable touching twice, this _will_ happen if the flags not disabled */
                                BM_elem_flag_disable(v, BM_ELEM_TAG);
 
-                               bmesh_vert_separate(bm, v, &vout, &r_vout_len);
+                               bmesh_vert_separate(bm, v, &vout, &r_vout_len, false);
                                v = NULL; /* don't use again */
 
                                /* in some cases the edge doesn't split off */
index c08479304220c197dad63754de7f5b50b251040d..7eea4c4878d501c97ec516c619384a71ec43d45c 100644 (file)
@@ -29,7 +29,6 @@
 #include "BLI_utildefines.h"
 
 #include "bmesh.h"
-#include "tools/bmesh_edgesplit.h"
 
 #include "intern/bmesh_operators_private.h" /* own include */
 
@@ -48,7 +47,7 @@ void bmo_split_edges_exec(BMesh *bm, BMOperator *op)
        }
 
        /* this is where everything happens */
-       BM_mesh_edgesplit(bm, use_verts, true);
+       BM_mesh_edgesplit(bm, use_verts, true, false);
 
        BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_INTERNAL_TAG);
 }
index d0b23c3cdfba70b937b4465039117133c359c259..e669585a85763f627b08450af3e2a23191ebcb53 100644 (file)
@@ -593,7 +593,7 @@ static void quad_4edge_subdivide(BMesh *bm, BMFace *UNUSED(face), BMVert **verts
        }
 
        for (i = 1; i < numcuts + 2; i++) {
-               for (j = 1; j < numcuts + 1; j++) {
+               for (j = 1; j <= numcuts; j++) {
                        a = i * s + j;
                        b = (i - 1) * s + j;
                        e = connect_smallest_face(bm, lines[a], lines[b], &f_new);
@@ -710,7 +710,7 @@ static void tri_3edge_subdivide(BMesh *bm, BMFace *UNUSED(face), BMVert **verts,
         *      s    s
         * </pre>
         */
-       for (i = 1; i < numcuts + 1; i++) {
+       for (i = 1; i <= numcuts; i++) {
                for (j = 0; j < i; j++) {
                        e = connect_smallest_face(bm, lines[i][j], lines[i + 1][j + 1], &f_new);
 
index 9cc418d61ede6d3d1539b3fccd031aebdeb20e5b..fa39ae68cdf02b5acca4759f2e556bd0f9ce9f27 100644 (file)
@@ -47,7 +47,6 @@
 #include "BKE_curve.h"
 
 #include "bmesh.h"
-#include "tools/bmesh_edgesplit.h"
 
 #include "intern/bmesh_operators_private.h" /* own include */
 
index 3ae5c712f0ae5ffa1ab3db59560ca2efa6d5c53a..adcf325b51c8db3c20dd5bc9850fba0187fcba77 100644 (file)
@@ -98,7 +98,7 @@ static void bm_edgesplit_validate_seams(BMesh *bm)
        MEM_freeN(vtouch);
 }
 
-void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only)
+void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only, const bool copy_select)
 {
        BMIter iter;
        BMEdge *e;
@@ -136,7 +136,7 @@ void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only)
 
                        /* keep splitting until each loop has its own edge */
                        do {
-                               bmesh_edge_separate(bm, e, e->l);
+                               bmesh_edge_separate(bm, e, e->l, copy_select);
                        } while (!BM_edge_is_boundary(e));
 
                        BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
@@ -159,11 +159,11 @@ void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only)
                if (BM_elem_flag_test(e, BM_ELEM_TAG)) {
                        if (BM_elem_flag_test(e->v1, BM_ELEM_TAG)) {
                                BM_elem_flag_disable(e->v1, BM_ELEM_TAG);
-                               bmesh_vert_separate(bm, e->v1, NULL, NULL);
+                               bmesh_vert_separate(bm, e->v1, NULL, NULL, copy_select);
                        }
                        if (BM_elem_flag_test(e->v2, BM_ELEM_TAG)) {
                                BM_elem_flag_disable(e->v2, BM_ELEM_TAG);
-                               bmesh_vert_separate(bm, e->v2, NULL, NULL);
+                               bmesh_vert_separate(bm, e->v2, NULL, NULL, copy_select);
                        }
                }
        }
index 8c1231dd794957a69744b371b78ce81b3511e9af..bd66f6a9e2f8506d86244fe9aeef42f9b8e8f8b7 100644 (file)
@@ -27,6 +27,6 @@
  *  \ingroup bmesh
  */
 
-void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only);
+void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only, const bool copy_select);
 
 #endif /* __BMESH_EDGESPLIT_H__ */
index 40b961326992e069f7ef54d7751115b153b1f226..e84008c3d159d9c1e77db4542acef10d11a42631 100644 (file)
@@ -487,6 +487,9 @@ static void pose_copy_menu(Scene *scene)
                                        break;
                                        case 8: /* Custom Bone Shape */
                                                pchan->custom = pchanact->custom;
+                                               if (pchan->custom) {
+                                                       id_us_plus(&pchan->custom->id);
+                                               }
                                                break;
                                        case 9: /* Visual Location */
                                                BKE_armature_loc_pose_to_bone(pchan, pchanact->pose_mat[3], pchan->loc);
index cbd1f6ccaaaf21ad2da1269120bfdec82ff203ff..cd845da10c6045e0c7cab1fa99bc79f62ec12d6d 100644 (file)
@@ -561,7 +561,7 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol)
 
        glColor4f(1.f, 1.f, 1.f, 0.08f);
        /* draw grid lines here */
-       for (i = 1; i < (HISTOGRAM_TOT_GRID_LINES + 1); i++) {
+       for (i = 1; i <= HISTOGRAM_TOT_GRID_LINES; i++) {
                const float fac = (float)i / (float)HISTOGRAM_TOT_GRID_LINES;
 
                /* so we can tell the 1.0 color point */
index 622559cd30f26870e870437e001e0f2fa888c01a..f9ee2b67e6bd1265082df482e6cf7d718d60a5e3 100644 (file)
@@ -228,10 +228,10 @@ typedef struct uiAfterFunc {
        bContextStore *context;
 
        char undostr[BKE_UNDO_STR_MAX];
-
-       int autokey;
 } uiAfterFunc;
 
+
+
 static bool ui_but_contains_pt(uiBut *but, int mx, int my);
 static bool ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y);
 static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state);
index 924e25e4ef4a3623562f46a134e940443fa479b1..fec4ab879967fd51a87e5daf38f69f0c756a645d 100644 (file)
@@ -165,7 +165,7 @@ static void draw_spline_points(const bContext *C, MaskLayer *masklay, MaskSpline
 
                int j;
 
-               for (j = 0; j < point->tot_uw + 1; j++) {
+               for (j = 0; j <= point->tot_uw; j++) {
                        float feather_point[2];
                        int sel = FALSE;
 
index 5c2aacf0713e9bc73cca3998071fc60ac6309849..c9d3bd19941dc3cd7a55b478a8ed3335855f00b8 100644 (file)
@@ -197,7 +197,7 @@ int ED_mask_feather_find_nearest(const bContext *C, Mask *mask, float normal_co[
                                int j;
                                MaskSplinePoint *cur_point = &spline->points[i];
 
-                               for (j = 0; j < cur_point->tot_uw + 1; j++) {
+                               for (j = 0; j <= cur_point->tot_uw; j++) {
                                        float cur_len, vec[2];
 
                                        vec[0] = (*fp)[0] * scalex;
index d61f6712a8f6a06d3c6d85b9064142139bdb6cde..e1d0a412ce7e9a8742d7c5c80be04becbe631d8e 100644 (file)
@@ -2684,7 +2684,7 @@ static void knife_make_chain_cut(KnifeTool_OpData *kcd, BMFace *f, ListBase *cha
                }
        }
        else {
-               BM_elem_select_copy(bm, bm, f, f_new);
+               BM_elem_select_copy(bm, bm, f_new, f);
        }
 
        *r_f_new = f_new;
index c027c1bbcd12bebfa67fb6378df6293e58612f48..59fe2a6705784c73d2638ef3f3129fc6d937a8c9 100644 (file)
@@ -510,24 +510,6 @@ static void edbm_tagged_loop_pairs_do_fill_faces(BMesh *bm, UnorderedLoopPair *u
 
 /* --- end 'face-fill' code --- */
 
-
-static bool edbm_rip_call_edgesplit(BMEditMesh *em, wmOperator *op)
-{
-       BMOperator bmop;
-
-       if (!EDBM_op_init(em, &bmop, op, "split_edges edges=%he verts=%hv use_verts=%b",
-                         BM_ELEM_TAG, BM_ELEM_SELECT, true))
-       {
-               return false;
-       }
-       BMO_op_exec(em->bm, &bmop);
-       if (!EDBM_op_finish(em, &bmop, op, true)) {
-               return false;
-       }
-
-       return true;
-}
-
 /**
  * This is the main vert ripping function (rip when one vertex is selected)
  */
@@ -648,11 +630,9 @@ static int edbm_rip_invoke__vert(bContext *C, wmOperator *op, const wmEvent *eve
 
                BM_vert_select_set(bm, v, false);
 
-               if (bmesh_vert_separate(bm, v, &vout, &vout_len) == false) {
-                       BKE_report(op->reports, RPT_ERROR, "Error ripping vertex from faces");
-                       return OPERATOR_CANCELLED;
-               }
-               else if (vout_len < 2) {
+               bmesh_vert_separate(bm, v, &vout, &vout_len, true);
+
+               if (vout_len < 2) {
                        MEM_freeN(vout);
                        /* set selection back to avoid active-unselected vertex */
                        BM_vert_select_set(bm, v, true);
@@ -786,10 +766,7 @@ static int edbm_rip_invoke__vert(bContext *C, wmOperator *op, const wmEvent *eve
                        fill_uloop_pairs = edbm_tagged_loop_pairs_to_fill(bm);
                }
 
-               if (!edbm_rip_call_edgesplit(em, op)) {
-                       if (fill_uloop_pairs) MEM_freeN(fill_uloop_pairs);
-                       return OPERATOR_CANCELLED;
-               }
+               BM_mesh_edgesplit(em->bm, true, true, true);
        }
 
        dist = FLT_MAX;
@@ -951,10 +928,7 @@ static int edbm_rip_invoke__edge(bContext *C, wmOperator *op, const wmEvent *eve
                fill_uloop_pairs = edbm_tagged_loop_pairs_to_fill(bm);
        }
 
-       if (!edbm_rip_call_edgesplit(em, op)) {
-               if (fill_uloop_pairs) MEM_freeN(fill_uloop_pairs);
-               return OPERATOR_CANCELLED;
-       }
+       BM_mesh_edgesplit(em->bm, true, true, true);
 
        /* note: the output of the bmesh operator is ignored, since we built
         * the contiguous loop pairs to split already, its possible that some
@@ -965,6 +939,9 @@ static int edbm_rip_invoke__edge(bContext *C, wmOperator *op, const wmEvent *eve
                                    ar, projectMat, fmval);
        MEM_freeN(eloop_pairs);
 
+       /* deselect loose verts */
+       BM_mesh_select_mode_clean_ex(bm, SCE_SELECT_EDGE);
+
        if (do_fill && fill_uloop_pairs) {
                edbm_tagged_loop_pairs_do_fill_faces(bm, fill_uloop_pairs);
                MEM_freeN(fill_uloop_pairs);
@@ -975,8 +952,6 @@ static int edbm_rip_invoke__edge(bContext *C, wmOperator *op, const wmEvent *eve
                return OPERATOR_CANCELLED;
        }
 
-       EDBM_selectmode_flush(em);
-
        return OPERATOR_FINISHED;
 }
 
index 629618fd3538a3923c107f708e00b1ce43d671ad..4610bb89ae4670b1b320ed4f20406070fc81fc89 100644 (file)
@@ -852,22 +852,23 @@ static int edbm_edge_split_exec(bContext *C, wmOperator *op)
 {
        Object *obedit = CTX_data_edit_object(C);
        BMEditMesh *em = BKE_editmesh_from_object(obedit);
-       BMesh *bm = em->bm;
-       BMOperator bmop;
-       int len = 0;
-       
-       if (!EDBM_op_init(em, &bmop, op, "split_edges edges=%he", BM_ELEM_SELECT)) {
-               return OPERATOR_CANCELLED;
-       }
-       BMO_op_exec(bm, &bmop);
-       len = BMO_slot_get(bmop.slots_out, "edges.out")->len;
-       if (!EDBM_op_finish(em, &bmop, op, true)) {
+
+       if (!EDBM_op_call_and_selectf(
+               em, op,
+               "edges.out", false,
+               "split_edges edges=%he",
+               BM_ELEM_SELECT))
+       {
                return OPERATOR_CANCELLED;
        }
        
+       if (em->selectmode == SCE_SELECT_FACE) {
+               EDBM_select_flush(em);
+       }
+
        EDBM_update_generic(em, true, true);
 
-       return len ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+       return OPERATOR_FINISHED;
 }
 
 void MESH_OT_edge_split(wmOperatorType *ot)
index aed1d9a1a6cefb34b8f0f15da7cc68cb58890c93..7f7a0777bbf80354dc07b0f11c4e1b5ce08b2ec6 100644 (file)
@@ -1347,7 +1347,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
 
 static int shade_poll(bContext *C)
 {
-       return (ED_operator_object_active_editable(C) && !ED_operator_editmesh(C));
+       return (CTX_data_edit_object(C) == NULL);
 }
 
 void OBJECT_OT_shade_flat(wmOperatorType *ot)
index 93a68be164a464e5895cc9d83375917e5900aa2b..295f8bd9ff229023ffbf6ffb6bf93e893c5bd46a 100644 (file)
@@ -50,6 +50,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_fcurve.h"
 #include "BKE_main.h"
+#include "BKE_global.h"
 #include "BKE_screen.h"
 #include "BKE_unit.h"
 
@@ -620,8 +621,12 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
                uiItemR(col, &driver_ptr, "expression", 0, IFACE_("Expr"), ICON_NONE);
                
                /* errors? */
-               if (driver->flag & DRIVER_FLAG_INVALID)
+               if ((G.f & G_SCRIPT_AUTOEXEC) == 0) {
+                       uiItemL(col, IFACE_("ERROR: Python auto-execution disabled"), ICON_ERROR);
+               }
+               else if (driver->flag & DRIVER_FLAG_INVALID) {
                        uiItemL(col, IFACE_("ERROR: Invalid Python expression"), ICON_ERROR);
+               }
        }
        else {
                /* errors? */
index 9c51265f917e42a7265e5ac8a8e6cf1e709fd7e8..00476cd467d1752c90a22562015f2be810ee0f11 100644 (file)
@@ -448,6 +448,7 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl)
 
        soutlinern->tree.first = soutlinern->tree.last = NULL;
        soutlinern->treestore = NULL;
+       soutlinern->treehash = NULL;
        
        return (SpaceLink *)soutlinern;
 }
index 0cf30c51db0d6d9ff838857a9560462d91120426..ad7619712004562464e1a19c746d1c79c2b7dc5c 100644 (file)
@@ -562,6 +562,7 @@ static void time_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), AR
                                        ED_region_tag_redraw(ar);
                                        break;
                        }
+                       break;
        }
 }
 
index 68f656bbf57678bf0e982c8455871a9b27fc3339..d3d8868520d36b14a888fc74bf3b21ed98c8cf08 100644 (file)
@@ -1485,7 +1485,7 @@ static void draw_dof_ellipse(float ax, float az)
                z = staticSine[i];
                
                px = 0.0f;
-               for (j = 1; j < n - i + 1; j++) {
+               for (j = 1; j <= (n - i); j++) {
                        x = staticSine[j];
                        
                        if (j == n - i) {
index d5d5c48fb466c9b99c27583916f1ab546da3b968..62e3f8471a38d1117d0996e78fe2cc1a3f5d9c55 100644 (file)
@@ -6780,7 +6780,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
 
                                        cpack(0xffffff);
                                        set_inverted_drawing(1);
-                                       for (i = 0; i < (selend - selstart + 1); i++) {
+                                       for (i = 0; i <= (selend - selstart); i++) {
                                                SelBox *sb = &(cu->selboxes[i]);
 
                                                if (i < (selend - selstart)) {
index a65f0af74a5e184631c277ef6004d7e0bb0b06b1..6c61c2af81636eb61152e3b5edc7cb6a0b0a2521 100644 (file)
@@ -826,6 +826,7 @@ static void view3d_main_area_listener(bScreen *sc, ScrArea *sa, ARegion *ar, wmN
                                        if (rv3d->persp == RV3D_CAMOB) {
                                                ED_region_tag_redraw(ar);
                                        }
+                                       break;
                                }
                        }
                        break;
index 4a14aa79e4171f0d4b2c1002330c698e46c18a02..44c338d22b9763dab9a5cb69f5cc3c737aacd2ce 100644 (file)
@@ -444,14 +444,27 @@ void VIEW3D_OT_camera_to_view(wmOperatorType *ot)
 
 /* unlike VIEW3D_OT_view_selected this is for framing a render and not
  * meant to take into account vertex/bone selection for eg. */
-static int view3d_camera_to_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
+static int view3d_camera_to_view_selected_exec(bContext *C, wmOperator *op)
 {
        Scene *scene = CTX_data_scene(C);
-       View3D *v3d = CTX_wm_view3d(C);
-       Object *camera_ob = v3d->camera;
+       View3D *v3d = CTX_wm_view3d(C);  /* can be NULL */
+       Object *camera_ob = v3d ? v3d->camera : scene->camera;
 
        float r_co[3]; /* the new location to apply */
 
+       if (camera_ob == NULL) {
+               BKE_report(op->reports, RPT_ERROR, "No active camera");
+               return OPERATOR_CANCELLED;
+       }
+       else if (camera_ob->type != OB_CAMERA) {
+               BKE_report(op->reports, RPT_ERROR, "Object not a camera");
+               return OPERATOR_CANCELLED;
+       }
+       else if (((Camera *)camera_ob->data)->type == R_ORTHO) {
+               BKE_report(op->reports, RPT_ERROR, "Orthographic cameras not supported");
+               return OPERATOR_CANCELLED;
+       }
+
        /* this function does all the important stuff */
        if (BKE_camera_view_frame_fit_to_scene(scene, v3d, camera_ob, r_co)) {
 
@@ -476,24 +489,6 @@ static int view3d_camera_to_view_selected_exec(bContext *C, wmOperator *UNUSED(o
        }
 }
 
-static int view3d_camera_to_view_selected_poll(bContext *C)
-{
-       View3D *v3d = CTX_wm_view3d(C);
-       if (v3d && v3d->camera && v3d->camera->id.lib == NULL) {
-               RegionView3D *rv3d = CTX_wm_region_view3d(C);
-               if (rv3d) {
-                       if (rv3d->is_persp == false) {
-                               CTX_wm_operator_poll_msg_set(C, "Only valid for a perspective camera view");
-                       }
-                       else if (!rv3d->viewlock) {
-                               return 1;
-                       }
-               }
-       }
-
-       return 0;
-}
-
 void VIEW3D_OT_camera_to_view_selected(wmOperatorType *ot)
 {
        /* identifiers */
@@ -503,7 +498,7 @@ void VIEW3D_OT_camera_to_view_selected(wmOperatorType *ot)
 
        /* api callbacks */
        ot->exec = view3d_camera_to_view_selected_exec;
-       ot->poll = view3d_camera_to_view_selected_poll;
+       ot->poll = ED_operator_scene_editable;
 
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
index a5701ea05e59ee0da593256cd54fe8fe64999f61..e517bf4f1967e955437c0e2df899095eb3f0fb21 100644 (file)
@@ -478,7 +478,7 @@ FitCurveWrapper::~FitCurveWrapper()
 
 void FitCurveWrapper::DrawBezierCurve(int n, Vector2 *curve)
 {
-       for (int i = 0; i < n + 1; ++i)
+       for (int i = 0; i <= n; ++i)
                _vertices.push_back(curve[i]);
 }
 
index c28118951472aef480cd730afa861c5848f320cb..2615df0a124c09226d2d5dd7f6b2545b814d7b55 100644 (file)
@@ -414,10 +414,10 @@ void Strip::cleanUpSingularities (const vector<StrokeVertex*>& iStrokeVertices)
                                        cerr << "Stephane dit \"Toto\"" << endl;
                                //traverse all the vertices of the singularity and average them
                                Vec2r avP(0.0, 0.0);
-                               for (j = i - timeSinceSingu1; j < i + 1; j++)
+                               for (j = i - timeSinceSingu1; j <= i; j++)
                                        avP = Vec2r(avP + _vertices[2 * j]->point2d());
                                avP = Vec2r( 1.0 / float(timeSinceSingu1 + 1) * avP);
-                               for (j = i - timeSinceSingu1; j < i + 1; j++)
+                               for (j = i - timeSinceSingu1; j <= i; j++)
                                        _vertices[2 * j]->setPoint2d(avP);
                                //_vertex[2 * j] = _vertex[2 * i];
                                singu1 = false;
@@ -435,10 +435,10 @@ void Strip::cleanUpSingularities (const vector<StrokeVertex*>& iStrokeVertices)
                                        cerr << "Stephane dit \"Toto\"" << endl;
                                //traverse all the vertices of the singularity and average them
                                Vec2r avP(0.0, 0.0);
-                               for (j = i - timeSinceSingu2; j < i + 1; j++)
+                               for (j = i - timeSinceSingu2; j <= i; j++)
                                        avP = Vec2r(avP + _vertices[2 * j + 1]->point2d());
                                avP = Vec2r(1.0 / float(timeSinceSingu2 + 1) * avP);
-                               for (j = i - timeSinceSingu2; j < i + 1; j++)
+                               for (j = i - timeSinceSingu2; j <= i; j++)
                                        _vertices[2 * j + 1]->setPoint2d(avP);
                                //_vertex[2 * j + 1] = _vertex[2 * i + 1];
                                singu2 = false;
index 7693afdce077bf6e64af6e6c834eeddfeb10b598..c777db6249fb175fd83cb3e4c352e28a31d18012 100644 (file)
@@ -74,7 +74,7 @@ SteerableViewMap::SteerableViewMap(const SteerableViewMap& iBrother)
        _directions = iBrother._directions;
        _mapping = iBrother._mapping;
        _imagesPyramids = new ImagePyramid *[_nbOrientations + 1]; // one more map to store the complete visible VM
-       for (i = 0; i < _nbOrientations + 1; ++i)
+       for (i = 0; i <= _nbOrientations; ++i)
                _imagesPyramids[i] = new GaussianPyramid(*(dynamic_cast<GaussianPyramid*>(iBrother._imagesPyramids[i])));
 }
 
index 5df3e4e0d8f85d0a1af71eab7f0bb07fb213fbb2..e78fb894be0009b2ea758ab069a28a24c2e99f83 100644 (file)
@@ -982,7 +982,7 @@ int load(istream& in, ViewMap *vm, ProgressBar *pb)
        if (fe_s) {
                bool b;
                READ(b);
-               for (READ(fe_rle1), fe_rle2 = 0; fe_rle1 < fe_s + 1; fe_rle2 = fe_rle1, READ(fe_rle1)) {
+               for (READ(fe_rle1), fe_rle2 = 0; fe_rle1 <= fe_s; fe_rle2 = fe_rle1, READ(fe_rle1)) {
                        if (b) {
                                for (unsigned int i = fe_rle2; i < fe_rle1; i++) {
                                        FEdgeSmooth *fes = new FEdgeSmooth;
@@ -1007,7 +1007,7 @@ int load(istream& in, ViewMap *vm, ProgressBar *pb)
        if (vv_s) {
                Nature::VertexNature nature;
                READ(nature);
-               for (READ(vv_rle1), vv_rle2 = 0; vv_rle1 < vv_s + 1; vv_rle2 = vv_rle1, READ(vv_rle1)) {
+               for (READ(vv_rle1), vv_rle2 = 0; vv_rle1 <= vv_s; vv_rle2 = vv_rle1, READ(vv_rle1)) {
                        if (nature & Nature::T_VERTEX) {
                                for (unsigned int i = vv_rle2; i < vv_rle1; i++) {
                                        TVertex *tv = new TVertex();
index 9f6f80585ab58bfd734d5bc76e82f7cffd9a5d07..fca8dcc33927d93faa2783948ed9470928aad2a9 100644 (file)
@@ -122,6 +122,7 @@ typedef struct GPUAttrib {
 } GPUAttrib;
 
 void GPU_global_buffer_pool_free(void);
+void GPU_global_buffer_pool_free_unused(void);
 
 GPUBuffer *GPU_buffer_alloc(int size);
 void GPU_buffer_free(GPUBuffer *buffer);
index 11cf64b09959f0f8653f8d076ebc73b13c1881e3..c54f937f4a917f0c994725192c678fc18cd75ca5 100644 (file)
@@ -172,6 +172,15 @@ static void gpu_buffer_pool_free(GPUBufferPool *pool)
        MEM_freeN(pool);
 }
 
+static void gpu_buffer_pool_free_unused(GPUBufferPool *pool)
+{
+       if (!pool)
+               return;
+       
+       while (pool->totbuf)
+               gpu_buffer_pool_delete_last(pool);
+}
+
 static GPUBufferPool *gpu_buffer_pool = NULL;
 static GPUBufferPool *gpu_get_global_buffer_pool(void)
 {
@@ -188,6 +197,11 @@ void GPU_global_buffer_pool_free(void)
        gpu_buffer_pool = NULL;
 }
 
+void GPU_global_buffer_pool_free_unused(void)
+{
+       gpu_buffer_pool_free_unused(gpu_buffer_pool);
+}
+
 /* get a GPUBuffer of at least `size' bytes; uses one from the buffer
  * pool if possible, otherwise creates a new one */
 GPUBuffer *GPU_buffer_alloc(int size)
index 9dc98e59c42440c8064b4df59078054723008e94..e9f9d4a3379e20d1a5fdae91bcdb5ebf35fdbbed 100644 (file)
@@ -1243,8 +1243,7 @@ void GPU_free_unused_buffers(void)
        image_free_queue = NULL;
 
        /* vbo buffers */
-       /* it's probably not necessary to free all buffers every frame */
-       /* GPU_buffer_pool_free_unused(0); */
+       GPU_global_buffer_pool_free_unused();
 
        BLI_unlock_thread(LOCK_OPENGL);
 }
index 856124ab5cbabab58f662e1378420c66498befb7..eb3cfc3ade38ed4cedd9e85602d232ca1dc49475 100644 (file)
@@ -100,11 +100,11 @@ static int checkbmp(unsigned char *mem)
                memcpy(&bmi, mem, sizeof(bmi));
 
                u = LITTLE_LONG(bmi.biSize);
-               /* we only support uncompressed 24 or 32 bits images for now */
+               /* we only support uncompressed images for now. */
                if (u >= sizeof(BMPINFOHEADER)) {
-                       if ((bmi.biCompression == 0) && (bmi.biClrUsed == 0)) {
+                       if (bmi.biCompression == 0) {
                                u = LITTLE_SHORT(bmi.biBitCount);
-                               if (u >= 16) {
+                               if (u >= 8) {
                                        ret_val = 1;
                                }
                        }
@@ -125,7 +125,7 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags, char co
 {
        struct ImBuf *ibuf = NULL;
        BMPINFOHEADER bmi;
-       int x, y, depth, skip, i;
+       int x, y, depth, ibuf_depth, skip, i;
        unsigned char *bmp, *rect;
        unsigned short col;
        double xppm, yppm;
@@ -151,6 +151,13 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags, char co
        xppm = LITTLE_LONG(bmi.biXPelsPerMeter);
        yppm = LITTLE_LONG(bmi.biYPelsPerMeter);
 
+       if (depth <= 8) {
+               ibuf_depth = 24;
+       }
+       else {
+               ibuf_depth = depth;
+       }
+
 #if 0
        printf("skip: %d, x: %d y: %d, depth: %d (%x)\n", skip, x, y,
               depth, bmi.biBitCount);
@@ -159,14 +166,33 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags, char co
 #endif
 
        if (flags & IB_test) {
-               ibuf = IMB_allocImBuf(x, y, depth, 0);
+               ibuf = IMB_allocImBuf(x, y, ibuf_depth, 0);
        }
        else {
-               ibuf = IMB_allocImBuf(x, y, depth, IB_rect);
+               ibuf = IMB_allocImBuf(x, y, ibuf_depth, IB_rect);
                bmp = mem + skip;
                rect = (unsigned char *) ibuf->rect;
 
-               if (depth == 16) {
+               if (depth == 8) {
+                       const int x_pad = (4 - (x % 4)) % 4;
+                       const char (*palette)[4] = (void *)bmp;
+                       bmp += bmi.biClrUsed * 4;
+                       for (i = y; i > 0; i--) {
+                               int j;
+                               for (j = x; j > 0; j--) {
+                                       const char *pcol = palette[bmp[0]];
+                                       rect[0] = pcol[0];
+                                       rect[1] = pcol[1];
+                                       rect[2] = pcol[2];
+
+                                       rect[3] = 255;
+                                       rect += 4; bmp += 1;
+                               }
+                               /* rows are padded to multiples of 4 */
+                               bmp += x_pad;
+                       }
+               }
+               else if (depth == 16) {
                        for (i = x * y; i > 0; i--) {
                                col = bmp[0] + (bmp[1] << 8);
                                rect[0] = ((col >> 10) & 0x1f) << 3;
@@ -179,6 +205,7 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags, char co
 
                }
                else if (depth == 24) {
+                       const int x_pad = x % 4;
                        for (i = y; i > 0; i--) {
                                int j;
                                for (j = x; j > 0; j--) {
@@ -190,7 +217,7 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags, char co
                                        rect += 4; bmp += 3;
                                }
                                /* for 24-bit images, rows are padded to multiples of 4 */
-                               bmp += x % 4;
+                               bmp += x_pad;
                        }
                }
                else if (depth == 32) {
index 456196771a64383b6f36689e34333fa3cd16423b..dae520f458df3511d39a605c9caf2c404e488122 100644 (file)
@@ -106,7 +106,7 @@ typedef struct Image {
        /* for generated images */
        int gen_x, gen_y;
        char gen_type, gen_flag;
-       char gen_pad[2];
+       short gen_depth;
        
        /* display aspect - for UV editing images resized for faster openGL display */
        float aspx, aspy;
index 5237c97ef718bd0725555053f33dfe9d01b5cd48..c158facca7cf4512ea37703e664595d66e32ba2e 100644 (file)
@@ -2292,7 +2292,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
                }
 
                if (dparm->next)
-                       fprintf(f, "\t_data += %d;\n", rna_parameter_size_alloc(dparm->prop));
+                       fprintf(f, "\t_data += %d;\n", rna_parameter_size(dparm->prop));
        }
 
        if (dfunc->call) {
index 7e2d8e8eb625e6b2daa8a38bb8ddc58c4d5dd68a..f3e561cde0aeb28e3a722e76f8f89719f065213c 100644 (file)
@@ -5378,7 +5378,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
 
        /* allocate data */
        for (parm = func->cont.properties.first; parm; parm = parm->next) {
-               alloc_size += rna_parameter_size_alloc(parm);
+               alloc_size += rna_parameter_size(parm);
 
                if (parm->flag & PROP_OUTPUT)
                        parms->ret_count++;
@@ -5440,7 +5440,7 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
                        }
                }
 
-               data = ((char *)data) + rna_parameter_size_alloc(parm);
+               data = ((char *)data) + rna_parameter_size(parm);
        }
 
        return parms;
@@ -5462,7 +5462,7 @@ void RNA_parameter_list_free(ParameterList *parms)
                                MEM_freeN(data_alloc->array);
                }
 
-               tot += rna_parameter_size_alloc(parm);
+               tot += rna_parameter_size(parm);
        }
 
        MEM_freeN(parms->data);
@@ -5497,7 +5497,7 @@ void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
        iter->offset = 0;
 
        if (iter->valid) {
-               iter->size = rna_parameter_size_alloc(iter->parm);
+               iter->size = rna_parameter_size(iter->parm);
                iter->data = (((char *)iter->parms->data)); /* +iter->offset, always 0 */
        }
 }
@@ -5509,7 +5509,7 @@ void RNA_parameter_list_next(ParameterIterator *iter)
        iter->valid = iter->parm != NULL;
 
        if (iter->valid) {
-               iter->size = rna_parameter_size_alloc(iter->parm);
+               iter->size = rna_parameter_size(iter->parm);
                iter->data = (((char *)iter->parms->data) + iter->offset);
        }
 }
index 969e715bebfc8a40548b9dea07e1cfa7811e061e..723f158bb507608147b2b8c67fa61ecbb340bc58 100644 (file)
@@ -3039,13 +3039,13 @@ void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
 int rna_parameter_size(PropertyRNA *parm)
 {
        PropertyType ptype = parm->type;
-       int len = parm->totarraylength; /* only supports fixed length at the moment */
+       int len = parm->totarraylength;
 
-       if (len > 0) {
-               /* XXX in other parts is mentioned that strings can be dynamic as well */
-               if (parm->flag & PROP_DYNAMIC)
-                       return sizeof(void *);
+       /* XXX in other parts is mentioned that strings can be dynamic as well */
+       if (parm->flag & PROP_DYNAMIC)
+               return sizeof(ParameterDynAlloc);
 
+       if (len > 0) {
                switch (ptype) {
                        case PROP_BOOLEAN:
                        case PROP_INT:
@@ -3106,18 +3106,6 @@ int rna_parameter_size(PropertyRNA *parm)
        return sizeof(void *);
 }
 
-/* this function returns the size of the memory allocated for the parameter,
- * useful for instance for memory alignment or for storing additional information */
-int rna_parameter_size_alloc(PropertyRNA *parm)
-{
-       int size = rna_parameter_size(parm);
-
-       if (parm->flag & PROP_DYNAMIC)
-               size += sizeof(((ParameterDynAlloc *)NULL)->array_tot);
-
-       return size;
-}
-
 /* Dynamic Enums */
 
 void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
index d1cfb01abfbfd4c868dd9c9aa53b83ca5483d360..72985f7b6e6704ab607b52ebfcdff769078bbb6c 100644 (file)
@@ -402,7 +402,6 @@ PointerRNA rna_pointer_inherit_refine(struct PointerRNA *ptr, struct StructRNA *
 /* Functions */
 
 int rna_parameter_size(struct PropertyRNA *parm);
-int rna_parameter_size_alloc(struct PropertyRNA *parm);
 
 struct Mesh *rna_Main_meshes_new_from_object(
         struct Main *bmain, struct ReportList *reports, struct Scene *sce,
index e37fc56d08c757888d2ce0992caaccdde32622fe..b3d3e65e120d8048432658dc181574eaecebf20e 100644 (file)
@@ -44,7 +44,6 @@
 #include "BKE_modifier.h"
 
 #include "bmesh.h"
-#include "tools/bmesh_edgesplit.h"
 
 #include "DNA_object_types.h"
 
@@ -91,7 +90,7 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
                }
        }
        
-       BM_mesh_edgesplit(bm, FALSE, TRUE);
+       BM_mesh_edgesplit(bm, false, true, false);
 
        /* BM_mesh_validate(bm); */ /* for troubleshooting */
 
index 5fdd17b5167368ea79d28894e581cfb091035947..40a4d5e0986cd7a8cbdc99d01140d7244ce52147 100644 (file)
@@ -318,8 +318,8 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd)
 
        /* create vertices */
        #pragma omp parallel for private(x, y) if (rx > OMP_MIN_RES)
-       for (y = 0; y < res_y + 1; y++) {
-               for (x = 0; x < res_x + 1; x++) {
+       for (y = 0; y <= res_y; y++) {
+               for (x = 0; x <= res_x; x++) {
                        const int i = y * (res_x + 1) + x;
                        float *co = mverts[i].co;
                        co[0] = ox + (x * sx);
index 55c97b66ffb16f2fffdfb53a2bd5b09771379887..d228e1a0646730aacee4365b35615a6287121557 100644 (file)
@@ -245,14 +245,10 @@ static PyObject *bpy_bm_utils_vert_separate(PyObject *UNUSED(self), PyObject *ar
                return NULL;
        }
 
-       if (BM_vert_separate(bm, py_vert->v, &elem, &elem_len, edge_array, edge_array_len)) {
-               /* return collected verts */
-               ret = BPy_BMElem_Array_As_Tuple(bm, (BMHeader **)elem, elem_len);
-               MEM_freeN(elem);
-       }
-       else {
-               ret = PyTuple_New(0);
-       }
+       BM_vert_separate(bm, py_vert->v, &elem, &elem_len, edge_array, edge_array_len);
+       /* return collected verts */
+       ret = BPy_BMElem_Array_As_Tuple(bm, (BMHeader **)elem, elem_len);
+       MEM_freeN(elem);
 
        PyMem_FREE(edge_array);
 
index e29cea279cec4497402378e22295ddd7873a0aae..ab888ba198b52762e30a1b4302b603f519d2d02a 100644 (file)
@@ -4817,6 +4817,9 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
        if (ob->particlesystem.first) {
                psysindex= 1;
                for (psys=ob->particlesystem.first; psys; psys=psys->next, psysindex++) {
+                       if (!psys_check_enabled(ob, psys))
+                               continue;
+                       
                        obr= RE_addRenderObject(re, ob, par, index, psysindex, ob->lay);
                        if ((dob && !dob->animated) || (ob->transflag & OB_RENDER_DUPLI)) {
                                obr->flag |= R_INSTANCEABLE;
index 51b758151791c795822df4c049e9e1359bf44643..a16c4b2468269a3a053240d6a182f5264ff207a9 100644 (file)
@@ -567,7 +567,7 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
                                node->child[b].node = child;
 
                                /* keep track of maximum depth for stack */
-                               if (depth + 1 > tree->maxdepth)
+                               if (depth >= tree->maxdepth)
                                        tree->maxdepth = depth + 1;
 
                                if (tree->dothreadedbuild)
index 817a4d8efac2e7dafc2757f18c42cd4f724d0c93..ccbcdd256393039346887a2ab2f52bed07857324 100644 (file)
@@ -118,6 +118,14 @@ static void mem_error_cb(const char *errorStr)
        fflush(stderr);
 }
 
+// library.c will only free window managers with a callback function.
+// We don't actually use a wmWindowManager, but loading a blendfile
+// loads wmWindows, so we need to free those.
+static void wm_free(bContext *C, wmWindowManager *wm)
+{
+       BLI_freelistN(&wm->windows);
+}
+
 #ifdef WIN32
 typedef enum {
        SCREEN_SAVER_MODE_NONE = 0,
@@ -501,6 +509,8 @@ int main(int argc, char** argv)
 
        sound_init_once();
 
+       set_free_windowmanager_cb(wm_free);
+
        /* if running blenderplayer the last argument can't be parsed since it has to be the filename. */
        isBlenderPlayer = !BLO_is_a_runtime(argv[0]);
        if (isBlenderPlayer)
index 360a337f8527e2ec8c804dccf5a2dcf335b81822..32666ec07923206d088adf0d8d18c62c7eea1dcf 100644 (file)
@@ -99,7 +99,8 @@ const char KX_KetsjiEngine::m_profileLabels[tc_numCategories][15] = {
        "Rasterizer:",  // tc_rasterizer
        "Services:",    // tc_services
        "Overhead:",    // tc_overhead
-       "Outside:"              // tc_outside
+       "Outside:",             // tc_outside
+       "GPU Latency:"  // tc_latency
 };
 
 double KX_KetsjiEngine::m_ticrate = DEFAULT_LOGIC_TIC_RATE;
@@ -542,7 +543,10 @@ void KX_KetsjiEngine::EndFrame()
        m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
        m_rasterizer->EndFrame();
        // swap backbuffer (drawing into this buffer) <-> front/visible buffer
+       m_logger->StartLog(tc_latency, m_kxsystem->GetTimeInSeconds(), true);
        m_rasterizer->SwapBuffers();
+       m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
+
        m_rendertools->EndFrame(m_rasterizer);
 
        
index 4dd8ea10e62baf45274cb6a31f8ce7f367106383..d5d7262a4189b6cab42c71879d4a92159ed93351 100644 (file)
@@ -158,9 +158,10 @@ private:
                tc_network,
                tc_scenegraph,
                tc_rasterizer,
-               tc_services,    // time spend in miscelaneous activities
+               tc_services,    // time spent in miscelaneous activities
                tc_overhead,    // profile info drawing overhead
-               tc_outside,             // time spend outside main loop
+               tc_outside,             // time spent outside main loop
+               tc_latency,             // time spent waiting on the gpu
                tc_numCategories
        } KX_TimeCategory;
 
index e595f24a6624578d7f524c059375f58bad0e5170..d8b4bf9e8bdb0f48bf827744afb1e139143a61f5 100644 (file)
@@ -233,9 +233,8 @@ static char gPyExpandPath_doc[] =
 path - the string path to convert.\n\n\
 Use / as directory separator in path\n\
 You can use '//' at the start of the string to define a relative path;\n\
-Blender replaces that string by the directory of the startup .blend or runtime\n\
-file to make a full path name (doesn't change during the game, even if you load\n\
-other .blend).\n\
+Blender replaces that string by the directory of the current .blend or runtime\n\
+file to make a full path name.\n\
 The function also converts the directory separator to the local file system format.";
 
 static PyObject *gPyExpandPath(PyObject *, PyObject *args)
index aeded04e4a71431569a46af6ff06cf5642211b75..05bdb3463a6442646460fd2f92a60ecc5ce71b5d 100644 (file)
 #include "SCA_IController.h"
 #include "KX_NavMeshObject.h"
 
-typedef vector<PyGetSetDef *> GetSetList;
-
-struct PyTypes_state {
-       GetSetList *getsets;
-};
-
 static void PyType_Attr_Set(PyGetSetDef *attr_getset, PyAttributeDef *attr)
 {
        attr_getset->name= (char *)attr->m_name;
@@ -120,11 +114,9 @@ static void PyType_Attr_Set(PyGetSetDef *attr_getset, PyAttributeDef *attr)
        attr_getset->closure= reinterpret_cast<void *>(attr);
 }
 
-static void PyType_Ready_ADD(PyObject *mod, PyTypeObject *tp, PyAttributeDef *attributes, PyAttributeDef *attributesPtr, int init_getset)
+static void PyType_Ready_ADD(PyObject *dict, PyTypeObject *tp, PyAttributeDef *attributes, PyAttributeDef *attributesPtr, int init_getset)
 {
        PyAttributeDef *attr;
-       PyObject *dict = PyModule_GetDict(mod);
-       GetSetList *getsets = reinterpret_cast<PyTypes_state*>(PyModule_GetState(mod))->getsets;
 
        if (init_getset) {
                /* we need to do this for all types before calling PyType_Ready
@@ -146,9 +138,7 @@ static void PyType_Ready_ADD(PyObject *mod, PyTypeObject *tp, PyAttributeDef *at
                                        attr->m_usePtr = true;
                        }
 
-                       tp->tp_getset = attr_getset = reinterpret_cast<PyGetSetDef *>(PyMem_Malloc((attr_tot+1) * sizeof(PyGetSetDef)));
-
-                       getsets->push_back(attr_getset); // Save the pointer so we can free it later
+                       tp->tp_getset = attr_getset = reinterpret_cast<PyGetSetDef *>(PyMem_Malloc((attr_tot+1) * sizeof(PyGetSetDef))); // XXX - Todo, free
 
                        if (attributes) {
                                for (attr= attributes; attr->m_name; attr++, attr_getset++) {
@@ -173,32 +163,6 @@ static void PyType_Ready_ADD(PyObject *mod, PyTypeObject *tp, PyAttributeDef *at
 #define PyType_Ready_Attr(d, n, i)   PyType_Ready_ADD(d, &n::Type, n::Attributes, NULL, i)
 #define PyType_Ready_AttrPtr(d, n, i)   PyType_Ready_ADD(d, &n::Type, n::Attributes, n::AttributesPtr, i)
 
-static void freePyTypes(void *ptr)
-{
-       PyObject *mod = reinterpret_cast<PyObject *>(ptr);
-       GetSetList *getsets = reinterpret_cast<PyTypes_state*>(PyModule_GetState(mod))->getsets;
-       GetSetList::iterator gsit;
-
-       for (gsit = getsets->begin(); gsit != getsets->end(); ++gsit) {
-               PyMem_Free(*gsit);
-       }
-
-       getsets->clear();
-       delete getsets;
-}
-
-static struct PyModuleDef typemodule = {
-    PyModuleDef_HEAD_INIT,
-    "GameTypes",
-    "BGE Python Types",
-    sizeof(PyTypes_state),
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    freePyTypes
-};
-
 void initPyTypes(void)
 {
 
@@ -208,91 +172,90 @@ void initPyTypes(void)
  */
 
        /* For now just do PyType_Ready */
-       PyObject *mod = PyModule_Create(&typemodule);
-       PyTypes_state *state = reinterpret_cast<PyTypes_state*>(PyModule_GetState(mod));
-       state->getsets = new GetSetList();
-
+       PyObject *mod = PyModule_New("GameTypes");
+       PyObject *dict = PyModule_GetDict(mod);
        PyDict_SetItemString(PySys_GetObject("modules"), "GameTypes", mod);
        Py_DECREF(mod);
        
+       
        for (int init_getset= 1; init_getset > -1; init_getset--) { /* run twice, once to init the getsets another to run PyType_Ready */
-               PyType_Ready_Attr(mod, BL_ActionActuator, init_getset);
-               PyType_Ready_Attr(mod, BL_Shader, init_getset);
-               PyType_Ready_Attr(mod, BL_ShapeActionActuator, init_getset);
-               PyType_Ready_Attr(mod, BL_ArmatureObject, init_getset);
-               PyType_Ready_Attr(mod, BL_ArmatureActuator, init_getset);
-               PyType_Ready_Attr(mod, BL_ArmatureConstraint, init_getset);
-               PyType_Ready_AttrPtr(mod, BL_ArmatureBone, init_getset);
-               PyType_Ready_AttrPtr(mod, BL_ArmatureChannel, init_getset);
-               // PyType_Ready_Attr(mod, CPropValue, init_getset);  // doesn't use Py_Header
-               PyType_Ready_Attr(mod, CListValue, init_getset);
-               PyType_Ready_Attr(mod, CValue, init_getset);
-               PyType_Ready_Attr(mod, KX_ArmatureSensor, init_getset);
-               PyType_Ready_Attr(mod, KX_BlenderMaterial, init_getset);
-               PyType_Ready_Attr(mod, KX_Camera, init_getset);
-               PyType_Ready_Attr(mod, KX_CameraActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_CharacterWrapper, init_getset);
-               PyType_Ready_Attr(mod, KX_ConstraintActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_ConstraintWrapper, init_getset);
-               PyType_Ready_Attr(mod, KX_GameActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_GameObject, init_getset);
-               PyType_Ready_Attr(mod, KX_IpoActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_LibLoadStatus, init_getset);
-               PyType_Ready_Attr(mod, KX_LightObject, init_getset);
-               PyType_Ready_Attr(mod, KX_FontObject, init_getset);
-               PyType_Ready_Attr(mod, KX_MeshProxy, init_getset);
-               PyType_Ready_Attr(mod, KX_MouseFocusSensor, init_getset);
-               PyType_Ready_Attr(mod, KX_NearSensor, init_getset);
-               PyType_Ready_Attr(mod, KX_NetworkMessageActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_NetworkMessageSensor, init_getset);
-               PyType_Ready_Attr(mod, KX_ObjectActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_ParentActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_PolyProxy, init_getset);
-               PyType_Ready_Attr(mod, KX_PolygonMaterial, init_getset);
-               PyType_Ready_Attr(mod, KX_RadarSensor, init_getset);
-               PyType_Ready_Attr(mod, KX_RaySensor, init_getset);
-               PyType_Ready_Attr(mod, KX_SCA_AddObjectActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_SCA_DynamicActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_SCA_EndObjectActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_SCA_ReplaceMeshActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_Scene, init_getset);
-               PyType_Ready_Attr(mod, KX_NavMeshObject, init_getset);
-               PyType_Ready_Attr(mod, KX_SceneActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_SoundActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_StateActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_SteeringActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_TouchSensor, init_getset);
-               PyType_Ready_Attr(mod, KX_TrackToActuator, init_getset);
-               PyType_Ready_Attr(mod, KX_VehicleWrapper, init_getset);
-               PyType_Ready_Attr(mod, KX_VertexProxy, init_getset);
-               PyType_Ready_Attr(mod, KX_VisibilityActuator, init_getset);
-               PyType_Ready_Attr(mod, PyObjectPlus, init_getset);
-               PyType_Ready_Attr(mod, SCA_2DFilterActuator, init_getset);
-               PyType_Ready_Attr(mod, SCA_ANDController, init_getset);
-               // PyType_Ready_Attr(mod, SCA_Actuator, init_getset);  // doesn't use Py_Header
-               PyType_Ready_Attr(mod, SCA_ActuatorSensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_AlwaysSensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_DelaySensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_ILogicBrick, init_getset);
-               PyType_Ready_Attr(mod, SCA_IObject, init_getset);
-               PyType_Ready_Attr(mod, SCA_ISensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_JoystickSensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_KeyboardSensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_MouseSensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_NANDController, init_getset);
-               PyType_Ready_Attr(mod, SCA_NORController, init_getset);
-               PyType_Ready_Attr(mod, SCA_ORController, init_getset);
-               PyType_Ready_Attr(mod, SCA_PropertyActuator, init_getset);
-               PyType_Ready_Attr(mod, SCA_PropertySensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_PythonController, init_getset);
-               PyType_Ready_Attr(mod, SCA_RandomActuator, init_getset);
-               PyType_Ready_Attr(mod, SCA_RandomSensor, init_getset);
-               PyType_Ready_Attr(mod, SCA_XNORController, init_getset);
-               PyType_Ready_Attr(mod, SCA_XORController, init_getset);
-               PyType_Ready_Attr(mod, SCA_IController, init_getset);
-               PyType_Ready_Attr(mod, SCA_PythonJoystick, init_getset);
-               PyType_Ready_Attr(mod, SCA_PythonKeyboard, init_getset);
-               PyType_Ready_Attr(mod, SCA_PythonMouse, init_getset);
+               PyType_Ready_Attr(dict, BL_ActionActuator, init_getset);
+               PyType_Ready_Attr(dict, BL_Shader, init_getset);
+               PyType_Ready_Attr(dict, BL_ShapeActionActuator, init_getset);
+               PyType_Ready_Attr(dict, BL_ArmatureObject, init_getset);
+               PyType_Ready_Attr(dict, BL_ArmatureActuator, init_getset);
+               PyType_Ready_Attr(dict, BL_ArmatureConstraint, init_getset);
+               PyType_Ready_AttrPtr(dict, BL_ArmatureBone, init_getset);
+               PyType_Ready_AttrPtr(dict, BL_ArmatureChannel, init_getset);
+               // PyType_Ready_Attr(dict, CPropValue, init_getset);  // doesn't use Py_Header
+               PyType_Ready_Attr(dict, CListValue, init_getset);
+               PyType_Ready_Attr(dict, CValue, init_getset);
+               PyType_Ready_Attr(dict, KX_ArmatureSensor, init_getset);
+               PyType_Ready_Attr(dict, KX_BlenderMaterial, init_getset);
+               PyType_Ready_Attr(dict, KX_Camera, init_getset);
+               PyType_Ready_Attr(dict, KX_CameraActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_CharacterWrapper, init_getset);
+               PyType_Ready_Attr(dict, KX_ConstraintActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_ConstraintWrapper, init_getset);
+               PyType_Ready_Attr(dict, KX_GameActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_GameObject, init_getset);
+               PyType_Ready_Attr(dict, KX_IpoActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_LibLoadStatus, init_getset);
+               PyType_Ready_Attr(dict, KX_LightObject, init_getset);
+               PyType_Ready_Attr(dict, KX_FontObject, init_getset);
+               PyType_Ready_Attr(dict, KX_MeshProxy, init_getset);
+               PyType_Ready_Attr(dict, KX_MouseFocusSensor, init_getset);
+               PyType_Ready_Attr(dict, KX_NearSensor, init_getset);
+               PyType_Ready_Attr(dict, KX_NetworkMessageActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_NetworkMessageSensor, init_getset);
+               PyType_Ready_Attr(dict, KX_ObjectActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_ParentActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_PolyProxy, init_getset);
+               PyType_Ready_Attr(dict, KX_PolygonMaterial, init_getset);
+               PyType_Ready_Attr(dict, KX_RadarSensor, init_getset);
+               PyType_Ready_Attr(dict, KX_RaySensor, init_getset);
+               PyType_Ready_Attr(dict, KX_SCA_AddObjectActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_SCA_DynamicActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_SCA_EndObjectActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_SCA_ReplaceMeshActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_Scene, init_getset);
+               PyType_Ready_Attr(dict, KX_NavMeshObject, init_getset);
+               PyType_Ready_Attr(dict, KX_SceneActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_SoundActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_StateActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_SteeringActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_TouchSensor, init_getset);
+               PyType_Ready_Attr(dict, KX_TrackToActuator, init_getset);
+               PyType_Ready_Attr(dict, KX_VehicleWrapper, init_getset);
+               PyType_Ready_Attr(dict, KX_VertexProxy, init_getset);
+               PyType_Ready_Attr(dict, KX_VisibilityActuator, init_getset);
+               PyType_Ready_Attr(dict, PyObjectPlus, init_getset);
+               PyType_Ready_Attr(dict, SCA_2DFilterActuator, init_getset);
+               PyType_Ready_Attr(dict, SCA_ANDController, init_getset);
+               // PyType_Ready_Attr(dict, SCA_Actuator, init_getset);  // doesn't use Py_Header
+               PyType_Ready_Attr(dict, SCA_ActuatorSensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_AlwaysSensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_DelaySensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_ILogicBrick, init_getset);
+               PyType_Ready_Attr(dict, SCA_IObject, init_getset);
+               PyType_Ready_Attr(dict, SCA_ISensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_JoystickSensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_KeyboardSensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_MouseSensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_NANDController, init_getset);
+               PyType_Ready_Attr(dict, SCA_NORController, init_getset);
+               PyType_Ready_Attr(dict, SCA_ORController, init_getset);
+               PyType_Ready_Attr(dict, SCA_PropertyActuator, init_getset);
+               PyType_Ready_Attr(dict, SCA_PropertySensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_PythonController, init_getset);
+               PyType_Ready_Attr(dict, SCA_RandomActuator, init_getset);
+               PyType_Ready_Attr(dict, SCA_RandomSensor, init_getset);
+               PyType_Ready_Attr(dict, SCA_XNORController, init_getset);
+               PyType_Ready_Attr(dict, SCA_XORController, init_getset);
+               PyType_Ready_Attr(dict, SCA_IController, init_getset);
+               PyType_Ready_Attr(dict, SCA_PythonJoystick, init_getset);
+               PyType_Ready_Attr(dict, SCA_PythonKeyboard, init_getset);
+               PyType_Ready_Attr(dict, SCA_PythonMouse, init_getset);
        }