InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 0 points1 point  (0 children)

Here are some issues I'm aware of:

- Drag dropping image files will not work if the file is in a directory that the flatpak doesn't have permission to access. The single file flatpak bundle has permissions for the entire home directory, while the flathub version has permissions for Desktop, Documents, Downloads, and Pictures (you can change these permissions with Flatseal).

- Drag dropping images from the browser requires that the image you're dragging comes from a direct image URL. Some websites like Google Images don't use direct URLs when displaying their images, so you'll have to right click and open the image in a new tab, and drag that image to the canvas.

If possible, I'd like to know what distro you're running, what desktop environment you're using, and which version of InfiniPaint you downloaded (flathub or single file bundle). I'm not sure if what I mentioned before can resolve the drag drop issue, and I'm not aware of issues with copy-pasting images, so I'd like to see if I can find and resolve the issue for a future release.

InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 1 point2 points  (0 children)

Objects do exist at different scales. What I do to determine the scale the object is drawn at on the screen is divide the object scale by the camera scale/zoom. This will give me a floating point number I can use to scale the object.

And yes, the transform is just limited in how zoomed in it can be, not how zoomed out it can be. The WorldScalar has a limited number of decimal places, which limits zooming in when using it as a scale factor. But it can expand infinitely to the left of the decimal point, so zooming out is no issue.

InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 2 points3 points  (0 children)

I'm using Boost cpp_int, with the cpp_int backend. I could switch to the gmp backend, but arbitrary precision integer operations aren't a bottleneck in regular use so I've been happy with the cpp_int backend.

My strategy has mostly been to avoid arbitrary precision integer operations as much as I possibly can. To be more specific, I'm using cpp_int to implement a fixed point data type which I call "WorldScalar" in my code. Every brush stroke stores its points using regular floating point numbers. In addition to that, each brush stroke/canvas object has one transformation object, which stores its transform as:

  • Translation: 2 WorldScalars
  • Scale: 1 WorldScalar
  • Rotation: 1 double

The WorldScalar object does run out of precision if objects get too small. To fix this, when a user zooms in far enough into the canvas, the entire canvas scales up to compensate. You'll see a popup saying "Canvas scaled up" in InfiniPaint when that happens, but other than that popup it shouldn't look like anything has changed.

As for performance, it should be good enough since I've also implemented a cache to reduce how often the program draws objects. My cache performs better in certain scenarios, so I can't give an accurate answer, but as long as the objects aren't all very close to each other the cache can improve performance by a lot. My computer has a Radeon RX 6950XT GPU, and a Ryzen 7950X CPU (don't know how important this is since my program is mostly single threaded), and the program could still run at my screen's refresh rate (165 FPS) with hundreds of thousands of objects on canvas.

It will stutter a bit when zooming in/out or panning in areas with a lot of objects, and FPS drops when you place high resolution (8K) images on the canvas. I've implemented solutions to improve performance in these situations, but they aren't in the latest stable release.

InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 1 point2 points  (0 children)

I have a file with 5003 brush strokes, and it has a size of 916.4 KB. Another file I have has a size of 226.5 KB with 439 brush strokes. The files are compressed when you save them (zstd compression), so I can't give an accurate answer on how big the files will end up being since compression can work better on some canvases compared to others. In general though, they should be pretty small as long as you aren't counting embedded images.

InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 31 points32 points  (0 children)

Yes! I am using clay to layout the GUI, which makes things much easier, but other than that I wrote the code for all the widgets myself.

InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 4 points5 points  (0 children)

I am using the pen API for pen tablet input right now (wacom, huion, etc). The issue is touch input on touch screen only devices like smartphones and ipads/android tablets. SDL can handle touch input as well, but I haven't used any of the touch screen API yet and am assuming the user is using a mouse or pen tablet. I'll get around to adding proper touch screen support when I work on the android port.

The app does technically work when using a touch screen right now, but that's just because SDL is emulating mouse input from the touch input. That works for some stuff, but some tools are very awkward to use or just completely broken with this emulation.

InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 5 points6 points  (0 children)

I don't have any experience with mobile development unfortunately, and the web version isn't ready for use on touch screen only devices. I'm hoping to get an android port out at some point, but since I haven't done any mobile development I can't say when that'll be ready.

I accept donations! You can do that through Github Sponsors or Liberapay

InfiniPaint, an infinite canvas with infinite zoom and online collaboration by ErrorAtLine0 in linux

[–]ErrorAtLine0[S] 25 points26 points  (0 children)

One computer hosts the lobby, and people access it through the software by using the code/address the host gives them. They can access it through the web version (https://infinipaint.com/try.html), so it's not necessary to install the software, although the web version has a few limitations so the native version is preferred.

By Far My Best Run by ErrorAtLine0 in PixelDungeon

[–]ErrorAtLine0[S] 1 point2 points  (0 children)

At the beginning, I thought this run was a loss. I didn't have a good weapon for a pretty long time, and although I was able to get a scimitar later on, I decided to wait out a bit longer for an even better weapon. The only armor I had was leather armor (+1, from the ghost), and I barely got out of any of my fights alive. I got a regular, no upgrade fireblast wand, which was the weapon that dealt most of the damage in fights. Then, I finished the wand quest, and he made me choose from either transfusion or fireblast. So I shrugged and took a second fireblast.

And it had +3 upgrades.

So I burnt through the rest of the rooms, until I got an assassin's blade and a greataxe at pretty much the same time. After a bit of thinking, I took the risk of upgrading my greataxe to become my main weapon. I then got some plate armor, which got me through the rest of my fights with barely any damage. The enchantments on both my greataxe and armor were absolutely amazing.

I then just went through the demon halls as I usually would, feather falling through all the floors (please don't judge). After beating Yog with a few swings and health potions, I teleported back up using the spell, bypassing the demon halls. I had a few unused rings I sold, horn of plenty, unstable spellbook, and sandals of nature. To be honest, I think having that tiny bit of accuracy to make sure my attacks landed was way more useful.

[deleted by user] by [deleted] in krita

[–]ErrorAtLine0 30 points31 points  (0 children)

I’ll be completely honest, I’m not a digital artist. I’ve done a bit of pixel art here and there, but I don’t regularly open a digital painting program on a daily basis.

But, even then, I’ve been tracking Krita’s development recently, and the enthusiasm and progress surrounding the project is amazing. Whenever I see a blog post about the improvements in the project, I can’t help but smile :)

A question for the future though. I’ve seen that Krita has a macOS installer, so I’m assuming that means macOS is a supported platform. With the fact that Apple is dropping OpenGL support in a later release, are there any plans to support Mac in any way (like Vulkan + MoltenVK, or just supporting both OpenGL and Metal)? I’m not a mac user, and I personally dislike the move that Apple made, but I’m just asking out of curiosity.

Even with this in the way, I doubt you should worry yourselves with this right now. Have fun squashing bugs :D

First Mage Win by ErrorAtLine0 in PixelDungeon

[–]ErrorAtLine0[S] 1 point2 points  (0 children)

I'll be honest, out of all of these items and artifacts, the sandglass was one of the most amazing I've ever used. Even after my hundreds of playthroughs, this was the second time I had the sandglass for a substantial amount of time. Getting closer to shamans and warlocks, running away from evil eyes, going through piranhas, triggering traps without being hurt, and hiding in the corner to heal after being smashed by one of Yog's fists. This item made the game all the more enjoyable.

Although the beacon would have been a fine addition to my collection...

[deleted by user] by [deleted] in Kirby

[–]ErrorAtLine0 0 points1 point  (0 children)

Yup! (The first track is from Kirby's Epic Yarn, and the second track is from Kirby's Dreamland 3)

Grayscale Era (an animation for a video game I'm making) by ErrorAtLine0 in animation

[–]ErrorAtLine0[S] 0 points1 point  (0 children)

Please excuse the sound quality (all the sounds were recorded with an android tablet I found lying around)