Bläddra i källkod

Fixed resource paths not setting correctly for textures, added texture resource reload, made images in IDE editors reload on change.

Ivan Safrin 12 år sedan
förälder
incheckning
aca1fa37a4

+ 3 - 5
Core/Contents/Include/PolyTexture.h

@@ -37,6 +37,8 @@ namespace Polycode {
 			Number scrollSpeedX;
 			Number scrollSpeedY;
 			
+			void reloadResource();			
+			
 			virtual void setTextureData(char *data) = 0;
 
 			virtual void recreateFromImageData() = 0;
@@ -46,10 +48,7 @@ namespace Polycode {
 			
 			void setImageData(Image *data);
 		
-			void updateScroll(int elapsed);
-			void setResourcePath(const String& newPath);
-			const String& getResourcePath() const;
-		
+			void updateScroll(int elapsed);		
 			char *getTextureData() const { return textureData;}
 			
 			int getWidth() const;
@@ -66,7 +65,6 @@ namespace Polycode {
 			bool createMipmaps;
 			int width;
 			int height;
-			String resourcePath;
 			Number scrollOffsetX;
 			Number scrollOffsetY;
 	};

+ 9 - 1
Core/Contents/Source/OSBasics.cpp

@@ -357,11 +357,19 @@ vector<OSFileEntry> OSBasics::parseFolder(const String& pathString, bool showHid
 }
 
 time_t OSBasics::getFileTime(const Polycode::String& pathString) {
+
+	String realString;
+	if(PHYSFS_exists(pathString.c_str())) {
+		realString = String(PHYSFS_getRealDir(pathString.c_str())) + "/" + pathString;
+	} else {
+		realString = pathString;
+	}
+
 #ifdef _WINDOWS
 
 #else
 	struct stat statbuf;
-	int retVal = stat(pathString.c_str(), &statbuf);
+	int retVal = stat(realString.c_str(), &statbuf);
 	if (retVal == 0) {
 		return statbuf.st_mtime;
 	} else {

+ 2 - 4
Core/Contents/Source/PolyMaterialManager.cpp

@@ -110,6 +110,8 @@ Texture *MaterialManager::createTextureFromFile(const String& fileName, bool cla
 			image->premultiplyAlpha();
 		}
 		newTexture = createTexture(image->getWidth(), image->getHeight(), image->getPixels(), clamp, createMipmaps);
+		newTexture->setResourcePath(fileName);
+		CoreServices::getInstance()->getResourceManager()->addResource(newTexture);		
 	} else {
 		Logger::log("Error loading image, using default texture.\n");
 		delete image;		
@@ -118,10 +120,6 @@ Texture *MaterialManager::createTextureFromFile(const String& fileName, bool cla
 	}
 		
 	delete image;
-
-//	vector<String> bits = fileName.split("/");
-	
-	newTexture->setResourcePath(fileName);
 	return newTexture;
 }
 

+ 4 - 1
Core/Contents/Source/PolyResourceManager.cpp

@@ -172,9 +172,11 @@ void ResourceManager::parseTextures(const String& dirPath, bool recursive, const
 				Texture *t = materialManager->createTextureFromFile(resourceDir[i].fullPath, materialManager->clampDefault, materialManager->mipmapsDefault);
 				if(t) {
 					if(basePath == "") {
-						t->setResourceName(resourceDir[i].name);					
+						t->setResourceName(resourceDir[i].name);
+						t->setResourcePath(resourceDir[i].fullPath);
 					} else {
 						t->setResourceName(basePath+"/"+resourceDir[i].name);
+						t->setResourcePath(resourceDir[i].fullPath);						
 					}
 					addResource(t);
 				}
@@ -252,6 +254,7 @@ void ResourceManager::checkForChangedFiles() {
 	for(int i=0; i < resources.size(); i++) {
 		if(resources[i]->reloadOnFileModify == true) {
 			time_t newFileTime = OSBasics::getFileTime(resources[i]->getResourcePath());
+//			printf("%s\n%lld %lld\n", resources[i]->getResourcePath().c_str(), newFileTime, resources[i]->resourceFileTime);
 			if(newFileTime != resources[i]->resourceFileTime) {
 				resources[i]->reloadResource();
 				resources[i]->resourceFileTime = newFileTime;

+ 7 - 9
Core/Contents/Source/PolyTexture.cpp

@@ -55,7 +55,13 @@ Texture::Texture(unsigned int width, unsigned int height, char *textureData,bool
 	scrollSpeedY = 0;
 	scrollOffsetX = 0;
 	scrollOffsetY = 0;
-	resourcePath = "";
+}
+
+void Texture::reloadResource() {
+	Image *image = new Image(getResourcePath());
+	setImageData(image);
+	recreateFromImageData();
+	delete image;
 }
 
 int Texture::getWidth() const {
@@ -105,14 +111,6 @@ Texture::Texture(Image *image) : Resource(Resource::RESOURCE_TEXTURE) {
 
 }
 
-void Texture::setResourcePath(const String& newPath) {
-	resourcePath = newPath;
-}
-
-const String& Texture::getResourcePath() const {
-	return resourcePath;
-}
-
 void Texture::updateScroll(int elapsed) {
 	Number ef = ((Number)(elapsed))/1000.0f;
 	scrollOffsetX += scrollSpeedX*ef;

+ 3 - 6
IDE/Contents/Source/PolycodeImageEditor.cpp

@@ -69,17 +69,14 @@ bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 		
 	editorImage = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
 	
-	Image *image = new Image(filePath.fullPath);
-	
-	Texture *newTexture = CoreServices::getInstance()->getMaterialManager()->createTextureFromImage(image);
-	
+	Texture *newTexture = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(filePath.fullPath);
+	newTexture->reloadOnFileModify = true;
 	editorImage->setTexture(newTexture);
 	
 	editorImage->strokeEnabled = true;
 	editorImage->setStrokeColor(1.0, 1.0, 1.0, 0.2);
 	
-	aspectRatio = ((Number)image->getWidth()) / ((Number)image->getHeight());
-	delete image;
+	aspectRatio = ((Number)newTexture->getWidth()) / ((Number)newTexture->getHeight());
 	
 	addChild(editorImage);
 	

+ 1 - 0
IDE/Contents/Source/PolycodeProps.cpp

@@ -1747,6 +1747,7 @@ void ScreenImageSheet::handleEvent(Event *event) {
 		Texture *selectedTexture = texture->previewShape->getTexture();
 		
 		image->setTexture(selectedTexture);
+		selectedTexture->reloadOnFileModify = true;
 		image->setShapeSize(selectedTexture->getWidth(), selectedTexture->getHeight());
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);
 	}

+ 9 - 1
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -1196,6 +1196,7 @@ void PolycodeScreenEditorMain::handleMouseDown(Vector2 position) {
 				placingImage->addEventListener(this, InputEvent::EVENT_MOUSEUP);
 				placingImage->id = "ScreenImage."+String::IntToString(placementCount);
 				placingImage->blockMouseInput = true;
+				placingImage->getTexture()->reloadOnFileModify = true;
 				currentLayer->addChild(placingImage);
 				placementCount++;
 					
@@ -1288,6 +1289,7 @@ void PolycodeScreenEditorMain::handleMouseDown(Vector2 position) {
 				currentLayer->addChild(placingSprite);
 				placingSprite->id = "ScreenSprite."+String::IntToString(placementCount);
 				placingSprite->blockMouseInput = true;
+				placingSprite->getTexture()->reloadOnFileModify = true;
 				
 				if(previewSprite->getCurrentAnimation()) {
 						placingSprite->playAnimation(previewSprite->getCurrentAnimation()->name, 0, false);
@@ -2452,7 +2454,6 @@ void PolycodeScreenEditorMain::applyEditorProperties(ScreenEntity *entity) {
 	} else if(dynamic_cast<ScreenShape*>(entity)) {
 	
 	} else if(dynamic_cast<ScreenImage*>(entity)) {
-
 	} else if(dynamic_cast<ScreenLabel*>(entity)) {
 
 	} else if(dynamic_cast<ScreenSound*>(entity)) {
@@ -2467,6 +2468,13 @@ void PolycodeScreenEditorMain::applyEditorProperties(ScreenEntity *entity) {
 		}
 	}
 	
+	if(dynamic_cast<ScreenMesh*>(entity)) {	
+		Texture *texture = ((ScreenMesh*)entity)->getTexture();
+		if(texture) {
+			texture->reloadOnFileModify = true;
+		}
+	}
+	
 	entity->processInputEvents = true;
 	entity->blockMouseInput = true;
 	entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);	

+ 3 - 1
IDE/Contents/Source/PolycodeSpriteEditor.cpp

@@ -198,6 +198,7 @@ void PolycodeSpriteEditor::handleEvent(Event *event) {
 	if(event->getDispatcher() == textureProp) {
 		previewSprite->setTexture(textureProp->get());
 		previewSprite->recalculateSpriteDimensions();
+		previewSprite->getTexture()->reloadOnFileModify = true;
 	}
 
 	if(event->getDispatcher() == widthProp) {
@@ -268,7 +269,8 @@ bool PolycodeSpriteEditor::openFile(OSFileEntry filePath) {
 	addChild(previewSprite);
 	previewSprite->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	previewSprite->setPosition(400, 80);				
-	zoomBox->setSelectedIndex(0);		
+	zoomBox->setSelectedIndex(0);
+	previewSprite->getTexture()->reloadOnFileModify = true;	
 	
 	for(int i=0;i < previewSprite->getNumAnimations(); i++) {
 		SpriteAnimation *animation = previewSprite->getAnimationAtIndex(i);