From c4ad2ed2536407cf2a9b3bc8f0b77bc88cccf71d Mon Sep 17 00:00:00 2001 From: Robin Allen Date: Sat, 13 Jun 2009 14:22:40 +0000 Subject: Omission of a texture node to specify coordinates was regarded as a bug by some users. I rather agree :) --- source/blender/blenkernel/BKE_node.h | 3 +- source/blender/blenkernel/intern/node.c | 1 + source/blender/nodes/TEX_node.h | 1 + source/blender/nodes/intern/TEX_nodes/TEX_at.c | 70 ++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 source/blender/nodes/intern/TEX_nodes/TEX_at.c (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 184b28b2cd2..66e8492b357 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -407,8 +407,9 @@ struct TexResult; #define TEX_NODE_DECOMPOSE 420 #define TEX_NODE_VALTONOR 421 #define TEX_NODE_SCALE 422 +#define TEX_NODE_AT 423 -/* 201-299 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */ +/* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */ #define TEX_NODE_PROC 500 #define TEX_NODE_PROC_MAX 600 diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 413c2fc20f5..62064799aca 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -2921,6 +2921,7 @@ static void registerTextureNodes(ListBase *ntypelist) nodeRegisterType(ntypelist, &tex_node_rotate); nodeRegisterType(ntypelist, &tex_node_translate); nodeRegisterType(ntypelist, &tex_node_scale); + nodeRegisterType(ntypelist, &tex_node_at); nodeRegisterType(ntypelist, &tex_node_proc_voronoi); nodeRegisterType(ntypelist, &tex_node_proc_blend); diff --git a/source/blender/nodes/TEX_node.h b/source/blender/nodes/TEX_node.h index d298f062143..f58d0312961 100644 --- a/source/blender/nodes/TEX_node.h +++ b/source/blender/nodes/TEX_node.h @@ -59,6 +59,7 @@ extern bNodeType tex_node_distance; extern bNodeType tex_node_rotate; extern bNodeType tex_node_translate; extern bNodeType tex_node_scale; +extern bNodeType tex_node_at; extern bNodeType tex_node_compose; extern bNodeType tex_node_decompose; diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/intern/TEX_nodes/TEX_at.c new file mode 100644 index 00000000000..80f232ccd0c --- /dev/null +++ b/source/blender/nodes/intern/TEX_nodes/TEX_at.c @@ -0,0 +1,70 @@ +/** + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): R Allen + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "../TEX_util.h" + +static bNodeSocketType inputs[]= { + { SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, + { SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f }, + { -1, 0, "" } +}; +static bNodeSocketType outputs[]= { + { SOCK_RGBA, 0, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, + { -1, 0, "" } +}; + +static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread) +{ + float new_coord[3]; + + tex_input_vec(new_coord, in[1], coord, thread); + tex_input_rgba(out, in[0], new_coord, thread); +} + +static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) +{ + tex_output(node, in, out[0], &colorfn); +} + +bNodeType tex_node_at = { + /* *next,*prev */ NULL, NULL, + /* type code */ TEX_NODE_AT, + /* name */ "At", + /* width+range */ 100, 60, 150, + /* class+opts */ NODE_CLASS_DISTORT, 0, + /* input sock */ inputs, + /* output sock */ outputs, + /* storage */ "", + /* execfunc */ exec, + /* butfunc */ NULL, + /* initfunc */ NULL, + /* freestoragefunc */ NULL, + /* copystoragefunc */ NULL, + /* id */ NULL + +}; -- cgit v1.2.3 From 76cd7046bba916737de142a76b06adea9f52660c Mon Sep 17 00:00:00 2001 From: Kent Mein Date: Sat, 13 Jun 2009 15:54:39 +0000 Subject: coverity issue CID: 44 Checker: FORWARD_NULL (help) File: base/src/source/blender/render/intern/source/texture.c Function: do_lamp_tex Description: Variable "co" tracked as NULL was dereferenced. co was set to NULL at the beginning of the function and it could possibly slip through all the logic above so lets test it before we use it blindly. Kent --- source/blender/render/intern/source/texture.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source/blender') diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index d41f68c021a..f2169ceea12 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -2420,13 +2420,13 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef /* placement */ - if(mtex->projx) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]); + if(mtex->projx && co) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]); else texvec[0]= mtex->size[0]*(mtex->ofs[0]); - if(mtex->projy) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]); + if(mtex->projy && co) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]); else texvec[1]= mtex->size[1]*(mtex->ofs[1]); - if(mtex->projz) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]); + if(mtex->projz && co) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]); else texvec[2]= mtex->size[2]*(mtex->ofs[2]); if(shi->osatex) { -- cgit v1.2.3 From a2bc531dc1ff47facd800f52c8f29cf5453d8b77 Mon Sep 17 00:00:00 2001 From: Kent Mein Date: Sat, 13 Jun 2009 16:49:30 +0000 Subject: coverity issue CID: 228 Checker: DEADCODE (help) File: base/src/source/blender/gpu/intern/gpu_material.c Function: GPU_materials_free Description: Conditional "ma != 0" was looping over wrong variable I'm guessing a cut and paste error from above. Kent --- source/blender/gpu/intern/gpu_material.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender') diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 818b67170c7..7e8b5c18d71 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -1285,7 +1285,7 @@ void GPU_materials_free() GPU_material_free(&defmaterial); - for(ob=G.main->object.first; ma; ma=ma->id.next) + for(ob=G.main->object.first; ob; ob=ob->id.next) GPU_lamp_free(ob); } -- cgit v1.2.3 From 0e13433d7cdb81b6ab7bf5dad7c9701097e9ffd2 Mon Sep 17 00:00:00 2001 From: Kent Mein Date: Sat, 13 Jun 2009 16:52:01 +0000 Subject: coverity issue CID: 401 Checker: NULL_RETURNS (help) File: base/src/source/blender/imbuf/intern/radiance_hdr.c Function: imb_loadhdr Description: Incrementing possibly NULL value "ptr" Make sure were not trying to index past our array. Kent --- source/blender/imbuf/intern/radiance_hdr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender') diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c index d00e34cfdbe..69c4970df38 100644 --- a/source/blender/imbuf/intern/radiance_hdr.c +++ b/source/blender/imbuf/intern/radiance_hdr.c @@ -191,7 +191,7 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) break; } } - if (found) { + if (found && (x<(size + 2))) { if (sscanf((char *)&mem[x+1], "%79s %d %79s %d", (char*)&oriY, &height, (char*)&oriX, &width) != 4) return NULL; -- cgit v1.2.3 From a7ac260cc5e47bfca6e9678f1271fbdd438ac119 Mon Sep 17 00:00:00 2001 From: Kent Mein Date: Sat, 13 Jun 2009 16:57:26 +0000 Subject: coverity issue CID: 469 Checker: REVERSE_INULL (help) File: base/src/source/blender/blenkernel/intern/BME_tools.c Function: BME_split_face Description: Pointer "example" dereferenced before NULL check Check for null before we try to use it. Kent --- source/blender/blenkernel/intern/BME_tools.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c index f3e4add34e9..a2cd6389e7d 100644 --- a/source/blender/blenkernel/intern/BME_tools.c +++ b/source/blender/blenkernel/intern/BME_tools.c @@ -192,7 +192,7 @@ static BME_Poly *BME_split_face(BME_Mesh *bm, BME_Poly *f, BME_Vert *v1, BME_Ver nf = BME_SFME(bm,f,v1,v2,nl); nf->flag = f->flag; /* if the edge was selected, select this face, too */ - if (example->flag & SELECT) f->flag |= ME_FACE_SEL; + if (example && (example->flag & SELECT)) f->flag |= ME_FACE_SEL; nf->h = f->h; nf->mat_nr = f->mat_nr; if (nl && example) { -- cgit v1.2.3 From 472239cc948443e8265fc6359834225214ae03c5 Mon Sep 17 00:00:00 2001 From: Kent Mein Date: Sat, 13 Jun 2009 22:23:24 +0000 Subject: coverity issue CID: 307 Checker: FORWARD_NULL (help) File: base/src/source/blender/blenkernel/intern/modifier.c Function: meshdeformModifier_deformVerts Description: Variable "dm" tracked as NULL was passed to a function that dereferences it. fix provided by Brecht. Kent --- source/blender/blenkernel/intern/modifier.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 2c4528f641e..29930b3eb58 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -7813,10 +7813,12 @@ static void meshdeformModifier_deformVerts( { DerivedMesh *dm; - if(!derivedData && ob->type==OB_MESH) - dm= CDDM_from_mesh(ob->data, ob); - else - dm= derivedData; + if (!derivedData) { + dm= get_original_dm(ob, NULL, 0); + if (dm == NULL) return; + } + else dm= derivedData; + modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ -- cgit v1.2.3 From bde991df9ed2d9a1bd54eecd09eb6a7ab0bea4fc Mon Sep 17 00:00:00 2001 From: Kent Mein Date: Sat, 13 Jun 2009 22:31:14 +0000 Subject: coverity issue CID: 275 Checker: FORWARD_NULL (help) File: base/src/source/blender/gpu/intern/gpu_extensions.c Function: GPU_shader_create Description: Variable "fragcode" tracked as NULL was passed to a function that dereferences it. fix provided by Brecht. :) Kent --- source/blender/gpu/intern/gpu_extensions.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source/blender') diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 7654c67419b..70192f44ceb 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -746,7 +746,9 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, /*GPU glGetObjectParameterivARB(shader->object, GL_OBJECT_LINK_STATUS_ARB, &status); if (!status) { glGetInfoLogARB(shader->object, sizeof(log), &length, log); - shader_print_errors("linking", log, fragcode); + if (fragecode) shader_print_errors("linking", log, fragcode); + else if (vertexcode) shader_print_errors("linking", log, vertexcode); + else if (libcode) shader_print_errors("linking", log, libcode); GPU_shader_free(shader); return NULL; -- cgit v1.2.3 From 7aeadf2baa89aef3775fdf47efde77b76ec601a9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 14 Jun 2009 06:52:46 +0000 Subject: typo in gpu_extensions.c, removed unused function --- source/blender/gpu/intern/gpu_extensions.c | 2 +- source/blender/python/api2_2x/sceneRender.c | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) (limited to 'source/blender') diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 70192f44ceb..4984e043031 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -746,7 +746,7 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, /*GPU glGetObjectParameterivARB(shader->object, GL_OBJECT_LINK_STATUS_ARB, &status); if (!status) { glGetInfoLogARB(shader->object, sizeof(log), &length, log); - if (fragecode) shader_print_errors("linking", log, fragcode); + if (fragcode) shader_print_errors("linking", log, fragcode); else if (vertexcode) shader_print_errors("linking", log, vertexcode); else if (libcode) shader_print_errors("linking", log, libcode); diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c index dce9231cce5..17c1c497061 100644 --- a/source/blender/python/api2_2x/sceneRender.c +++ b/source/blender/python/api2_2x/sceneRender.c @@ -925,13 +925,6 @@ static PyObject *RenderData_getBorder( BPy_RenderData * self ) self->renderContext->border.ymax ); } -static PyObject *RenderData_EnableGammaCorrection( BPy_RenderData * self, - PyObject * args ) -{ - return M_Render_BitToggleInt( args, R_GAMMA, - &self->renderContext->mode ); -} - static PyObject *RenderData_GaussFilterSize( BPy_RenderData * self, PyObject * args ) { return M_Render_GetSetAttributeFloat( args, -- cgit v1.2.3 From 36e96e5b6e497926a6d7bbb215577bd3bf7bbee0 Mon Sep 17 00:00:00 2001 From: Peter Schlaile Date: Sun, 14 Jun 2009 10:59:54 +0000 Subject: == Sequencer == This fixes: * free_imbuf_seq() didn't free all scenes. That will lead to steady memory growth in case of nested timelines with several scenes. * sequencer panels were always jumping around, depending on strip type, which was caused by choosing always the same panel position and the silly limitation, that * effect strips had no filter option, which was therefore added. So you can apply color balance on effect filter output now :) --- source/blender/src/buttons_scene.c | 14 ++++++------ source/blender/src/sequence.c | 45 +++++++++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 12 deletions(-) (limited to 'source/blender') diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index 7c361b6113d..532ecad249f 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -570,7 +570,7 @@ static void seq_panel_editing() UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Edit", "Sequencer", - 10, 230, 318, 204) == 0) return; + 0, 0, 318, 204) == 0) return; uiDefBut(block, LABEL, 0, give_seqname(last_seq), @@ -754,7 +754,7 @@ static void seq_panel_input() UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Input", "Sequencer", - 10, 230, 318, 204) == 0) return; + 320, 0, 318, 204) == 0) return; if (SEQ_HAS_PATH(last_seq)) { uiDefBut(block, TEX, @@ -897,7 +897,7 @@ static void seq_panel_filter_video() UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Filter", "Sequencer", - 10, 230, 318, 204) == 0) return; + 640, 0, 318, 204) == 0) return; uiBlockBeginAlign(block); @@ -1024,7 +1024,7 @@ static void seq_panel_filter_audio() UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Filter", "Sequencer", - 10, 230, 318, 204) == 0) return; + 640, 0, 318, 204) == 0) return; uiBlockBeginAlign(block); uiDefButF(block, NUM, B_SEQ_BUT_RELOAD, "Gain (dB):", 10,50,150,19, &last_seq->level, -96.0, 6.0, 100, 0, ""); @@ -1040,7 +1040,7 @@ static void seq_panel_effect() UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Effect", "Sequencer", - 10, 230, 318, 204) == 0) return; + 320, 0, 318, 204) == 0) return; if(last_seq->type == SEQ_PLUGIN) { PluginSeq *pis; @@ -1168,7 +1168,7 @@ static void seq_panel_proxy() UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Proxy", "Sequencer", - 10, 230, 318, 204) == 0) return; + 960, 0, 318, 204) == 0) return; uiBlockBeginAlign(block); @@ -1276,7 +1276,7 @@ void sequencer_panels() } if (type == SEQ_PLUGIN || type >= SEQ_EFFECT) { - panels |= SEQ_PANEL_EFFECT | SEQ_PANEL_PROXY; + panels |= SEQ_PANEL_EFFECT | SEQ_PANEL_FILTER| SEQ_PANEL_PROXY; } if (panels & SEQ_PANEL_EDITING) { diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c index cf2b28c6d72..44661b5fa91 100644 --- a/source/blender/src/sequence.c +++ b/source/blender/src/sequence.c @@ -1480,7 +1480,8 @@ static int input_have_to_preprocess(Sequence * seq, TStripElem* se, int cfra) mul = seq->mul; - if(seq->blend_mode == SEQ_BLEND_REPLACE) { + if(seq->blend_mode == SEQ_BLEND_REPLACE && + !(seq->type & SEQ_EFFECT)) { if (seq->ipo && seq->ipo->curve.first) { do_seq_ipo(seq, cfra); mul *= seq->facf0; @@ -1568,7 +1569,8 @@ static void input_preprocess(Sequence * seq, TStripElem* se, int cfra) mul = seq->mul; - if(seq->blend_mode == SEQ_BLEND_REPLACE) { + if(seq->blend_mode == SEQ_BLEND_REPLACE && + !(seq->type & SEQ_EFFECT)) { if (seq->ipo && seq->ipo->curve.first) { do_seq_ipo(seq, cfra); mul *= seq->facf0; @@ -1822,10 +1824,14 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra, input_preprocess(seq, se, cfra); } } else if(seq->type & SEQ_EFFECT) { + int use_preprocess = FALSE; /* should the effect be recalculated? */ if (!build_proxy_run && se->ibuf == 0) { se->ibuf = seq_proxy_fetch(seq, cfra, render_size); + if (se->ibuf) { + use_preprocess = TRUE; + } } if(se->ibuf == 0) { @@ -1838,6 +1844,22 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra, se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0); do_effect(cfra, seq, se); + if (input_have_to_preprocess(seq, se, cfra) && + !build_proxy_run) { + if ((se->se1 && (se->ibuf == se->se1->ibuf)) || + (se->se2 && (se->ibuf == se->se2->ibuf))) { + struct ImBuf * i + = IMB_dupImBuf(se->ibuf); + + IMB_freeImBuf(se->ibuf); + + se->ibuf = i; + } + use_preprocess = TRUE; + } + } + if (use_preprocess) { + input_preprocess(seq, se, cfra); } } else if(seq->type == SEQ_IMAGE) { if(se->ok == STRIPELEM_OK && se->ibuf == 0) { @@ -2946,9 +2968,8 @@ void free_imbuf_seq_except(int cfra) END_SEQ } -void free_imbuf_seq() +static void free_imbuf_seq_editing(Editing * ed) { - Editing *ed= G.scene->ed; Sequence *seq; TStripElem *se; int a; @@ -2990,6 +3011,15 @@ void free_imbuf_seq() END_SEQ } +void free_imbuf_seq() +{ + Scene * sce = G.main->scene.first; + while(sce) { + free_imbuf_seq_editing(sce->ed); + sce= sce->id.next; + } +} + void free_imbuf_seq_with_ipo(struct Ipo *ipo) { /* force update of all sequences with this ipo, on ipo changes */ @@ -3074,12 +3104,17 @@ void update_changed_seq_and_deps(Sequence *changed_seq, int len_change, int ibuf /* bad levell call... */ void do_render_seq(RenderResult *rr, int cfra) { + static int recurs_depth = 0; ImBuf *ibuf; G.f |= G_PLAYANIM; /* waitcursor patch */ + recurs_depth++; + ibuf= give_ibuf_seq(rr->rectx, rr->recty, cfra, 0, G.scene->r.size); + recurs_depth--; + if(ibuf) { if(ibuf->rect_float) { if (!rr->rectf) @@ -3115,7 +3150,7 @@ void do_render_seq(RenderResult *rr, int cfra) on freeing _all_ buffers every time on long timelines...) (schlaile) */ - { + if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */ uintptr_t mem_in_use; uintptr_t mmap_in_use; uintptr_t max; -- cgit v1.2.3 From ca12954e9fb3b38d662190d12e72937ef9990d89 Mon Sep 17 00:00:00 2001 From: Peter Schlaile Date: Sun, 14 Jun 2009 18:54:35 +0000 Subject: == Sequencer == Big proxy fix (addressing hopefully most complaints on mailing list and in tracker) * proxy render settings are now independent of render size settings. That means: which proxy size is used, is controlled by two parameters now: the proxy size of the files, can be controlled with additional buttons within the proxy panels. What is shown in a specific preview window depends on the header settings of the preview panel. So: proxies are _only_ used in those windows, that are switched to a specific proxy resolution. * output rendering is always done _without_ proxies. * proxy generation now shows a waitcursor with numbers. (closing Bug: [#18909] Building Proxies doesn't give any feedback which was rather a feature request, since the problem mentioned there was always the case :) ) --- source/blender/blenkernel/BKE_blender.h | 2 +- source/blender/blenloader/intern/readfile.c | 28 +++++ source/blender/makesdna/DNA_sequence_types.h | 3 + source/blender/src/buttons_scene.c | 159 +++++++++++++++++---------- source/blender/src/drawseq.c | 18 ++- source/blender/src/header_seq.c | 16 +-- source/blender/src/sequence.c | 20 ++-- 7 files changed, 162 insertions(+), 84 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 5513f98b299..30e68b83149 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -41,7 +41,7 @@ struct ListBase; struct MemFile; #define BLENDER_VERSION 249 -#define BLENDER_SUBVERSION 1 +#define BLENDER_SUBVERSION 2 #define BLENDER_MINVERSION 245 #define BLENDER_MINSUBVERSION 15 diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 38b8bfaaa88..c4d63cf14fd 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8156,6 +8156,34 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } + if (main->versionfile < 249 && main->subversionfile < 2) { + Scene *sce= main->scene.first; + Sequence *seq; + Editing *ed; + + while(sce) { + ed= sce->ed; + if(ed) { + WHILE_SEQ(&ed->seqbase) { + if (seq->strip && seq->strip->proxy){ + if (G.scene->r.size != 100.0) { + seq->strip->proxy->size + = sce->r.size; + } else { + seq->strip->proxy->size + = 25.0; + } + seq->strip->proxy->quality =90; + } + } + END_SEQ + } + + sce= sce->id.next; + } + + } + /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */ diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index ed1626c887f..b6815df9fc5 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -80,6 +80,9 @@ typedef struct StripProxy { char dir[160]; char file[80]; struct anim *anim; + short size; + short quality; + int pad; } StripProxy; typedef struct Strip { diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index 532ecad249f..d0df532a824 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -1164,6 +1164,8 @@ static void seq_panel_proxy() { Sequence *last_seq = get_last_seq(); uiBlock *block; + int yofs; + block = uiNewBlock(&curarea->uiblocks, "seq_panel_proxy", UI_EMBOSS, UI_HELV, curarea->win); @@ -1172,83 +1174,118 @@ static void seq_panel_proxy() uiBlockBeginAlign(block); + yofs = 140; + uiDefButBitI(block, TOG, SEQ_USE_PROXY, B_SEQ_BUT_RELOAD, "Use Proxy", - 10,140,80,19, &last_seq->flag, + 10,yofs,80,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Use a preview proxy for this strip"); - if (last_seq->flag & SEQ_USE_PROXY) { - if (!last_seq->strip->proxy) { - last_seq->strip->proxy = - MEM_callocN(sizeof(struct StripProxy), - "StripProxy"); - } + if (!(last_seq->flag & SEQ_USE_PROXY)) { + uiBlockEndAlign(block); + return; + } - uiDefButBitI(block, TOG, SEQ_USE_PROXY_CUSTOM_DIR, - B_SEQ_BUT_RELOAD, "Custom Dir", - 90,140,80,19, &last_seq->flag, - 0.0, 21.0, 100, 0, - "Use a custom directory to store data"); + if (!last_seq->strip->proxy) { + last_seq->strip->proxy = + MEM_callocN(sizeof(struct StripProxy), + "StripProxy"); + } - uiDefButBitI(block, TOG, SEQ_USE_PROXY_CUSTOM_FILE, - B_SEQ_BUT_RELOAD, "Custom File", - 170,140,80,19, &last_seq->flag, - 0.0, 21.0, 100, 0, - "Use a custom file to load data from"); + uiDefButBitI(block, TOG, SEQ_USE_PROXY_CUSTOM_DIR, + B_SEQ_BUT_RELOAD, "Custom Dir", + 90,yofs,80,19, &last_seq->flag, + 0.0, 21.0, 100, 0, + "Use a custom directory to store data"); - if (last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) { - uiDefIconBut(block, BUT, B_SEQ_SEL_PROXY_DIR, - ICON_FILESEL, 10, 120, 20, 20, 0, 0, 0, 0, 0, - "Select the directory/name for " - "the proxy storage"); + uiDefButBitI(block, TOG, SEQ_USE_PROXY_CUSTOM_FILE, + B_SEQ_BUT_RELOAD, "Custom File", + 170,yofs,80,19, &last_seq->flag, + 0.0, 21.0, 100, 0, + "Use a custom file to load data from"); + + if (last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR || + last_seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { + yofs -= 20; - uiDefBut(block, TEX, - B_SEQ_BUT_RELOAD, "Dir: ", - 30,120,220,20, last_seq->strip->proxy->dir, - 0.0, (float)sizeof(last_seq->strip->proxy->dir)-1, 100, 0, ""); - } - if (last_seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { - uiDefIconBut(block, BUT, B_SEQ_SEL_PROXY_FILE, - ICON_FILESEL, 10, 100, 20, 20, 0, 0, 0, - 0, 0, - "Select the custom proxy file " - "(used for all preview resolutions!)"); + uiDefIconBut(block, BUT, B_SEQ_SEL_PROXY_DIR, + ICON_FILESEL, 10, yofs, 20, 20, 0, 0, 0, 0, 0, + "Select the directory/name for " + "the proxy storage"); + + uiDefBut(block, TEX, + B_SEQ_BUT_RELOAD, "Dir: ", + 30,yofs,220,20, last_seq->strip->proxy->dir, + 0.0, (float)sizeof(last_seq->strip->proxy->dir)-1, + 100, 0, ""); + } - uiDefBut(block, TEX, - B_SEQ_BUT_RELOAD, "File: ", - 30,100,220,20, last_seq->strip->proxy->file, - 0.0, (float)sizeof(last_seq->strip->proxy->file)-1, 100, 0, ""); - } + if (last_seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { + yofs -= 20; + uiDefIconBut(block, BUT, B_SEQ_SEL_PROXY_FILE, + ICON_FILESEL, 10, yofs, 20, 20, 0, 0, 0, + 0, 0, + "Select the custom proxy file " + "(used for all preview resolutions!)"); + + uiDefBut(block, TEX, + B_SEQ_BUT_RELOAD, "File: ", + 30, yofs,220,20, last_seq->strip->proxy->file, + 0.0, (float)sizeof(last_seq->strip->proxy->file)-1, + 100, 0, ""); } - if (last_seq->flag & SEQ_USE_PROXY) { - if (G.scene->r.size == 100) { - uiDefBut(block, LABEL, 0, - "Full render size selected, ", - 10,60,240,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, LABEL, 0, - "so no proxy enabled!", - 10,40,240,19, 0, 0, 0, 0, 0, ""); - } else if (last_seq->type != SEQ_MOVIE - && last_seq->type != SEQ_IMAGE - && !(last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)) { - uiDefBut(block, LABEL, 0, - "Cannot proxy this strip without ", - 10,60,240,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, LABEL, 0, - "custom directory selection!", - 10,40,240,19, 0, 0, 0, 0, 0, ""); - } else if (!(last_seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) { - uiDefBut(block, BUT, B_SEQ_BUT_REBUILD_PROXY, - "Rebuild proxy", - 10,60,240,19, 0, 0, 0, 0, 0, - "Rebuild proxy for the " - "currently selected strip."); + if (!(last_seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) { + if (last_seq->strip->proxy->size == 0) { + if (G.scene->r.size != 100) { + last_seq->strip->proxy->size = G.scene->r.size; + } else { + last_seq->strip->proxy->size = 25; + } + } + if (last_seq->strip->proxy->quality == 0) { + last_seq->strip->proxy->quality = 90; } + yofs -= 25; + + uiDefButS(block, NUM,B_DIFF, "Q:", 10,yofs,74,20, + &last_seq->strip->proxy->quality, + 10.0, 100.0, 0, 0, + "Quality setting for JPEG images"); + uiDefButS(block, ROW,B_DIFF,"75%", 90,yofs,53,20, + &last_seq->strip->proxy->size,1.0,75.0, 0, 0, + "Set proxy size to 3/4 of defined size"); + uiDefButS(block, ROW,B_DIFF,"50%", 143,yofs,53,20, + &last_seq->strip->proxy->size,1.0,50.0, 0, 0, + "Set proxy size to 1/2 of defined size"); + uiDefButS(block, ROW,B_DIFF,"25%", 196,yofs,53,20, + &last_seq->strip->proxy->size,1.0,25.0, 0, 0, + "Set proxy size to 1/4 of defined size"); + } + + if (last_seq->type != SEQ_MOVIE + && last_seq->type != SEQ_IMAGE + && !(last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)) { + yofs -= 20; + uiDefBut(block, LABEL, 0, + "Cannot proxy this strip without ", + 30,yofs,240,19, 0, 0, 0, 0, 0, ""); + yofs -= 20; + uiDefBut(block, LABEL, 0, + "custom directory selection!", + 30,yofs,240,19, 0, 0, 0, 0, 0, ""); + } else if (!(last_seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) { + yofs -= 45; + uiDefBut(block, BUT, B_SEQ_BUT_REBUILD_PROXY, + "Rebuild proxy", + 10,yofs,240,40, 0, 0, 0, 0, 0, + "Rebuild proxy for the " + "currently selected strip."); } uiBlockEndAlign(block); + } diff --git a/source/blender/src/drawseq.c b/source/blender/src/drawseq.c index 7fd7d8880a1..2ff26d75595 100644 --- a/source/blender/src/drawseq.c +++ b/source/blender/src/drawseq.c @@ -849,7 +849,8 @@ static void draw_image_seq(ScrArea *sa) static int recursive= 0; float zoom; float zoomx, zoomy; - int render_size = 0; + float render_size = 0.0; + float proxy_size = 100.0; glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -860,6 +861,8 @@ static void draw_image_seq(ScrArea *sa) render_size = sseq->render_size; if (render_size == 0) { render_size = G.scene->r.size; + } else { + proxy_size = render_size; } if (render_size < 0) { return; @@ -879,16 +882,16 @@ static void draw_image_seq(ScrArea *sa) recursive= 1; if (special_seq_update) { ibuf= give_ibuf_seq_direct( - rectx, recty, (G.scene->r.cfra), render_size, + rectx, recty, (G.scene->r.cfra), proxy_size, special_seq_update); } else if (!U.prefetchframes || (G.f & G_PLAYANIM) == 0) { ibuf= (ImBuf *)give_ibuf_seq( rectx, recty, (G.scene->r.cfra), - sseq->chanshown, render_size); + sseq->chanshown, proxy_size); } else { ibuf= (ImBuf *)give_ibuf_seq_threaded( rectx, recty, (G.scene->r.cfra), - sseq->chanshown, render_size); + sseq->chanshown, proxy_size); } recursive= 0; @@ -939,7 +942,7 @@ static void draw_image_seq(ScrArea *sa) zoom= SEQ_ZOOM_FAC(sseq->zoom); if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) { - zoom /= render_size / 100.0; + zoom /= proxy_size / 100.0; zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp); zoomy = zoom; } else { @@ -1122,8 +1125,11 @@ void drawprefetchseqspace(ScrArea *sa, void *spacedata) SpaceSeq *sseq= sa->spacedata.first; int rectx, recty; int render_size = sseq->render_size; + int proxy_size = 100.0; if (render_size == 0) { render_size = G.scene->r.size; + } else { + proxy_size = render_size; } if (render_size < 0) { return; @@ -1135,7 +1141,7 @@ void drawprefetchseqspace(ScrArea *sa, void *spacedata) if(sseq->mainb) { give_ibuf_prefetch_request( rectx, recty, (G.scene->r.cfra), sseq->chanshown, - render_size); + proxy_size); } } diff --git a/source/blender/src/header_seq.c b/source/blender/src/header_seq.c index 23712b93b50..5b117fb2273 100644 --- a/source/blender/src/header_seq.c +++ b/source/blender/src/header_seq.c @@ -741,16 +741,16 @@ void seq_buttons() xco+= 8 + XIC*3.5; uiDefButS(block, MENU, B_REDR, - "Render size: %t" - "|R 100 %x100" - "|R 75 %x75" - "|R 50 %x50" - "|R 25 %x25" - "|R Sce %x0" - "|R Off %x-1", + "Proxy Render Size: %t" + "|Q 100 %x100" + "|Q 75 %x75" + "|Q 50 %x50" + "|Q 25 %x25" + "|Q Sce %x0" + "|Q Off %x-1", xco,0,3.0 * XIC, YIC, &sseq->render_size, 0,0,0,0, - "Use different (proxy) render size " + "Use different proxy render size settings " "for this preview screen, use scene render size " "or disable this preview completely"); diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c index 44661b5fa91..5a63e3ea995 100644 --- a/source/blender/src/sequence.c +++ b/source/blender/src/sequence.c @@ -1211,7 +1211,7 @@ static void seq_proxy_build_frame(Sequence * seq, int cfra, int render_size) depth = 32 is intentionally left in, otherwise ALPHA channels won't work... */ - quality = 90; + quality = seq->strip->proxy->quality; ibuf->ftype= JPG | quality; BLI_make_existing_file(name); @@ -1228,6 +1228,7 @@ static void seq_proxy_build_frame(Sequence * seq, int cfra, int render_size) void seq_proxy_rebuild(Sequence * seq) { int cfra; + float rsize = seq->strip->proxy->size; waitcursor(1); @@ -1245,6 +1246,8 @@ void seq_proxy_rebuild(Sequence * seq) tse->flag &= ~STRIPELEM_PREVIEW_DONE; } + + /* a _lot_ faster for movie files, if we read frames in sequential order */ if (seq->flag & SEQ_REVERSE_FRAMES) { @@ -1253,8 +1256,8 @@ void seq_proxy_rebuild(Sequence * seq) TStripElem * tse = give_tstripelem(seq, cfra); if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) { - seq_proxy_build_frame(seq, cfra, - G.scene->r.size); + set_timecursor(cfra); + seq_proxy_build_frame(seq, cfra, rsize); tse->flag |= STRIPELEM_PREVIEW_DONE; } if (blender_test_break()) { @@ -1267,8 +1270,8 @@ void seq_proxy_rebuild(Sequence * seq) TStripElem * tse = give_tstripelem(seq, cfra); if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) { - seq_proxy_build_frame(seq, cfra, - G.scene->r.size); + set_timecursor(cfra); + seq_proxy_build_frame(seq, cfra, rsize); tse->flag |= STRIPELEM_PREVIEW_DONE; } if (blender_test_break()) { @@ -1959,7 +1962,7 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra, } else if (se->ibuf==NULL && sce_valid) { /* no need to display a waitcursor on sequencer scene strips */ - if (!(sce->r.scemode & R_DOSEQ)) + if (!(sce->r.scemode & R_DOSEQ) && !build_proxy_run) waitcursor(1); /* Hack! This function can be called from do_render_seq(), in that case @@ -2012,7 +2015,8 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra, G.scene->r.scemode |= doseq; if((G.f & G_PLAYANIM)==0 /* bad, is set on do_render_seq */ - && !(sce->r.scemode & R_DOSEQ)) + && !(sce->r.scemode & R_DOSEQ) + && !build_proxy_run) waitcursor(0); CFRA = oldcfra; @@ -3111,7 +3115,7 @@ void do_render_seq(RenderResult *rr, int cfra) recurs_depth++; - ibuf= give_ibuf_seq(rr->rectx, rr->recty, cfra, 0, G.scene->r.size); + ibuf= give_ibuf_seq(rr->rectx, rr->recty, cfra, 0, 100.0); recurs_depth--; -- cgit v1.2.3 From bc6761f5ef9e4201a0f34531f9855fce2be68c5e Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Sun, 14 Jun 2009 20:01:12 +0000 Subject: BGE bug #18869: Can't create Windows runtime. --- source/blender/src/header_info.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/blender') diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c index 71abed0d806..98a45de51e9 100644 --- a/source/blender/src/header_info.c +++ b/source/blender/src/header_info.c @@ -565,8 +565,8 @@ static void copy_game_dll(char *dll_filename, char *source_dir, char *dest_dir) static void copy_all_game_dlls(char *str) { -#define GAME_DLL_COUNT 7 - char *game_dll_list[GAME_DLL_COUNT]={"gnu_gettext.dll", "libpng.dll", "libtiff.dll", "pthreadVC2.dll", "python25.dll", "SDL.dll", "zlib.dll"}; +#define GAME_DLL_COUNT 17 + char *game_dll_list[GAME_DLL_COUNT]={"avcodec-52.dll", "avdevice-52.dll", "avformat-52.dll", "avutil-50.dll", "libfaac-0.dll", "libfaad-2.dll", "libmp3lame-0.dll", "libx264-67.dll", "swscale-0.dll", "xvidcore.dll", "gnu_gettext.dll", "libtiff.dll", "python25.dll", "SDL.dll", "pthreadVC2.dll", "libpng.dll", "zlib.dll"}; char dest_dir[FILE_MAX]; char source_dir[FILE_MAX]; -- cgit v1.2.3 From afaa3768e655bb7cfc7f89fd5fdd08a69ac4f132 Mon Sep 17 00:00:00 2001 From: Peter Schlaile Date: Sun, 14 Jun 2009 20:52:43 +0000 Subject: == Sequencer == Fixes an irritating but harmless error message when using custom proxy files. --- source/blender/src/buttons_scene.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source/blender') diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index d0df532a824..dac093b6ba8 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -1266,7 +1266,8 @@ static void seq_panel_proxy() if (last_seq->type != SEQ_MOVIE && last_seq->type != SEQ_IMAGE - && !(last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)) { + && !(last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) + && !(last_seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) { yofs -= 20; uiDefBut(block, LABEL, 0, "Cannot proxy this strip without ", -- cgit v1.2.3 From b8d0f62fd2a9088034fa7da1d7e5e82ca845b728 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 15 Jun 2009 11:48:42 +0000 Subject: Fix for bug #18924: OpenGL performance issue with particle modifiers, actually two modifier datamask optimizations that were never done. * Don't use modifier data mask for disabled modifiers. * Check if UV data is needed for particle system instead of always requesting it. --- source/blender/blenkernel/BKE_modifier.h | 9 ++- source/blender/blenkernel/intern/DerivedMesh.c | 26 +++---- source/blender/blenkernel/intern/modifier.c | 80 +++++++++++++++------- source/blender/blenkernel/intern/particle.c | 4 +- source/blender/blenkernel/intern/particle_system.c | 5 +- 5 files changed, 78 insertions(+), 46 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index a41716ed1ff..e6d83793f94 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -202,7 +202,7 @@ typedef struct ModifierTypeInfo { * * This function is optional. */ - CustomDataMask (*requiredDataMask)(struct ModifierData *md); + CustomDataMask (*requiredDataMask)(struct Object *ob, struct ModifierData *md); /* Free internal modifier data variables, this function should * not free the md variable itself. @@ -270,6 +270,7 @@ int modifier_dependsOnTime(struct ModifierData *md); int modifier_supportsMapping(struct ModifierData *md); int modifier_couldBeCage(struct ModifierData *md); int modifier_isDeformer(struct ModifierData *md); +int modifier_isEnabled(struct ModifierData *md, int required_mode); void modifier_setError(struct ModifierData *md, char *format, ...); void modifiers_foreachObjectLink(struct Object *ob, @@ -300,8 +301,10 @@ int modifiers_indexInObject(struct Object *ob, struct ModifierData *md * evaluation, assuming the data indicated by dataMask is required at the * end of the stack. */ -struct LinkNode *modifiers_calcDataMasks(struct ModifierData *md, - CustomDataMask dataMask); +struct LinkNode *modifiers_calcDataMasks(struct Object *ob, + struct ModifierData *md, + CustomDataMask dataMask, + int required_mode); struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob); #endif diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index ddb7d853f2f..1d0d91c4208 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2134,18 +2134,18 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], modifiers_clearErrors(ob); + if(useRenderParams) required_mode = eModifierMode_Render; + else required_mode = eModifierMode_Realtime; + /* we always want to keep original indices */ dataMask |= CD_MASK_ORIGINDEX; - datamasks = modifiers_calcDataMasks(md, dataMask); + datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode); curr = datamasks; if(deform_r) *deform_r = NULL; *final_r = NULL; - if(useRenderParams) required_mode = eModifierMode_Render; - else required_mode = eModifierMode_Realtime; - if(useDeform) { if(useDeform > 0 && do_ob_key(ob)) /* shape key makes deform verts */ deformedVerts = mesh_getVertexCos(me, &numVerts); @@ -2156,8 +2156,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], for(;md; md = md->next, curr = curr->next) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); - if((md->mode & required_mode) != required_mode) continue; - if(mti->isDisabled && mti->isDisabled(md)) continue; + if(!modifier_isEnabled(md, required_mode)) continue; if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue; if(mti->type == eModifierTypeType_OnlyDeform) { @@ -2221,19 +2220,18 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], for(;md; md = md->next, curr = curr->next) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); - if((md->mode & required_mode) != required_mode) continue; + if(!modifier_isEnabled(md, required_mode)) continue; if(mti->type == eModifierTypeType_OnlyDeform && !useDeform) continue; if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) { modifier_setError(md, "Modifier requires original data, bad stack position."); continue; } - if(mti->isDisabled && mti->isDisabled(md)) continue; if(needMapping && !modifier_supportsMapping(md)) continue; if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue; /* add an orco layer if needed by this modifier */ if(dm && mti->requiredDataMask) { - mask = mti->requiredDataMask(md); + mask = mti->requiredDataMask(ob, md); if(mask & CD_MASK_ORCO) add_orco_dm(ob, NULL, dm, orcodm); } @@ -2405,14 +2403,11 @@ static int editmesh_modifier_is_enabled(ModifierData *md, DerivedMesh *dm) ModifierTypeInfo *mti = modifierType_getInfo(md->type); int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; - if((md->mode & required_mode) != required_mode) return 0; + if(!modifier_isEnabled(md, required_mode)) return 0; if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) { modifier_setError(md, "Modifier requires original data, bad stack position."); return 0; } - if(mti->isDisabled && mti->isDisabled(md)) return 0; - if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) return 0; - if(md->mode & eModifierMode_DisableTemporary) return 0; return 1; } @@ -2429,6 +2424,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh *dm, *orcodm = NULL; int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL); LinkNode *datamasks, *curr; + int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; modifiers_clearErrors(ob); @@ -2442,7 +2438,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, /* we always want to keep original indices */ dataMask |= CD_MASK_ORIGINDEX; - datamasks = modifiers_calcDataMasks(md, dataMask); + datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode); curr = datamasks; for(i = 0; md; i++, md = md->next, curr = curr->next) { @@ -2453,7 +2449,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, /* add an orco layer if needed by this modifier */ if(dm && mti->requiredDataMask) { - mask = mti->requiredDataMask(md); + mask = mti->requiredDataMask(ob, md); if(mask & CD_MASK_ORCO) add_orco_dm(ob, em, dm, orcodm); } diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 29930b3eb58..fa2f857cc8b 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -206,7 +206,7 @@ static void curveModifier_copyData(ModifierData *md, ModifierData *target) strncpy(tcmd->name, cmd->name, 32); } -CustomDataMask curveModifier_requiredDataMask(ModifierData *md) +CustomDataMask curveModifier_requiredDataMask(Object *ob, ModifierData *md) { CurveModifierData *cmd = (CurveModifierData *)md; CustomDataMask dataMask = 0; @@ -282,7 +282,7 @@ static void latticeModifier_copyData(ModifierData *md, ModifierData *target) strncpy(tlmd->name, lmd->name, 32); } -CustomDataMask latticeModifier_requiredDataMask(ModifierData *md) +CustomDataMask latticeModifier_requiredDataMask(Object *ob, ModifierData *md) { LatticeModifierData *lmd = (LatticeModifierData *)md; CustomDataMask dataMask = 0; @@ -665,7 +665,7 @@ static void maskModifier_copyData(ModifierData *md, ModifierData *target) strcpy(tmmd->vgroup, mmd->vgroup); } -static CustomDataMask maskModifier_requiredDataMask(ModifierData *md) +static CustomDataMask maskModifier_requiredDataMask(Object *ob, ModifierData *md) { return (1 << CD_MDEFORMVERT); } @@ -3393,7 +3393,7 @@ static void bevelModifier_copyData(ModifierData *md, ModifierData *target) strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32); } -CustomDataMask bevelModifier_requiredDataMask(ModifierData *md) +CustomDataMask bevelModifier_requiredDataMask(Object *ob, ModifierData *md) { BevelModifierData *bmd = (BevelModifierData *)md; CustomDataMask dataMask = 0; @@ -3473,7 +3473,7 @@ static void displaceModifier_copyData(ModifierData *md, ModifierData *target) strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32); } -CustomDataMask displaceModifier_requiredDataMask(ModifierData *md) +CustomDataMask displaceModifier_requiredDataMask(Object *ob, ModifierData *md) { DisplaceModifierData *dmd = (DisplaceModifierData *)md; CustomDataMask dataMask = 0; @@ -3816,7 +3816,7 @@ static void uvprojectModifier_copyData(ModifierData *md, ModifierData *target) tumd->aspecty = umd->aspecty; } -CustomDataMask uvprojectModifier_requiredDataMask(ModifierData *md) +CustomDataMask uvprojectModifier_requiredDataMask(Object *ob, ModifierData *md) { CustomDataMask dataMask = 0; @@ -4276,7 +4276,7 @@ int smoothModifier_isDisabled(ModifierData *md) return 0; } -CustomDataMask smoothModifier_requiredDataMask(ModifierData *md) +CustomDataMask smoothModifier_requiredDataMask(Object *ob, ModifierData *md) { SmoothModifierData *smd = (SmoothModifierData *)md; CustomDataMask dataMask = 0; @@ -4505,7 +4505,7 @@ int castModifier_isDisabled(ModifierData *md) return 0; } -CustomDataMask castModifier_requiredDataMask(ModifierData *md) +CustomDataMask castModifier_requiredDataMask(Object *ob, ModifierData *md) { CastModifierData *cmd = (CastModifierData *)md; CustomDataMask dataMask = 0; @@ -5136,7 +5136,7 @@ static void waveModifier_updateDepgraph( } } -CustomDataMask waveModifier_requiredDataMask(ModifierData *md) +CustomDataMask waveModifier_requiredDataMask(Object *ob, ModifierData *md) { WaveModifierData *wmd = (WaveModifierData *)md; CustomDataMask dataMask = 0; @@ -5473,7 +5473,7 @@ static void armatureModifier_copyData(ModifierData *md, ModifierData *target) strncpy(tamd->defgrp_name, amd->defgrp_name, 32); } -CustomDataMask armatureModifier_requiredDataMask(ModifierData *md) +CustomDataMask armatureModifier_requiredDataMask(Object *ob, ModifierData *md) { CustomDataMask dataMask = 0; @@ -5587,7 +5587,7 @@ static void hookModifier_copyData(ModifierData *md, ModifierData *target) strncpy(thmd->name, hmd->name, 32); } -CustomDataMask hookModifier_requiredDataMask(ModifierData *md) +CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md) { HookModifierData *hmd = (HookModifierData *)md; CustomDataMask dataMask = 0; @@ -5846,7 +5846,7 @@ static void clothModifier_updateDepgraph( } } -CustomDataMask clothModifier_requiredDataMask(ModifierData *md) +CustomDataMask clothModifier_requiredDataMask(Object *ob, ModifierData *md) { CustomDataMask dataMask = 0; @@ -6230,7 +6230,7 @@ static DerivedMesh *booleanModifier_applyModifier( return derivedData; } -CustomDataMask booleanModifier_requiredDataMask(ModifierData *md) +CustomDataMask booleanModifier_requiredDataMask(Object *ob, ModifierData *md) { CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE); @@ -6278,12 +6278,27 @@ static void particleSystemModifier_copyData(ModifierData *md, ModifierData *targ tpsmd->psys = psmd->psys; } -CustomDataMask particleSystemModifier_requiredDataMask(ModifierData *md) +CustomDataMask particleSystemModifier_requiredDataMask(Object *ob, ModifierData *md) { ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; - CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE); + CustomDataMask dataMask = 0; + Material *ma; + MTex *mtex; int i; + ma= give_current_material(ob, psmd->psys->part->omat); + if(ma) { + for(i=0; imtex[i]; + if(mtex && (ma->septex & (1<pmapto && (mtex->texco & TEXCO_UV)) + dataMask |= (1 << CD_MTFACE); + } + } + + if(psmd->psys->part->tanfac!=0.0) + dataMask |= (1 << CD_MTFACE); + /* ask for vertexgroups if we need them */ for(i=0; ipsys->vgroup[i]){ @@ -6638,7 +6653,7 @@ static int explodeModifier_dependsOnTime(ModifierData *md) { return 1; } -CustomDataMask explodeModifier_requiredDataMask(ModifierData *md) +CustomDataMask explodeModifier_requiredDataMask(Object *ob, ModifierData *md) { ExplodeModifierData *emd= (ExplodeModifierData*) md; CustomDataMask dataMask = 0; @@ -7552,7 +7567,7 @@ static void meshdeformModifier_copyData(ModifierData *md, ModifierData *target) tmmd->object = mmd->object; } -CustomDataMask meshdeformModifier_requiredDataMask(ModifierData *md) +CustomDataMask meshdeformModifier_requiredDataMask(Object *ob, ModifierData *md) { MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; CustomDataMask dataMask = 0; @@ -7876,7 +7891,7 @@ static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target) tsmd->subsurfLevels = smd->subsurfLevels; } -CustomDataMask shrinkwrapModifier_requiredDataMask(ModifierData *md) +CustomDataMask shrinkwrapModifier_requiredDataMask(Object *ob, ModifierData *md) { ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md; CustomDataMask dataMask = 0; @@ -7910,7 +7925,7 @@ static void shrinkwrapModifier_foreachObjectLink(ModifierData *md, Object *ob, O static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { DerivedMesh *dm = NULL; - CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md); + CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(ob, md); /* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */ if(dataMask) @@ -7936,7 +7951,7 @@ static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, Derived static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { DerivedMesh *dm = NULL; - CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md); + CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(ob, md); if(dataMask) { @@ -7995,7 +8010,7 @@ static void simpledeformModifier_copyData(ModifierData *md, ModifierData *target memcpy(tsmd->limit, smd->limit, sizeof(tsmd->limit)); } -static CustomDataMask simpledeformModifier_requiredDataMask(ModifierData *md) +static CustomDataMask simpledeformModifier_requiredDataMask(Object *ob, ModifierData *md) { SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; CustomDataMask dataMask = 0; @@ -8024,7 +8039,7 @@ static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *for static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { DerivedMesh *dm = NULL; - CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md); + CustomDataMask dataMask = simpledeformModifier_requiredDataMask(ob, md); /* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */ if(dataMask) @@ -8051,7 +8066,7 @@ static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, Deriv static void simpledeformModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { DerivedMesh *dm = NULL; - CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md); + CustomDataMask dataMask = simpledeformModifier_requiredDataMask(ob, md); /* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */ if(dataMask) @@ -8658,7 +8673,20 @@ int modifiers_isParticleEnabled(Object *ob) return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render)); } -LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask) +int modifier_isEnabled(ModifierData *md, int required_mode) +{ + ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if((md->mode & required_mode) != required_mode) return 0; + if(mti->isDisabled && mti->isDisabled(md)) return 0; + if(md->mode & eModifierMode_DisableTemporary) return 0; + if(required_mode & eModifierMode_Editmode) + if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) return 0; + + return 1; +} + +LinkNode *modifiers_calcDataMasks(Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode) { LinkNode *dataMasks = NULL; LinkNode *curr, *prev; @@ -8668,7 +8696,9 @@ LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask) ModifierTypeInfo *mti = modifierType_getInfo(md->type); CustomDataMask mask = 0; - if(mti->requiredDataMask) mask = mti->requiredDataMask(md); + if(modifier_isEnabled(md, required_mode)) + if(mti->requiredDataMask) + mask = mti->requiredDataMask(ob, md); BLI_linklist_prepend(&dataMasks, (void *)mask); } diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 41ce23347a3..b5b2c07af9c 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -3182,7 +3182,7 @@ static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float if(ma) for(m=0; mmtex[m]; - if(mtex && (ma->septex & (1<septex & (1<pmapto){ float def=mtex->def_var; float var=mtex->varfac; short blend=mtex->blendtype; @@ -3231,7 +3231,7 @@ void psys_get_texture(Object *ob, Material *ma, ParticleSystemModifierData *psmd if(ma) for(m=0; mmtex[m]; - if(mtex && (ma->septex & (1<septex & (1<pmapto){ float var=mtex->varfac; float def=mtex->def_var; short blend=mtex->blendtype; diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 31e246f66b9..6ac57934670 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -1762,7 +1762,10 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi where_is_object_time(ob,pa->time); /* get birth location from object */ - psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0); + if(part->tanfac!=0.0) + psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0); + else + psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,0,0,0,0); /* save local coordinates for later */ VECCOPY(tloc,loc); -- cgit v1.2.3 From 1a7d3a085632142817d2aa42ab252ca54032f35a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 15 Jun 2009 12:18:17 +0000 Subject: Bug #18920, clarification in tooltip of Mirror Vgroup option in the mirror modifier. --- source/blender/src/buttons_editing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender') diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index b4eddfde865..2f9eac67d94 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -2004,7 +2004,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco uiDefButBitS(block, TOG, MOD_MIR_AXIS_Y, B_MODIFIER_RECALC, "Y", lx+20,cy,20,19, &mmd->flag, 0, 0, 0, 0, "Enable Y axis mirror"); uiDefButBitS(block, TOG, MOD_MIR_AXIS_Z, B_MODIFIER_RECALC, "Z", lx+40,cy,20,19, &mmd->flag, 0, 0, 0, 0, "Enable Z axis mirror"); uiDefButBitS(block, TOG, MOD_MIR_CLIPPING, B_MODIFIER_RECALC, "Do Clipping", lx+60, cy, buttonWidth-60,19, &mmd->flag, 1, 2, 0, 0, "Prevents during Transform vertices to go through Mirror"); - uiDefButBitS(block, TOG, MOD_MIR_VGROUP, B_MODIFIER_RECALC, "Mirror Vgroups", lx, (cy-=19), buttonWidth,19, &mmd->flag, 1, 2, 0, 0, "Mirror vertex groups (e.g. .R->.L)"); + uiDefButBitS(block, TOG, MOD_MIR_VGROUP, B_MODIFIER_RECALC, "Mirror Vgroups", lx, (cy-=19), buttonWidth,19, &mmd->flag, 1, 2, 0, 0, "Mirror vertex groups (e.g. .R to .L), empty mirror vertex groups must already exist."); uiDefButBitS(block, TOG, MOD_MIR_MIRROR_U, B_MODIFIER_RECALC, "Mirror U", lx, (cy-=19), buttonWidth/2, 19, -- cgit v1.2.3 From 2ecbe1c81cec6f537aa10829e94fbc451f9bc823 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 16 Jun 2009 07:16:51 +0000 Subject: BGE Py API * Removed modules Expression and CValue, neither were ever available. * Added GameLogic.EvalExpression(exp) from the Expression module, evaluates an expression like the expression controller (not sure if this is really that useful since python is far more advanced). * resetting the original blend file path didint work (own fault == -> =) * Py3.x PyModule_Create didnt allow importing since it didn't add to sys.modules, Looks like they want us to use init-tab array, but this doesn't suit us since it needs to be setup before python is initialized. * Documented GameLogic.globalDict --- source/blender/python/api2_2x/BGL.c | 1 + source/blender/python/api2_2x/Geometry.c | 1 + source/blender/python/api2_2x/Mathutils.c | 1 + 3 files changed, 3 insertions(+) (limited to 'source/blender') diff --git a/source/blender/python/api2_2x/BGL.c b/source/blender/python/api2_2x/BGL.c index 7735f2b444f..93e110dfbde 100644 --- a/source/blender/python/api2_2x/BGL.c +++ b/source/blender/python/api2_2x/BGL.c @@ -1104,6 +1104,7 @@ PyObject *BGL_Init(const char *from) PyObject *mod, *dict, *item; #if (PY_VERSION_HEX >= 0x03000000) mod = PyModule_Create(&BGL_module_def); + PyDict_SetItemString(PySys_GetObject("modules"), BGL_module_def.m_name, mod); #else mod= Py_InitModule(from, BGL_methods); #endif diff --git a/source/blender/python/api2_2x/Geometry.c b/source/blender/python/api2_2x/Geometry.c index f875cbc52fb..e5679ea6ed7 100644 --- a/source/blender/python/api2_2x/Geometry.c +++ b/source/blender/python/api2_2x/Geometry.c @@ -99,6 +99,7 @@ PyObject *Geometry_Init(const char *from) #if (PY_VERSION_HEX >= 0x03000000) submodule = PyModule_Create(&M_Geometry_module_def); + PyDict_SetItemString(PySys_GetObject("modules"), M_Geometry_module_def.m_name, submodule); #else submodule = Py_InitModule3(from, M_Geometry_methods, M_Geometry_doc); #endif diff --git a/source/blender/python/api2_2x/Mathutils.c b/source/blender/python/api2_2x/Mathutils.c index 8f99723e12d..3ffc8662cc9 100644 --- a/source/blender/python/api2_2x/Mathutils.c +++ b/source/blender/python/api2_2x/Mathutils.c @@ -139,6 +139,7 @@ PyObject *Mathutils_Init(const char *from) #if (PY_VERSION_HEX >= 0x03000000) submodule = PyModule_Create(&M_Mathutils_module_def); + PyDict_SetItemString(PySys_GetObject("modules"), M_Mathutils_module_def.m_name, submodule); #else submodule = Py_InitModule3(from, M_Mathutils_methods, M_Mathutils_doc); #endif -- cgit v1.2.3 From 0a66e24bd79fa9ec15a0bc1454d9c7d41fe401b8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 16 Jun 2009 08:52:04 +0000 Subject: KX_PythonSeq (used for a number of BGE sequence types) * cont.actuators.get("key", default) # dict like get function * if "key" in cont.sensors: ... Updated docs Added missing include to Particle.c --- source/blender/python/api2_2x/Particle.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source/blender') diff --git a/source/blender/python/api2_2x/Particle.c b/source/blender/python/api2_2x/Particle.c index 21697779ca4..f69cb6a01b9 100644 --- a/source/blender/python/api2_2x/Particle.c +++ b/source/blender/python/api2_2x/Particle.c @@ -31,6 +31,7 @@ #include "Particle.h" #include "gen_utils.h" +#include "gen_library.h" #include "BKE_object.h" #include "BKE_main.h" #include "BKE_particle.h" -- cgit v1.2.3