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:
authorLukas Tönne <lukas.toenne@gmail.com>2015-03-20 16:48:51 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2015-03-20 16:48:51 +0300
commite84b0d456f963faf1cb0c3c180fa851e2cb6b070 (patch)
treecc2d47c80d2b22c2837e66e24b6ad57be19e3ff3 /source/blender/makesrna/intern
parent5950b4832896e4cf59b25de10e7b9e301e9ed65f (diff)
Working implementation of cache reading for dupli data during renders.
Diffstat (limited to 'source/blender/makesrna/intern')
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c65
-rw-r--r--source/blender/makesrna/intern/rna_object.c2
2 files changed, 60 insertions, 7 deletions
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 13307a1a2be..1cd372df161 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -313,11 +313,58 @@ Mesh *rna_Main_meshes_new_from_object(
/* copied from Mesh_getFromObject and adapted to RNA interface */
/* settings: 1 - preview, 2 - render */
-Mesh *rna_Main_meshes_new_from_dupli_cache(
- Main *bmain, ReportList *UNUSED(reports), DupliObjectData *data,
- int calc_tessface, int calc_undeformed)
+Mesh *rna_Main_meshes_new_from_dupli(
+ Main *bmain, ReportList *reports, Scene *scene, Object *parent, DupliObject *dob,
+ int settings, int calc_tessface, int calc_undeformed)
{
- return BKE_mesh_new_from_dupli_cache(bmain, data, calc_tessface, calc_undeformed);
+ Mesh *mesh = NULL;
+
+ switch (dob->ob->type) {
+ case OB_FONT:
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_MBALL:
+ case OB_MESH:
+ break;
+ default:
+ BKE_report(reports, RPT_ERROR, "Object does not have geometry data");
+ return NULL;
+ }
+
+ if ((parent->transflag & OB_DUPLI_READ_CACHE) && parent->cache_library) {
+ float frame = (float)scene->r.cfra;
+ eCacheLibrary_EvalMode eval_mode;
+
+ if (settings == 1)
+ eval_mode = CACHE_LIBRARY_EVAL_REALTIME;
+ else if (settings == 2)
+ eval_mode = CACHE_LIBRARY_EVAL_RENDER;
+ else
+ return NULL;
+
+ if (settings == 1 && parent->dup_cache) {
+ DupliObjectData *data;
+
+ /* use dupli cache for realtime dupli data if possible */
+ data = BKE_dupli_cache_find_data(parent->dup_cache, dob->ob);
+ if (data)
+ mesh = BKE_mesh_new_from_dupli_data(bmain, data, calc_tessface, calc_undeformed);
+ }
+ else {
+ DupliObjectData data;
+
+ memset(&data, 0, sizeof(data));
+ if (BKE_cache_read_dupli_object(scene, frame, eval_mode, dob->ob, &data, parent->cache_library))
+ mesh = BKE_mesh_new_from_dupli_data(bmain, &data, calc_tessface, calc_undeformed);
+
+ BKE_dupli_object_data_clear(&data);
+ }
+ }
+ else {
+ mesh = BKE_mesh_new_from_object(bmain, scene, dob->ob, true, settings, calc_tessface, calc_undeformed);
+ }
+
+ return mesh;
}
static void rna_Main_meshes_remove(Main *bmain, ReportList *reports, PointerRNA *mesh_ptr)
@@ -1067,11 +1114,17 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
"Mesh created from object, remove it if it is only used for export");
RNA_def_function_return(func, parm);
- func = RNA_def_function(srna, "new_from_dupli_cache", "rna_Main_meshes_new_from_dupli_cache");
+ func = RNA_def_function(srna, "new_from_dupli", "rna_Main_meshes_new_from_dupli");
RNA_def_function_ui_description(func, "Add a new mesh created from dupli cache data");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm = RNA_def_pointer(func, "data", "DupliObjectData", "", "Dupli Object Data");
+ parm = RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate modifiers");
+ RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+ parm = RNA_def_pointer(func, "parent", "Object", "", "Duplicator parent of the object");
RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+ parm = RNA_def_pointer(func, "dupli_object", "DupliObject", "", "Dupli Object to create mesh from");
+ RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+ parm = RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces");
RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates");
parm = RNA_def_pointer(func, "mesh", "Mesh", "",
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 6ce17f4a0b4..dc256acb395 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -2867,7 +2867,7 @@ static void rna_def_dupli_object(BlenderRNA *brna)
static void rna_def_dupli_object_data(BlenderRNA *brna)
{
StructRNA *srna;
- PropertyRNA *prop;
+ /*PropertyRNA *prop;*/
srna = RNA_def_struct(brna, "DupliObjectData", NULL);
RNA_def_struct_sdna(srna, "DupliObjectData");