From 3402cd81c7c95f3c96db6b037023b94bd4c9ebc2 Mon Sep 17 00:00:00 2001 From: Vincent Fazio Date: Fri, 21 Sep 2018 10:31:21 +1000 Subject: [PATCH 1/3] Added interface to 'aiExportSceneToBlob()' for pyassimp --- port/PyAssimp/pyassimp/core.py | 29 ++++++++++++++++++++++++++++- port/PyAssimp/pyassimp/helper.py | 7 +++++-- port/PyAssimp/pyassimp/structs.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/port/PyAssimp/pyassimp/core.py b/port/PyAssimp/pyassimp/core.py index 50d2f9a1a..4668eeda2 100644 --- a/port/PyAssimp/pyassimp/core.py +++ b/port/PyAssimp/pyassimp/core.py @@ -35,7 +35,7 @@ class AssimpLib(object): """ Assimp-Singleton """ - load, load_mem, export, release, dll = helper.search_library() + load, load_mem, export, export_blob, release, dll = helper.search_library() _assimp_lib = AssimpLib() def make_tuple(ai_obj, type = None): @@ -352,6 +352,33 @@ def export(scene, if exportStatus != 0: raise AssimpError('Could not export scene!') +def export_blob(scene, + file_type = None, + processing = postprocess.aiProcess_Triangulate): + ''' + Export a scene and return a blob in the correct format. On failure throws AssimpError. + + Arguments + --------- + scene: scene to export. + file_type: string of file exporter to use. For example "collada". + processing: assimp postprocessing parameters. Verbose keywords are imported + from postprocessing, and the parameters can be combined bitwise to + generate the final processing value. Note that the default value will + triangulate quad faces. Example of generating other possible values: + processing = (pyassimp.postprocess.aiProcess_Triangulate | + pyassimp.postprocess.aiProcess_OptimizeMeshes) + Returns + --------- + ExportBlob + ''' + from ctypes import pointer + exportBlobPtr = _assimp_lib.export_blob(pointer(scene), file_type.encode("ascii"), processing) + + if exportBlobPtr == 0: + raise AssimpError('Could not export scene to blob!') + return exportBlobPtr + def release(scene): from ctypes import pointer _assimp_lib.release(pointer(scene)) diff --git a/port/PyAssimp/pyassimp/helper.py b/port/PyAssimp/pyassimp/helper.py index f9163de2a..55e8a9d2b 100644 --- a/port/PyAssimp/pyassimp/helper.py +++ b/port/PyAssimp/pyassimp/helper.py @@ -176,6 +176,7 @@ def try_load_functions(library_path, dll): load from filename function, load from memory function, export to filename function, + export to blob function, release function, ctypes handle to assimp library) ''' @@ -185,15 +186,17 @@ def try_load_functions(library_path, dll): release = dll.aiReleaseImport load_mem = dll.aiImportFileFromMemory export = dll.aiExportScene + export2blob = dll.aiExportSceneToBlob except AttributeError: #OK, this is a library, but it doesn't have the functions we need return None # library found! - from .structs import Scene + from .structs import Scene, ExportDataBlob load.restype = POINTER(Scene) load_mem.restype = POINTER(Scene) - return (library_path, load, load_mem, export, release, dll) + export2blob.restype = POINTER(ExportDataBlob) + return (library_path, load, load_mem, export, export2blob, release, dll) def search_library(): ''' diff --git a/port/PyAssimp/pyassimp/structs.py b/port/PyAssimp/pyassimp/structs.py index 15e50b14b..8a75c1e46 100644 --- a/port/PyAssimp/pyassimp/structs.py +++ b/port/PyAssimp/pyassimp/structs.py @@ -996,6 +996,37 @@ class Animation(Structure): ] +class ExportDataBlob(Structure): + """ + See 'cexport.h' for details. + """ + pass + +ExportDataBlob._fields_ = [ + # Size of the data in bytes + ("size", c_size_t), + + # The data. + ("data", c_void_p), + + # Name of the blob. An empty string always + # indicates the first (and primary) blob, + # which contains the actual file data. + # Any other blobs are auxiliary files produced + # by exporters (i.e. material files). Existence + # of such files depends on the file format. Most + # formats don't split assets across multiple files. + # + # If used, blob names usually contain the file + # extension that should be used when writing + # the data to disc. + ("name", String), + + # Pointer to the next blob in the chain or NULL if there is none. + ("next", POINTER(ExportDataBlob)), + ] + + class Scene(Structure): """ See 'aiScene.h' for details. From ef4e317625e8473077535055621b9779bb2109a4 Mon Sep 17 00:00:00 2001 From: Vincent Fazio Date: Fri, 21 Sep 2018 10:51:38 +1000 Subject: [PATCH 2/3] Improved some comments --- port/PyAssimp/pyassimp/core.py | 2 +- port/PyAssimp/pyassimp/structs.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/port/PyAssimp/pyassimp/core.py b/port/PyAssimp/pyassimp/core.py index 4668eeda2..64dd351a7 100644 --- a/port/PyAssimp/pyassimp/core.py +++ b/port/PyAssimp/pyassimp/core.py @@ -370,7 +370,7 @@ def export_blob(scene, pyassimp.postprocess.aiProcess_OptimizeMeshes) Returns --------- - ExportBlob + Pointer to structs.ExportDataBlob ''' from ctypes import pointer exportBlobPtr = _assimp_lib.export_blob(pointer(scene), file_type.encode("ascii"), processing) diff --git a/port/PyAssimp/pyassimp/structs.py b/port/PyAssimp/pyassimp/structs.py index 8a75c1e46..ddfd87f8a 100644 --- a/port/PyAssimp/pyassimp/structs.py +++ b/port/PyAssimp/pyassimp/structs.py @@ -999,6 +999,8 @@ class Animation(Structure): class ExportDataBlob(Structure): """ See 'cexport.h' for details. + + Note that the '_fields_' definition is outside the class to allow the 'next' field to be recursive """ pass From 8cb0b4ce2b5827fb0b847d749147c5b238e85f1f Mon Sep 17 00:00:00 2001 From: Vincent Fazio Date: Fri, 21 Sep 2018 11:02:14 +1000 Subject: [PATCH 3/3] Updated pyassimp function description --- port/PyAssimp/pyassimp/helper.py | 1 + 1 file changed, 1 insertion(+) diff --git a/port/PyAssimp/pyassimp/helper.py b/port/PyAssimp/pyassimp/helper.py index 55e8a9d2b..4e9f10e94 100644 --- a/port/PyAssimp/pyassimp/helper.py +++ b/port/PyAssimp/pyassimp/helper.py @@ -206,6 +206,7 @@ def search_library(): Returns: tuple, (load from filename function, load from memory function, export to filename function, + export to blob function, release function, dll) '''