Subversion Repositories AndroidProjects

Rev

Rev 1421 | Rev 1489 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1386 chris 1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
1398 chris 6
using System.IO;
1386 chris 7
 
1397 chris 8
using BauzoidNET.graphics;
9
using BauzoidNET.graphics.sprite;
1401 chris 10
using BauzoidNET.math;
1397 chris 11
 
1401 chris 12
using ShapeEditor.file.shapes;
1404 chris 13
using ShapeEditor.interaction;
1401 chris 14
 
1386 chris 15
namespace ShapeEditor.file
16
{
17
    public class Document
18
    {
1402 chris 19
        public static readonly Vector4 SHAPE_COLOR = new Vector4(0, 0, 1, 1);
20
        public static readonly Vector4 SHAPE_COLOR_SELECTED = new Vector4(0.8f, 0.2f, 1, 1);
21
 
22
        public const int HANDLE_SIZE = 7;
23
 
1398 chris 24
        private MainForm mOwner = null;
1405 chris 25
        public MainForm Owner { get { return mOwner; } }
1398 chris 26
 
1386 chris 27
        private bool mIsDirty = false;
1398 chris 28
        private string mFilename = null;
1386 chris 29
 
1401 chris 30
        private List<BaseShapeElement> mShapeElements = new List<BaseShapeElement>();
1414 chris 31
        public List<BaseShapeElement> ShapeElements { get { return mShapeElements; } }
1386 chris 32
 
1397 chris 33
        private Sprite mSprite = null;
34
 
1402 chris 35
        private SimpleSprite mHandle = null;
36
 
1397 chris 37
        private SpriteInstance mSpriteInstance = null;
1405 chris 38
        public SpriteInstance Sprite { get { return mSpriteInstance; } }
1397 chris 39
 
1398 chris 40
        public Document(MainForm owner)
1386 chris 41
        {
1398 chris 42
            mOwner = owner;
1402 chris 43
 
44
            mHandle = new SimpleSprite(MainForm.App.getGraphics(), "data/textures/handle.png");
1386 chris 45
        }
46
 
1402 chris 47
        public void Init()
48
        {
49
            mHandle.init();
50
            mHandle.getSpriteTransform().w = HANDLE_SIZE;
51
            mHandle.getSpriteTransform().h = HANDLE_SIZE;
52
            mHandle.getSpriteTransform().centerPivot();
53
        }
54
 
55
        public void Exit()
56
        {
57
            Destroy();
58
            mHandle.dispose();
59
        }
60
 
1397 chris 61
        public void Destroy()
62
        {
1398 chris 63
            DestroySprite();
1408 chris 64
            mOwner.ZoomFactor = 1.0f;
65
            mOwner.mCurrentX = 0.0f;
66
            mOwner.mCurrentY = 0.0f;
67
            mShapeElements.Clear();
68
            mOwner.ElementsListBox.Items.Clear();
1398 chris 69
        }
70
 
71
        public void DestroySprite()
72
        {
1397 chris 73
            if (mSprite != null)
74
            {
75
                mSprite.dispose();
76
                mSprite = null;
77
            }
78
 
79
            mSpriteInstance = null;
80
        }
81
 
1409 chris 82
        public void SetMainFormCaption()
83
        {
84
            if (IsFilenameSet())
85
                mOwner.Text = Path.GetFileName(mFilename) + " - Bauzoid ShapeEditor";
86
            else
87
                mOwner.Text = "Bauzoid ShapeEditor";
88
        }
89
 
1386 chris 90
        public bool NewDocument()
1397 chris 91
        {  
92
            Destroy();
93
 
1386 chris 94
            mIsDirty = false;
95
 
1398 chris 96
            ChangeSprite("data/textures/test.png");
1409 chris 97
 
98
            SetMainFormCaption();
1398 chris 99
 
1386 chris 100
            return true;
101
        }
102
 
103
        public bool LoadDocument(String filename)
104
        {
1397 chris 105
            Destroy();
106
 
107
            mIsDirty = false;
1386 chris 108
            mFilename = filename;
109
 
1407 chris 110
            string spriteFile = Path.ChangeExtension(filename, "png");
1422 chris 111
 
112
            if (!File.Exists(spriteFile))
113
                spriteFile = "data/textures/test.png";
114
 
1407 chris 115
            ChangeSprite(spriteFile);
116
 
1414 chris 117
            if (!FileUtil.LoadLevel(mFilename, this))
1407 chris 118
                return false;
119
 
1409 chris 120
            SetMainFormCaption();
121
 
1407 chris 122
            return true;
1386 chris 123
        }
124
 
125
        public bool SaveDocument()
126
        {
127
            // save mLevelElements
1414 chris 128
            if (!FileUtil.SaveLevel(mFilename, this))
129
                return false;
1409 chris 130
 
131
            SetMainFormCaption();
132
 
1414 chris 133
            return true;
1386 chris 134
        }
135
 
1398 chris 136
        public bool SaveDocument(string filename)
1386 chris 137
        {
138
            mFilename = filename;
139
            return SaveDocument();
140
        }
141
 
1398 chris 142
        public void ChangeSprite(string filename)
143
        {
144
            DestroySprite();
145
 
146
            string atlasFile = Path.ChangeExtension(filename, "txt");
147
            if (File.Exists(atlasFile))
148
            {
149
                mSprite = new Sprite(MainForm.App.getGraphics(), filename, atlasFile);
150
            }
151
            else
152
            {
153
                mSprite = new Sprite(MainForm.App.getGraphics(), filename);
154
            }
155
            mSprite.init();
156
 
157
            mSpriteInstance = mSprite.createSpriteInstanceForAll();
1407 chris 158
 
159
            mSpriteInstance.transform.x = 0;
160
            mSpriteInstance.transform.y = 0;
161
            mSpriteInstance.transform.w = mSpriteInstance.getSprite().getTextureWidth() * mSpriteInstance.getSpriteRegion().getWidth();
162
            mSpriteInstance.transform.h = mSpriteInstance.getSprite().getTextureHeight() * mSpriteInstance.getSpriteRegion().getHeight();
163
            mSpriteInstance.transform.pivotX = 0;
164
            mSpriteInstance.transform.pivotY = 0;
1398 chris 165
        }
166
 
1397 chris 167
        public void Render()
168
        {
169
            Graphics g = MainForm.App.getGraphics();
170
 
1401 chris 171
            for (int i = 0; i < mShapeElements.Count; i++)
1397 chris 172
            {
1402 chris 173
                if (mOwner.ElementsListBox.SelectedIndex == i)
1408 chris 174
                    mShapeElements.ElementAt(i).RenderSelected(mSpriteInstance.transform, mOwner.Interaction.Mode == InteractionMode.SELECT);
1402 chris 175
                else
1408 chris 176
                    mShapeElements.ElementAt(i).Render(mSpriteInstance.transform);
1397 chris 177
            }
178
        }
179
 
1405 chris 180
        /*public bool IsInsideHandle(int x, int y)
1404 chris 181
        {
182
            for (int i = mShapeElements.Count - 1; i >= 0; i--)
183
            {
184
                if (mShapeElements.ElementAt(i).IsInsideHandle(x, y, mSpriteInstance.transform, mOwner.ZoomFactor))
185
                    return true;
186
            }
187
 
188
            return false;
1405 chris 189
        }*/
190
 
191
        public BaseShapeElement GetSelectedElement()
192
        {
193
            if (mOwner.ElementsListBox.Items.Count == 0)
194
                return null;
195
 
196
            if (mOwner.ElementsListBox.SelectedIndex == -1)
197
                return null;
198
 
199
            return mShapeElements.ElementAt(mOwner.ElementsListBox.SelectedIndex);
1404 chris 200
        }
201
 
1408 chris 202
        public BaseShapeElement SelectAt(float x, float y)
1406 chris 203
        {
204
            if (mOwner.ElementsListBox.Items.Count == 0)
205
                return null;
206
 
207
            if (mOwner.ElementsListBox.SelectedIndex == -1)
208
                return null;
209
 
210
            for (int i = mShapeElements.Count - 1; i >= 0; i--)
211
            {
212
                if (mShapeElements.ElementAt(i).IsInside(x, y))
213
                {
214
                    mOwner.ElementsListBox.SelectedIndex = i;
215
                    return mShapeElements.ElementAt(i);
216
                }
217
            }
218
 
219
            return null;
220
        }
221
 
1402 chris 222
        public void RenderHandle(float x, float y, SpriteTransform t)
223
        {
1408 chris 224
            //Vector2 p = t.spriteToWorld(x, y);
1402 chris 225
 
1408 chris 226
            mHandle.getSpriteTransform().x = x * mOwner.ZoomFactor + mSpriteInstance.transform.x;
227
            mHandle.getSpriteTransform().y = y * mOwner.ZoomFactor + mSpriteInstance.transform.y;
1402 chris 228
            mHandle.render();
229
        }
230
 
1401 chris 231
        public void AddRectangle(float x, float y, float w, float h)
232
        {
1408 chris 233
            string name = "rect " + x + ", " + y + ", " + w + ", " + h;
234
            RectangleElement e = new RectangleElement(this, name, x, y, w, h);
1402 chris 235
            mShapeElements.Add(e);
236
            mOwner.ElementsListBox.Items.Add(e);
237
            mOwner.ElementsListBox.SelectedIndex = mOwner.ElementsListBox.Items.Count - 1;
1409 chris 238
 
239
            mIsDirty = true;
1401 chris 240
        }
241
 
1416 chris 242
        public void AddEllipse(float centerX, float centerY, float radiusX, float radiusY)
243
        {
244
            string name = "ellipse " + centerX + ", " + centerY + ", " + radiusX + ", " + radiusY;
245
            EllipseElement e = new EllipseElement(this, name, centerX, centerY, radiusX, radiusY);
246
            mShapeElements.Add(e);
247
            mOwner.ElementsListBox.Items.Add(e);
248
            mOwner.ElementsListBox.SelectedIndex = mOwner.ElementsListBox.Items.Count - 1;
249
 
250
            mIsDirty = true;
251
        }
252
 
1419 chris 253
        public void AddPolygon(List<Vector2> vertices)
254
        {
255
            if (vertices.Count < 3)
256
                return;
257
 
258
            string name = "polygon " + vertices.First().x + ", " + vertices.First().y + " -->";
1421 chris 259
 
260
            PolygonElement e = new PolygonElement(this, name, vertices);
261
            mShapeElements.Add(e);
262
            mOwner.ElementsListBox.Items.Add(e);
263
 
1419 chris 264
            /*EllipseElement e = new EllipseElement(this, name, centerX, centerY, radiusX, radiusY);
265
            mShapeElements.Add(e);
266
            mOwner.ElementsListBox.Items.Add(e);*/
267
            mOwner.ElementsListBox.SelectedIndex = mOwner.ElementsListBox.Items.Count - 1;
268
 
269
            mIsDirty = true;
270
        }
271
 
1411 chris 272
        public void DeleteCurrent()
273
        {
274
            int i = mOwner.ElementsListBox.SelectedIndex;
275
            if (i == -1)
276
                return;
277
 
278
            mShapeElements.RemoveAt(i);
279
            mOwner.ElementsListBox.Items.RemoveAt(i);
280
            mOwner.ElementsListBox.SelectedIndex = Math.Min(i, mOwner.ElementsListBox.Items.Count - 1);            
281
        }
282
 
283
        public void MoveUp()
284
        {
285
            int i = mOwner.ElementsListBox.SelectedIndex;
286
            if (i <= 0)
287
                return;
288
 
289
            BaseShapeElement e = mShapeElements.ElementAt(i);
290
            mShapeElements.RemoveAt(i);
291
            mOwner.ElementsListBox.Items.RemoveAt(i);
292
            mShapeElements.Insert(i - 1, e);
293
            mOwner.ElementsListBox.Items.Insert(i - 1, e);
294
            mOwner.ElementsListBox.SelectedIndex = i - 1;
295
        }
296
 
297
        public void MoveDown()
298
        {
299
            int i = mOwner.ElementsListBox.SelectedIndex;
300
            if ((i == -1) || (i >= (mOwner.ElementsListBox.Items.Count-1)))
301
                return;
302
 
303
            BaseShapeElement e = mShapeElements.ElementAt(i);
304
            mShapeElements.RemoveAt(i);
305
            mOwner.ElementsListBox.Items.RemoveAt(i);
306
            mShapeElements.Insert(i + 1, e);
307
            mOwner.ElementsListBox.Items.Insert(i + 1, e);
308
            mOwner.ElementsListBox.SelectedIndex = i + 1;
309
        }
310
 
1412 chris 311
        public BaseShapeElement GetCurrentShape()
312
        {
313
            if (mOwner.ElementsListBox.SelectedIndex == -1)
314
                return null;
315
 
316
            return mShapeElements.ElementAt(mOwner.ElementsListBox.SelectedIndex);
317
        }
318
 
1409 chris 319
        public void SetDirty(bool dirty = true)
1386 chris 320
        {
321
            mIsDirty = dirty;
322
        }
323
 
324
        public bool IsDirty()
325
        {
326
            return mIsDirty;
327
        }
328
 
329
        public String GetFilename()
330
        {
331
            return mFilename;
332
        }
333
 
334
        public void SetFilename(String filename)
335
        {
336
            mFilename = filename;
337
        }
338
 
339
        public bool IsFilenameSet()
340
        {
341
            return (mFilename != null);
342
        }
1397 chris 343
 
344
        public SpriteInstance GetSpriteInstance()
345
        {
346
            return mSpriteInstance;
347
        }
1386 chris 348
    }
349
}