فهرست منبع

Fixed horizontal scroll in UIScrollContainer, added a front end for the 3d asset import tool in the IDE, fixed refresh in the IDE project browser

Ivan Safrin 12 سال پیش
والد
کامیت
b5bb40045f

+ 5 - 0
Core/Contents/Include/PolyCore.h

@@ -43,6 +43,11 @@ namespace Polycode {
 	
 	class _PolyExport CoreFileExtension : public PolyBase {
 	public:
+		CoreFileExtension() {}
+		CoreFileExtension(String description, String extension) {
+			this->extension = extension;
+			this->description = description;
+		}	
 		String extension;
 		String description;
 	};

+ 2 - 0
IDE/Contents/Include/PolycodeFrame.h

@@ -365,6 +365,8 @@ public:
 	UIWindow *aboutWindow;
 	UIButton *aboutOKButton;
 	
+	AssetImporterWindow *assetImporterWindow;
+	
 	void updateFileSelector();
 	
 	bool isShowingConsole();

+ 1 - 0
IDE/Contents/Include/PolycodeIDEApp.h

@@ -78,6 +78,7 @@ public:
 	void openDocs();
 	
 	void addFiles();
+	void importAssets();
 	
 	void newGroup();	
 	void openProject();

+ 2 - 1
IDE/Contents/Include/PolycodeProjectBrowser.h

@@ -66,13 +66,14 @@ class PolycodeProjectBrowser : public UIElement {
 		
 		void handleEvent(Event *event);
 		
-		void parseFolderIntoNode(UITree *node, String spath, PolycodeProject *parentProject);
+		void parseFolderIntoNode(UITree *node, String spath);
 		
 		BrowserUserData *getSelectedData() { return selectedData; }
 		
 		UITreeContainer *treeContainer;
 			
 protected:
+		PolycodeProject *project;
 
 		void applyOpenNodeToTree(UITree* treeNode, ObjectEntry *nodeEntry);
 		

+ 1 - 0
IDE/Contents/Include/PolycodeToolLauncher.h

@@ -53,6 +53,7 @@ class PolycodeToolLauncher {
 		static void openExternalEditor(String app, String file, String inFolder);
 		static String generateTempPath(PolycodeProject *project);
 		static void buildProject(PolycodeProject *project, String destinationPath, bool compileScripts);
+		static String importAssets(String sourceFile, String inFolder, bool addMeshes, String prefix, bool swapZY, bool generateTangents, bool listOnly);
 
 		static void runPolyapp(String polyappPath);
 };

+ 37 - 1
IDE/Contents/Include/ToolWindows.h

@@ -82,4 +82,40 @@ class YesNoCancelPopup : public UIWindow {
 		UIButton *cancelButton;
 		UIButton *noButton;		
 		UIButton *okButton;
-};
+};
+
+class AssetImporterWindow : public UIWindow {
+	public:
+		AssetImporterWindow();
+		~AssetImporterWindow();
+
+		void clearFiles();
+		void addFile(String fileName);
+		void setFilesToImport(String files);
+		
+		void setSourceFileAndTargetFolder(String file, String folder);
+		void refreshPreview();
+			
+		void handleEvent(Event *event);	
+			
+	protected:
+
+		String file;
+		String folder;
+
+		UIButton *cancelButton;
+		UIButton *okButton;
+		std::vector<UILabel*> fileLabels;
+
+		UICheckBox *usePrefixCheckbox;
+		UITextInput *prefixInput;
+		UICheckBox *addMeshesCheckbox;
+		UICheckBox *generateTangensCheckbox;
+		UICheckBox *swapZYAxisCheckbox;
+				
+		Entity *filesAnchor;
+		UIScrollContainer *filesScroller;
+
+		UILabel *filesToImportLabel;
+};
+

+ 5 - 0
IDE/Contents/Source/PolycodeFrame.cpp

@@ -29,6 +29,7 @@ extern UIGlobalMenu *globalMenu;
 EditorHolder *activeEditorHolder = NULL;
 extern PolycodeEditorManager *globalEditorManager;
 
+
 EditPoint::EditPoint(BezierPoint *point, unsigned int type) : Entity() {
 	this->point = point;
 	this->type = type;
@@ -1389,6 +1390,10 @@ PolycodeFrame::PolycodeFrame(PolycodeEditorManager *editorManager) : UIElement()
 	aboutOKButton->setPosition(700, 420);
 	aboutOKButton->addEventListener(this, UIEvent::CLICK_EVENT);
 	
+	
+	assetImporterWindow = new AssetImporterWindow();
+	
+	
 	UILabel *versionLabel = new UILabel("version 0.8.2", 12, "mono");
 	aboutWindow->addChild(versionLabel);
 	versionLabel->setPosition(20, 430);

+ 60 - 0
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -485,6 +485,59 @@ void PolycodeIDEApp::runProject() {
 	}
 }
 
+void PolycodeIDEApp::importAssets() {
+	vector<CoreFileExtension> extensions;		
+	
+	extensions.push_back(CoreFileExtension("Collada", "dae"));
+	extensions.push_back(CoreFileExtension("Collada XML", "xml"));
+	extensions.push_back(CoreFileExtension("Blender", "blend"));
+	extensions.push_back(CoreFileExtension("Biovision BVH", "bvh"));
+	extensions.push_back(CoreFileExtension("3D Studio Max 3DS", "3ds"));
+	extensions.push_back(CoreFileExtension("3D Studio Max ASE", "ase"));
+	extensions.push_back(CoreFileExtension("3Wavefront Object", "obj"));
+	extensions.push_back(CoreFileExtension("Stanford Polygon Library", "ply"));
+	extensions.push_back(CoreFileExtension("AutoCAD DXF", "dxf"));
+	extensions.push_back(CoreFileExtension("IFC-STEP", "ifc"));
+	extensions.push_back(CoreFileExtension("Neutral File Format", "nff"));
+	extensions.push_back(CoreFileExtension("Valve Model", "smd"));
+	extensions.push_back(CoreFileExtension("Valve Model", "vta"));
+	extensions.push_back(CoreFileExtension("Quake I", "mdl"));
+	extensions.push_back(CoreFileExtension("Quake II", "md2"));
+	extensions.push_back(CoreFileExtension("Quake III", "md3"));
+	extensions.push_back(CoreFileExtension("Quake III BSP", "pk3"));
+	extensions.push_back(CoreFileExtension("RtCW", "mdc"));
+	extensions.push_back(CoreFileExtension("Doom 3", "md5mesh"));
+	extensions.push_back(CoreFileExtension("Doom 3 Animation", "md5anim"));
+	extensions.push_back(CoreFileExtension("Direct X", "x"));
+	extensions.push_back(CoreFileExtension("Quick 3D", "q3o"));
+	extensions.push_back(CoreFileExtension("Quick 3D", "q3s"));
+	extensions.push_back(CoreFileExtension("Raw Triangles", "raw"));
+	extensions.push_back(CoreFileExtension("AC3D", "ac"));		
+	extensions.push_back(CoreFileExtension("Stereolithography", "stl"));
+	extensions.push_back(CoreFileExtension("Irrlicht Mesh", "irrmesh"));
+	extensions.push_back(CoreFileExtension("Object File Format", "off"));
+	extensions.push_back(CoreFileExtension("Terragen Terrain", "terr"));
+	extensions.push_back(CoreFileExtension("3D GameStudio Model", "mdl"));
+	extensions.push_back(CoreFileExtension("3D GameStudio Terrain", "hmp"));
+	extensions.push_back(CoreFileExtension("Ogre mesh XML", "mesh.xml"));	
+	extensions.push_back(CoreFileExtension("Ogre skeleton XML", "skeleton.xml"));
+	extensions.push_back(CoreFileExtension("Ogre material", "material"));
+	extensions.push_back(CoreFileExtension("Milkshape 3D", "ms3d"));
+	extensions.push_back(CoreFileExtension("Lightwave model", "lwo"));
+	extensions.push_back(CoreFileExtension("Lightwave scene", "lws"));
+	extensions.push_back(CoreFileExtension("Modo model", "lxo"));
+	extensions.push_back(CoreFileExtension("CharacterStudio Motion", "csm"));
+	extensions.push_back(CoreFileExtension("TrueSpace", "scn"));
+	extensions.push_back(CoreFileExtension("XGL", "xgl"));						
+			
+	std::vector<String> files = core->openFilePicker(extensions, false);	
+	if(files.size()) {		
+		frame->assetImporterWindow->setSourceFileAndTargetFolder(files[0], projectManager->activeFolder);
+		frame->showModal(frame->assetImporterWindow);
+		frame->assetImporterWindow->addEventListener(this, UIEvent::OK_EVENT);
+	}
+}
+
 void PolycodeIDEApp::addFiles() {
 	if(projectManager->getActiveProject()) {
 #ifdef USE_POLYCODEUI_FILE_DIALOGS
@@ -596,6 +649,11 @@ void PolycodeIDEApp::openFile(OSFileEntry file) {
 }
 
 void PolycodeIDEApp::handleEvent(Event *event) {
+
+	if(event->getDispatcher() == frame->assetImporterWindow) {
+		frame->getCurrentProjectBrowser()->Refresh();
+	}
+	
 	if(event->getDispatcher() == projectManager && event->getEventCode() == Event::CHANGE_EVENT) {
 		if(projectManager->getActiveProject()) {
 		
@@ -734,6 +792,8 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 						newFile();
 					} else if(bEvent->command == "add_files") {
 						addFiles();
+					} else if(bEvent->command == "import_assets") {
+						importAssets();		
 					} else if(bEvent->command == "add_new_project") {
 						newProject();
 					} else if(bEvent->command == "add_new_folder") {				

+ 1 - 1
IDE/Contents/Source/PolycodeMeshEditor.cpp

@@ -200,7 +200,7 @@ void PolycodeMeshEditor::Resize(int x, int y) {
 	renderTexture->resizeRenderTexture(x, y-30);
 	previewShape->setTexture(renderTexture->getTargetTexture());	
 	previewShape->Resize(x, y-30);	
-	bgShape->setImageCoordinates(0,0,x,y);
+	bgShape->setImageCoordinates(0,0,x,y-30);
 	
 	bgShape->setPosition(0, 30);
 	previewShape->setPosition(0, 30);

+ 10 - 19
IDE/Contents/Source/PolycodeProjectBrowser.cpp

@@ -26,6 +26,7 @@ extern UIGlobalMenu *globalMenu;
 
 PolycodeProjectBrowser::PolycodeProjectBrowser(PolycodeProject *project) : UIElement() {
 
+	this->project = project;	
 	headerBg = new UIRect(10,10);
 	addChild(headerBg);
 	headerBg->setAnchorPoint(-1.0, -1.0, 0.0);
@@ -52,7 +53,7 @@ PolycodeProjectBrowser::PolycodeProjectBrowser(PolycodeProject *project) : UIEle
 	addChild(treeContainer);		
 	selectedData = NULL;
 	
-	parseFolderIntoNode(treeContainer->getRootNode(), project->getRootFolder(), project);
+	parseFolderIntoNode(treeContainer->getRootNode(), project->getRootFolder());
 }
 
 PolycodeProjectBrowser::~PolycodeProjectBrowser() {
@@ -60,18 +61,7 @@ PolycodeProjectBrowser::~PolycodeProjectBrowser() {
 }
 
 void PolycodeProjectBrowser::Refresh() {
-// FIX
-/*	
-	UITree *projectTree = treeContainer->getRootNode();	
-	for(int i=0; i < projectTree->getNumTreeChildren(); i++) {
-		UITree *projectChild = projectTree->getTreeChild(i);
-		BrowserUserData *userData = (BrowserUserData*)projectChild->getUserData();
-		if(userData->parentProject == project) {
-			parseFolderIntoNode(projectChild, project->getRootFolder(), project);		
-			return;
-		}
-	}	
-*/	
+	parseFolderIntoNode(treeContainer->getRootNode(), project->getRootFolder());		
 }
 
 void PolycodeProjectBrowser::handleEvent(Event *event) {
@@ -97,7 +87,8 @@ void PolycodeProjectBrowser::handleEvent(Event *event) {
 			contextMenu->addOption("New Project", "add_new_project");
 			contextMenu->addOption("New Folder", "add_new_folder");
 			contextMenu->addDivider();
-			contextMenu->addOption("Add external files", "add_files");			
+			contextMenu->addOption("Add external files", "add_files");
+			contextMenu->addOption("Import 3D assets", "import_assets");
 			contextMenu->addDivider();
 			contextMenu->addOption("Refresh", "refresh");
 			contextMenu->addOption("Rename", "rename");						
@@ -210,7 +201,7 @@ void PolycodeProjectBrowser::applyBrowserConfig(ObjectEntry *entry) {
 	}
 }
 
-void PolycodeProjectBrowser::parseFolderIntoNode(UITree *node, String spath, PolycodeProject *parentProject) {
+void PolycodeProjectBrowser::parseFolderIntoNode(UITree *node, String spath) {
 	vector<OSFileEntry> files = OSBasics::parseFolder(spath, false);
 	
 	// check if files got deleted
@@ -230,17 +221,17 @@ void PolycodeProjectBrowser::parseFolderIntoNode(UITree *node, String spath, Pol
 				data->fileEntry = entry;
 				UITree *newChild = node->addTreeChild("folder.png", entry.name, (void*) data);
 				data->type = 2;	
-				data->parentProject = parentProject;
-				parseFolderIntoNode(newChild, entry.fullPath, parentProject);				
+				data->parentProject = project;
+				parseFolderIntoNode(newChild, entry.fullPath);				
 			} else {
-				parseFolderIntoNode(existing, entry.fullPath, parentProject);							
+				parseFolderIntoNode(existing, entry.fullPath);							
 			}
 		} else {
 			if(!nodeHasName(node, entry.name)) {
 				BrowserUserData *data = new BrowserUserData();
 				data->fileEntry = entry;
 				data->type = 1;
-				data->parentProject = parentProject;			
+				data->parentProject = project;			
 				node->addTreeChild("file.png", entry.name, (void*) data);
 			}
 		}

+ 34 - 0
IDE/Contents/Source/PolycodeToolLauncher.cpp

@@ -113,6 +113,40 @@ void PolycodeToolLauncher::buildProject(PolycodeProject *project, String destina
 
 }
 
+String PolycodeToolLauncher::importAssets(String sourceFile, String inFolder, bool addMeshes, String prefix, bool swapZY, bool generateTangents, bool listOnly) {
+
+	String ret;
+	String polycodeBasePath = CoreServices::getInstance()->getCore()->getDefaultWorkingDirectory();
+	
+	String args = "\""+sourceFile+"\"";
+	if(listOnly) {
+		args = "-l "+args;
+	}		
+	if(addMeshes) {
+		args = "-a "+args;
+	}
+	if(swapZY) {
+		args = "-s "+args;
+	}
+	if(generateTangents) {
+		args = "-t "+args;
+	}
+	if(prefix != "") {
+		args = "-p "+prefix+" "+args;
+	}
+
+	
+#ifdef _WINDOWS
+	String targetFolder = projectBasePath;
+	String command = "\""+polycodeBasePath+"/Standalone/Bin/polyimport.exe\"";
+	ret = CoreServices::getInstance()->getCore()->executeExternalCommand(command, args, targetFolder);
+#else
+	String command = polycodeBasePath+"/Standalone/Bin/polyimport";
+	ret = CoreServices::getInstance()->getCore()->executeExternalCommand(command, args, inFolder);
+#endif
+	return ret;
+}
+
 void PolycodeToolLauncher::openExternalEditor(String app, String file, String inFolder) {
 	GenericRunner *runner = new GenericRunner(app, "\""+file+"\"", inFolder);
 	CoreServices::getInstance()->getCore()->createThread(runner);

+ 126 - 1
IDE/Contents/Source/ToolWindows.cpp

@@ -21,6 +21,7 @@
  */
  
 #include "ToolWindows.h"
+#include "PolycodeToolLauncher.h"
 
 TextInputPopup::TextInputPopup() : UIWindow(L"", 300, 80) {
 	
@@ -194,4 +195,128 @@ void YesNoCancelPopup::handleEvent(Event *event) {
 
 YesNoCancelPopup::~YesNoCancelPopup() {
 	
-}
+}
+
+AssetImporterWindow::AssetImporterWindow() : UIWindow("3D Asset Importer", 500, 300) {
+	filesToImportLabel = new UILabel("Files that will be imported:", 12);
+	addChild(filesToImportLabel);
+	filesToImportLabel->setPosition(padding, 35);
+	
+	filesAnchor = new Entity();	
+		
+	filesScroller = new UIScrollContainer(filesAnchor, true, true, 270, 250);
+	addChild(filesScroller);
+	filesScroller->setPosition(padding, 60);
+		
+	cancelButton = new UIButton(L"Cancel", 100);
+	cancelButton->addEventListener(this, UIEvent::CLICK_EVENT);
+	addChild(cancelButton);
+	cancelButton->setPosition(padding+500-100-100-10-10, 285);		
+	
+	okButton = new UIButton(L"OK", 100);
+	okButton->addEventListener(this, UIEvent::CLICK_EVENT);
+	addChild(okButton);
+	okButton->setPosition(padding+500-100-10, 285);
+	
+	closeOnEscape = true;
+
+	prefixInput = new UITextInput(false, 200, 16);
+	prefixInput->setPosition(290, 60);
+	addChild(prefixInput); 
+	prefixInput->addEventListener(this, UIEvent::CHANGE_EVENT);
+		
+	usePrefixCheckbox = new UICheckBox("Custom filename prefix", false);
+	usePrefixCheckbox->setPosition(290, 90);
+	addChild(usePrefixCheckbox);
+	usePrefixCheckbox->addEventListener(this, UIEvent::CHANGE_EVENT);
+	
+	addMeshesCheckbox = new UICheckBox("Add all meshes to a single mesh", false);
+	addMeshesCheckbox->setPosition(290, 120);
+	addChild(addMeshesCheckbox); 
+	addMeshesCheckbox->addEventListener(this, UIEvent::CHANGE_EVENT);
+	
+	generateTangensCheckbox = new UICheckBox("Generate tangents", true);
+	generateTangensCheckbox->setPosition(290, 150);
+	addChild(generateTangensCheckbox); 
+	
+	swapZYAxisCheckbox = new UICheckBox("Swap Z/Y axis (e.g. for Blender)", false);
+	swapZYAxisCheckbox->setPosition(290, 180);
+	addChild(swapZYAxisCheckbox); 
+}
+
+void AssetImporterWindow::handleEvent(Event *event) {
+	if(event->getDispatcher() == okButton) {
+	
+		String prefixString;
+		if(usePrefixCheckbox->isChecked() && prefixInput->getText() != "") {
+			prefixString = prefixInput->getText().replace(" ", "_");
+		}
+		PolycodeToolLauncher::importAssets(file, folder, addMeshesCheckbox->isChecked(), prefixString, swapZYAxisCheckbox->isChecked(), generateTangensCheckbox->isChecked(), false);	
+	
+		dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
+		dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);	
+	} else if(event->getDispatcher() == cancelButton) {
+		dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
+	} else {
+		refreshPreview();
+	}
+	UIWindow::handleEvent(event);
+}
+
+void AssetImporterWindow::clearFiles() {
+	for(int i=0; i < fileLabels.size(); i++) {
+		filesAnchor->removeChild(fileLabels[i]);
+		delete fileLabels[i];
+	}
+	fileLabels.clear();
+	filesScroller->setContentSize(0,0);
+}
+
+void AssetImporterWindow::addFile(String fileName) {
+	UILabel *fileLabel = new UILabel(fileName, 12);
+	filesAnchor->addChild(fileLabel);
+	fileLabel->setPosition(0.0, 14 * fileLabels.size());
+
+	if(fileLabel->getWidth() > filesScroller->getContentSize().x) {
+		filesScroller->setContentSize(fileLabel->getWidth(), (fileLabels.size()+1) * 14);
+	} else {
+		filesScroller->setContentSize(filesScroller->getContentSize().x, (fileLabels.size()+1) * 14);	
+	}	
+	filesScroller->setScrollValue(0, 0);
+	
+	fileLabels.push_back(fileLabel);
+}
+
+void AssetImporterWindow::setSourceFileAndTargetFolder(String file, String folder) {
+	this->file = file;
+	this->folder = folder;
+	refreshPreview();
+}
+
+void AssetImporterWindow::refreshPreview() {
+	String prefixString;
+	if(usePrefixCheckbox->isChecked() && prefixInput->getText() != "") {
+		prefixString = prefixInput->getText().replace(" ", "_");
+	}
+	String fileList = PolycodeToolLauncher::importAssets(file, folder, addMeshesCheckbox->isChecked(), prefixString, swapZYAxisCheckbox->isChecked(), generateTangensCheckbox->isChecked(), true);
+	setFilesToImport(fileList);		
+}
+
+void AssetImporterWindow::setFilesToImport(String files) {	
+	clearFiles();
+	
+	if(files == "") {
+		addFile("NO");
+		addFile("IMPORTABLE");
+		addFile("ASSETS");
+	}else {
+		std::vector<String> splitFiles = files.split("\n");
+		for(int i=0; i < splitFiles.size(); i++) {
+			addFile(splitFiles[i]);
+		}
+	}
+}
+
+AssetImporterWindow::~AssetImporterWindow() {
+
+}

+ 1 - 0
Modules/Contents/UI/Include/PolyUIHScrollBar.h

@@ -35,6 +35,7 @@ namespace Polycode {
 		void Update();
 		Number getScrollValue();
 		void handleEvent(Event *event);
+		void Resize(int newWidth);
 		
 		void scrollTo(Number scrollValue);
 		void Scroll(Number amount);

+ 7 - 0
Modules/Contents/UI/Source/PolyUIHScrollBar.cpp

@@ -87,6 +87,13 @@ UIHScrollBar::UIHScrollBar(Number width, Number height, Number initialRatio) : U
 	setWidth(width);	
 }
 
+void UIHScrollBar::Resize(int newWidth) {
+	bgBox->resizeBox(newWidth, getHeight());
+	setWidth(newWidth);
+	dragRectWidth = getWidth()-(padding*2)-scrollHandleWidth;	
+	handleBox->setDragLimits(Rectangle(padding,padding,dragRectWidth, getHeight()-(padding*2)-(getHeight()-(padding*2))));
+}
+
 void UIHScrollBar::Update() {
 	if(lastPositionX != handleBox->getPosition().x) {
 		lastPositionX = handleBox->getPosition().x;

+ 3 - 1
Modules/Contents/UI/Source/PolyUIScrollContainer.cpp

@@ -82,10 +82,12 @@ void UIScrollContainer::Resize(Number width, Number height) {
 	setWidth(width);
 	setHeight(height);
 	
-	
+	hScrollBar->Resize(width);	
 	vScrollBar->Resize(height);
+
 	setContentSize(contentWidth, contentHeight);
 	vScrollBar->setPosition(width-vScrollBar->getWidth(), 0);
+	hScrollBar->setPosition(0, height-hScrollBar->getHeight());
 	
 	matrixDirty = true;
 	

+ 12 - 5
Tools/Contents/polyimport/Source/polyimport.cpp

@@ -34,7 +34,9 @@ void addToMesh(String prefix, Polycode::Mesh *tmesh, const struct aiScene *sc, c
 	
 		const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]];
 		if(listOnly) {
-			printf("%s%s.mesh\n", prefix.c_str(), nd->mName.data);
+			if(!addSubmeshes) {
+				printf("%s%s.mesh\n", prefix.c_str(), nd->mName.data);
+			}
 		} else {
 			printf("Importing mesh:%s (%d vertices) (%d faces) \n", mesh->mName.data, mesh->mNumVertices, mesh->mNumFaces);
 		}
@@ -141,16 +143,21 @@ int exportToFile(String prefix, bool swapZY, bool addSubmeshes, bool listOnly) {
 	Polycode::Mesh *mesh = new Polycode::Mesh(Mesh::TRI_MESH);
 	addToMesh(prefix, mesh, scene, scene->mRootNode, swapZY, addSubmeshes, listOnly);
 	
-	if(!listOnly && addSubmeshes) {		
+	if(addSubmeshes) {		
 		String fileNameMesh;
 		if(prefix != "") {
 			fileNameMesh = prefix+".mesh";			
 		} else {
 			fileNameMesh = "out.mesh";
 		}		
-		OSFILE *outFile = OSBasics::open(fileNameMesh.c_str(), "wb");	
-		mesh->saveToFile(outFile);
-		OSBasics::close(outFile);
+
+		if(listOnly) {
+			printf("%s\n", fileNameMesh.c_str());
+		} else {
+			OSFILE *outFile = OSBasics::open(fileNameMesh.c_str(), "wb");	
+			mesh->saveToFile(outFile);
+			OSBasics::close(outFile);
+		}
 	}
 		
 	if(hasWeights) {