Explorar el Código

Frame removal, sprite editor bugfixes

Ivan Safrin hace 11 años
padre
commit
113771acef

+ 16 - 1
IDE/Contents/Include/PolycodeSpriteEditor.h

@@ -51,6 +51,9 @@ class SpriteState {
     
         Mesh *getMeshForFrameIndex(unsigned int index);
     
+        void removeFrameByIndex(unsigned int frameIndex);
+        void removeFrameIndices(std::vector<unsigned int> indices);
+    
         void rebuildStateMeshes();
     
         void setStateFPS(Number fps);
@@ -252,22 +255,34 @@ class SpriteStateEditBar : public UIElement {
         void clearBar();
         void refreshBar();
     
+        void handleEvent(Event *event);
+    
+        bool isFrameSelected(unsigned int frameID);
+        void deleteSelectedFrames();
+    
         void Update();
     
         void setSceneSprite(SceneSpriteRewrite *sprite);
-
         void setSpriteState(SpriteState *state);
     
     protected:
     
+        Number zoomScale;
         SpriteState *spriteState;
         SpriteSet *spriteSet;
         SceneSpriteRewrite *sceneSprite;
     
+        Number defaultFrameWidth;
+    
         SceneMesh *barMesh;
         SceneMesh *barMeshBg;
         SceneMesh *frameTicksMesh;
         SceneMesh *frameGripsMesh;
+    
+        UIElement *barBase;
+        UIScrollContainer *scroller;
+    
+        std::vector<unsigned int> selectedFrames;
 };
 
 

+ 137 - 17
IDE/Contents/Source/PolycodeSpriteEditor.cpp

@@ -119,6 +119,33 @@ SpriteState::SpriteState(SpriteSet *spriteSet, String name) {
     stateFPS = 60.0;
 }
 
+void SpriteState::removeFrameByIndex(unsigned int index) {
+    if(index < frameIDs.size()) {
+        frameIDs.erase(frameIDs.begin()+index);
+    }
+    rebuildStateMeshes();    
+}
+
+void SpriteState::removeFrameIndices(std::vector<unsigned int> indices) {
+    std::vector<unsigned int> newFrames;
+    
+    for(int i=0; i < frameIDs.size(); i++) {
+        bool hasIndex = false;
+        for(int j=0; j < indices.size(); j++) {
+            if(indices[j] == i) {
+                hasIndex = true;
+                break;
+            }
+        }
+        if(!hasIndex) {
+            newFrames.push_back(frameIDs[i]);
+        }
+    }
+    
+    frameIDs = newFrames;
+    rebuildStateMeshes();
+}
+
 void SpriteState::setStateFPS(Number fps) {
     stateFPS = fps;
 }
@@ -700,7 +727,9 @@ void SpriteSheetEditor::handleEvent(Event *event) {
                         transforedCoords.h = frame.coordinates.h * zoomScale  * previewImage->getHeight();
 
                         if(mouseCoord.x >= transforedCoords.x && mouseCoord.x <= transforedCoords.x + transforedCoords.w && mouseCoord.y >= transforedCoords.y && mouseCoord.y <= transforedCoords.y + transforedCoords.h) {
-                            selectedIDs.push_back(frame.frameID);
+                            if(!hasSelectedID(frame.frameID)) {
+                                selectedIDs.push_back(frame.frameID);
+                            }
                             break;
                         }
                     }
@@ -1012,7 +1041,8 @@ void SpriteStateEditBar::refreshBar() {
     Mesh *meshBg = barMeshBg->getMesh();
     meshBg->clearMesh();
     meshBg->indexedMesh = true;
-
+    meshBg->useVertexColors = true;
+    
     Mesh *meshTicks = frameTicksMesh->getMesh();
     meshTicks->clearMesh();
     meshTicks->indexedMesh = true;
@@ -1022,6 +1052,8 @@ void SpriteStateEditBar::refreshBar() {
     meshGrips->clearMesh();
     meshGrips->indexedMesh = true;
     
+    Number frameOffset;
+    Number frameSize;
     
     unsigned int offset = 0;
     for(int i=0; i < spriteState->getNumFrameIDs(); i++) {
@@ -1031,17 +1063,17 @@ void SpriteStateEditBar::refreshBar() {
         
         Number gapSize = 1.0;
         
-        Number frameTickHeight = 20.0;
+        Number frameTickHeight = 10.0;
         Number frameTickGap = 2.0;
         
-        Number frameSize = 50.0;
-        Number frameHeight = getHeight()-frameTickHeight-frameTickGap;
+        frameSize = defaultFrameWidth * zoomScale;
+        Number frameHeight = getHeight()-frameTickHeight-frameTickGap-scroller->getHScrollBar()->getHeight();
         
-        if(frameHeight < frameSize) {
-            frameHeight = frameSize;
+        if(frameHeight < 32.0) {
+            frameHeight = 32.0;
         }
         
-        Number frameOffset = ((Number)i) * frameSize;
+        frameOffset = ((Number)i) * frameSize;
         
         // draw frame ticks
         
@@ -1073,7 +1105,12 @@ void SpriteStateEditBar::refreshBar() {
         Number iconFrameWidth = frameSize * 0.5;
         Number iconFrameHeight = iconFrameWidth * aspectRatio;
         
-        Number iconOffset = 5.0;
+        if(iconFrameHeight > frameHeight * 0.8) {
+            iconFrameHeight = frameHeight * 0.8;
+            iconFrameWidth = iconFrameHeight / aspectRatio;
+        }
+        
+        Number iconOffset = 2.0;
         
         mesh->addVertex(frameOffset+iconOffset, -frameTickHeight-frameTickGap-iconOffset, 0.0, frame.coordinates.x, 1.0-frame.coordinates.y);
         mesh->addVertex(frameOffset+iconOffset, -frameTickHeight-frameTickGap-iconFrameHeight-iconOffset, 0.0, frame.coordinates.x, 1.0-frame.coordinates.y  - frame.coordinates.h);
@@ -1087,10 +1124,16 @@ void SpriteStateEditBar::refreshBar() {
         
         // draw frame backgrounds
         
-        meshBg->addVertex(frameOffset, -frameTickHeight-frameTickGap, 0.0, 0.0, 0.0);
-        meshBg->addVertex(frameOffset, -frameTickHeight-frameTickGap-frameHeight, 0.0, 0.0, 1.0);
-        meshBg->addVertex(frameOffset+frameSize-gapSize, -frameTickHeight-frameTickGap-frameHeight, 0.0, 1.0, 1.0);
-        meshBg->addVertex(frameOffset+frameSize-gapSize, -frameTickHeight-frameTickGap, 0.0, 1.0, 0.0);
+        Color bgFrameColor = Color(1.0, 1.0, 1.0, 1.0);
+        
+        if(isFrameSelected(i)) {
+            bgFrameColor = Color(1.0, 0.5, 0.5, 1.0);
+        }
+        
+        meshBg->addVertex(frameOffset, -frameTickHeight-frameTickGap, 0.0, 0.0, 0.0)->vertexColor = bgFrameColor;
+        meshBg->addVertex(frameOffset, -frameTickHeight-frameTickGap-frameHeight, 0.0, 0.0, 1.0)->vertexColor = bgFrameColor;
+        meshBg->addVertex(frameOffset+frameSize-gapSize, -frameTickHeight-frameTickGap-frameHeight, 0.0, 1.0, 1.0)->vertexColor = bgFrameColor;
+        meshBg->addVertex(frameOffset+frameSize-gapSize, -frameTickHeight-frameTickGap, 0.0, 1.0, 0.0)->vertexColor = bgFrameColor;
 
         
         meshBg->addIndexedFace(offset+0,offset+1);
@@ -1121,6 +1164,17 @@ void SpriteStateEditBar::refreshBar() {
     mesh->dirtyArrays();
     meshBg->dirtyArrays();
     meshTicks->dirtyArrays();
+    
+    scroller->setContentSize(frameOffset+frameSize, getHeight());
+}
+
+bool SpriteStateEditBar::isFrameSelected(unsigned int frameIndex) {
+    for(int i=0; i < selectedFrames.size(); i++) {
+        if(selectedFrames[i] == frameIndex) {
+            return true;
+        }
+    }
+    return false;
 }
 
 void SpriteStateEditBar::Update() {
@@ -1129,6 +1183,7 @@ void SpriteStateEditBar::Update() {
 
 void SpriteStateEditBar::Resize(Number width, Number height) {
     UIElement::Resize(width, height);
+    scroller->Resize(width, height);
     refreshBar();
 }
 
@@ -1138,21 +1193,86 @@ SpriteStateEditBar::SpriteStateEditBar(SpriteSet *spriteSet) : UIElement() {
     sceneSprite = NULL;
     spriteState = NULL;
     
+    barBase = new UIElement();
+    
     barMeshBg = new SceneMesh(Mesh::QUAD_MESH);
-    addChild(barMeshBg);
+    barBase->addChild(barMeshBg);
     barMeshBg->loadTexture("spriteEditor/sprite_frame_bg.png");
+    barMeshBg->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
     
     barMesh = new SceneMesh(Mesh::QUAD_MESH);
-    addChild(barMesh);
+    barBase->addChild(barMesh);
     barMesh->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
     
     frameTicksMesh = new SceneMesh(Mesh::QUAD_MESH);
-    addChild(frameTicksMesh);
+    barBase->addChild(frameTicksMesh);
     
     frameGripsMesh = new SceneMesh(Mesh::QUAD_MESH);
-    addChild(frameGripsMesh);
+    barBase->addChild(frameGripsMesh);
     frameGripsMesh->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
     frameGripsMesh->loadTexture("spriteEditor/frame_grip.png");
+    
+    this->addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_UP);
+    this->addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_DOWN);
+    this->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
+    
+    Services()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
+    
+    zoomScale = 1.0;
+    defaultFrameWidth = 50.0;
+    
+    scroller = new UIScrollContainer(barBase, true, false, 10, 10);
+    addChild(scroller);
+}
+
+void SpriteStateEditBar::handleEvent(Event *event) {
+    if(event->getDispatcher() == this) {
+        InputEvent *inputEvent = (InputEvent*) event;
+        
+        switch(event->getEventCode()) {
+            case InputEvent::EVENT_MOUSEWHEEL_UP:
+                zoomScale *= 1.02;
+            break;
+            case InputEvent::EVENT_MOUSEWHEEL_DOWN:
+                zoomScale *= 0.98;
+                if(zoomScale < 0.25) {
+                    zoomScale = 0.25;
+                }
+            break;
+            case InputEvent::EVENT_MOUSEDOWN:
+                if(inputEvent->getMousePosition().y < getHeight()-scroller->getHScrollBar()->getHeight()) {
+                    unsigned int selectedFrameIndex = (inputEvent->getMousePosition().x - barBase->getPosition().x)/ defaultFrameWidth / zoomScale;
+                    if(!Services()->getCore()->getInput()->getKeyState(KEY_LSHIFT) &&
+                       !Services()->getCore()->getInput()->getKeyState(KEY_LSHIFT)) {
+                        selectedFrames.clear();
+                    }
+                    selectedFrames.push_back(selectedFrameIndex);
+                }
+                focusSelf();
+            break;
+        }
+    } else if(event->getDispatcher() == Services()->getCore()->getInput()) {
+        InputEvent *inputEvent = (InputEvent*) event;
+        
+        if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
+            switch(inputEvent->getKey()) {
+                case Polycode::KEY_DELETE:
+                case Polycode::KEY_BACKSPACE:
+                    if(hasFocus) {
+                        deleteSelectedFrames();
+                    }
+                break;
+            }
+        }
+    }
+}
+
+void SpriteStateEditBar::deleteSelectedFrames() {
+    if(!spriteState) {
+        return;
+    }
+    spriteState->removeFrameIndices(selectedFrames);
+    selectedFrames.clear();
 }
 
 SpriteStateEditBar::~SpriteStateEditBar() {