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

Adding sprite in scene editor, sprite sheet prop, added ability to set sprite size explicitly

Ivan Safrin 12 лет назад
Родитель
Сommit
892aa11319

+ 6 - 2
Core/Contents/Include/PolySceneSprite.h

@@ -111,7 +111,10 @@ class _PolyExport SceneSprite : public ScenePrimitive
 		String getFileName() const;
 	
 		void recalculateSpriteDimensions();
-	
+    
+        void setActualSpriteSize(Number width, Number height);
+        Vector2 getActualSpriteSize();
+    
 		bool loadFromFile(const String& fileName);
 		
 		void reloadSprite();
@@ -138,7 +141,8 @@ class _PolyExport SceneSprite : public ScenePrimitive
 	protected:
 	
 		String fileName;
-		
+        Vector2 actualSpriteSize;
+    
 		bool paused;
 	
 		Number spriteWidth;

+ 25 - 7
Core/Contents/Source/PolySceneSprite.cpp

@@ -101,7 +101,8 @@ bool SceneSprite::loadFromFile(const String& fileName) {
 		}
 
 		if(frameWidth && frameHeight) {
-			
+			actualSpriteSize.x = frameWidth->NumberVal;
+			actualSpriteSize.y = frameHeight->NumberVal;
 			setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, frameWidth->NumberVal, frameHeight->NumberVal);
 			setSpriteSize(frameWidth->NumberVal, frameHeight->NumberVal);
 		}
@@ -174,6 +175,9 @@ SceneSprite::SceneSprite(const String& fileName, Number spriteWidth, Number spri
 	currentFrame = 0;
 	currentAnimation = NULL;	
 	paused = false;
+    actualSpriteSize.x = spriteWidth;
+    actualSpriteSize.y = spriteHeight;
+    
 	setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, spriteWidth, spriteHeight);	
 }
 
@@ -190,6 +194,16 @@ void SceneSprite::removeAnimation(SpriteAnimation *animation) {
 	}
 }
 
