nycos62 Posted January 23, 2019 Share Posted January 23, 2019 Hello folks, wonderfull work !, already made 3 plugin for pixelart automations, I love codeLab is there a way to change canvas Size by code with CodeLab ?, I didn't find informations about that on boltbait website cheers ! Quote Link to comment Share on other sites More sharing options...
AndrewDavid Posted January 23, 2019 Share Posted January 23, 2019 Hi @nycos62 Welcome to the Forum. I remember this question being asked before and here is the appropriate response from @Rick Brewster Posted for a quick answer. 1 Quote Link to comment Share on other sites More sharing options...
toe_head2001 Posted January 23, 2019 Share Posted January 23, 2019 17 minutes ago, nycos62 said: is there a way to change canvas Size by code with CodeLab There's no way for a plugin to change the canvas size; CodeLab or otherwise. 1 Quote My Gallery | My Plugin Pack Layman's Guide to CodeLab Link to comment Share on other sites More sharing options...
nycos62 Posted January 23, 2019 Author Share Posted January 23, 2019 (edited) ok thank you, anyway I don't know if it could interest someone, but I made this : image you have a spritesheet with Cells 32px by 32px with multiple layers ... ... and you want to draw a weapon but you didn't let enough room to draw it , so you must extend the cells size, it's a huge work to do with mouse/selection/displace things, but with this code it's really easy : example: spritesheet (canvas size 160*160, with 5*5 cells of 32*32 px) you want now 40*40px first you change canvas size as it cannot be done by code from 160*160 to 200*200 px (5 * 40 px ) so you set this (see picture attached) source code : (quick and dirty but it's working... ) // Name: SpriteSheet Grid Modifier // Submenu: PixelArt // Author: Nycos62 // Title: SpriteSheet Grid Modifier // Version: 0.1 // Desc: Modify Cell Grid Size in all layers // Keywords: // URL: // Help: #region UICode IntSliderControl Amount1 = 0; // [0,100] X Cell number IntSliderControl Amount2 = 0; // [0,100] Y Cell number IntSliderControl Amount3 = 0; // [0,100] Original Cell width (X) IntSliderControl Amount4 = 0; // [0,100] Original Cell height (Y) IntSliderControl Amount5 = 0; // [0,100] Desired Cell width (New X) IntSliderControl Amount6 = 0; // [0,100] Desired Cell height (New Y) #endregion void Render(Surface dst, Surface src, Rectangle rect) { int XOffset = 0; int YOffset = 0; int XDiff = Amount5 - Amount3; int YDiff = Amount6 - Amount4; if (XDiff %2 == 0) XOffset = XDiff / 2; else XOffset = (int)(XDiff / 2);//odd even cell dimension TODO if (YDiff %2 == 0) YOffset = YDiff / 2; else YOffset = (int)(YDiff / 2);//odd even cell dimension TODO int XOffsetAfter = XDiff - XOffset; int YOffsetAfter = YDiff - YOffset; ColorBgra transparentPixel = new ColorBgra(); transparentPixel.A = 0; transparentPixel.B = 0; transparentPixel.G = 0; transparentPixel.Bgra = 0; for (int y = rect.Top; y < rect.Bottom; y++) { for (int x = rect.Left; x < rect.Right; x++) { dst[x,y] = transparentPixel; } } for (int cx = 0; cx < Amount1; cx++) { int XDecay = Math.Max(cx,0) * XOffsetAfter; for (int cy = 0; cy < Amount2; cy++) { int YDecay = Math.Max(cy,0) * YOffsetAfter; if (IsCancelRequested) return; //Copy cell with Offset for (int cell_posX = 0; cell_posX < Amount3; cell_posX++) { for (int cell_posY = 0; cell_posY < Amount4; cell_posY++) { //TODO : ignore dst out of bound x,y dst[cx * Amount3 + cell_posX + (cx+1) * XOffset + XDecay, cy * Amount4 + cell_posY + (cy+1) * YOffset + YDecay] = src[cx * Amount3 + cell_posX, cy * Amount4 + cell_posY]; } } } } } I hope it could help someone one day , it was really a pain to do by mouse and selection before I discovered CodeLab Edited January 23, 2019 by nycos62 Quote Link to comment Share on other sites More sharing options...
toe_head2001 Posted January 23, 2019 Share Posted January 23, 2019 38 minutes ago, nycos62 said: I don't know if it could interest someone, but I made this : I don't work on spritesheets, but that seems like it would be very useful to some people. Here are a few suggestions... Change all the defaults from 0. That way, when someone first opens the effect they can see it's doing something; rather than just blanking the canvas. Change this code: ColorBgra transparentPixel = new ColorBgra(); transparentPixel.A = 0; transparentPixel.B = 0; transparentPixel.G = 0; transparentPixel.Bgra = 0; for (int y = rect.Top; y < rect.Bottom; y++) { for (int x = rect.Left; x < rect.Right; x++) { dst[x,y] = transparentPixel; } } To this: for (int y = rect.Top; y < rect.Bottom; y++) { for (int x = rect.Left; x < rect.Right; x++) { dst[x,y] = ColorBgra.Transparent; } } Or, better yet, this one line: dst.Clear(rect, ColorBgra.Transparent); 1 1 Quote My Gallery | My Plugin Pack Layman's Guide to CodeLab Link to comment Share on other sites More sharing options...
nycos62 Posted January 23, 2019 Author Share Posted January 23, 2019 2 minutes ago, toe_head2001 said: dst.Clear(rect, ColorBgra.Transparent); perfect Quote Link to comment Share on other sites More sharing options...
AndrewDavid Posted January 24, 2019 Share Posted January 24, 2019 After copying and pasting the original code into codelab I am able to preview the effect and see that a white layer would be rendered to square blocks. Moving the sliders adjusts as expected but of course it doesn't render to canvas. After I build and install the DLL, then restart Paint.Net, moving the fourth slider results in this crash report.. File: C:\Program Files\paint.net\Effects\SpriteSheetGridModifier.dll Name: SpriteSheetGridModifierEffect.SpriteSheetGridModifierEffectPlugin Version: 0.1.6963.23219 Author: Copyright ©2019 by Nycos62 Copyright: Modify Cell Grid Size in all layers Website: https://www.getpaint.net/redirect/plugins.html Full error message: PaintDotNet.WorkerThreadException: Worker thread threw an exception ---> System.ArgumentOutOfRangeException: Coordinates out of range, max={Width=799, Height=599} Parameter name: (x,y) Actual value was {X=-11,Y=0}. at PaintDotNet.ExceptionUtil.ThrowArgumentOutOfRangeException(String paramName, Object actualValue, String message) in D:\src\pdn\src\Base\ExceptionUtil.cs:line 88 at PaintDotNet.Surface.GetSetItemThrow(Int32 x, Int32 y) in D:\src\pdn\src\Core\Surface.cs:line 813 at SpriteSheetGridModifierEffect.SpriteSheetGridModifierEffectPlugin.Render(Surface dst, Surface src, Rectangle rect) at SpriteSheetGridModifierEffect.SpriteSheetGridModifierEffectPlugin.OnRender(Rectangle[] rois, Int32 startIndex, Int32 length) at PaintDotNet.Effects.Effect`1.Render(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs, Rectangle[] rois, Int32 startIndex, Int32 length) in D:\src\pdn\src\Effects\Effect`1.cs:line 99 at PaintDotNet.Effects.BackgroundEffectRenderer.RenderWithClipMask(Effect effect, EffectConfigToken token, RenderArgs dstArgs, RenderArgs srcArgs, RectInt32[] rois, IRenderer`1 clipMaskRenderer) in D:\src\pdn\src\PaintDotNet\Effects\BackgroundEffectRenderer.cs:line 196 at PaintDotNet.Effects.BackgroundEffectRenderer.RendererContext.RenderTile(EffectConfigToken token, Int32 tileIndex) in D:\src\pdn\src\PaintDotNet\Effects\BackgroundEffectRenderer.cs:line 175 at PaintDotNet.Effects.BackgroundEffectRenderer.RendererContext.RenderNextTile(EffectConfigToken token) in D:\src\pdn\src\PaintDotNet\Effects\BackgroundEffectRenderer.cs:line 167 at PaintDotNet.Effects.BackgroundEffectRenderer.ThreadFunction() in D:\src\pdn\src\PaintDotNet\Effects\BackgroundEffectRenderer.cs:line 267 --- End of inner exception stack trace --- at PaintDotNet.Effects.BackgroundEffectRenderer.DrainExceptions() in D:\src\pdn\src\PaintDotNet\Effects\BackgroundEffectRenderer.cs:line 443 at PaintDotNet.Effects.BackgroundEffectRenderer.Abort() in D:\src\pdn\src\PaintDotNet\Effects\BackgroundEffectRenderer.cs:line 399 at PaintDotNet.Effects.BackgroundEffectRenderer.Start() in D:\src\pdn\src\PaintDotNet\Effects\BackgroundEffectRenderer.cs:line 345 at PaintDotNet.Menus.EffectMenuBase.<>c__DisplayClass41_4.<RunEffectImpl>b__4() in D:\src\pdn\src\PaintDotNet\Menus\EffectMenuBase.cs:line 926 Starting to think something might be wrong with my system 1 Quote Link to comment Share on other sites More sharing options...
toe_head2001 Posted January 24, 2019 Share Posted January 24, 2019 21 minutes ago, AndrewDavid said: Starting to think something might be wrong with my system Looks like this is the real issue: Quote Actual value was {X=-11,Y=0}. A negative coordinate. nycos62's math must be incorrect. 1 Quote My Gallery | My Plugin Pack Layman's Guide to CodeLab Link to comment Share on other sites More sharing options...
AndrewDavid Posted January 24, 2019 Share Posted January 24, 2019 @toe_head2001 Thanks for the reply. Looks like it is very easy to go out of bounds. Adjusting the sliders in the proper order as not to go out of bounds is the answer. No safeguards to warn the user like I have seen in other plugins. Adjusting the sliders from the bottom seemed to work until I got to the top sliders and rendered another crash. Same issue with values set to negative numbers. Posted for @nycos62 1 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 24, 2019 Author Share Posted January 24, 2019 1 hour ago, AndrewDavid said: After I build and install the DLL, then restart Paint.Net, moving the fourth slider results in this crash report.. sorry, I posted a quick and dirty code as I was really excited with the discover of codeLab 15 minutes ago. I rework the script tomorrow and post a bug free code 1 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 Here it is : // Name: SpriteSheet Grid Modifier // Submenu: PixelArt // Author: Nycos62 // Title: SpriteSheet Grid Modifier // Version: 0.1 // Desc: Modify Cell Grid Size in all layers // Keywords: // URL: // Help: #region UICode IntSliderControl Amount1 = 3; // [0,100] X Cell number IntSliderControl Amount2 = 3; // [0,100] Y Cell number IntSliderControl Amount3 = 10; // [0,100] Original Cell width (X) IntSliderControl Amount4 = 10; // [0,100] Original Cell height (Y) IntSliderControl Amount5 = 14; // [0,100] Desired Cell width (New X) IntSliderControl Amount6 = 14; // [0,100] Desired Cell height (New Y) #endregion void Render(Surface dst, Surface src, Rectangle rect) { //clear dest dst.Clear(rect, ColorBgra.Transparent); int XOffset = 0; int YOffset = 0; int XDiff = Amount5 - Amount3; int YDiff = Amount6 - Amount4; if (XDiff %2 == 0) XOffset = XDiff / 2; else XOffset = (int)(XDiff / 2); //TODO verify if (YDiff %2 == 0) YOffset = YDiff / 2; else YOffset = (int)(YDiff / 2); //TODO verify int XOffsetAfter = XDiff - XOffset; int YOffsetAfter = YDiff - YOffset; for (int cx = 0; cx < Amount1; cx++) { int XDecay = Math.Max(cx,0) * XOffsetAfter; for (int cy = 0; cy < Amount2; cy++) { int YDecay = Math.Max(cy,0) * YOffsetAfter; if (IsCancelRequested) return; //Copy cell with Offset for (int cell_posX = 0; cell_posX < Amount3; cell_posX++) { for (int cell_posY = 0; cell_posY < Amount4; cell_posY++) { int Xdest = cx * Amount3 + cell_posX + (cx+1) * XOffset + XDecay; int Ydest = cy * Amount4 + cell_posY + (cy+1) * YOffset + YDecay; int XSource = cx * Amount3 + cell_posX; int YSource = cy * Amount4 + cell_posY; //avoid drawing out of bounds dst/src [x,y] if (Xdest < dst.Bounds.Width && Ydest < dst.Bounds.Height && XSource < dst.Bounds.Width && YSource < dst.Bounds.Height) dst[Xdest, Ydest] = src[XSource, YSource]; } } } } } 1 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 DrawBackGroundGrid plugin to "draw a grid on the background spritesheet layer" // Name: DrawGrid // Submenu: PixelArt // Author: Nycos62 // Title: DrawGrid // Version: 0.1 // Desc: Draw a background spritesheet grid for a given width and height // Keywords: // URL: // Help: #region UICode IntSliderControl Amount1 = 32; // [0,1000] Grid cell width (X) IntSliderControl Amount2 = 32; // [0,1000] Grid cell height (Y) #endregion void Render(Surface dst, Surface src, Rectangle rect) { ColorBgra GridOdd = ColorBgra.HotPink; ColorBgra GridEven = ColorBgra.Lime; for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { if (x/Amount1 %2 == 0) if (y/Amount2 %2 == 0) dst[x,y] = GridOdd; else dst[x,y] = GridEven; else if (y/Amount2 %2 == 0) dst[x,y] = GridEven; else dst[x,y] = GridOdd; } } } Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 (edited) DrawCenterCell to draw a line on the center of the cell (line has 2 pixel width if cell dimension is even to see the real center of the cell) // Name: DrawCenterCell // Submenu: PixelArt // Author: Nycos62 // Title: Draw Center Cell Indicator // Version: 0.1 // Desc: Draw a line in center of cell for a given width and height // Keywords: // URL: // Help: #region UICode IntSliderControl Amount1 = 32; // [0,1000] Grid cell width (X) IntSliderControl Amount2 = 32; // [0,1000] Grid cell height (Y) #endregion void Render(Surface dst, Surface src, Rectangle rect) { //clear dest dst.Clear(rect, ColorBgra.Transparent); ColorBgra LineColor = ColorBgra.White; int CellCenterX = Amount1 / 2; int CellCenterY = Amount2 / 2; for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { if ((x + CellCenterX)%Amount1 == 0 && y%2 == 0) dst[x,y] = LineColor; if ((y + CellCenterY)%Amount2 == 0 && x%2 == 0) dst[x,y] = LineColor; if (Amount1 % 2 == 0) if ((x + CellCenterX - 1)%Amount1 == 0 && y%2 == 1) dst[x,y] = LineColor; if (Amount2 % 2 == 0) if ((y + CellCenterY - 1)%Amount2 == 0 && x%2 == 1) dst[x,y] = LineColor; } } } Edited January 26, 2019 by nycos62 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 (edited) PixelArt plugin Files DrawGrid.zip DrawCenterCell.zip SpriteSheet Grid Modifier.zip It could be great to add a OpenFileLocation Button after CodeLab generate a dll Edited October 5, 2020 by nycos62 add menu picture 1 Quote Link to comment Share on other sites More sharing options...
BoltBait Posted January 26, 2019 Share Posted January 26, 2019 6 minutes ago, nycos62 said: It could be great to add a OpenFileLocation Button after CodeLab generate a dll CodeLab just puts the built zip files on the user's desktop. They should be pretty easy to find by pressing and holding the windows key then pressing D. Quote Click to play: Download: BoltBait's Plugin Pack | CodeLab | and how about a Computer Dominos Game Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 (edited) maybe only at the first build ? Edited January 26, 2019 by nycos62 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 8 minutes ago, BoltBait said: They should be pretty easy to find I'm lazy Quote Link to comment Share on other sites More sharing options...
AndrewDavid Posted January 26, 2019 Share Posted January 26, 2019 @nycos62 Thanks for the updated code. Works as expected now. I believe i can make use of it in something other than sprite sheets. The more code I gather, the more chance I have to learn. Your other two may be a little redundant. We have a few grid makers already built, but the center line I believe is unique for centering on the sprite sheet squares. With over 1K plugins now, its difficult to find something new. 1 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 (edited) good news ! I could not find these plugins, searched about 1 hour, and found codeLab, cost less time to code than search 😃 Edited January 26, 2019 by nycos62 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 26, 2019 Author Share Posted January 26, 2019 (edited) On 1/26/2019 at 9:09 PM, AndrewDavid said: We have a few grid makers already built with this plugin you can guess the sprite dimensions when you start to work with pixel art materials found in google pictures, and you must know dimensions to import sprite sheets in game engine. For my personnal use I find them pretty effective. SpriteSheets are often packed, and in order to use AnimationHelper plugin from Pixelbyte Studio, you must center your sprite on tiles with same dimension Edited January 28, 2019 by nycos62 Quote Link to comment Share on other sites More sharing options...
Ego Eram Reputo Posted January 27, 2019 Share Posted January 27, 2019 5 hours ago, nycos62 said: I could not find these plugins, searched about 1 hour, It's as easy as this: https://forums.getpaint.net/topic/15260-plugin-index/ Search Option keyword = grid Quote ebook: Mastering Paint.NET | resources: Plugin Index | Stereogram Tut | proud supporter of Codelab plugins: EER's Plugin Pack | Planetoid | StickMan | WhichSymbol+ | Dr Scott's Markup Renderer | CSV Filetype | dwarf horde plugins: Plugin Browser | ShapeMaker Link to comment Share on other sites More sharing options...
AndrewDavid Posted January 27, 2019 Share Posted January 27, 2019 (edited) Rendered with your plugin assistance @nycos62 Edited February 7, 2019 by AndrewDavid Refreshed Link 1 Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 27, 2019 Author Share Posted January 27, 2019 27 minutes ago, AndrewDavid said: Rendered with your plugin assistance nice !! could you share code ? Quote Link to comment Share on other sites More sharing options...
AndrewDavid Posted January 27, 2019 Share Posted January 27, 2019 @nycos62 Guess I should have said painted instead of rendered. 40 Frame GIF. Right click - save as if you want the GIF. Quote Link to comment Share on other sites More sharing options...
nycos62 Posted January 27, 2019 Author Share Posted January 27, 2019 57 minutes ago, Ego Eram Reputo said: Search Option keyword = grid sorry to disturb , okay.. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.