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

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 лет назад
Родитель
Сommit
fc6ec09585

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

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

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

@@ -141,6 +141,10 @@ void SceneSprite::setSpriteSet(SpriteSet *spriteSet) {
     currentSpriteState = NULL;
 }
 
+Vector3 SceneSprite::getSpriteBoundingBox() const {
+    return spriteBoundingBox;
+}
+
 void SceneSprite::handleEvent(Event *event) {
     if(event->getDispatcher() == spriteSet) {
         if(event->getEventCode() == Event::CHANGE_EVENT) {
@@ -195,11 +199,14 @@ void SceneSprite::setSpriteState(SpriteState *spriteState, unsigned int starting
         return;
     }
     
+    Vector2 bBox = currentSpriteState->getBoundingBox();
+    setLocalBoundingBox(bBox.x / currentSpriteState->getPixelsPerUnit(), bBox.y / currentSpriteState->getPixelsPerUnit(), 0.001);
+    
+    spriteBoundingBox = currentSpriteState->getLargestFrameBoundingBox();
+    
     this->playOnce = playOnce;
     currentFrame = startingFrame;
     
-    Vector2 bBox = spriteState->getBoundingBox();
-    setLocalBoundingBox(bBox.x / spriteState->getPixelsPerUnit(), bBox.y / spriteState->getPixelsPerUnit(), 0.001);
 }
 
 void SceneSprite::Update() {
@@ -208,6 +215,11 @@ void SceneSprite::Update() {
         return;
     }
     
+    Vector2 bBox = currentSpriteState->getBoundingBox();
+    setLocalBoundingBox(bBox.x / currentSpriteState->getPixelsPerUnit(), bBox.y / currentSpriteState->getPixelsPerUnit(), 0.001);
+    
+    spriteBoundingBox = currentSpriteState->getLargestFrameBoundingBox();
+    
     setTexture(spriteSet->getTexture());
     
     if(paused) {
@@ -339,6 +351,10 @@ void SpriteState::setNewFrameIDs(std::vector<unsigned int> newIDs) {
     rebuildStateMeshes();
 }
 
+Vector3 SpriteState::getLargestFrameBoundingBox() const {
+    return largestFrameBoundingBox;
+}
+
 void SpriteState::insertFrame(unsigned int index, unsigned int frameID) {
     if(index < frameIDs.size()) {
         frameIDs.insert(frameIDs.begin()+index, frameID);
@@ -360,6 +376,8 @@ void SpriteState::rebuildStateMeshes() {
     }
     frameMeshes.clear();
     
+    largestFrameBoundingBox = Vector3();
+    
     for(int i=0; i < frameIDs.size(); i++) {
         Mesh *frameMesh = new Mesh(Mesh::QUAD_MESH);
         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, 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(1,2);
         frameMesh->addIndexedFace(2,3);
@@ -397,6 +430,8 @@ void SpriteState::rebuildStateMeshes() {
         
         frameMeshes.push_back(frameMesh);
     }
+    
+    largestFrameBoundingBox = largestFrameBoundingBox * 2.0;
 }
 
 String SpriteState::getName() const {
@@ -622,8 +657,6 @@ void SpriteSet::loadSpriteSet(String fileName) {
             }
         }
     }
-    
-    
 }
 
 void SpriteSet::removeFrameByID(unsigned int frameID) {

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

@@ -36,7 +36,7 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeViewBase *view) : EventDispatcher() {
 #else
 PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 #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;
     
 	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;
             if(previewSprite->getHeight() > previewSprite->getWidth()) {
-                spriteScale = 40.0 / previewSprite->getHeight();
+                spriteScale = 40.0 / previewSprite->getSpriteBoundingBox().y;
             } else {
-                spriteScale = 40.0 / previewSprite->getWidth();
+                spriteScale = 40.0 / previewSprite->getSpriteBoundingBox().x;
             }
             previewSprite->setScale(spriteScale, spriteScale, 1.0);
             
@@ -1482,8 +1482,8 @@ void SceneSpriteProp::set(Sprite *sprite) {
     if(sprite->getNumStates() > 0) {
         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);
     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->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);
     addChild(label);
     
@@ -1537,6 +1537,7 @@ void SpriteStateEditor::setSpriteEntry(Sprite *entry) {
     
     if(entry->getNumStates() > 0) {
         stateBrowser->stateTreeView->getRootNode()->getTreeChild(0)->setSelected();
+        dispatchEvent(new Event(), Event::CHANGE_EVENT);
     }
     
 }
@@ -1690,27 +1691,35 @@ void SpritePreview::Update() {
     
     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);
     
     Mesh *bbBoxMesh = boundingBoxPreview->getMesh();
     bbBoxMesh->clearMesh();
     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;
     
+    
     frame.coordinates.x = 0.0;
     frame.coordinates.y = 0.0;
     Vector3 bBoxNorm = bBox;
     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.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->dirtyArrays();
+    
+    sprite->setScale(spriteScale, spriteScale, 1.0);
 
 }
 
@@ -1735,6 +1746,8 @@ void SpritePreview::Resize(Number width, Number height) {
     boundingBoxPreview->setPosition(sprite->getPosition());
     
     bgSelector->setPosition(width - bgSelector->getWidth() - 3.0, 3.0);
+    
+    UIElement::Resize(width, height);
 }
 
 PolycodeSpriteEditor::PolycodeSpriteEditor() : PolycodeEditor(true){
@@ -1744,8 +1757,8 @@ PolycodeSpriteEditor::PolycodeSpriteEditor() : PolycodeEditor(true){
 void PolycodeSpriteEditor::handleEvent(Event *event) {
     if(event->getDispatcher() == spriteBrowser) {
         Sprite *selectedSprite = spriteBrowser->getSelectedSpriteEntry();
-        stateEditor->setSpriteEntry(selectedSprite);
         spritePreview->getSceneSprite()->setSprite(selectedSprite);
+        stateEditor->setSpriteEntry(selectedSprite);
     } else if(event->getDispatcher() == addFramesButton) {
         SpriteState *spriteState = stateEditor->getDetailsEditor()->getSpriteState();
         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;
             if(spritePreview->getHeight() > spritePreview->getWidth()) {
-                spriteScale = 64.0 / spritePreview->getHeight();
+                spriteScale = 64.0 / spritePreview->getSpriteBoundingBox().y;
             } else {
-                spriteScale = 64.0 / spritePreview->getWidth();
+                spriteScale = 64.0 / spritePreview->getSpriteBoundingBox().x;
             }
             spritePreview->setScale(spriteScale, spriteScale, 1.0);