Преглед изворни кода

Added ability to get SceneSprite's largest frame bounding box, sprite preview now scales properly in both the sprite editor and sprite asset browser in the IDE

Ivan Safrin пре 11 година
родитељ
комит
fc6ec09585

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

@@ -69,6 +69,8 @@ namespace Polycode {
         void setStateFPS(Number fps);
         void setStateFPS(Number fps);
         Number getStateFPS();
         Number getStateFPS();
         
         
+        Vector3 getLargestFrameBoundingBox() const;
+        
         void setBoundingBox(Vector2 boundingBox);
         void setBoundingBox(Vector2 boundingBox);
         Vector2 getBoundingBox();
         Vector2 getBoundingBox();
         
         
@@ -77,6 +79,7 @@ namespace Polycode {
         
         
     protected:
     protected:
         
         
+        Vector3 largestFrameBoundingBox;
         Vector2 boundingBox;
         Vector2 boundingBox;
         Vector2 spriteOffset;
         Vector2 spriteOffset;
         Number pixelsPerUnit;
         Number pixelsPerUnit;
@@ -177,6 +180,8 @@ namespace Polycode {
         void Update();
         void Update();
         void Render();
         void Render();
         
         
+        Vector3 getSpriteBoundingBox() const;
+        
         void setPaused(bool val);
         void setPaused(bool val);
         bool isPaused();
         bool isPaused();
         
         
@@ -194,6 +199,7 @@ namespace Polycode {
         
         
     protected:
     protected:
         
         
+        Vector3 spriteBoundingBox;
         bool startOnRandomFrame;
         bool startOnRandomFrame;
         bool playOnce;
         bool playOnce;
         bool paused;
         bool paused;

+ 37 - 4
Core/Contents/Source/PolySceneSprite.cpp

@@ -141,6 +141,10 @@ void SceneSprite::setSpriteSet(SpriteSet *spriteSet) {
     currentSpriteState = NULL;
     currentSpriteState = NULL;
 }
 }
 
 
+Vector3 SceneSprite::getSpriteBoundingBox() const {
+    return spriteBoundingBox;
+}
+
 void SceneSprite::handleEvent(Event *event) {
 void SceneSprite::handleEvent(Event *event) {
     if(event->getDispatcher() == spriteSet) {
     if(event->getDispatcher() == spriteSet) {
         if(event->getEventCode() == Event::CHANGE_EVENT) {
         if(event->getEventCode() == Event::CHANGE_EVENT) {
@@ -195,11 +199,14 @@ void SceneSprite::setSpriteState(SpriteState *spriteState, unsigned int starting
         return;
         return;
     }
     }
     
     
+    Vector2 bBox = currentSpriteState->getBoundingBox();
+    setLocalBoundingBox(bBox.x / currentSpriteState->getPixelsPerUnit(), bBox.y / currentSpriteState->getPixelsPerUnit(), 0.001);
+    
+    spriteBoundingBox = currentSpriteState->getLargestFrameBoundingBox();
+    
     this->playOnce = playOnce;
     this->playOnce = playOnce;
     currentFrame = startingFrame;
     currentFrame = startingFrame;
     
     
-    Vector2 bBox = spriteState->getBoundingBox();
-    setLocalBoundingBox(bBox.x / spriteState->getPixelsPerUnit(), bBox.y / spriteState->getPixelsPerUnit(), 0.001);
 }
 }
 
 
 void SceneSprite::Update() {
 void SceneSprite::Update() {
@@ -208,6 +215,11 @@ void SceneSprite::Update() {
         return;
         return;
     }
     }
     
     
+    Vector2 bBox = currentSpriteState->getBoundingBox();
+    setLocalBoundingBox(bBox.x / currentSpriteState->getPixelsPerUnit(), bBox.y / currentSpriteState->getPixelsPerUnit(), 0.001);
+    
+    spriteBoundingBox = currentSpriteState->getLargestFrameBoundingBox();
+    
     setTexture(spriteSet->getTexture());
     setTexture(spriteSet->getTexture());
     
     
     if(paused) {
     if(paused) {
@@ -339,6 +351,10 @@ void SpriteState::setNewFrameIDs(std::vector<unsigned int> newIDs) {
     rebuildStateMeshes();
     rebuildStateMeshes();
 }
 }
 
 
+Vector3 SpriteState::getLargestFrameBoundingBox() const {
+    return largestFrameBoundingBox;
+}
+
 void SpriteState::insertFrame(unsigned int index, unsigned int frameID) {
 void SpriteState::insertFrame(unsigned int index, unsigned int frameID) {
     if(index < frameIDs.size()) {
     if(index < frameIDs.size()) {
         frameIDs.insert(frameIDs.begin()+index, frameID);
         frameIDs.insert(frameIDs.begin()+index, frameID);
@@ -360,6 +376,8 @@ void SpriteState::rebuildStateMeshes() {
     }
     }
     frameMeshes.clear();
     frameMeshes.clear();
     
     
+    largestFrameBoundingBox = Vector3();
+    
     for(int i=0; i < frameIDs.size(); i++) {
     for(int i=0; i < frameIDs.size(); i++) {
         Mesh *frameMesh = new Mesh(Mesh::QUAD_MESH);
         Mesh *frameMesh = new Mesh(Mesh::QUAD_MESH);
         SpriteFrame frame = spriteSet->getSpriteFrameByID(frameIDs[i]);
         SpriteFrame frame = spriteSet->getSpriteFrameByID(frameIDs[i]);
@@ -388,6 +406,21 @@ void SpriteState::rebuildStateMeshes() {
         frameMesh->addVertex(meshOffset.x+-frameWidth*0.5+frameWidth, meshOffset.y+frameHeight*0.5-frameHeight, 0.0, frame.coordinates.x+frame.coordinates.w, 1.0- frame.coordinates.y  - frame.coordinates.h);
         frameMesh->addVertex(meshOffset.x+-frameWidth*0.5+frameWidth, meshOffset.y+frameHeight*0.5-frameHeight, 0.0, frame.coordinates.x+frame.coordinates.w, 1.0- frame.coordinates.y  - frame.coordinates.h);
         frameMesh->addVertex(meshOffset.x+-frameWidth*0.5+frameWidth, meshOffset.y+frameHeight*0.5, 0.0, frame.coordinates.x+frame.coordinates.w, 1.0-frame.coordinates.y);
         frameMesh->addVertex(meshOffset.x+-frameWidth*0.5+frameWidth, meshOffset.y+frameHeight*0.5, 0.0, frame.coordinates.x+frame.coordinates.w, 1.0-frame.coordinates.y);
         
         
+        
+        for(int j=0; j < 4; j++) {
+            Number val = fabs(frameMesh->getActualVertex(j)->x);
+            if(val > largestFrameBoundingBox.x) {
+                largestFrameBoundingBox.x = val;
+            }
+            val = fabs(frameMesh->getActualVertex(j)->y);
+            if(val > largestFrameBoundingBox.y) {
+                largestFrameBoundingBox.y = val;
+            }
+            val = fabs(frameMesh->getActualVertex(j)->z);
+            if(val > largestFrameBoundingBox.z) {
+                largestFrameBoundingBox.z = val;
+            }
+        }
         frameMesh->addIndexedFace(0,1);
         frameMesh->addIndexedFace(0,1);
         frameMesh->addIndexedFace(1,2);
         frameMesh->addIndexedFace(1,2);
         frameMesh->addIndexedFace(2,3);
         frameMesh->addIndexedFace(2,3);
@@ -397,6 +430,8 @@ void SpriteState::rebuildStateMeshes() {
         
         
         frameMeshes.push_back(frameMesh);
         frameMeshes.push_back(frameMesh);
     }
     }
+    
+    largestFrameBoundingBox = largestFrameBoundingBox * 2.0;
 }
 }
 
 
 String SpriteState::getName() const {
 String SpriteState::getName() const {
@@ -622,8 +657,6 @@ void SpriteSet::loadSpriteSet(String fileName) {
             }
             }
         }
         }
     }
     }
-    
-    
 }
 }
 
 
 void SpriteSet::removeFrameByID(unsigned int frameID) {
 void SpriteSet::removeFrameByID(unsigned int frameID) {

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

@@ -36,7 +36,7 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeViewBase *view) : EventDispatcher() {
 #else
 #else
 PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 #endif
 #endif
-	core = new POLYCODE_CORE((PolycodeView*)view, 1100, 700,false,false, 0, 0,60, -1, false);
+	core = new POLYCODE_CORE((PolycodeView*)view, 1100, 700,false,false, 0, 0,60, -1, true);
 //	core->pauseOnLoseFocus = true;
 //	core->pauseOnLoseFocus = true;
     
     
 	printf("DIR: %s\n", core->getDefaultWorkingDirectory().c_str());
 	printf("DIR: %s\n", core->getDefaultWorkingDirectory().c_str());

+ 4 - 4
IDE/Contents/Source/PolycodeProps.cpp

@@ -1430,9 +1430,9 @@ void SceneSpriteProp::handleEvent(Event *event) {
             
             
             Number spriteScale = 1.0;
             Number spriteScale = 1.0;
             if(previewSprite->getHeight() > previewSprite->getWidth()) {
             if(previewSprite->getHeight() > previewSprite->getWidth()) {
-                spriteScale = 40.0 / previewSprite->getHeight();
+                spriteScale = 40.0 / previewSprite->getSpriteBoundingBox().y;
             } else {
             } else {
-                spriteScale = 40.0 / previewSprite->getWidth();
+                spriteScale = 40.0 / previewSprite->getSpriteBoundingBox().x;
             }
             }
             previewSprite->setScale(spriteScale, spriteScale, 1.0);
             previewSprite->setScale(spriteScale, spriteScale, 1.0);
             
             
@@ -1482,8 +1482,8 @@ void SceneSpriteProp::set(Sprite *sprite) {
     if(sprite->getNumStates() > 0) {
     if(sprite->getNumStates() > 0) {
         previewSprite->setSpriteState(sprite->getState(0), 0, false);
         previewSprite->setSpriteState(sprite->getState(0), 0, false);
     }
     }
-    previewSprite->setAnchorPoint(-1.0, -1.0, 0.0);
-    previewSprite->setPosition(2, 1);
+    previewSprite->setAnchorPoint(0.0, 0.0, 0.0);
+    previewSprite->setPosition(22, 21);
     previewSprite->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
     previewSprite->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
     propContents->addChild(previewSprite);
     propContents->addChild(previewSprite);
     
     

+ 23 - 10
IDE/Contents/Source/PolycodeSpriteEditor.cpp

@@ -776,7 +776,7 @@ SpriteStateEditorDetails::SpriteStateEditorDetails(SpriteSet *spriteSet) : UIEle
     fpsInput->setPosition(65.0, 40.0);
     fpsInput->setPosition(65.0, 40.0);
     fpsInput->addEventListener(this, UIEvent::CHANGE_EVENT);
     fpsInput->addEventListener(this, UIEvent::CHANGE_EVENT);
     
     
-	label = new UILabel("SCALE", 18, "section", Label::ANTIALIAS_FULL);
+	label = new UILabel("PPU", 18, "section", Label::ANTIALIAS_FULL);
 	label->setPosition(60.0-label->getWidth(), 65.0);
 	label->setPosition(60.0-label->getWidth(), 65.0);
     addChild(label);
     addChild(label);
     
     
@@ -1537,6 +1537,7 @@ void SpriteStateEditor::setSpriteEntry(Sprite *entry) {
     
     
     if(entry->getNumStates() > 0) {
     if(entry->getNumStates() > 0) {
         stateBrowser->stateTreeView->getRootNode()->getTreeChild(0)->setSelected();
         stateBrowser->stateTreeView->getRootNode()->getTreeChild(0)->setSelected();
+        dispatchEvent(new Event(), Event::CHANGE_EVENT);
     }
     }
     
     
 }
 }
@@ -1690,27 +1691,35 @@ void SpritePreview::Update() {
     
     
     SpriteState  *state = sprite->getCurrentSpriteState();
     SpriteState  *state = sprite->getCurrentSpriteState();
     
     
-    if(state) {
-        Vector2 bBox = state->getBoundingBox();
-        sprite->setLocalBoundingBox(bBox.x / state->getPixelsPerUnit(), bBox.y / state->getPixelsPerUnit(), 0.001);
-    }
-    
+//    if(state) {
+//        Vector2 bBox = state->getBoundingBox();
+//        sprite->setLocalBoundingBox(bBox.x / state->getPixelsPerUnit(), bBox.y / state->getPixelsPerUnit(), 0.001);
+//    }
+//    
     //boundingBoxPreview->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, sprite->getLocalBoundingBox().x, sprite->getLocalBoundingBox().y);
     //boundingBoxPreview->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, sprite->getLocalBoundingBox().x, sprite->getLocalBoundingBox().y);
     
     
     Mesh *bbBoxMesh = boundingBoxPreview->getMesh();
     Mesh *bbBoxMesh = boundingBoxPreview->getMesh();
     bbBoxMesh->clearMesh();
     bbBoxMesh->clearMesh();
     bbBoxMesh->indexedMesh = true;
     bbBoxMesh->indexedMesh = true;
     
     
-    Vector3 bBox = sprite->getLocalBoundingBox();
+    
+    Number spriteScale =  (getWidth() - 80) / sprite->getSpriteBoundingBox().x;
+    
+    if(sprite->getSpriteBoundingBox().y * spriteScale > getHeight() - 80) {
+        spriteScale =  (getHeight() - 80) / sprite->getSpriteBoundingBox().y;
+    }
+    
+    Vector3 bBox = sprite->getLocalBoundingBox() * spriteScale;
     
     
     SpriteFrame frame;
     SpriteFrame frame;
     
     
+    
     frame.coordinates.x = 0.0;
     frame.coordinates.x = 0.0;
     frame.coordinates.y = 0.0;
     frame.coordinates.y = 0.0;
     Vector3 bBoxNorm = bBox;
     Vector3 bBoxNorm = bBox;
     bBoxNorm.Normalize();
     bBoxNorm.Normalize();
-    frame.coordinates.w = bBoxNorm.x;
-    frame.coordinates.h = bBoxNorm.y;
+    frame.coordinates.w = bBoxNorm.x * spriteScale;
+    frame.coordinates.h = bBoxNorm.y * spriteScale;
     
     
     bbBoxMesh->addVertex(-bBox.x * 0.5, bBox.y * 0.5, 0.0, frame.coordinates.x, frame.coordinates.y);
     bbBoxMesh->addVertex(-bBox.x * 0.5, bBox.y * 0.5, 0.0, frame.coordinates.x, frame.coordinates.y);
     bbBoxMesh->addVertex((-bBox.x * 0.5)+bBox.x, bBox.y * 0.5, 0.0, frame.coordinates.x+frame.coordinates.w, frame.coordinates.y);
     bbBoxMesh->addVertex((-bBox.x * 0.5)+bBox.x, bBox.y * 0.5, 0.0, frame.coordinates.x+frame.coordinates.w, frame.coordinates.y);
@@ -1723,6 +1732,8 @@ void SpritePreview::Update() {
     bbBoxMesh->addIndexedFace(3,0);
     bbBoxMesh->addIndexedFace(3,0);
     
     
     bbBoxMesh->dirtyArrays();
     bbBoxMesh->dirtyArrays();
+    
+    sprite->setScale(spriteScale, spriteScale, 1.0);
 
 
 }
 }
 
 
@@ -1735,6 +1746,8 @@ void SpritePreview::Resize(Number width, Number height) {
     boundingBoxPreview->setPosition(sprite->getPosition());
     boundingBoxPreview->setPosition(sprite->getPosition());
     
     
     bgSelector->setPosition(width - bgSelector->getWidth() - 3.0, 3.0);
     bgSelector->setPosition(width - bgSelector->getWidth() - 3.0, 3.0);
+    
+    UIElement::Resize(width, height);
 }
 }
 
 
 PolycodeSpriteEditor::PolycodeSpriteEditor() : PolycodeEditor(true){
 PolycodeSpriteEditor::PolycodeSpriteEditor() : PolycodeEditor(true){
@@ -1744,8 +1757,8 @@ PolycodeSpriteEditor::PolycodeSpriteEditor() : PolycodeEditor(true){
 void PolycodeSpriteEditor::handleEvent(Event *event) {
 void PolycodeSpriteEditor::handleEvent(Event *event) {
     if(event->getDispatcher() == spriteBrowser) {
     if(event->getDispatcher() == spriteBrowser) {
         Sprite *selectedSprite = spriteBrowser->getSelectedSpriteEntry();
         Sprite *selectedSprite = spriteBrowser->getSelectedSpriteEntry();
-        stateEditor->setSpriteEntry(selectedSprite);
         spritePreview->getSceneSprite()->setSprite(selectedSprite);
         spritePreview->getSceneSprite()->setSprite(selectedSprite);
+        stateEditor->setSpriteEntry(selectedSprite);
     } else if(event->getDispatcher() == addFramesButton) {
     } else if(event->getDispatcher() == addFramesButton) {
         SpriteState *spriteState = stateEditor->getDetailsEditor()->getSpriteState();
         SpriteState *spriteState = stateEditor->getDetailsEditor()->getSpriteState();
         bool generateBBox = false;
         bool generateBBox = false;

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

@@ -84,9 +84,9 @@ AssetEntry::AssetEntry(String assetPath, String assetName, String extension, Res
             
             
             Number spriteScale = 1.0;
             Number spriteScale = 1.0;
             if(spritePreview->getHeight() > spritePreview->getWidth()) {
             if(spritePreview->getHeight() > spritePreview->getWidth()) {
-                spriteScale = 64.0 / spritePreview->getHeight();
+                spriteScale = 64.0 / spritePreview->getSpriteBoundingBox().y;
             } else {
             } else {
-                spriteScale = 64.0 / spritePreview->getWidth();
+                spriteScale = 64.0 / spritePreview->getSpriteBoundingBox().x;
             }
             }
             spritePreview->setScale(spriteScale, spriteScale, 1.0);
             spritePreview->setScale(spriteScale, spriteScale, 1.0);