/*************************************************************************/ /* editor_import_export.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* http://www.godotengine.org */ /*************************************************************************/ /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #ifndef EDITOR_EXPORT_H #define EDITOR_EXPORT_H #include "resource.h" #include "scene/main/node.h" #include "scene/main/timer.h" #include "scene/resources/texture.h" class EditorProgress; class FileAccess; class EditorExportPlatform; class EditorFileSystemDirectory; class EditorExportPreset : public Reference { GDCLASS(EditorExportPreset, Reference) public: enum ExportFilter { EXPORT_ALL_RESOURCES, EXPORT_SELECTED_SCENES, EXPORT_SELECTED_RESOURCES, }; private: Ref platform; ExportFilter export_filter; String include_filter; String exclude_filter; String exporter; Set selected_files; bool runnable; Vector patches; friend class EditorExport; friend class EditorExportPlatform; List properties; Map values; String name; protected: bool _set(const StringName &p_name, const Variant &p_value); bool _get(const StringName &p_name, Variant &r_ret) const; void _get_property_list(List *p_list) const; public: Ref get_platform() const; bool has(const StringName &p_property) const { return values.has(p_property); } Vector get_files_to_export() const; void add_export_file(const String &p_path); void remove_export_file(const String &p_path); bool has_export_file(const String &p_path); void set_name(const String &p_name); String get_name() const; void set_runnable(bool p_enable); bool is_runnable() const; void set_export_filter(ExportFilter p_filter); ExportFilter get_export_filter() const; void set_include_filter(const String &p_include); String get_include_filter() const; void set_exclude_filter(const String &p_exclude); String get_exclude_filter() const; void add_patch(const String &p_path, int p_at_pos = -1); void set_patch(int p_index, const String &p_path); String get_patch(int p_index); void remove_patch(int p_idx); Vector get_patches() const; const List &get_properties() const { return properties; } EditorExportPreset(); }; class EditorExportPlatform : public Reference { GDCLASS(EditorExportPlatform, Reference) public: typedef Error (*EditorExportSaveFunction)(void *p_userdata, const String &p_path, const Vector &p_data, int p_file, int p_total); private: struct SavedData { uint64_t ofs; uint64_t size; Vector md5; CharString path_utf8; bool operator<(const SavedData &p_data) const { return path_utf8 < p_data.path_utf8; } }; struct PackData { FileAccess *f; Vector file_ofs; EditorProgress *ep; }; struct ZipData { void *zip; EditorProgress *ep; }; void _export_find_resources(EditorFileSystemDirectory *p_dir, Set &p_paths); void _export_find_dependencies(const String &p_path, Set &p_paths); void gen_debug_flags(Vector &r_flags, int p_flags); static Error _save_pack_file(void *p_userdata, const String &p_path, const Vector &p_data, int p_file, int p_total); static Error _save_zip_file(void *p_userdata, const String &p_path, const Vector &p_data, int p_file, int p_total); protected: virtual void get_preset_features(const Ref &p_preset, List *r_features) = 0; String find_export_template(String template_file_name) const; void gen_export_flags(Vector &r_flags, int p_flags); public: struct ExportOption { PropertyInfo option; Variant default_value; ExportOption(const PropertyInfo &p_info, const Variant &p_default) { option = p_info; default_value = p_default; } ExportOption() {} }; virtual Ref create_preset(); virtual void get_export_options(List *r_options) = 0; virtual String get_name() const = 0; virtual Ref get_logo() const = 0; Error export_project_files(const Ref &p_preset, EditorExportSaveFunction p_func, void *p_udata); Error save_pack(const Ref &p_preset, const String &p_path); Error save_zip(const Ref &p_preset, const String &p_path); virtual bool poll_devices() { return false; } virtual int get_device_count() const { return 0; } virtual String get_device_name(int p_device) const { return ""; } virtual String get_device_info(int p_device) const { return ""; } enum DebugFlags { DEBUG_FLAG_DUMB_CLIENT = 1, DEBUG_FLAG_REMOTE_DEBUG = 2, DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST = 4, DEBUG_FLAG_VIEW_COLLISONS = 8, DEBUG_FLAG_VIEW_NAVIGATION = 16, }; virtual Error run(const Ref &p_preset, int p_device, int p_debug_flags) { return OK; } virtual bool can_export(const Ref &p_preset, String &r_error, bool &r_missing_templates) const = 0; virtual String get_binary_extension() const = 0; virtual Error export_project(const Ref &p_preset, bool p_debug, const String &p_path, int p_flags = 0) = 0; EditorExportPlatform(); }; class EditorExport : public Node { GDCLASS(EditorExport, Node); Vector > export_platforms; Vector > export_presets; Timer *save_timer; bool block_save; static EditorExport *singleton; void _save(); protected: friend class EditorExportPreset; void save_presets(); void _notification(int p_what); static void _bind_methods(); public: static EditorExport *get_singleton() { return singleton; } void add_export_platform(const Ref &p_platform); int get_export_platform_count(); Ref get_export_platform(int p_idx); void add_export_preset(const Ref &p_preset, int p_at_pos = -1); int get_export_preset_count() const; Ref get_export_preset(int p_idx); void remove_export_preset(int p_idx); void load_config(); bool poll_export_platforms(); EditorExport(); ~EditorExport(); }; class EditorExportPlatformPC : public EditorExportPlatform { GDCLASS(EditorExportPlatformPC, EditorExportPlatform) Ref logo; String name; String extension; String release_file_32; String release_file_64; String debug_file_32; String debug_file_64; public: virtual void get_preset_features(const Ref &p_preset, List *r_features); virtual void get_export_options(List *r_options); virtual String get_name() const; virtual Ref get_logo() const; virtual bool can_export(const Ref &p_preset, String &r_error, bool &r_missing_templates) const; virtual String get_binary_extension() const; virtual Error export_project(const Ref &p_preset, bool p_debug, const String &p_path, int p_flags = 0); void set_extension(const String &p_extension); void set_name(const String &p_name); void set_logo(const Ref &p_loco); void set_release_64(const String &p_file); void set_release_32(const String &p_file); void set_debug_64(const String &p_file); void set_debug_32(const String &p_file); EditorExportPlatformPC(); }; #endif // EDITOR_IMPORT_EXPORT_H