Просмотр исходного кода

Drastic speed improvements in loading skeletal animation data, fixed pausing in Tweens, added normal generation support to polyimport and import dialog in the IDE, fixed bug in IDE where the asset browser tree wouldn't scroll up on reset

Ivan Safrin 11 лет назад
Родитель
Сommit
7e5c38fdc5

+ 1 - 2
Core/Contents/Include/PolyBezierCurve.h

@@ -187,8 +187,7 @@ namespace Polycode {
 		
 		
 		protected:
 		protected:
 		
 		
-			bool buffersDirty;
-		
+            bool distancesDirty;
 
 
 	
 	
 			
 			

+ 16 - 15
Core/Contents/Source/PolyBezierCurve.cpp

@@ -43,7 +43,7 @@ BezierCurve::BezierCurve(){
 		heightBuffer[i] = 0;
 		heightBuffer[i] = 0;
 	}
 	}
 	
 	
-	buffersDirty = false;	
+    distancesDirty =  false;
 }
 }
 
 
 void BezierCurve::clearControlPoints() {
 void BezierCurve::clearControlPoints() {
@@ -52,7 +52,7 @@ void BezierCurve::clearControlPoints() {
 		heightBuffer[i] = 0;
 		heightBuffer[i] = 0;
 	}
 	}
 	
 	
-	buffersDirty = true;
+    distancesDirty =  true;
 	for(int i=0; i < controlPoints.size(); i++) {
 	for(int i=0; i < controlPoints.size(); i++) {
 		delete controlPoints[i];
 		delete controlPoints[i];
 	}
 	}
@@ -80,8 +80,7 @@ void BezierCurve::addControlPoint(Number p1x, Number p1y, Number p1z, Number p2x
 	}
 	}
 	
 	
 	distances.push_back(0);
 	distances.push_back(0);
