source: 2014/30/MikkoI/frakt/frakt/frakt/Game1.cs @ 5705

Revision 5705, 28.1 KB checked in by mijoilmo, 5 years ago (diff)

update

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Threading;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.GamerServices;
9using Microsoft.Xna.Framework.Graphics;
10using Microsoft.Xna.Framework.Input;
11using Microsoft.Xna.Framework.Media;
12using System.IO;
13
14namespace frakt
15{
16    /// <summary>
17    /// This is the main type for your game
18    /// </summary>
19    public class WooooFract : Microsoft.Xna.Framework.Game
20    {
21        GraphicsDeviceManager graphics;
22        SpriteBatch spriteBatch;
23        Vector2 viewportSize;
24        KeyboardState keyboardState;
25        KeyboardState oldKeyboardState;
26        MouseState mouseState;
27        MouseState oldMouseState;
28
29        SpriteFont command;
30
31        Vector2 imageSize = Vector2.Zero;
32
33        Texture2D pixel;
34        System.Drawing.Bitmap image;
35        Texture2D referenceImage;
36
37        string commandStr = "";
38        bool infoHide = false;
39        string errorMessage = "";
40
41        bool rendering = false;
42
43        bool allowPanorama = false;
44
45        decimal[,][] pointData;
46
47        decimal[] gridOffset = new decimal[2] { 0, 0 };
48        decimal[] gridScale = new decimal[2] { 4, 4 };
49        decimal[] calcResolution = new decimal[2] { 10, 10 };
50        int calcIterations = 1;
51        int iterationColors = 1;
52
53        decimal[] downPos;
54        decimal[] upPos;
55
56        GameTime gameTime;
57
58        Color[] data;
59
60        int maxThreads = 4;
61
62        public WooooFract()
63        {
64            graphics = new GraphicsDeviceManager(this);
65            graphics.PreferredBackBufferWidth = 500;
66            graphics.PreferredBackBufferHeight = 500;
67            Content.RootDirectory = "Content";
68            IsMouseVisible = true;
69        }
70
71        /// <summary>
72        /// Allows the game to perform any initialization it needs to before starting to run.
73        /// This is where it can query for any required services and load any non-graphic
74        /// related content.  Calling base.Initialize will enumerate through any components
75        /// and initialize them as well.
76        /// </summary>
77        protected override void Initialize()
78        {
79            // TODO: Add your initialization logic here
80            pixel = new Texture2D(GraphicsDevice, 1, 1);
81            pixel.SetData(new UInt32[] { UInt32.MaxValue });
82
83            base.Initialize();
84
85            renderImage();
86        }
87
88        void renderImage()
89        {
90            rendering = true;
91            viewportSize.X = Window.ClientBounds.Width;
92            viewportSize.Y = Window.ClientBounds.Height;
93
94            GraphicsDevice.Textures[0] = null;
95
96            //if (calcResolution[0] > 2048) { calcResolution[0] = 2048; }
97            //if (calcResolution[1] > 2048) { calcResolution[1] = 2048; }
98
99            int threads = Math.Min(maxThreads, (int)Math.Min(calcResolution[0], calcResolution[1]));
100
101            imageSize = new Vector2((int)calcResolution[0], (int)calcResolution[1]);
102
103            if (image != null) image.Dispose();
104            this.pointData = null;
105
106            System.Drawing.Bitmap[] images = new System.Drawing.Bitmap[threads];
107
108            //alusta fraktaalin numeerinen data
109            this.pointData = new decimal[(int)imageSize.X, (int)imageSize.Y][];
110
111            image = new System.Drawing.Bitmap((int)imageSize.X, (int)imageSize.Y);
112
113
114            Thread[] apurit = new Thread[threads];
115
116            this.data = new Color[(int)imageSize.X * (int)imageSize.Y];
117
118            for (int y = 0; y < threads; y++)
119            {
120                int yy = y;
121                apurit[y] = new Thread(delegate(object o)
122                {
123                    int alku = ((int)imageSize.Y / threads) * yy;
124                    int loppu = ((int)imageSize.Y / threads) * (yy + 1);
125                    if (yy == threads - 1) { loppu = (int)imageSize.Y; }
126
127                    images[yy] = Test(alku, loppu);
128                });
129
130                apurit[y].Start(null);
131            }
132
133            for (int y = 0; y < threads; y++)
134            {
135                apurit[y].Join();
136            }
137
138            using (System.Drawing.Graphics grfx = System.Drawing.Graphics.FromImage(image))
139            {
140                int totalY = 0;
141                for (var y = 0; y < threads; y++)
142                {
143                    grfx.DrawImage(images[y], 0, totalY);
144                    totalY += images[y].Height;
145                }
146            }
147
148            Vector2 refSize = new Vector2(Math.Min(image.Width, 2048), Math.Min(image.Height, 2048));
149
150            Color[] pixels = new Color[(int)(refSize.X * refSize.Y)];
151            for (int y = 0; y < refSize.Y; y++)
152            {
153                for (int x = 0; x < refSize.X; x++)
154                {
155                    System.Drawing.Color c = image.GetPixel(x, y);
156                    pixels[(y * (int)refSize.X) + x] = new Color(c.R, c.G, c.B, c.A);
157                }
158            }
159
160            referenceImage = new Texture2D(GraphicsDevice, (int)refSize.X, (int)refSize.Y);
161            referenceImage.SetData<Color>(pixels);
162            rendering = false;
163        }
164
165        System.Drawing.Bitmap Test(int alku, int loppu)
166        {
167            Random random = new Random();
168
169            System.Drawing.Bitmap thisImage = new System.Drawing.Bitmap((int)imageSize.X, loppu - alku);
170
171            for (int y = alku; y < loppu; y++)
172            {
173                for (int x = 0; x < imageSize.X; x++)
174                {
175                    decimal VectorX = (gridScale[0] / (int)imageSize.X) * x - (gridScale[0] / 2M) + gridOffset[0];
176                    decimal VectorY = (gridScale[1] / (int)imageSize.Y) * y - (gridScale[1] / 2M) + gridOffset[1];
177                    pointData[x, y] = new decimal[4] { VectorX, VectorY, VectorX, VectorY };
178                    for (int iterations = 0; iterations < calcIterations; iterations++)
179                    {
180                        if (doesPointEscape(this.pointData[x, y]))
181                        {
182                            thisImage.SetPixel(x, y - alku, getColor(iterations, iterationColors + 1));
183                            break;
184                        }
185                        else
186                        {
187                            pointData[x, y] = iteration2d(pointData[x, y]);
188                        }
189                    }
190                }
191            }
192            return thisImage;
193        }
194
195        bool doesPointEscape(decimal[] vec)
196        {
197            return vec[0] * vec[0] + vec[1] * vec[1] > 4;
198        }
199
200        decimal[] iteration2d(decimal[] vec)
201        {
202            decimal[] nvec = new decimal[4];
203            decimal branchLevel = 2M;
204            nvec[0] =
205                //branchLevel * vec[0] - vec[1] * vec[1] - branchLevel * vec[1] * vec[0] * vec[0]; // branch
206            vec[0] * vec[0] - vec[1] * vec[1] + vec[2]; // mandelbrot
207            nvec[1] =
208                //branchLevel * vec[1] - vec[0] * vec[0] - branchLevel * vec[0] * vec[1] * vec[1]; // branch
209            2M * vec[0] * vec[1] + vec[3]; // mandelbrot
210            nvec[2] = vec[2];
211            nvec[3] = vec[3];
212            return nvec;
213        }
214
215        /// <summary>
216        /// LoadContent will be called once per game and is the place to load
217        /// all of your content.
218        /// </summary>
219        protected override void LoadContent()
220        {
221            // Create a new SpriteBatch, which can be used to draw textures.
222            spriteBatch = new SpriteBatch(GraphicsDevice);
223            command = Content.Load<SpriteFont>("fonts/c");
224
225            // TODO: use this.Content to load your game content here
226        }
227
228        /// <summary>
229        /// UnloadContent will be called once per game and is the place to unload
230        /// all content.
231        /// </summary>
232        protected override void UnloadContent()
233        {
234
235        }
236
237        /// <summary>
238        /// Allows the game to run logic such as updating the world,
239        /// checking for collisions, gathering input, and playing audio.
240        /// </summary>
241        /// <param name="gameTime">Provides a snapshot of timing values.</param>
242
243        bool isKeyPressed(Keys key)
244        {
245            return keyboardState.IsKeyDown(key) && oldKeyboardState.IsKeyUp(key);
246        }
247
248        void runCommand(String commandStr)
249        {
250            char splitChar;
251            Char.TryParse(" ", out splitChar);
252            string[] commandSplit = commandStr.Split(splitChar);
253            try
254            {
255                switch (commandSplit[0])
256                {
257                    case "I"://set iterations
258                        switch (commandSplit[1])
259                        {
260                            case "C":
261                                iterationColors = Convert.ToInt32(commandSplit[2]);
262                                break;
263                            default:
264                                calcIterations = Convert.ToInt32(commandSplit[1]);
265                                break;
266                        }
267                        break;
268                    case "R"://set resolution
269                        switch (commandSplit[1])
270                        {
271                            case "X":
272                                calcResolution = Factorize(calcResolution, decimal.Parse(commandSplit[2]), true);
273                                break;
274                            case "Y":
275                                calcResolution = Factorize(calcResolution, decimal.Parse(commandSplit[2]), false);
276                                break;
277                            case "S"://Hard set
278                                switch (commandSplit[2])
279                                {
280                                    case "X":
281                                        calcResolution[0] = Convert.ToInt32(commandSplit[3]);
282                                        break;
283                                    case "Y":
284                                        calcResolution[1] = Convert.ToInt32(commandSplit[3]);
285                                        break;
286                                    case "F":
287                                        calcResolution[0] = Window.ClientBounds.Width;
288                                        calcResolution[1] = Window.ClientBounds.Height;
289                                        break;
290                                    case "A":
291                                        calcResolution[0] = Math.Max(calcResolution[0], calcResolution[1]);
292                                        calcResolution[1] = Math.Max(calcResolution[0], calcResolution[1]);
293                                        break;
294                                    case "I":
295                                        calcResolution[0] = Math.Min(calcResolution[0], calcResolution[1]);
296                                        calcResolution[1] = Math.Min(calcResolution[0], calcResolution[1]);
297                                        break;
298                                    default:
299                                        calcResolution[0] = int.Parse(commandSplit[2]);
300                                        calcResolution[1] = int.Parse(commandSplit[2]);
301                                        break;
302                                }
303                                break;
304                            default:
305                                calcResolution = Factorize(calcResolution, decimal.Parse(commandSplit[1]));
306                                break;
307                        }
308                        break;
309                    case "O"://set offset
310                        switch (commandSplit[1])
311                        {
312                            case "X":
313                                gridOffset[0] = decimal.Parse(commandSplit[2]);
314                                break;
315                            case "Y":
316                                gridOffset[1] = decimal.Parse(commandSplit[2]);
317                                break;
318                            case "O":
319                                gridOffset[0] = 0;
320                                gridOffset[1] = 0;
321                                break;
322                            default:
323                                gridOffset[0] = decimal.Parse(commandSplit[1]);
324                                gridOffset[1] = decimal.Parse(commandSplit[1]);
325                                break;
326                        }
327                        break;
328                    case "P":
329                        allowPanorama = !allowPanorama;
330                        break;
331                    case "H"://hide / show hud
332                        infoHide = !infoHide;
333                        break;
334                    case "W"://set window size
335                        graphics.IsFullScreen = false;
336                        switch (commandSplit[1])
337                        {
338                            case "X":
339                                graphics.PreferredBackBufferWidth = Convert.ToInt32(commandSplit[2]);
340                                break;
341                            case "Y":
342                                graphics.PreferredBackBufferHeight = Convert.ToInt32(commandSplit[2]);
343                                break;
344                            case "F":
345                                graphics.PreferredBackBufferWidth = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
346                                graphics.PreferredBackBufferHeight = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
347                                graphics.IsFullScreen = true;
348                                break;
349                            default:
350                                graphics.PreferredBackBufferWidth = Convert.ToInt32(commandSplit[1]);
351                                graphics.PreferredBackBufferHeight = Convert.ToInt32(commandSplit[1]);
352                                break;
353                        }
354                        graphics.ApplyChanges();
355                        break;
356                    case "S"://Save image
357                        string filePath = "";
358                        if (commandSplit.Length == 1)
359                        {
360                            filePath = DateTime.Now.ToString("MM-dd-yy H;mm;ss") + ".png";
361                        }
362                        else
363                        {
364                            filePath = commandSplit[1] + ".png";
365                        }
366                        //Stream stream = File.Create(filePath);
367                        image.Save(filePath);
368                        //stream.Dispose();
369                        break;
370                    case "RUN"://render
371                        renderImage();
372                        break;
373                    case "EXIT"://exit
374                        Exit();
375                        break;
376                }
377            }
378            catch (System.Exception e)
379            {
380                errorMessage = e.Message;
381            }
382        }
383
384        decimal[] Factorize(decimal[] input, decimal factor, bool overr = false)
385        {
386            if (input[0] > input[1] || overr)
387            {
388                input[1] = (input[1] / input[0]) * factor;
389                input[0] = factor;
390            }
391            else
392            {
393                input[0] = (input[0] / input[1]) * factor;
394                input[1] = factor;
395            }
396            return input;
397        }
398
399        int[] Factorize(int[] input, double factor, bool overr = false)
400        {
401            if (input[0] > input[1] || overr)
402            {
403                input[1] = (int)(((double)input[1] / (double)input[0]) * factor);
404                input[0] = (int)factor;
405            }
406            else
407            {
408                input[0] = (int)(((double)input[0] / (double)input[1]) * factor);
409                input[1] = (int)factor;
410            }
411            return input;
412        }
413
414        void commandTypeCheck()
415        {
416            if (isKeyPressed(Keys.Enter))
417            {
418                runCommand(commandStr);
419                commandStr = "";
420            }
421            if (isKeyPressed(Keys.Back))
422            {
423                if (commandStr != "")
424                    commandStr = commandStr.Substring(0, commandStr.Length - 1);
425            }
426            if (isKeyPressed(Keys.D1)) { commandStr += "1"; }
427            if (isKeyPressed(Keys.D2)) { commandStr += "2"; }
428            if (isKeyPressed(Keys.D3)) { commandStr += "3"; }
429            if (isKeyPressed(Keys.D4)) { commandStr += "4"; }
430            if (isKeyPressed(Keys.D5)) { commandStr += "5"; }
431            if (isKeyPressed(Keys.D6)) { commandStr += "6"; }
432            if (isKeyPressed(Keys.D7)) { commandStr += "7"; }
433            if (isKeyPressed(Keys.D8)) { commandStr += "8"; }
434            if (isKeyPressed(Keys.D9)) { commandStr += "9"; }
435            if (isKeyPressed(Keys.D0)) { commandStr += "0"; }
436            if (isKeyPressed(Keys.OemComma)) { commandStr += ","; }
437
438            if (isKeyPressed(Keys.Q)) { commandStr += "Q"; }
439            if (isKeyPressed(Keys.W)) { commandStr += "W"; }
440            if (isKeyPressed(Keys.E)) { commandStr += "E"; }
441            if (isKeyPressed(Keys.R)) { commandStr += "R"; }
442            if (isKeyPressed(Keys.T)) { commandStr += "T"; }
443            if (isKeyPressed(Keys.Y)) { commandStr += "Y"; }
444            if (isKeyPressed(Keys.U)) { commandStr += "U"; }
445            if (isKeyPressed(Keys.I)) { commandStr += "I"; }
446            if (isKeyPressed(Keys.O)) { commandStr += "O"; }
447            if (isKeyPressed(Keys.P)) { commandStr += "P"; }
448            if (isKeyPressed(Keys.A)) { commandStr += "A"; }
449            if (isKeyPressed(Keys.S)) { commandStr += "S"; }
450            if (isKeyPressed(Keys.D)) { commandStr += "D"; }
451            if (isKeyPressed(Keys.F)) { commandStr += "F"; }
452            if (isKeyPressed(Keys.G)) { commandStr += "G"; }
453            if (isKeyPressed(Keys.H)) { commandStr += "H"; }
454            if (isKeyPressed(Keys.J)) { commandStr += "J"; }
455            if (isKeyPressed(Keys.K)) { commandStr += "K"; }
456            if (isKeyPressed(Keys.L)) { commandStr += "L"; }
457            if (isKeyPressed(Keys.Z)) { commandStr += "Z"; }
458            if (isKeyPressed(Keys.X)) { commandStr += "X"; }
459            if (isKeyPressed(Keys.C)) { commandStr += "C"; }
460            if (isKeyPressed(Keys.V)) { commandStr += "V"; }
461            if (isKeyPressed(Keys.B)) { commandStr += "B"; }
462            if (isKeyPressed(Keys.N)) { commandStr += "N"; }
463            if (isKeyPressed(Keys.M)) { commandStr += "M"; }
464            if (isKeyPressed(Keys.Space)) { commandStr += " "; }
465        }
466
467        protected override void Update(GameTime gameTime)
468        {
469            // Allows the game to exit
470
471            this.gameTime = gameTime;
472
473            this.keyboardState = Keyboard.GetState();
474
475            if (isKeyPressed(Keys.Left))
476            {
477                gridOffset[0] -= gridScale[0] / 10M;//kymmenes imagen koosta
478                renderImage();
479            }
480            else if (isKeyPressed(Keys.Right))
481            {
482                gridOffset[0] += gridScale[0] / 10M;
483                renderImage();
484            }
485            if (isKeyPressed(Keys.Up))
486            {
487                gridOffset[1] -= gridScale[1] / 10M;
488                renderImage();
489            }
490            else if (isKeyPressed(Keys.Down))
491            {
492                gridOffset[1] += gridScale[1] / 10M;
493                renderImage();
494            }
495
496            if (isKeyPressed(Keys.RightShift))
497            {
498                if (keyboardState.IsKeyDown(Keys.LeftShift))
499                {
500                    iterationColors *= 2;
501                }
502                else
503                {
504                    iterationColors += 1;
505                }
506                renderImage();
507            }
508            else if (isKeyPressed(Keys.RightControl))
509            {
510                if (keyboardState.IsKeyDown(Keys.LeftShift))
511                {
512                    iterationColors /= 2;
513                }
514                else
515                {
516                    iterationColors -= 1;
517                }
518                if (iterationColors < 1) { iterationColors = 1; };
519                renderImage();
520            }
521
522            if (isKeyPressed(Keys.Add))
523            {
524                if (keyboardState.IsKeyDown(Keys.LeftShift))
525                {
526                    calcResolution[0] *= 2;
527                    calcResolution[1] *= 2;
528                }
529                else
530                {
531                    calcResolution[0] += 1;
532                    calcResolution[1] += 1;
533                }
534                renderImage();
535            }
536            else if (isKeyPressed(Keys.Subtract))
537            {
538                if (keyboardState.IsKeyDown(Keys.LeftShift))
539                {
540                    calcResolution[0] /= 2;
541                    calcResolution[1] /= 2;
542                }
543                else
544                {
545                    calcResolution[0] -= 1;
546                    calcResolution[1] -= 1;
547                }
548                if (calcResolution[0] < 1 || calcResolution[1] < 1) { calcResolution = new decimal[2] { 1, 1 }; };
549                renderImage();
550            }
551
552            if (isKeyPressed(Keys.OemPlus))
553            {
554                if (keyboardState.IsKeyDown(Keys.LeftShift))
555                {
556                    calcIterations *= 2;
557                }
558                else
559                {
560                    calcIterations += 1;
561                }
562                renderImage();
563            }
564            else if (isKeyPressed(Keys.OemMinus))
565            {
566                if (keyboardState.IsKeyDown(Keys.LeftShift))
567                {
568                    calcIterations /= 2;
569                }
570                else
571                {
572                    calcIterations -= 1;
573                }
574                if (calcIterations < 1) { calcIterations = 1; };
575                renderImage();
576            }
577
578            if (keyboardState.IsKeyDown(Keys.Escape))
579                this.Exit();
580
581            commandTypeCheck();
582
583            this.mouseState = Mouse.GetState();
584
585            if (this.mouseState.ScrollWheelValue != this.oldMouseState.ScrollWheelValue)
586            {
587                if (this.mouseState.ScrollWheelValue > this.oldMouseState.ScrollWheelValue)
588                {
589                    gridScale[0] /= 1.1M;
590                    gridScale[1] /= 1.1M;
591                }
592                else if (this.mouseState.ScrollWheelValue < this.oldMouseState.ScrollWheelValue)
593                {
594                    gridScale[0] *= 1.1M;
595                    gridScale[1] *= 1.1M;
596                }
597                renderImage();
598            }
599
600            if (
601                IsActive // if window is active
602                && !(Window.ClientBounds.Width == 0 || Window.ClientBounds.Height == 0) // and it's not minimized
603                && mouseState.X > 0 && mouseState.Y > 0 // and mouse is
604                && mouseState.X < graphics.PreferredBackBufferWidth && mouseState.Y < graphics.PreferredBackBufferHeight // in the window
605                )
606            {
607                if (mouseState.LeftButton == ButtonState.Pressed && oldMouseState.LeftButton != ButtonState.Pressed)
608                {
609                    //mouse is down and dragging
610                    downPos = new decimal[2] { mouseState.X, mouseState.Y };
611                }
612                if (mouseState.LeftButton == ButtonState.Released && oldMouseState.LeftButton != ButtonState.Released)
613                {
614                    //mouse is up
615                    if (!(Window.ClientBounds.Width == 0 || Window.ClientBounds.Height == 0) && downPos != null)
616                    {
617                        upPos = new decimal[2] { mouseState.X, mouseState.Y };
618                        rezToMouse(downPos, upPos);
619                    }
620                }
621            }
622
623            // TODO: Add your update logic here
624
625            this.oldMouseState = mouseState;
626            this.oldKeyboardState = keyboardState;
627
628            base.Update(gameTime);
629        }
630
631        decimal[] getMousePos(decimal[] mouse)
632        {
633            return new decimal[2] {
634                    ((mouse[0] - (decimal)viewportSize.X / 2) / (decimal)viewportSize.X) * gridScale[0] + gridOffset[0],
635                    ((mouse[1] - (decimal)viewportSize.Y / 2) / (decimal)viewportSize.Y) * gridScale[1] + gridOffset[1]
636                };
637        }
638
639        void rezToMouse(decimal[] topleft, decimal[] botright)
640        {
641            //if panorama is not allowed, scale is always a square. Otherwise resolution is bound to scale
642            decimal[] scale = new decimal[2] { Math.Abs(botright[0] - topleft[0]), Math.Abs(botright[1] - topleft[1]) };
643            topleft = getMousePos(topleft);
644            botright = getMousePos(botright);
645            decimal[] gScale = new decimal[2] { Math.Abs(botright[0] - topleft[0]), Math.Abs(botright[1] - topleft[1]) };
646
647            if (gScale[0] == 0 || gScale[1] == 0) { return; }
648
649            decimal[] center = new decimal[2] { topleft[0] + (botright[0] - topleft[0]) / 2, topleft[1] + (botright[1] - topleft[1]) / 2 };
650            gridOffset = center;
651
652            decimal bigger = Math.Max(gScale[0], gScale[1]);
653            if (allowPanorama)
654            {
655                calcResolution[0] = (int)((scale[0] * (decimal)viewportSize.X) / calcResolution[0]);
656                calcResolution[1] = (int)((scale[1] * (decimal)viewportSize.Y) / calcResolution[1]);
657            }
658            else
659            {
660                gScale = new decimal[2] { bigger, bigger };
661            }
662            gridScale = gScale;
663            if (!allowPanorama) { renderImage(); }
664        }
665
666        /// <summary>
667        /// This is called when the game should draw itself.
668        /// </summary>
669        /// <param name="gameTime">Provides a snapshot of timing values.</param>
670        System.Drawing.Color getColor(float index, float size)
671        {
672            Color[] palette = { new Color(0, 0, 0), new Color(255, 0, 0), new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 255, 255), new Color(0, 0, 255), new Color(0, 0, 0) };
673            index = Math.Abs(index);
674            index = index % size;
675            size--;
676            float realIndex = ((float)Math.Floor(index) / size) * (palette.Length - 1);
677            Color col1 = palette[(int)Math.Floor(realIndex)];
678            Color col2 = palette[(int)Math.Ceiling(realIndex)];
679            float rel = realIndex - (float)Math.Floor(realIndex);
680            return convertColor(Color.Lerp(col1, col2, rel));
681        }
682        System.Drawing.Color convertColor(Color color)
683        {
684            return System.Drawing.Color.FromArgb(color.R, color.G, color.B);
685        }
686        protected override void Draw(GameTime gameTime)
687        {
688            if (rendering) { return; }
689            GraphicsDevice.Clear(Color.White);
690            // TODO: Add your drawing code here
691
692            spriteBatch.Begin();
693            spriteBatch.Draw(referenceImage, new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height), Color.White);
694            spriteBatch.DrawString(command, commandStr, new Vector2(0, 0), Color.Gray);
695            if (!infoHide)
696            {
697                spriteBatch.DrawString(command,
698                    "i:" + calcIterations + "/" + iterationColors + 
699                    "\nr:(" + calcResolution[0] + "," + calcResolution[1] +
700                    ")\nRT:(" + (calcResolution[0] * calcResolution[1]) +
701                    ")\nP:(" + gridOffset[0] +
702                    ",\n" + gridOffset[1] +
703                    ")\ns:" + gridScale[0]
704                    , new Vector2(0, Window.ClientBounds.Height - command.LineSpacing * 4), Color.HotPink);
705                spriteBatch.DrawString(command, errorMessage, new Vector2(Window.ClientBounds.Width - command.MeasureString(errorMessage).X, 0), Color.Red);
706            }
707            spriteBatch.End();
708
709            base.Draw(gameTime);
710        }
711    }
712}
Note: See TracBrowser for help on using the repository browser.