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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release/scripts/ui/properties_scene.py29
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h4
-rw-r--r--source/blender/blenkernel/BKE_modifier.h9
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c24
-rw-r--r--source/blender/blenkernel/intern/modifier.c20
-rw-r--r--source/blender/blenkernel/intern/multires.c5
-rw-r--r--source/blender/blenkernel/intern/particle_system.c8
-rw-r--r--source/blender/blenkernel/intern/scene.c8
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c11
-rw-r--r--source/blender/editors/include/UI_interface.h2
-rw-r--r--source/blender/editors/interface/interface_templates.c14
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c11
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h1
-rw-r--r--source/blender/editors/transform/transform_conversions.c4
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c2
-rw-r--r--source/blender/makesrna/intern/rna_scene.c58
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c1
17 files changed, 156 insertions, 55 deletions
diff --git a/release/scripts/ui/properties_scene.py b/release/scripts/ui/properties_scene.py
index 5efc3873149..0ce8d1dca3e 100644
--- a/release/scripts/ui/properties_scene.py
+++ b/release/scripts/ui/properties_scene.py
@@ -180,11 +180,40 @@ class SCENE_PT_physics(SceneButtonsPanel):
else:
layout.column().prop(scene, "gravity", text="")
+class SCENE_PT_simplify(SceneButtonsPanel):
+ bl_label = "Simplify"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ def draw_header(self, context):
+ scene = context.scene
+ rd = scene.render_data
+ self.layout.prop(rd, "use_simplify", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ scene = context.scene
+ rd = scene.render_data
+ wide_ui = context.region.width > narrowui
+
+ layout.active = rd.use_simplify
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(rd, "simplify_subdivision", text="Subdivision")
+ col.prop(rd, "simplify_child_particles", text="Child Particles")
+
+ if wide_ui:
+ col = split.column()
+ col.prop(rd, "simplify_shadow_samples", text="Shadow Samples")
+ col.prop(rd, "simplify_ao_sss", text="AO and SSS")
+
bpy.types.register(SCENE_PT_scene)
bpy.types.register(SCENE_PT_unit)
bpy.types.register(SCENE_PT_keying_sets)
bpy.types.register(SCENE_PT_keying_set_paths)
bpy.types.register(SCENE_PT_physics)
+bpy.types.register(SCENE_PT_simplify)
bpy.types.register(SCENE_PT_custom_props)
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 01f863a4c2e..29b3d09807d 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -502,8 +502,8 @@ void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct EditMesh *em
/* returns an array of deform matrices for crazyspace correction, and the
number of modifiers left */
-int editmesh_get_first_deform_matrices(struct Object *, struct EditMesh *em, float (**deformmats)[3][3],
- float (**deformcos)[3]);
+int editmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct EditMesh *em,
+ float (**deformmats)[3][3], float (**deformcos)[3]);
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index dd5f391cc5c..562144d2edb 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -279,10 +279,10 @@ void modifier_unique_name(struct ListBase *modifiers, struct ModifierData *m
void modifier_copyData(struct ModifierData *md, struct ModifierData *target);
int modifier_dependsOnTime(struct ModifierData *md);
int modifier_supportsMapping(struct ModifierData *md);
-int modifier_couldBeCage(struct ModifierData *md);
+int modifier_couldBeCage(struct Scene *scene, struct ModifierData *md);
int modifier_isCorrectableDeformed(struct ModifierData *md);
int modifier_sameTopology(ModifierData *md);
-int modifier_isEnabled(struct ModifierData *md, int required_mode);
+int modifier_isEnabled(struct Scene *scene, struct ModifierData *md, int required_mode);
void modifier_setError(struct ModifierData *md, char *format, ...);
void modifiers_foreachObjectLink(struct Object *ob,
@@ -293,7 +293,7 @@ void modifiers_foreachIDLink(struct Object *ob,
void *userData);
struct ModifierData *modifiers_findByType(struct Object *ob, ModifierType type);
void modifiers_clearErrors(struct Object *ob);
-int modifiers_getCageIndex(struct Object *ob,
+int modifiers_getCageIndex(struct Scene *scene, struct Object *ob,
int *lastPossibleCageIndex_r, int virtual_);
int modifiers_isSoftbodyEnabled(struct Object *ob);
@@ -313,7 +313,8 @@ 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 Object *ob,
+struct LinkNode *modifiers_calcDataMasks(struct Scene *scene,
+ struct Object *ob,
struct ModifierData *md,
CustomDataMask dataMask,
int required_mode);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 3ffa32c700d..28c9dfb317c 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1643,7 +1643,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
/* we always want to keep original indices */
dataMask |= CD_MASK_ORIGINDEX;
- datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
+ datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
curr = datamasks;
if(deform_r) *deform_r = NULL;
@@ -1659,7 +1659,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
md->scene= scene;
- if(!modifier_isEnabled(md, required_mode)) continue;
+ if(!modifier_isEnabled(scene, md, required_mode)) continue;
if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
if(mti->type == eModifierTypeType_OnlyDeform) {
@@ -1708,7 +1708,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
md->scene= scene;
- if(!modifier_isEnabled(md, required_mode)) continue;
+ if(!modifier_isEnabled(scene, 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.");
@@ -1884,12 +1884,12 @@ static float (*editmesh_getVertexCos(EditMesh *em, int *numVerts_r))[3]
return cos;
}
-static int editmesh_modifier_is_enabled(ModifierData *md, DerivedMesh *dm)
+static int editmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
- if(!modifier_isEnabled(md, required_mode)) return 0;
+ if(!modifier_isEnabled(scene, md, required_mode)) return 0;
if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
modifier_setError(md, "Modifier requires original data, bad stack position.");
return 0;
@@ -1906,7 +1906,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
float (*deformedVerts)[3] = NULL;
CustomDataMask mask;
DerivedMesh *dm, *orcodm = NULL;
- int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL, 1);
+ int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
LinkNode *datamasks, *curr;
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1922,7 +1922,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
/* we always want to keep original indices */
dataMask |= CD_MASK_ORIGINDEX;
- datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
+ datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
curr = datamasks;
for(i = 0; md; i++, md = md->next, curr = curr->next) {
@@ -1930,7 +1930,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
md->scene= scene;
- if(!editmesh_modifier_is_enabled(md, dm))
+ if(!editmesh_modifier_is_enabled(scene, md, dm))
continue;
/* add an orco layer if needed by this modifier */
@@ -2348,12 +2348,12 @@ float *mesh_get_mapped_verts_nors(Scene *scene, Object *ob)
/* ********* crazyspace *************** */
-int editmesh_get_first_deform_matrices(Object *ob, EditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3])
+int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3])
{
ModifierData *md;
DerivedMesh *dm;
int i, a, numleft = 0, numVerts = 0;
- int cageIndex = modifiers_getCageIndex(ob, NULL, 1);
+ int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
modifiers_clearErrors(ob);
@@ -2367,7 +2367,7 @@ int editmesh_get_first_deform_matrices(Object *ob, EditMesh *em, float (**deform
for(i = 0; md && i <= cageIndex; i++, md = md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if(!editmesh_modifier_is_enabled(md, dm))
+ if(!editmesh_modifier_is_enabled(scene, md, dm))
continue;
if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
@@ -2388,7 +2388,7 @@ int editmesh_get_first_deform_matrices(Object *ob, EditMesh *em, float (**deform
}
for(; md && i <= cageIndex; md = md->next, i++)
- if(editmesh_modifier_is_enabled(md, dm) && modifier_isCorrectableDeformed(md))
+ if(editmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
numleft++;
if(dm)
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index f09c92d6091..df46943d7b1 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -101,6 +101,7 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
+#include "BKE_scene.h"
#include "BKE_smoke.h"
#include "BKE_softbody.h"
#include "BKE_subsurf.h"
@@ -427,8 +428,9 @@ static void subsurfModifier_freeData(ModifierData *md)
static int subsurfModifier_isDisabled(ModifierData *md, int useRenderParams)
{
SubsurfModifierData *smd = (SubsurfModifierData*) md;
+ int levels= (useRenderParams)? smd->renderLevels: smd->levels;
- return (useRenderParams)? (smd->renderLevels == 0): (smd->levels == 0);
+ return get_render_subsurf_level(&md->scene->r, levels) == 0;
}
static DerivedMesh *subsurfModifier_applyModifier(
@@ -9181,10 +9183,12 @@ void modifier_copyData(ModifierData *md, ModifierData *target)
mti->copyData(md, target);
}
-int modifier_couldBeCage(ModifierData *md)
+int modifier_couldBeCage(Scene *scene, ModifierData *md)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ md->scene= scene;
+
return ( (md->mode & eModifierMode_Realtime) &&
(md->mode & eModifierMode_Editmode) &&
(!mti->isDisabled || !mti->isDisabled(md, 0)) &&
@@ -9219,11 +9223,13 @@ void modifier_setError(ModifierData *md, char *format, ...)
* also used in transform_conversion.c, to detect CrazySpace [tm] (2nd arg
* then is NULL)
*/
-int modifiers_getCageIndex(Object *ob, int *lastPossibleCageIndex_r, int virtual_)
+int modifiers_getCageIndex(Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_)
{
ModifierData *md = (virtual_)? modifiers_getVirtualModifierList(ob): ob->modifiers.first;
int i, cageIndex = -1;
+ md->scene= scene;
+
/* Find the last modifier acting on the cage. */
for (i=0; md; i++,md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -9267,10 +9273,12 @@ int modifiers_isParticleEnabled(Object *ob)
return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
}
-int modifier_isEnabled(ModifierData *md, int required_mode)
+int modifier_isEnabled(Scene *scene, ModifierData *md, int required_mode)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ md->scene= scene;
+
if((md->mode & required_mode) != required_mode) return 0;
if(mti->isDisabled && mti->isDisabled(md, required_mode == eModifierMode_Render)) return 0;
if(md->mode & eModifierMode_DisableTemporary) return 0;
@@ -9280,7 +9288,7 @@ int modifier_isEnabled(ModifierData *md, int required_mode)
return 1;
}
-LinkNode *modifiers_calcDataMasks(Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode)
+LinkNode *modifiers_calcDataMasks(Scene *scene, Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode)
{
LinkNode *dataMasks = NULL;
LinkNode *curr, *prev;
@@ -9290,7 +9298,7 @@ LinkNode *modifiers_calcDataMasks(Object *ob, ModifierData *md, CustomDataMask d
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
CustomDataMask mask = 0;
- if(modifier_isEnabled(md, required_mode))
+ if(modifier_isEnabled(scene, md, required_mode))
if(mti->requiredDataMask)
mask = mti->requiredDataMask(ob, md);
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index f5414567da8..7f08846177a 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -50,6 +50,7 @@
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_object.h"
+#include "BKE_scene.h"
#include "BKE_subsurf.h"
#include "BKE_utildefines.h"
@@ -84,11 +85,11 @@ MultiresModifierData *find_multires_modifier(Object *ob)
static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render)
{
if(render)
- return mmd->renderlvl;
+ return get_render_subsurf_level(&mmd->modifier.scene->r, mmd->renderlvl);
else if(ob->mode == OB_MODE_SCULPT)
return mmd->sculptlvl;
else
- return mmd->lvl;
+ return get_render_subsurf_level(&mmd->modifier.scene->r, mmd->lvl);
}
static void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl)
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 19187ed35af..6dba1a2e9ba 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -247,12 +247,12 @@ static int get_psys_child_number(struct Scene *scene, ParticleSystem *psys)
if(!psys->part->childtype)
return 0;
- if(psys->renderdata) {
+ if(psys->renderdata)
nbr= psys->part->ren_child_nbr;
- return get_render_child_particle_number(&scene->r, nbr);
- }
else
- return psys->part->child_nbr;
+ nbr= psys->part->child_nbr;
+
+ return get_render_child_particle_number(&scene->r, nbr);
}
static int get_psys_tot_child(struct Scene *scene, ParticleSystem *psys)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index f17d11c40ce..a12fa36b519 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -925,7 +925,7 @@ void scene_add_render_layer(Scene *sce)
int get_render_subsurf_level(RenderData *r, int lvl)
{
- if(G.rt == 1 && (r->mode & R_SIMPLIFY))
+ if(r->mode & R_SIMPLIFY)
return MIN2(r->simplify_subsurf, lvl);
else
return lvl;
@@ -933,7 +933,7 @@ int get_render_subsurf_level(RenderData *r, int lvl)
int get_render_child_particle_number(RenderData *r, int num)
{
- if(G.rt == 1 && (r->mode & R_SIMPLIFY))
+ if(r->mode & R_SIMPLIFY)
return (int)(r->simplify_particles*num);
else
return num;
@@ -941,7 +941,7 @@ int get_render_child_particle_number(RenderData *r, int num)
int get_render_shadow_samples(RenderData *r, int samples)
{
- if(G.rt == 1 && (r->mode & R_SIMPLIFY) && samples > 0)
+ if((r->mode & R_SIMPLIFY) && samples > 0)
return MIN2(r->simplify_shadowsamples, samples);
else
return samples;
@@ -949,7 +949,7 @@ int get_render_shadow_samples(RenderData *r, int samples)
float get_render_aosss_error(RenderData *r, float error)
{
- if(G.rt == 1 && (r->mode & R_SIMPLIFY))
+ if(r->mode & R_SIMPLIFY)
return ((1.0f-r->simplify_aosss)*10.0f + 1.0f)*error;
else
return error;
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 3997f83ed49..ef015208354 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2506,7 +2506,9 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
CCGDerivedMesh *result;
if(editMode) {
- smd->emCache = _getSubSurf(smd->emCache, smd->levels, useAging, 0,
+ int levels= get_render_subsurf_level(&smd->modifier.scene->r, smd->levels);
+
+ smd->emCache = _getSubSurf(smd->emCache, levels, useAging, 0,
useSimple);
ss_sync_from_derivedmesh(smd->emCache, dm, vertCos, useSimple);
@@ -2518,7 +2520,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
CCGSubSurf *ss;
int levels;
- levels= smd->renderLevels; // XXX get_render_subsurf_level(&scene->r, smd->renderLevels);
+ levels= get_render_subsurf_level(&smd->modifier.scene->r, smd->renderLevels);
if(levels == 0)
return dm;
@@ -2533,6 +2535,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
} else {
int useIncremental = (smd->flags & eSubsurfModifierFlag_Incremental);
int useAging = smd->flags & eSubsurfModifierFlag_DebugIncr;
+ int levels= get_render_subsurf_level(&smd->modifier.scene->r, smd->levels);
CCGSubSurf *ss;
/* It is quite possible there is a much better place to do this. It
@@ -2549,7 +2552,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
}
if(useIncremental && isFinalCalc) {
- smd->mCache = ss = _getSubSurf(smd->mCache, smd->levels,
+ smd->mCache = ss = _getSubSurf(smd->mCache, levels,
useAging, 0, useSimple);
ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
@@ -2563,7 +2566,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
smd->mCache = NULL;
}
- ss = _getSubSurf(NULL, smd->levels, 0, 1, useSimple);
+ ss = _getSubSurf(NULL, levels, 0, 1, useSimple);
ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
result = getCCGDerivedMesh(ss, drawInteriorEdges, useSubsurfUv, dm);
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 34e8f5c8e13..517a1e92f93 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -661,7 +661,7 @@ void uiTemplateAnyID(uiLayout *layout, struct bContext *C, struct PointerRNA *pt
char *proptypename, char *text);
void uiTemplatePathBuilder(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
struct PointerRNA *root_ptr, char *text);
-uiLayout *uiTemplateModifier(uiLayout *layout, struct PointerRNA *ptr, int compact);
+uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, int compact);
uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
void uiTemplatePreview(uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot);
void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index dcc5db81335..f9c27c8572f 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -614,9 +614,10 @@ void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char
static void modifiers_setOnCage(bContext *C, void *ob_v, void *md_v)
{
+ Scene *scene = CTX_data_scene(C);
Object *ob = ob_v;
ModifierData *md= md_v;
- int i, cageIndex = modifiers_getCageIndex(ob, NULL, 0);
+ int i, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 0);
/* undo button operation */
md->mode ^= eModifierMode_OnCage;
@@ -664,7 +665,7 @@ static int modifier_can_delete(ModifierData *md)
return 1;
}
-static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, int index, int cageIndex, int lastCageIndex, int compact)
+static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, ModifierData *md, int index, int cageIndex, int lastCageIndex, int compact)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
PointerRNA ptr;
@@ -758,7 +759,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i
if (mti->flags & eModifierTypeFlag_SupportsEditmode)
uiItemR(row, "", 0, &ptr, "editmode", 0);
}
- if ((ob->type==OB_MESH) && modifier_couldBeCage(md) && (index <= lastCageIndex))
+ if ((ob->type==OB_MESH) && modifier_couldBeCage(scene, md) && (index <= lastCageIndex))
{
/* -- convert to rna ? */
but = uiDefIconButBitI(block, TOG, eModifierMode_OnCage, 0, ICON_MESH_DATA, 0, 0, 16, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
@@ -830,8 +831,9 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i
return result;
}
-uiLayout *uiTemplateModifier(uiLayout *layout, PointerRNA *ptr, int compact)
+uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr, int compact)
{
+ Scene *scene = CTX_data_scene(C);
Object *ob;
ModifierData *md, *vmd;
int i, lastCageIndex, cageIndex;
@@ -853,14 +855,14 @@ uiLayout *uiTemplateModifier(uiLayout *layout, PointerRNA *ptr, int compact)
uiBlockSetButLock(uiLayoutGetBlock(layout), (ob && ob->id.lib), ERROR_LIBDATA_MESSAGE);
/* find modifier and draw it */
- cageIndex = modifiers_getCageIndex(ob, &lastCageIndex, 0);
+ cageIndex = modifiers_getCageIndex(scene, ob, &lastCageIndex, 0);
// XXX virtual modifiers are not accesible for python
vmd = modifiers_getVirtualModifierList(ob);
for(i=0; vmd; i++, vmd=vmd->next) {
if(md == vmd)
- return draw_modifier(layout, ob, md, i, cageIndex, lastCageIndex, compact);
+ return draw_modifier(layout, scene, ob, md, i, cageIndex, lastCageIndex, compact);
else if(vmd->mode & eModifierMode_Virtual)
i--;
}
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 6671fec783e..16c7bffd938 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -1460,12 +1460,12 @@ static void sculpt_update_tex(Sculpt *sd, SculptSession *ss)
}
/* Checks whether full update mode (slower) needs to be used to work with modifiers */
-char sculpt_modifiers_active(Object *ob)
+static int sculpt_modifiers_active(Scene *scene, Object *ob)
{
ModifierData *md;
for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) {
- if(modifier_isEnabled(md, eModifierMode_Realtime))
+ if(modifier_isEnabled(scene, md, eModifierMode_Realtime))
if(!ELEM(md->type, eModifierType_Multires, eModifierType_ShapeKey))
return 1;
}
@@ -1801,7 +1801,9 @@ static void sculpt_update_cache_variants(Sculpt *sd, SculptSession *ss, struct P
static void sculpt_stroke_modifiers_check(bContext *C, SculptSession *ss)
{
- if(sculpt_modifiers_active(ss->ob)) {
+ Scene *scene= CTX_data_scene(C);
+
+ if(sculpt_modifiers_active(scene, ss->ob)) {
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
Brush *brush = paint_brush(&sd->paint);
@@ -1979,6 +1981,7 @@ static void sculpt_restore_mesh(Sculpt *sd, SculptSession *ss)
static void sculpt_flush_update(bContext *C)
{
+ Scene *scene = CTX_data_scene(C);
Object *ob = CTX_data_active_object(C);
SculptSession *ss = ob->sculpt;
ARegion *ar = CTX_wm_region(C);
@@ -1988,7 +1991,7 @@ static void sculpt_flush_update(bContext *C)
if(mmd)
multires_mark_as_modified(ob);
- if(sculpt_modifiers_active(ob)) {
+ if(sculpt_modifiers_active(scene, ob)) {
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
ED_region_tag_redraw(ar);
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 0e1c0510902..0fd2eee60bd 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -54,7 +54,6 @@ struct MultiresModifierData *sculpt_multires_active(struct Object *ob);
struct Brush *sculptmode_brush(void);
//void do_symmetrical_brush_actions(struct Sculpt *sd, struct wmOperator *wm, struct BrushAction *a, short *, short *);
-char sculpt_modifiers_active(struct Object *ob);
void sculpt(Sculpt *sd);
int sculpt_poll(struct bContext *C);
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 811ebb13592..378ee85757f 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -2216,11 +2216,11 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
/* detect CrazySpace [tm] */
if(propmode==0) {
- if(modifiers_getCageIndex(t->obedit, NULL, 1)>=0) {
+ if(modifiers_getCageIndex(t->scene, t->obedit, NULL, 1)>=0) {
if(modifiers_isCorrectableDeformed(t->scene, t->obedit)) {
/* check if we can use deform matrices for modifier from the
start up to stack, they are more accurate than quats */
- totleft= editmesh_get_first_deform_matrices(t->obedit, em, &defmats, &defcos);
+ totleft= editmesh_get_first_deform_matrices(t->scene, t->obedit, em, &defmats, &defcos);
/* if we still have more modifiers, also do crazyspace
correction with quats, relative to the coordinates after
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index a4fdf60dbb3..9e6f20cf4e6 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -540,14 +540,12 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
prop= RNA_def_property(srna, "levels", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "levels");
- RNA_def_property_range(prop, 0, INT_MAX);
RNA_def_property_ui_range(prop, 0, 6, 1, 0);
RNA_def_property_ui_text(prop, "Levels", "Number of subdivisions to perform.");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "render_levels", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "renderLevels");
- RNA_def_property_range(prop, 0, INT_MAX);
RNA_def_property_ui_range(prop, 0, 6, 1, 0);
RNA_def_property_ui_text(prop, "Render Levels", "Number of subdivisions to perform when rendering.");
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 8ae96b473f0..4c5fa1bea8c 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -29,6 +29,8 @@
#include "rna_internal.h"
+#include "DNA_group_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
@@ -628,6 +630,33 @@ static void rna_Scene_editmesh_select_mode_update(Main *bmain, Scene *scene, Poi
WM_main_add_notifier(NC_SCENE|ND_TOOLSETTINGS, NULL);
}
+static void object_simplify_update(Object *ob)
+{
+ ModifierData *md;
+
+ for(md=ob->modifiers.first; md; md=md->next)
+ if(ELEM3(md->type, eModifierType_Subsurf, eModifierType_Multires, eModifierType_ParticleSystem))
+ ob->recalc |= OB_RECALC_DATA;
+
+ if(ob->dup_group) {
+ GroupObject *gob;
+
+ for(gob=ob->dup_group->gobject.first; gob; gob=gob->next)
+ object_simplify_update(gob->ob);
+ }
+}
+
+static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Base *base;
+
+ for(base= scene->base.first; base; base= base->next)
+ object_simplify_update(base->object);
+
+ DAG_ids_flush_update(0);
+ WM_main_add_notifier(NC_GEOM|ND_DATA, NULL);
+}
+
#else
static void rna_def_transform_orientation(BlenderRNA *brna)
@@ -2362,11 +2391,38 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Use Game Engine", "Current rendering engine is a game engine.");
+ /* simplify */
+ prop= RNA_def_property(srna, "use_simplify", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SIMPLIFY);
+ RNA_def_property_ui_text(prop, "Use Simplify", "Enable simplification of scene for quicker preview renders.");
+ RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
+
+ prop= RNA_def_property(srna, "simplify_subdivision", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "simplify_subsurf");
+ RNA_def_property_ui_range(prop, 0, 6, 1, 0);
+ RNA_def_property_ui_text(prop, "Simplify Subdivision", "Global maximum subdivision level.");
+ RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
+
+ prop= RNA_def_property(srna, "simplify_child_particles", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "simplify_particles");
+ RNA_def_property_ui_text(prop, "Simplify Child Particles", "Global child particles percentage.");
+ RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
+
+ prop= RNA_def_property(srna, "simplify_shadow_samples", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "simplify_shadowsamples");
+ RNA_def_property_ui_range(prop, 1, 16, 1, 0);
+ RNA_def_property_ui_text(prop, "Simplify Shadow Samples", "Global maximum shadow samples.");
+ RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
+
+ prop= RNA_def_property(srna, "simplify_ao_sss", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "simplify_aosss");
+ RNA_def_property_ui_text(prop, "Simplify AO and SSS", "Global approximate AA and SSS quality factor.");
+ RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
+
/* Scene API */
RNA_api_scene_render(srna);
}
-
/* scene.objects */
static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
{
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index c344173afb3..cd7051fc171 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -299,6 +299,7 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
func= RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "data", "Modifier", "", "Modifier data.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");