Until now, there was never any code for making drivers on materials get recalculated when their dependencies were changed. However, since changing material colors with drivers is something that is quite common, a workaround was introduced to ensure that materials could still be driven (albeit with the relevant drivers rooted at object level). This worked well enough so far with traditional materials - though it was sometimes clunky and confusing for some users - and would have been ok to tide us over until the depsgraph refactor. The introduction of Cycles changed this, as it has in many other ways. Now that people use Cycles to render, they'll need to drive the material colors through the nested nodetree (and other things nested deeply within that). However, this is much more difficult to generate hacks to create the relevant paths needed to work around the problem. == This Commit... == * Adds a recursive driver calculation step to the BKE_object_handle_update() (which gets called whenever the depsgraph has finished tagging object datablocks for updates), which goes through calculating the drivers attached to the object (and the materials/nodetrees attached to that). This case gets handled everytime the object is tagged as needing updates to its "data" (OB_RECALC_DATA) * When building the depsgraph, every dependency that the drivers there have are treated as if they were attached to object.data instead. This should trick the depsgraph into tagging OB_RECALC_DATA to force recalculation of drivers, at the expense perhaps of modifiers getting recalculated again. == Todo == * The old workarounds noted are still in place (will be commented out in the next commit). This fix renders at least the material case redundant, although the textures case still needs a bit more work. * Check on whether similar hacks can be done for other datablock combinations * So far, only simple test cases have been tested. There is probably some performance penalty for heavy setups still (due to need to traverse down all parts of material/node hierarchy to find things that need updates). If there really is a problem here, we could try introducing some tags to limit this traversal (which get added at depsgraph build time). <--- USER TESTING NEEDED!!!
113 lines
3.7 KiB
C++
113 lines
3.7 KiB
C++
/*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
* All rights reserved.
|
|
*
|
|
* The Original Code is: all of this file.
|
|
*
|
|
* Contributor(s): none yet.
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
#ifndef __BKE_MATERIAL_H__
|
|
#define __BKE_MATERIAL_H__
|
|
|
|
/** \file BKE_material.h
|
|
* \ingroup bke
|
|
* \brief General operations, lookup, etc. for materials.
|
|
*/
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct Main;
|
|
struct Material;
|
|
struct ID;
|
|
struct Object;
|
|
struct Mesh;
|
|
struct MTFace;
|
|
struct Scene;
|
|
|
|
/* materials */
|
|
|
|
void init_def_material(void);
|
|
void BKE_material_free(struct Material *sc);
|
|
void test_object_materials(struct ID *id);
|
|
void resize_object_material(struct Object *ob, const short totcol);
|
|
void init_material(struct Material *ma);
|
|
struct Material *BKE_material_add(const char *name);
|
|
struct Material *BKE_material_copy(struct Material *ma);
|
|
struct Material *localize_material(struct Material *ma);
|
|
struct Material *give_node_material(struct Material *ma); /* returns node material or self */
|
|
void BKE_material_make_local(struct Material *ma);
|
|
void extern_local_matarar(struct Material **matar, short totcol);
|
|
|
|
void automatname(struct Material *);
|
|
|
|
/* material slots */
|
|
|
|
struct Material ***give_matarar(struct Object *ob);
|
|
short *give_totcolp(struct Object *ob);
|
|
struct Material ***give_matarar_id(struct ID *id); /* same but for ID's */
|
|
short *give_totcolp_id(struct ID *id);
|
|
|
|
struct Material *give_current_material(struct Object *ob, short act);
|
|
struct ID *material_from(struct Object *ob, short act);
|
|
void assign_material_id(struct ID *id, struct Material *ma, short act);
|
|
void assign_material(struct Object *ob, struct Material *ma, short act);
|
|
void assign_matarar(struct Object *ob, struct Material ***matar, short totcol);
|
|
|
|
short find_material_index(struct Object *ob, struct Material *ma);
|
|
|
|
int object_add_material_slot(struct Object *ob);
|
|
int object_remove_material_slot(struct Object *ob);
|
|
|
|
/* rna api */
|
|
void material_append_id(struct ID *id, struct Material *ma);
|
|
struct Material *material_pop_id(struct ID *id, int index, int remove_material_slot); /* index is an int because of RNA */
|
|
|
|
/* rendering */
|
|
|
|
void init_render_material(struct Material *, int, float *);
|
|
void init_render_materials(struct Main *, int, float *);
|
|
void end_render_material(struct Material *);
|
|
void end_render_materials(struct Main *);
|
|
|
|
int material_in_material(struct Material *parmat, struct Material *mat);
|
|
|
|
void ramp_blend(int type, float r_col[3], const float fac, const float col[3]);
|
|
|
|
/* driver update hacks */
|
|
void material_drivers_update(struct Scene *scene, struct Material *mat, float ctime);
|
|
|
|
/* copy/paste */
|
|
void clear_matcopybuf(void);
|
|
void free_matcopybuf(void);
|
|
void copy_matcopybuf(struct Material *ma);
|
|
void paste_matcopybuf(struct Material *ma);
|
|
|
|
/* handle backward compatibility for tface/materials called from doversion (fileload=1) or Help Menu (fileload=0) */
|
|
int do_version_tface(struct Main *main, int fileload);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|