-	recalculateDistances();
-	buffersDirty = true;	
+    distancesDirty =  true;
 }
 }
 
 
 void BezierCurve::addControlPoint3dWithHandles(Number p1x, Number p1y, Number p1z, Number p2x, Number p2y, Number p2z, Number p3x, Number p3y, Number p3z) {
 void BezierCurve::addControlPoint3dWithHandles(Number p1x, Number p1y, Number p1z, Number p2x, Number p2y, Number p2z, Number p3x, Number p3y, Number p3z) {
@@ -104,6 +103,7 @@ void BezierCurve::addControlPoint2d(Number x, Number y) {
 void BezierCurve::recalculateDistances() {
 void BezierCurve::recalculateDistances() {
 	if(controlPoints.size() < 2)
 	if(controlPoints.size() < 2)
 		return;
 		return;
+    distancesDirty = false;
 		
 		
 	Number dist, lastDist = 0;
 	Number dist, lastDist = 0;
 	distances[0] = 0;
 	distances[0] = 0;
@@ -127,6 +127,8 @@ void BezierCurve::recalculateDistances() {
 	for(int i=0; i < controlPoints.size(); i++) {
 	for(int i=0; i < controlPoints.size(); i++) {
 		distances[i] = distances[i]/totalDistance;
 		distances[i] = distances[i]/totalDistance;
 	}
 	}
+    
+    rebuildBuffers();
 }
 }
 
 
 Vector3 BezierCurve::getPointBetween(Number a, BezierPoint *bp1, BezierPoint *bp2) {
 Vector3 BezierCurve::getPointBetween(Number a, BezierPoint *bp1, BezierPoint *bp2) {
@@ -156,23 +158,18 @@ void BezierCurve::removePoint(BezierPoint *point) {
 			break;
 			break;
 		}
 		}
 	}
 	}
-	recalculateDistances();
-	buffersDirty = true;	
-
+    distancesDirty =  true;
 }
 }
 
 
 Number BezierCurve::getHeightAt(Number a) {
 Number BezierCurve::getHeightAt(Number a) {
-	if( a< 0) a = 0;
-	if(a > 1) a = 1;
-	
-	if (buffersDirty) 
-		rebuildBuffers();
+	if (distancesDirty)  {
+        recalculateDistances();
+    }
 	
 	
-	int unsigned index = ((Number)(BUFFER_CACHE_PRECISION)) * a;	
+	int unsigned index = ((Number)(BUFFER_CACHE_PRECISION)) * a;
 	
 	
 	if(index > BUFFER_CACHE_PRECISION-1)
 	if(index > BUFFER_CACHE_PRECISION-1)
 		index = BUFFER_CACHE_PRECISION-1;
 		index = BUFFER_CACHE_PRECISION-1;
-	
 	return heightBuffer[index];
 	return heightBuffer[index];
 	
 	
 //	return getPointAt(a).y;
 //	return getPointAt(a).y;
@@ -182,10 +179,14 @@ void BezierCurve::rebuildBuffers() {
 	for(int i=0; i < BUFFER_CACHE_PRECISION; i++) {
 	for(int i=0; i < BUFFER_CACHE_PRECISION; i++) {
 		heightBuffer[i]	= getPointAt(((Number)i)/((Number)BUFFER_CACHE_PRECISION)).y;
 		heightBuffer[i]	= getPointAt(((Number)i)/((Number)BUFFER_CACHE_PRECISION)).y;
 	}
 	}
-	buffersDirty = false;
 }
 }
 
 
 Vector3 BezierCurve::getPointAt(Number a) {
 Vector3 BezierCurve::getPointAt(Number a) {
+    
+	if (distancesDirty)  {
+        recalculateDistances();
+    }
+    
 	if(controlPoints.size() == 0) {
 	if(controlPoints.size() == 0) {
 		return Vector3();
 		return Vector3();
 	}
 	}

+ 5 - 1
Core/Contents/Source/PolyTween.cpp

@@ -53,7 +53,7 @@ Tween::	Tween(Number *target, int easeType, Number startVal, Number endVal, Numb
 }
 }
 
 
 void Tween::Pause(bool pauseVal) {
 void Tween::Pause(bool pauseVal) {
-	paused = true;
+	paused = pauseVal;
 }
 }
 
 
 void Tween::setSpeed(Number speed) {
 void Tween::setSpeed(Number speed) {
@@ -76,6 +76,10 @@ void Tween::doOnComplete() {
 
 
 void Tween::updateTween(Number elapsed) {
 void Tween::updateTween(Number elapsed) {
 
 
+    if(paused) {
+        return;
+    }
+    
 	tweenTime += elapsed;
 	tweenTime += elapsed;
 	
 	
 	if(tweenTime >= endTime+waitTime) {
 	if(tweenTime >= endTime+waitTime) {

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

@@ -53,7 +53,7 @@ class PolycodeToolLauncher {
 		static void openExternalEditor(String app, String file, String inFolder);
 		static void openExternalEditor(String app, String file, String inFolder);
 		static String generateTempPath(PolycodeProject *project);
 		static String generateTempPath(PolycodeProject *project);
 		static void buildProject(PolycodeProject *project, String destinationPath, bool compileScripts);
 		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,bool writeNormals, bool writeTangents, bool writeColors, bool writeBoneWeights, bool writeUVs, bool writeSecondaryUVs);
+		static String importAssets(String sourceFile, String inFolder, bool addMeshes, String prefix, bool swapZY, bool generateNormals, bool generateTangents, bool listOnly,bool writeNormals, bool writeTangents, bool writeColors, bool writeBoneWeights, bool writeUVs, bool writeSecondaryUVs);
 
 
 		static void runPolyapp(String polyappPath);
 		static void runPolyapp(String polyappPath);
 };
 };

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

@@ -111,6 +111,7 @@ class AssetImporterWindow : public UIWindow {
 		UITextInput *prefixInput;
 		UITextInput *prefixInput;
 		UICheckBox *addMeshesCheckbox;
 		UICheckBox *addMeshesCheckbox;
 		UICheckBox *generateTangensCheckbox;
 		UICheckBox *generateTangensCheckbox;
+		UICheckBox *generateNormalsCheckbox;
 		UICheckBox *swapZYAxisCheckbox;
 		UICheckBox *swapZYAxisCheckbox;
 
 
         UICheckBox *exportNormals;
         UICheckBox *exportNormals;

+ 4 - 1
IDE/Contents/Source/PolycodeToolLauncher.cpp

@@ -113,7 +113,7 @@ void PolycodeToolLauncher::buildProject(PolycodeProject *project, String destina
 
 
 }
 }
 
 
-String PolycodeToolLauncher::importAssets(String sourceFile, String inFolder, bool addMeshes, String prefix, bool swapZY, bool generateTangents, bool listOnly, bool writeNormals, bool writeTangents, bool writeColors, bool writeBoneWeights, bool writeUVs, bool writeSecondaryUVs) {
+String PolycodeToolLauncher::importAssets(String sourceFile, String inFolder, bool addMeshes, String prefix, bool swapZY, bool generateNormals, bool generateTangents, bool listOnly, bool writeNormals, bool writeTangents, bool writeColors, bool writeBoneWeights, bool writeUVs, bool writeSecondaryUVs) {
 
 
 	String ret;
 	String ret;
 	String polycodeBasePath = CoreServices::getInstance()->getCore()->getDefaultWorkingDirectory();
 	String polycodeBasePath = CoreServices::getInstance()->getCore()->getDefaultWorkingDirectory();
@@ -128,6 +128,9 @@ String PolycodeToolLauncher::importAssets(String sourceFile, String inFolder, bo
 	if(swapZY) {
 	if(swapZY) {
 		args = "-s "+args;
 		args = "-s "+args;
 	}
 	}
+	if(generateNormals) {
+		args = "-m "+args;
+	}
 	if(generateTangents) {
 	if(generateTangents) {
 		args = "-t "+args;
 		args = "-t "+args;
 	}
 	}

+ 4 - 1
IDE/Contents/Source/TextureBrowser.cpp

@@ -313,6 +313,7 @@ void AssetBrowser::setProject(PolycodeProject *project) {
 	}	
 	}	
 	
 	
 	currentProject = project;
 	currentProject = project;
+    templateContainer->getScrollContainer()->setScrollValue(0.0, 0.0);    
 }
 }
 
 
 AssetBrowser::~AssetBrowser() {
 AssetBrowser::~AssetBrowser() {
@@ -363,7 +364,9 @@ void AssetBrowser::handleEvent(Event *event) {
             
             
             if(browseMode == BROWSE_MODE_FILES) {
             if(browseMode == BROWSE_MODE_FILES) {
                 FolderUserData *data = (FolderUserData *)treeEvent->selection->getUserData();
                 FolderUserData *data = (FolderUserData *)treeEvent->selection->getUserData();
-                assetList->showFolder(data->folderPath);
+                if(data) {
+                    assetList->showFolder(data->folderPath);
+                }
             } else {
             } else {
                 ResourcePool *pool = (ResourcePool*) treeEvent->selection->getUserData();
                 ResourcePool *pool = (ResourcePool*) treeEvent->selection->getUserData();
                 if(pool) {
                 if(pool) {

+ 10 - 6
IDE/Contents/Source/ToolWindows.cpp

@@ -235,12 +235,16 @@ AssetImporterWindow::AssetImporterWindow() : UIWindow("3D Asset Importer", 650,
 	addChild(addMeshesCheckbox); 
 	addChild(addMeshesCheckbox); 
 	addMeshesCheckbox->addEventListener(this, UIEvent::CHANGE_EVENT);
 	addMeshesCheckbox->addEventListener(this, UIEvent::CHANGE_EVENT);
 	
 	
+	generateNormalsCheckbox = new UICheckBox("Generate normals", false);
+	generateNormalsCheckbox->setPosition(290, 120);
+	addChild(generateNormalsCheckbox);
+    
 	generateTangensCheckbox = new UICheckBox("Generate tangents", true);
 	generateTangensCheckbox = new UICheckBox("Generate tangents", true);
-	generateTangensCheckbox->setPosition(290, 120);
-	addChild(generateTangensCheckbox); 
-	
+	generateTangensCheckbox->setPosition(290, 150);
+	addChild(generateTangensCheckbox);
+
 	swapZYAxisCheckbox = new UICheckBox("Swap Z/Y axis (e.g. for Blender)", false);
 	swapZYAxisCheckbox = new UICheckBox("Swap Z/Y axis (e.g. for Blender)", false);
-	swapZYAxisCheckbox->setPosition(290, 150);
+	swapZYAxisCheckbox->setPosition(290, 180);
 	addChild(swapZYAxisCheckbox);
 	addChild(swapZYAxisCheckbox);
     
     
     exportNormals = new UICheckBox("Vertex normals", true);
     exportNormals = new UICheckBox("Vertex normals", true);
@@ -279,7 +283,7 @@ void AssetImporterWindow::handleEvent(Event *event) {
 		if(usePrefixCheckbox->isChecked() && prefixInput->getText() != "") {
 		if(usePrefixCheckbox->isChecked() && prefixInput->getText() != "") {
 			prefixString = prefixInput->getText().replace(" ", "_");
 			prefixString = prefixInput->getText().replace(" ", "_");
 		}
 		}
-		PolycodeToolLauncher::importAssets(file, folder, addMeshesCheckbox->isChecked(), prefixString, swapZYAxisCheckbox->isChecked(), generateTangensCheckbox->isChecked(), false, exportNormals->isChecked(), exportTangents->isChecked(), exportColors->isChecked(), exportBoneWeights->isChecked(), exportUVs->isChecked(), exportSecondaryUVs->isChecked());
+		PolycodeToolLauncher::importAssets(file, folder, addMeshesCheckbox->isChecked(), prefixString, swapZYAxisCheckbox->isChecked(), generateNormalsCheckbox->isChecked(), generateTangensCheckbox->isChecked(), false, exportNormals->isChecked(), exportTangents->isChecked(), exportColors->isChecked(), exportBoneWeights->isChecked(), exportUVs->isChecked(), exportSecondaryUVs->isChecked());
 	
 	
 		dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
 		dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
 		dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);	
 		dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);	
@@ -325,7 +329,7 @@ void AssetImporterWindow::refreshPreview() {
 	if(usePrefixCheckbox->isChecked() && prefixInput->getText() != "") {
 	if(usePrefixCheckbox->isChecked() && prefixInput->getText() != "") {
 		prefixString = prefixInput->getText().replace(" ", "_");
 		prefixString = prefixInput->getText().replace(" ", "_");
 	}
 	}
-	String fileList = PolycodeToolLauncher::importAssets(file, folder, addMeshesCheckbox->isChecked(), prefixString, swapZYAxisCheckbox->isChecked(), generateTangensCheckbox->isChecked(), true, false, false, false, false, false, false);
+	String fileList = PolycodeToolLauncher::importAssets(file, folder, addMeshesCheckbox->isChecked(), prefixString, swapZYAxisCheckbox->isChecked(), generateNormalsCheckbox->isChecked(), generateTangensCheckbox->isChecked(), true, false, false, false, false, false, false);
 	setFilesToImport(fileList);		
 	setFilesToImport(fileList);		
 }
 }
 
 

+ 2 - 0
Modules/Contents/UI/Include/PolyUITreeContainer.h

@@ -51,6 +51,8 @@ namespace Polycode {
 		 */
 		 */
 		void scrollToNode(UITree *node, bool showAtTop);
 		void scrollToNode(UITree *node, bool showAtTop);
 		
 		
+        UIScrollContainer *getScrollContainer();
+        
 	protected:
 	protected:
 		bool keyNavigable;
 		bool keyNavigable;
 		
 		

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

@@ -133,6 +133,7 @@ void UIScrollContainer::setContentSize(Number newContentWidth, Number newContent
 		if((getHeight() / newContentHeight) >= 1) {
 		if((getHeight() / newContentHeight) >= 1) {
 			vScrollBar->enabled = false;
 			vScrollBar->enabled = false;
 			vScrollBar->scrollTo(0);
 			vScrollBar->scrollTo(0);
+            scrollChild->setPositionY(0.0);
 		} else {
 		} else {
 			vScrollBar->enabled = true;		
 			vScrollBar->enabled = true;		
 		}
 		}
@@ -141,7 +142,8 @@ void UIScrollContainer::setContentSize(Number newContentWidth, Number newContent
 	if(hasHScroll) {
 	if(hasHScroll) {
 		if((getWidth() / newContentWidth) >= 1) {
 		if((getWidth() / newContentWidth) >= 1) {
 			hScrollBar->enabled = false;
 			hScrollBar->enabled = false;
-			hScrollBar->scrollTo(0);			
+			hScrollBar->scrollTo(0);
+            scrollChild->setPositionX(0.0);
 		} else {
 		} else {
 			hScrollBar->enabled = true;		
 			hScrollBar->enabled = true;		
 		}
 		}

+ 1 - 0
Modules/Contents/UI/Source/PolyUITree.cpp

@@ -319,6 +319,7 @@ void UITree::clearTree() {
 		delete child;
 		delete child;
 	}
 	}
 	treeChildren.clear();
 	treeChildren.clear();
+    dispatchEvent(new UITreeEvent(), UITreeEvent::NEED_REFRESH_EVENT);
 }
 }
 
 
 void UITree::Update() {
 void UITree::Update() {

+ 4 - 0
Modules/Contents/UI/Source/PolyUITreeContainer.cpp

@@ -86,6 +86,10 @@ void UITreeContainer::Resize(Number width, Number height) {
 	setHeight(height);
 	setHeight(height);
 }
 }
 
 
+UIScrollContainer *UITreeContainer::getScrollContainer() {
+    return mainContainer;
+}
+
 void UITreeContainer::handleEvent(Event *event) {
 void UITreeContainer::handleEvent(Event *event) {
 
 
 	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
 	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {

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

@@ -448,7 +448,7 @@ int main(int argc, char **argv) {
 	}
 	}
 	
 	
 	if(showHelp || argc < 2) {
 	if(showHelp || argc < 2) {
-		printf("usage: polyimport [-adhlstngcwuv] [-p output_prefix] source_file\n\n");
+		printf("usage: polyimport [-adhlstngcwuvme] [-p output_prefix] source_file\n\n");
 		printf("Misc options:\n");
 		printf("Misc options:\n");
 		printf("d: Show Assimp debug info.\n");
 		printf("d: Show Assimp debug info.\n");
 		printf("h: Show this help.\n");
 		printf("h: Show this help.\n");
@@ -490,14 +490,14 @@ int main(int argc, char **argv) {
     
     
     if(scene) {
     if(scene) {
 
 
-        if(generateNormals && !listOnly) {
-            aiApplyPostProcessing(scene, aiProcess_GenSmoothNormals);
-        }
-        
         if(generateTangents && !listOnly) {
         if(generateTangents && !listOnly) {
             aiApplyPostProcessing(scene, aiProcess_CalcTangentSpace);
             aiApplyPostProcessing(scene, aiProcess_CalcTangentSpace);
         }
         }
         
         
+        if(generateNormals && !listOnly) {
+            aiApplyPostProcessing(scene, aiProcess_GenSmoothNormals);
+        }
+        
 		exportToFile(prefix, swapZYAxis, addSubmeshes, listOnly, exportEntity);
 		exportToFile(prefix, swapZYAxis, addSubmeshes, listOnly, exportEntity);
 	} else {
 	} else {
 		printf("Error opening scene (%s)\n", aiGetErrorString());
 		printf("Error opening scene (%s)\n", aiGetErrorString());