+void SceneSprite::setActualSpriteSize(Number width, Number height) {
+    actualSpriteSize.x = width;
+    actualSpriteSize.y = height;
+	setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, actualSpriteSize.x, actualSpriteSize.y);
+}
+
+Vector2 SceneSprite::getActualSpriteSize() {
+    return actualSpriteSize;
+}
+
 void SceneSprite::recalculateSpriteDimensions() {
 	if(!texture)
 		return;
@@ -385,14 +399,18 @@ void SceneSprite::Update() {
 void SceneSprite::updateSprite() {
 	Number xOffset = currentAnimation->framesOffsets[currentFrame].x;
 	Number yOffset = 1.0f - currentAnimation->framesOffsets[currentFrame].y - spriteUVHeight;
-	
-	Polygon *imagePolygon = mesh->getPolygon(0);
-		
-	imagePolygon->getVertex(0)->setTexCoord(xOffset, yOffset);	
+
+    Polygon *imagePolygon;
+	imagePolygon = mesh->getPolygon(0);
+	imagePolygon->getVertex(0)->setTexCoord(xOffset, yOffset);
 	imagePolygon->getVertex(1)->setTexCoord(xOffset+spriteUVWidth, yOffset);
 	imagePolygon->getVertex(2)->setTexCoord(xOffset+spriteUVWidth, yOffset+spriteUVHeight);
-	imagePolygon->getVertex(3)->setTexCoord(xOffset, yOffset+spriteUVHeight);	
-		
+	
+    imagePolygon = mesh->getPolygon(1);
+	imagePolygon->getVertex(0)->setTexCoord(xOffset, yOffset);	;
+	imagePolygon->getVertex(1)->setTexCoord(xOffset+spriteUVWidth, yOffset+spriteUVHeight);
+	imagePolygon->getVertex(2)->setTexCoord(xOffset, yOffset+spriteUVHeight);
+    
 	mesh->arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
 
 }

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

@@ -55,6 +55,7 @@ class EntityEditorPropertyView : public UIElement {
         SceneLightSheet *lightSheet;
         ParticleEmitterSheet *particleSheet;
         SceneLabelSheet *labelSheet;
+        SceneSpriteSheet *spriteSheet;
     
         ShaderTexturesSheet *shaderTexturesSheet;
         ShaderOptionsSheet *shaderOptionsSheet;

+ 4 - 3
IDE/Contents/Include/PolycodeProps.h

@@ -714,12 +714,13 @@ class SceneSpriteSheet : public PropSheet {
 		~SceneSpriteSheet();
 		
 		void handleEvent(Event *event);
-		void Update();
+        void setSprite(SceneSprite *sprite);
 				
 		SceneSprite *sprite;	
 		SceneSpriteProp *spriteProp;
-		ComboProp *defaultAnimationProp;		
-		SceneSprite *lastSprite;
+        ComboProp *defaultAnimationProp;
+        NumberProp *spriteWidthProp;
+        NumberProp *spriteHeightProp;
 };
 
 

+ 10 - 3
IDE/Contents/Source/EntityEditorPropertyView.cpp

@@ -59,6 +59,9 @@ EntityEditorPropertyView::EntityEditorPropertyView() : UIElement() {
     entityProps->addPropSheet(particleSheet);
     particleSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     
+    spriteSheet = new SceneSpriteSheet();
+    entityProps->addPropSheet(spriteSheet);
+    spriteSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     
     primitiveSheet = new ScenePrimitiveSheet();
     entityProps->addPropSheet(primitiveSheet);
@@ -86,6 +89,7 @@ void EntityEditorPropertyView::handleEvent(Event *event) {
 void EntityEditorPropertyView::updateShaderOptions() {
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
     SceneLabel *sceneLabel = dynamic_cast<SceneLabel*>(targetEntity);
+    SceneSprite *sceneSprite = dynamic_cast<SceneSprite*>(sceneSprite);
     
     shaderTexturesSheet->enabled = false;
     shaderOptionsSheet->enabled = false;
@@ -93,8 +97,8 @@ void EntityEditorPropertyView::updateShaderOptions() {
     if(sceneMesh) {
         if(sceneMesh->getMaterial() && sceneMesh->getLocalShaderOptions()) {
             
-            // can't edit the textures manually on a scene label
-            if(!sceneLabel) {
+            // can't edit the textures manually on a scene label or sprite
+            if(!sceneLabel && !sceneSprite) {
             shaderTexturesSheet->setShader(sceneMesh->getMaterial()->getShader(0), sceneMesh->getMaterial(), sceneMesh->getLocalShaderOptions());
             }
             
@@ -117,9 +121,12 @@ void EntityEditorPropertyView::setEntity(Entity *entity) {
     SceneLabel *sceneLabel = dynamic_cast<SceneLabel*>(entity);
     labelSheet->setSceneLabel(sceneLabel);
 
+    SceneSprite *sceneSprite = dynamic_cast<SceneSprite*>(entity);
+    spriteSheet->setSprite(sceneSprite);
+
     ScenePrimitive *scenePrimitive = dynamic_cast<ScenePrimitive*>(entity);
     
-    if(!sceneLabel) {
+    if(!sceneLabel && !sceneSprite) {
         primitiveSheet->setScenePrimitive(scenePrimitive);
     } else {
         primitiveSheet->setScenePrimitive(NULL);

+ 25 - 0
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -204,6 +204,15 @@ void EntityEditorMainView::addEntityFromMenu(String command) {
         return;
     }
 
+    if(command == "add_sprite") {
+        assetSelectType = "sprite";
+        globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
+        std::vector<String> extensions;
+        extensions.push_back("sprite");
+        globalFrame->showAssetBrowser(extensions);
+        return;
+    }
+    
     if(command == "add_label") {
         SceneLabel  *newLabel = new SceneLabel("TEXT", 12);
         newLabel->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
@@ -294,8 +303,24 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 setEditorProps(newImage);
                 newImage->setPosition(cursorPosition);
                 selectEntity(newImage);
+        } else if(assetSelectType == "sprite") {
+            SceneSprite *newSprite = new SceneSprite(globalFrame->assetBrowser->getFullSelectedAssetPath());
+            
+            if(newSprite->getNumAnimations()) {
+                newSprite->playAnimation(newSprite->getAnimationAtIndex(0)->name, 0, false);
             }
             
+            newSprite->setMaterialByName("UnlitMaterial");
+            if(newSprite->getLocalShaderOptions()) {
+                newSprite->getLocalShaderOptions()->addTexture("diffuse", newSprite->getTexture());
+            }
+            sceneObjectRoot->addChild(newSprite);
+            setEditorProps(newSprite);
+            newSprite->setPosition(cursorPosition);
+            selectEntity(newSprite);
+        }
+        
+        
             globalFrame->assetBrowser->removeAllHandlersForListener(this);
             globalFrame->hideModal();
         }

+ 35 - 12
IDE/Contents/Source/PolycodeProps.cpp

@@ -1075,6 +1075,7 @@ Texture* TextureProp::get() {
 SceneSpriteProp::SceneSpriteProp(String caption) : PropProp(caption, "SceneSprite"){
 
 		previewSprite = new SceneSprite("default/default.sprite");
+        previewSprite->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
 		previewSprite->setAnchorPoint(-1.0, -1.0, 0.0);
 		previewSprite->setPosition(2, 1);
 		previewSprite->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, 48,48);		
@@ -1132,6 +1133,7 @@ void SceneSpriteProp::set(String fileName) {
 		previewSprite = new SceneSprite(fileName);
 		previewSprite->setAnchorPoint(-1.0, -1.0, 0.0);
 		previewSprite->setPosition(2, 1);
+        previewSprite->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
 		previewSprite->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, 48,48);		
 		propContents->addChild(previewSprite);	
 	}
@@ -2836,9 +2838,9 @@ void EntitySheet::setEntity(Entity *entity) {
     }
 }
 
-SceneSpriteSheet::SceneSpriteSheet() : PropSheet("SCREEN SPRITE", "SceneSprite") {
+SceneSpriteSheet::SceneSpriteSheet() : PropSheet("SPRITE", "SceneSprite") {
 	sprite = NULL;
-	lastSprite = NULL;
+    enabled = false;
 	
 	spriteProp = new SceneSpriteProp("Sprite");
 	spriteProp->addEventListener(this, Event::CHANGE_EVENT);
@@ -2846,9 +2848,17 @@ SceneSpriteSheet::SceneSpriteSheet() : PropSheet("SCREEN SPRITE", "SceneSprite")
 	
 	defaultAnimationProp = new ComboProp("Animation");
 	defaultAnimationProp->addEventListener(this, Event::CHANGE_EVENT);
-	addProp(defaultAnimationProp);	
-	
-	propHeight = 140;
+	addProp(defaultAnimationProp);
+    
+    spriteWidthProp = new NumberProp("Width");
+	spriteWidthProp->addEventListener(this, Event::CHANGE_EVENT);
+	addProp(spriteWidthProp);
+
+    spriteHeightProp = new NumberProp("Height");
+	spriteHeightProp->addEventListener(this, Event::CHANGE_EVENT);
+	addProp(spriteHeightProp);
+
+	propHeight = 190;
 }
 
 SceneSpriteSheet::~SceneSpriteSheet() {
@@ -2862,9 +2872,19 @@ void SceneSpriteSheet::handleEvent(Event *event) {
 	if(event->getDispatcher() == sprite->getResourceEntry()) {
 		spriteProp->previewSprite->reloadSprite();
 		sprite->getResourceEntry()->removeAllHandlersForListener(this);
-		lastSprite = NULL;
 	}
 
+    if(event->getDispatcher() == spriteWidthProp) {
+        sprite->setActualSpriteSize(spriteWidthProp->get(), sprite->getActualSpriteSize().y);
+        dispatchEvent(new Event(), Event::CHANGE_EVENT);
+	}
+
+    if(event->getDispatcher() == spriteHeightProp) {
+        sprite->setActualSpriteSize(sprite->getActualSpriteSize().x, spriteHeightProp->get());
+        dispatchEvent(new Event(), Event::CHANGE_EVENT);
+	}
+ 
+    
 	if(event->getDispatcher() == defaultAnimationProp) {
 		sprite->playAnimation(defaultAnimationProp->comboEntry->getSelectedItem()->label, 0, false);
 		spriteProp->previewSprite->playAnimation(defaultAnimationProp->comboEntry->getSelectedItem()->label, 0, false);
@@ -2882,9 +2902,10 @@ void SceneSpriteSheet::handleEvent(Event *event) {
 	PropSheet::handleEvent(event);
 }
 
-void SceneSpriteSheet::Update() {
-	if(sprite) {	
-		if(lastSprite != sprite) {
+void SceneSpriteSheet::setSprite(SceneSprite *sprite) {
+    this->sprite = sprite;
+    
+	if(sprite) {
 			defaultAnimationProp->comboEntry->clearItems();
 			for(int i=0; i < sprite->getNumAnimations(); i++) {
 				defaultAnimationProp->comboEntry->addComboItem(sprite->getAnimationAtIndex(i)->name);
@@ -2895,11 +2916,13 @@ void SceneSpriteSheet::Update() {
 					}
 				}
 			}
-			lastSprite = sprite;
-		}	
+
 		enabled = true;	
 		spriteProp->set(sprite->getFileName());
 		sprite->getResourceEntry()->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
+        
+        spriteWidthProp->set(sprite->getActualSpriteSize().x);
+        spriteHeightProp->set(sprite->getActualSpriteSize().y);
 	} else {
 		enabled = false;
 	}
@@ -2945,7 +2968,7 @@ void SceneEntityInstanceSheet::Update() {
 	}
 }
 
-SceneLabelSheet::SceneLabelSheet() : PropSheet("SCREEN LABEL", "UILabel") {
+SceneLabelSheet::SceneLabelSheet() : PropSheet("LABEL", "UILabel") {
 	label = NULL;
     enabled = false;
 	

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

@@ -51,7 +51,7 @@ AssetEntry::AssetEntry(String assetPath, String assetName, String extension) : U
 	} else if(extension == "entity") {
 		imageShape->loadTexture("browserIcons/entity_icon");
 	} else if(extension == "sprite") {
-		imageShape->loadTexture("browserIcons/sprite_icon");
+		imageShape->loadTexture("browserIcons/sprite_icon.png");
 	} else if(extension == "ttf" || extension == "otf") {
 		imageShape->loadTexture("browserIcons/font_icon.png");
 	} else if(extension == "vert" || extension == "frag") {