[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47927] branches/soc-2012-bratwurst/source /blender: - bf_assimp: blender now reads the list of supported file extensions directly from assimp .
Alexander Gessler
alexander.gessler at gmx.net
Fri Jun 15 01:41:13 CEST 2012
Revision: 47927
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47927
Author: aramis_acg
Date: 2012-06-14 23:41:07 +0000 (Thu, 14 Jun 2012)
Log Message:
-----------
- bf_assimp: blender now reads the list of supported file extensions directly from assimp.
Modified Paths:
--------------
branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp
branches/soc-2012-bratwurst/source/blender/assimp/bassimp.h
branches/soc-2012-bratwurst/source/blender/editors/space_file/CMakeLists.txt
branches/soc-2012-bratwurst/source/blender/editors/space_file/filelist.c
branches/soc-2012-bratwurst/source/blender/imbuf/IMB_imbuf_types.h
branches/soc-2012-bratwurst/source/blender/imbuf/intern/util.c
Modified: branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp 2012-06-14 22:51:34 UTC (rev 47926)
+++ branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp 2012-06-14 23:41:07 UTC (rev 47927)
@@ -26,6 +26,11 @@
#include "SceneImporter.h"
+namespace {
+#define MAX_ASSIMP_EXT_TOTAL_LENGTH 512
+ char cached_extensions[MAX_ASSIMP_EXT_TOTAL_LENGTH] = {0};
+}
+
extern "C"
{
#include "BKE_scene.h"
@@ -35,6 +40,46 @@
#include "BLI_fileops.h"
#include "BLI_path_util.h"
+ void bassimp_query_import_file_extensions(const char* out[], int dim)
+ {
+ // XXX: this is a very inconvenient solution (and its not re-entrant either).
+ // the problem is that we should return static strings to Blender, but
+ // we can't get take them directly from assimp.
+
+ Assimp::Importer importer;
+
+ aiString ext;
+ importer.GetExtensionList(ext);
+
+ char* buff_cursor = cached_extensions, *buff_end = cached_extensions + MAX_ASSIMP_EXT_TOTAL_LENGTH - 1;
+
+ int cnt = 0;
+ bool done = false;
+ for(const char* sz = ext.data, *last = sz+1 /* skip the '*' */; !done; ++sz)
+ {
+ done = !(*sz);
+ if (*sz == ';' || done) {
+ const size_t len = static_cast<size_t>(sz-last);
+ if (buff_cursor + len > buff_end) {
+ return;
+ }
+
+ memcpy(buff_cursor,last,len);
+ buff_cursor[len] = '\0';
+
+ out[cnt++] = buff_cursor;
+
+ buff_cursor += len+1;
+ last = sz+2;
+
+ if(cnt == dim) {
+ return;
+ }
+ }
+ }
+ }
+
+
int bassimp_import(bContext *C, const char *filepath)
{
bassimp::SceneImporter imp(filepath,C);
Modified: branches/soc-2012-bratwurst/source/blender/assimp/bassimp.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/bassimp.h 2012-06-14 22:51:34 UTC (rev 47926)
+++ branches/soc-2012-bratwurst/source/blender/assimp/bassimp.h 2012-06-14 23:41:07 UTC (rev 47927)
@@ -33,7 +33,15 @@
#ifdef __cplusplus
extern "C" {
#endif
- /*
+
+ /* list all import file extensions recognized by assimp.
+ * entries should follow the format '.aaa'
+ * 'out' array should be of size dim+1
+ */
+ void bassimp_query_import_file_extensions(const char* out[], int dim);
+
+
+ /* import/export functions
* both return 1 on success, 0 on error
*/
int bassimp_import(bContext *C, const char *filepath);
Modified: branches/soc-2012-bratwurst/source/blender/editors/space_file/CMakeLists.txt
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/space_file/CMakeLists.txt 2012-06-14 22:51:34 UTC (rev 47926)
+++ branches/soc-2012-bratwurst/source/blender/editors/space_file/CMakeLists.txt 2012-06-14 23:41:07 UTC (rev 47927)
@@ -78,6 +78,10 @@
add_definitions(-DWITH_HDR)
endif()
+if(WITH_ASSIMP)
+ add_definitions(-DWITH_ASSIMP)
+endif()
+
if(WITH_INTERNATIONAL)
add_definitions(-DWITH_INTERNATIONAL)
endif()
Modified: branches/soc-2012-bratwurst/source/blender/editors/space_file/filelist.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/space_file/filelist.c 2012-06-14 22:51:34 UTC (rev 47926)
+++ branches/soc-2012-bratwurst/source/blender/editors/space_file/filelist.c 2012-06-14 23:41:07 UTC (rev 47927)
@@ -80,6 +80,11 @@
#include "filelist.h"
+
+#ifdef WITH_ASSIMP
+# include "../../assimp/bassimp.h"
+#endif
+
/* max length of library group name within filesel */
#define GROUP_MAX 32
@@ -796,9 +801,21 @@
else if (BLI_testextensie_array(relname, imb_ext_audio)) {
return SOUNDFILE;
}
- else if (BLI_testextensie_array(relname, imb_ext_assimp)) {
- return ASSIMPFILE;
+
+#ifdef WITH_ASSIMP
+ else {
+
+ // query list of file extensions from assimp
+ if (imb_ext_assimp[0] == NULL) {
+ bassimp_query_import_file_extensions(imb_ext_assimp,MAX_ASSIMP_EXT);
+ }
+
+ if (BLI_testextensie_array(relname, imb_ext_assimp)) {
+ return ASSIMPFILE;
+ }
}
+#endif
+
return 0;
}
Modified: branches/soc-2012-bratwurst/source/blender/imbuf/IMB_imbuf_types.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/imbuf/IMB_imbuf_types.h 2012-06-14 22:51:34 UTC (rev 47926)
+++ branches/soc-2012-bratwurst/source/blender/imbuf/IMB_imbuf_types.h 2012-06-14 23:41:07 UTC (rev 47927)
@@ -219,6 +219,8 @@
extern const char *imb_ext_image_qt[];
extern const char *imb_ext_movie[];
extern const char *imb_ext_audio[];
+
+#define MAX_ASSIMP_EXT 64
extern const char *imb_ext_assimp[];
#endif
Modified: branches/soc-2012-bratwurst/source/blender/imbuf/intern/util.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/imbuf/intern/util.c 2012-06-14 22:51:34 UTC (rev 47926)
+++ branches/soc-2012-bratwurst/source/blender/imbuf/intern/util.c 2012-06-14 23:41:07 UTC (rev 47927)
@@ -151,16 +151,11 @@
NULL
};
-// XXX: get list from assimp
-const char *imb_ext_assimp[] = {
- ".3ds",
- ".obj",
- ".ms3d",
- ".x",
- ".lwo",
- NULL
-};
+// the actual list will be pulled from assimp at runtime
+// if Blender is built without assimp, this is just a dummy
+const char *imb_ext_assimp[MAX_ASSIMP_EXT+1] = {0};
+
static int IMB_ispic_name(const char *name)
{
ImFileType *type;
More information about the Bf-blender-cvs
mailing list