| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- /*
- Copyright (C) 2012 by Ivan Safrin
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- */
-
- #pragma once
- #include "PolycodeEditor.h"
- #include <Polycode.h>
- #include "PolycodeProps.h"
- using namespace Polycode;
- class SpriteFrame {
- public:
- Polycode::Rectangle coordinates;
- Vector2 anchorPoint;
- unsigned int frameID;
- };
- class SpriteSet;
- class SpriteState {
- public:
- SpriteState(SpriteSet *spriteSet, String name);
-
- void setName(String name);
- String getName() const;
-
- void appendFrames(std::vector<unsigned int> newFrameIDs);
-
- unsigned int getNumFrameIDs();
- unsigned int getFrameIDAtIndex(unsigned int index);
-
- Mesh *getMeshForFrameIndex(unsigned int index);
-
- void insertFrame(unsigned int index, unsigned int frameID);
-
- void setNewFrameIDs(std::vector<unsigned int> newIDs);
-
- void removeFrameByIndex(unsigned int frameIndex);
- void removeFrameIndices(std::vector<unsigned int> indices);
-
- void setPixelsPerUnit(Number ppu);
- Number getPixelsPerUnit();
-
- void rebuildStateMeshes();
-
- void setStateFPS(Number fps);
- Number getStateFPS();
-
- void setBoundingBox(Vector2 boundingBox);
- Vector2 getBoundingBox();
-
- Vector2 getSpriteOffset();
- void setSpriteOffset(const Vector2 &offset);
-
- protected:
-
- Vector2 boundingBox;
- Vector2 spriteOffset;
- Number pixelsPerUnit;
- Number stateFPS;
- SpriteSet *spriteSet;
- String name;
- std::vector<unsigned int> frameIDs;
- std::vector<Mesh*> frameMeshes;
- };
- class Sprite {
- public:
- Sprite(String name);
- ~Sprite();
-
- String getName();
- void setName(String name);
-
- void addSpriteState(SpriteState *state);
- void removeSpriteState(SpriteState *state);
-
- unsigned int getNumStates();
- SpriteState *getState(unsigned int index);
-
- protected:
- String name;
- std::vector<SpriteState*> states;
- };
- class SpriteSet {
- public:
- SpriteSet(String imageFileName);
- ~SpriteSet();
- void setTexture(Texture *texture);
- Texture *getTexture();
- Texture *loadTexture(String imageFileName);
-
- void addSpriteEntry(Sprite *newEntry);
- unsigned int getNumSpriteEntries() const;
- Sprite *getSpriteEntry(unsigned int index) const;
- void removeSprite(Sprite *sprite);
-
-
- // frame manipulation
- void addSpriteFrame(const SpriteFrame &frame);
- unsigned int getNumFrames() const;
- SpriteFrame getSpriteFrame(unsigned int index) const;
-
- SpriteFrame getSpriteFrameByID(unsigned int frameID) const;
- void removeFrameByID(unsigned int frameID);
-
- void setSpriteFrame(const SpriteFrame &frame);
-
- void clearFrames();
-
- // automatic frame generation
- void createGridFrames(Number width, Number height, const Vector2 &defaultAnchor);
- void createFramesFromIslands(unsigned int minDistance, const Vector2 &defaultAnchor);
-
- protected:
-
- unsigned int nextFrameIDIndex;
- Texture *spriteTexture;
- std::vector<SpriteFrame> frames;
- std::vector<Sprite*> sprites;
- };
- class SceneSpriteRewrite : public SceneMesh {
- public:
- SceneSpriteRewrite(SpriteSet *spriteSet);
- ~SceneSpriteRewrite();
-
- SpriteSet *getSpriteSet();
- Sprite *getCurrentSprite();
-
- void setCurrentFrame(unsigned int frameIndex);
- unsigned int getCurrentFrame();
- void Update();
- void Render();
-
- void setPaused(bool val);
- bool isPaused();
-
- void setSprite(Sprite *spriteEntry);
- void setSpriteState(SpriteState *spriteState);
- SpriteState *getCurrentSpriteState();
-
- protected:
-
- bool paused;
- Core *core;
- unsigned int currentFrame;
- Mesh *defaultMesh;
- Sprite *currentSprite;
- SpriteState *currentSpriteState;
- SpriteSet *spriteSet;
- Number spriteTimer;
- Number spriteTimerVal;
-
- };
- class SpritePreview : public UIElement {
- public:
- SpritePreview(SpriteSet *spriteSet);
- ~SpritePreview();
-
- void Update();
-
- void handleEvent(Event *event);
-
- SceneSpriteRewrite *getSceneSprite();
- void Resize(Number width, Number height);
-
- protected:
- UIRect *headerBg;
- UIImage *previewBg;
- SceneSpriteRewrite *sprite;
-
- UIIconSelector *bgSelector;
-
- ScenePrimitive *boundingBoxPreview;
-
- };
- class TransformGrips : public UIElement {
- public:
- TransformGrips();
- ~TransformGrips();
-
- void setGripRectangle(Polycode::Rectangle rectangle, Vector2 offset);
-
- void handleEvent(Event *event);
- Polycode::Rectangle getGripRectangle();
-
- Vector2 getAnchorPoint();
-
- private:
-
- bool transforming;
- UIImage *movingTransform;
-
- Polycode::Rectangle gripRectangle;
- Vector2 anchorPoint;
-
- Vector2 mouseBase;
-
- UIRect *mainRect;
- UIImage *transformTL;
- UIImage *transformT;
- UIImage *transformTR;
- UIImage *transformR;
- UIImage *transformL;
- UIImage *transformBL;
- UIImage *transformB;
- UIImage *transformBR;
- UIImage *transformOffset;
- std::vector<UIElement*> grips;
-
- };
- class SpriteSheetEditor : public UIElement {
- public:
- SpriteSheetEditor(SpriteSet *sprite);
- ~SpriteSheetEditor();
-
- void handleEvent(Event *event);
-
- void Update();
-
- void Render();
-
- void deleteSelectedFrames();
-
- void clearSelected();
- bool hasSelectedID(unsigned int frameID);
- std::vector<unsigned int> getSelectedFrameIDs();
-
- void Resize(Number width, Number height);
-
- protected:
-
- UIRect *headerBg;
-
- UIIconSelector *bgSelector;
-
- bool creatingFrame;
- bool willCreateFrame;
-
- Number zoomScale;
- Vector2 panOffset;
-
- TransformGrips *transformGrips;
-
- SpriteFrame frameToAdd;
- Vector2 clickBaseCoord;
-
- Vector2 panMouseBase;
- bool panning;
-
- SpriteSet *sprite;
- UIRect *previewImage;
-
- std::vector<Vector2> defaultAnchors;
-
- UIImage *previewBg;
-
- SceneMesh *frameVisualizerMesh;
- SceneMesh *frameVisualizerMeshSelected;
-
- Entity *bottomMenu;
- UIRect *bottomMenuRect;
- UIButton *changeImageButton;
- UIButton *generateFramesButton;
- UIButton *clearFramesButton;
-
- UIButton *generateOptionsButton;
-
- UIElement *uniformOptions;
- UIElement *detectOptions;
-
- UIComboBox *defaultAnchorCombo;
-
- UIWindow *optionsWindow;
-
- UITextInput *uniformGridWidthInput;
- UITextInput *uniformGridHeightInput;
-
- UITextInput *minimumDistanceInput;
-
- std::vector<unsigned int> selectedIDs;
-
- UIComboBox *generateTypeDropdown;
- };
- class SpriteBrowser : public UIElement {
- public:
- SpriteBrowser(SpriteSet *spriteSet);
- ~SpriteBrowser();
-
- void Resize(Number width, Number height);
- void handleEvent(Event *event);
- void refreshSprites();
-
- Sprite *getSelectedSpriteEntry();
-
- protected:
-
- UIRect *headerBg;
- SpriteSet *spriteSet;
-
- Sprite *selectedEntry;
-
- UITreeContainer *spriteTreeView;
- UIImageButton *newSpriteButton;
- UIImageButton *removeSpriteButton;
- UIImageButton *moreButton;
-
- UIMenu *spriteMoreMenu;
- };
- class SpriteStateEditBar : public UIElement {
- public:
- SpriteStateEditBar(SpriteSet *spriteSet);
- ~SpriteStateEditBar();
-
- void Resize(Number width, Number height);
- void clearBar();
- void refreshBar();
-
- void handleEvent(Event *event);
-
- void moveSelectedLeft();
- void moveSelectedRight();
-
- void doSelectFrame(unsigned int selectedFrameIndex);
-
- bool isFrameSelected(unsigned int frameID);
- void deleteSelectedFrames();
-
- void Update();
-
- void setSceneSprite(SceneSpriteRewrite *sprite);
- void setSpriteState(SpriteState *state);
-
- protected:
-
- Vector2 clickBaseCoord;
- Vector2 frameMoveBase;
-
- bool draggingFrames;
- bool extendingFrame;
- unsigned int extendingID;
- unsigned int extendingIndex;
-
- 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;
- };
- class SpriteStateBrowser : public UIElement {
- public:
- SpriteStateBrowser();
- ~SpriteStateBrowser();
-
- void Resize(Number width, Number height);
-
- UITreeContainer *stateTreeView;
- UIRect *headerBg;
-
- UIImageButton *newStateButton;
- UIImageButton *removeStateButton;
- UIImageButton *moreButton;
-
- };
- class SpriteStateEditorDetails : public UIElement {
- public:
- SpriteStateEditorDetails(SpriteSet *spriteSet);
- ~SpriteStateEditorDetails();
-
- void Resize(Number width, Number height);
- void handleEvent(Event *event);
-
- void Update();
-
- void setSpriteState(SpriteState *state);
- SpriteState *getSpriteState();
-
- void setSceneSprite(SceneSpriteRewrite *spritePreview);
-
- void refreshState();
-
- UIButton *getAppendFramesButton();
- SpriteStateEditBar *getEditBar();
-
- protected:
-
- UIRect *headerBg;
-
- SpriteState *spriteState;
- SpriteSet *spriteSet;
- SceneSpriteRewrite *sceneSprite;
-
- UITextInput *fpsInput;
- UITextInput *scaleInput;
- UITextInput *bBoxWidthInput;
- UITextInput *bBoxHeightInput;
- UITextInput *offsetXInput;
- UITextInput *offsetYInput;
-
- UIButton *appendFramesButton;
- UIButton *removeFramesButton;
- UIButton *clearFramesButton;
-
- UIImageButton *playButton;
- UIImageButton *pauseButton;
- SpriteStateEditBar *editBar;
-
- };
- class SpriteStateEditor : public UIElement {
- public:
- SpriteStateEditor(SpriteSet *spriteSet);
- ~SpriteStateEditor();
-
- void setSpriteEntry(Sprite *entry);
- void refreshStates();
- void handleEvent(Event *event);
-
- void Resize(Number width, Number height);
-
- SpriteStateEditorDetails *getDetailsEditor();
-
- SpriteState *getSelectedState();
- protected:
- UITreeContainer *stateTreeView;
- SpriteSet *spriteSet;
- SpriteState *selectedState;
-
- UIMenu *stateMoreMenu;
-
- SpriteStateBrowser *stateBrowser;
-
- Sprite *spriteSetEntry;
-
- UIImageButton *newStateButton;
-
- UIHSizer *stateSizer;
-
- SpriteStateEditorDetails *stateDetails;
- };
- class PolycodeSpriteEditor : public PolycodeEditor {
- public:
- PolycodeSpriteEditor();
- virtual ~PolycodeSpriteEditor();
-
- void handleEvent(Event *event);
-
- bool openFile(OSFileEntry filePath);
- void Resize(int x, int y);
- void saveFile();
-
- protected:
-
- SpriteSet *sprite;
- UIVSizer *mainSizer;
- UIHSizer *topSizer;
-
- UIHSizer *bottomSizer;
-
- SpriteSheetEditor *spriteSheetEditor;
- SpriteBrowser *spriteBrowser;
- SpriteStateEditor *stateEditor;
- SpritePreview *spritePreview;
-
- UIButton *addFramesButton;
-
- };
- class PolycodeSpriteEditorFactory : public PolycodeEditorFactory {
- public:
- PolycodeSpriteEditorFactory() : PolycodeEditorFactory() { extensions.push_back("sprites"); }
- PolycodeEditor *createEditor() { return new PolycodeSpriteEditor(); }
- };
|