Alembic export: made hair/particle export optional.
[blender.git] / source / blender / editors / io / io_alembic.c
index 96a3ef1f2f6ba92e9d721c79be07a97c524aaab3..8651d89c403d2b0d0453afcecb52a38182daff52 100644 (file)
@@ -34,6 +34,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_mesh_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_space_types.h"
@@ -67,6 +68,8 @@
 
 static int wm_alembic_export_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
+       RNA_boolean_set(op->ptr, "init_scene_frame_range", true);
+
        if (!RNA_struct_property_is_set(op->ptr, "filepath")) {
                Main *bmain = CTX_data_main(C);
                char filepath[FILE_MAX];
@@ -119,8 +122,13 @@ static int wm_alembic_export_exec(bContext *C, wmOperator *op)
            .renderable_only = RNA_boolean_get(op->ptr, "renderable_only"),
            .face_sets = RNA_boolean_get(op->ptr, "face_sets"),
            .use_subdiv_schema = RNA_boolean_get(op->ptr, "subdiv_schema"),
+           .export_hair = RNA_boolean_get(op->ptr, "export_hair"),
+           .export_particles = RNA_boolean_get(op->ptr, "export_particles"),
            .compression_type = RNA_enum_get(op->ptr, "compression_type"),
            .packuv = RNA_boolean_get(op->ptr, "packuv"),
+           .triangulate = RNA_boolean_get(op->ptr, "triangulate"),
+           .quad_method = RNA_enum_get(op->ptr, "quad_method"),
+           .ngon_method = RNA_enum_get(op->ptr, "ngon_method"),
 
            .global_scale = RNA_float_get(op->ptr, "global_scale"),
        };
@@ -132,10 +140,12 @@ static int wm_alembic_export_exec(bContext *C, wmOperator *op)
 
 static void ui_alembic_export_settings(uiLayout *layout, PointerRNA *imfptr)
 {
-       uiLayout *box = uiLayoutBox(layout);
+       uiLayout *box;
        uiLayout *row;
+       uiLayout *col;
 
 #ifdef WITH_ALEMBIC_HDF5
+       box = uiLayoutBox(layout);
        row = uiLayoutRow(box, false);
        uiItemL(row, IFACE_("Archive Options:"), ICON_NONE);
 
@@ -211,13 +221,46 @@ static void ui_alembic_export_settings(uiLayout *layout, PointerRNA *imfptr)
 
        row = uiLayoutRow(box, false);
        uiItemR(row, imfptr, "apply_subdiv", 0, NULL, ICON_NONE);
+
+       row = uiLayoutRow(box, false);
+       uiItemR(row, imfptr, "triangulate", 0, NULL, ICON_NONE);
+
+       const bool triangulate = RNA_boolean_get(imfptr, "triangulate");
+
+       row = uiLayoutRow(box, false);
+       uiLayoutSetEnabled(row, triangulate);
+       uiItemR(row, imfptr, "quad_method", 0, NULL, ICON_NONE);
+
+       row = uiLayoutRow(box, false);
+       uiLayoutSetEnabled(row, triangulate);
+       uiItemR(row, imfptr, "ngon_method", 0, NULL, ICON_NONE);
+
+       /* Object Data */
+       box = uiLayoutBox(layout);
+       row = uiLayoutRow(box, false);
+       uiItemL(row, IFACE_("Particle Systems:"), ICON_PARTICLE_DATA);
+
+       col = uiLayoutColumn(box, true);
+       uiItemR(col, imfptr, "export_hair", 0, NULL, ICON_NONE);
+       uiItemR(col, imfptr, "export_particles", 0, NULL, ICON_NONE);
 }
 
-static void wm_alembic_export_draw(bContext *UNUSED(C), wmOperator *op)
+static void wm_alembic_export_draw(bContext *C, wmOperator *op)
 {
        PointerRNA ptr;
 
        RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr);
+
+       /* Conveniently set start and end frame to match the scene's frame range. */
+       Scene *scene = CTX_data_scene(C);
+
+       if (scene != NULL && RNA_boolean_get(&ptr, "init_scene_frame_range")) {
+               RNA_int_set(&ptr, "start", SFRA);
+               RNA_int_set(&ptr, "end", EFRA);
+
+               RNA_boolean_set(&ptr, "init_scene_frame_range", false);
+       }
+
        ui_alembic_export_settings(op->layout, &ptr);
 }
 
@@ -307,6 +350,23 @@ void WM_OT_alembic_export(wmOperatorType *ot)
        RNA_def_float(ot->srna, "global_scale", 1.0f, 0.0001f, 1000.0f, "Scale",
                      "Value by which to enlarge or shrink the objects with respect to the world's origin",
                      0.0001f, 1000.0f);
+
+       RNA_def_boolean(ot->srna, "triangulate", false, "Triangulate",
+                       "Export Polygons (Quads & NGons) as Triangles");
+
+       RNA_def_enum(ot->srna, "quad_method", rna_enum_modifier_triangulate_quad_method_items,
+                    MOD_TRIANGULATE_QUAD_SHORTEDGE, "Quad Method", "Method for splitting the quads into triangles");
+
+       RNA_def_enum(ot->srna, "ngon_method", rna_enum_modifier_triangulate_quad_method_items,
+                    MOD_TRIANGULATE_NGON_BEAUTY, "Polygon Method", "Method for splitting the polygons into triangles");
+
+       RNA_def_boolean(ot->srna, "export_hair", 1, "Export Hair", "Exports hair particle systems as animated curves");
+       RNA_def_boolean(ot->srna, "export_particles", 1, "Export Particles", "Exports non-hair particle systems");
+
+       /* This dummy prop is used to check whether we need to init the start and
+     * end frame values to that of the scene's, otherwise they are reset at
+     * every change, draw update. */
+       RNA_def_boolean(ot->srna, "init_scene_frame_range", false, "", "");
 }
 
 /* ************************************************************************** */