|
70268
|
Python bank by @syedakhter | Stardance
|
syedakhter
|
1
|
2.0
|
1
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-18T03:56:08Z", "hours": 2.0, "multiplier": 1.07, "payout": 1, "blessing": "neutral", "text": "I made a python bank well not in python but you have to copy and paste the code into a python thing for you to see it in action", "repo": "https://github.com/8051987-eng/python-bank", "demo": "https://8051987-eng.github.io/python-bank/"}]...
|
[{"post_id": 80540, "ts": "202 [{"post_id": 80540, "ts": "2026-10-18T03:54:57Z", "hours": 2.0894, "text": "I made a python bank"}]...
|
Title: Python bank by @syedakhter | Stardance
Dev Title: Python bank by @syedakhter | Stardance
Devlogs:
I made a python bank
Ships:
I made a python bank well not in python but you have to copy and paste the code into a python thing for you to see it in action...
|
1793724478.00743
|
1793810878.00743
|
|
70417
|
Pro website by @syedakhter | Stardance
|
syedakhter
|
1
|
2.0
|
1
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T01:12:51Z", "hours": 2.0, "multiplier": 1.0, "payout": 1, "blessing": "neutral", "text": "This is a website i made using js html and css and this website is going pro.", "repo": "https://github.com/8051987-eng/pro-website", "demo": "https://8051987-eng.github.io/pro-website/"}]...
|
[{"post_id": 80856, "ts": "202 [{"post_id": 80856, "ts": "2026-10-19T01:11:57Z", "hours": 2.0783, "text": "A pro website"}]...
|
Title: Pro website by @syedakhter | Stardance
Dev Title: Pro website by @syedakhter | Stardance
Devlogs:
A pro website
Ships:
This is a website i made using js html and css and this website is going pro....
|
1793703181.7085373
|
1793789581.7085373
|
|
70567
|
Quiz by @syedakhter | Stardance
|
syedakhter
|
2
|
3.0
|
2
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T14:48:00Z", "hours": 2.0, "multiplier": 1.0, "payout": 1, "blessing": "neutral", "text": "i ADDED MORE QUESTIONS", "repo": "https://github.com/8051987-eng/quiz", "demo": "https://8051987-eng.github.io/quiz/"}, {"ship_num": 2, "ts": "2026-10-21T01:53:20Z", "hours": 1.0, "multiplier": 1.0, "payout": 1, "blessing": "neutral", "text": "This project is a quiz", "repo": "https://github.com/8051987-eng/quiz", "demo": "https://8051987-eng.github.io/quiz/"}]...
|
[{"post_id": 82129, "ts": "202 [{"post_id": 82129, "ts": "2026-10-24T01:21:18Z", "hours": 2.045, "text": "Quiz"}, {"post_id": 81144, "ts": "2026-10-20T02:16:31Z", "hours": 1.0067, "text": "A quiz only spent 1hr on this because im busy"}]...
|
Title: Quiz by @syedakhter | Stardance
Devlogs:
A Title: Quiz by @syedakhter | Stardance
Devlogs:
A quiz only spent 1hr on this because im busy
Quiz
Ships:
This project is a quiz
i ADDED MORE QUESTIONS...
|
1793710369.0566032
|
1793796769.0566032
|
|
71331
|
CALM by @syedakhter | Stardance
|
syedakhter
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-25T15:32:48Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This website is going to calm you down and also needs your information.", "repo": "https://github.com/8051987-eng/CALM", "demo": "https://8051987-eng.github.io/CALM/"}]...
|
[{"post_id": 82671, "ts": "202 [{"post_id": 82671, "ts": "2026-10-25T15:31:49Z", "hours": 2.1792, "text": "I made a calming website"}]...
|
Title: CALM by @syedakhter | Stardance
Devlogs:
I Title: CALM by @syedakhter | Stardance
Devlogs:
I made a calming website
Ships:
This website is going to calm you down and also needs your information....
|
1793678158.0115345
|
1793764558.0115345
|
|
71682
|
Store by @syedakhter | Stardance
|
syedakhter
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-28T01:57:52Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a store with 3 items", "repo": "https://github.com/8051987-eng/Store", "demo": "https://8051987-eng.github.io/Store/"}]...
|
[{"post_id": 83493, "ts": "202 [{"post_id": 83493, "ts": "2026-10-28T01:57:26Z", "hours": 1.0861, "text": "I made a store with 3 items"}]...
|
Title: Store by @syedakhter | Stardance
Devlogs:
Title: Store by @syedakhter | Stardance
Devlogs:
I made a store with 3 items
Ships:
I made a store with 3 items...
|
1793674596.9717364
|
1793760996.9717364
|
|
51784
|
My awesome macropad! by @syedaemaanzehrarizvi | St My awesome macropad! by @syedaemaanzehrarizvi | Stardance...
|
syedaemaanzehrarizvi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @syedaemaanzehrariz Title: My awesome macropad! by @syedaemaanzehrarizvi | Stardance...
|
1793404560.2960606
|
1794009360.2960606
|
|
65373
|
My awesome macropad! by @syedabubakar | Stardance
|
syedabubakar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @syedabubakar | Sta Title: My awesome macropad! by @syedabubakar | Stardance...
|
1793699674.8121617
|
1794304474.8121617
|
|
49922
|
My own site! by @syedaarhan | Stardance
|
syedaarhan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @syedaarhan | Stardance
|
1793314074.886763
|
1793918874.886763
|
|
60812
|
My own site! by @syedaaleena678 | Stardance
|
syedaaleena678
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @syedaaleena678 | Stardance
|
1793645676.3804157
|
1794250476.3804157
|
|
20771
|
My first slack bot! by @syed_yahya | Stardance
|
syed_yahya
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @syed_yahya | Starda Title: My first slack bot! by @syed_yahya | Stardance...
|
1793209833.924626
|
1793814633.924626
|
|
7081
|
My awesome macropad! by @syed_hasan | Stardance
|
syed_hasan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @syed_hasan | Stard Title: My awesome macropad! by @syed_hasan | Stardance...
|
1793465707.590361
|
1794070507.590361
|
|
7093
|
Untitled by @syed_hasan | Stardance
|
syed_hasan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @syed_hasan | Stardance
|
1793407631.7131665
|
1794012431.7131665
|
|
19983
|
My very own WebOS by @syed_ahmed | Stardance
|
syed_ahmed
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @syed_ahmed | Stardanc Title: My very own WebOS by @syed_ahmed | Stardance...
|
1793180856.2293398
|
1793785656.2293398
|
|
21036
|
Untitled by @syed_ahmed | Stardance
|
syed_ahmed
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @syed_ahmed | Stardance
|
1793217261.8572586
|
1793822061.8572586
|
|
41061
|
My first slack bot! by @syedS | Stardance
|
syedS
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @syedS | Stardance
|
1793540868.6342
|
1794145668.6342
|
|
51347
|
My own site! by @sydallythy350 | Stardance
|
sydallythy350
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @sydallythy350 | Stardance
|
1793386361.8185656
|
1793991161.8185656
|
|
14042
|
My awesome macropad! by @syclusions | Stardance
|
syclusions
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @syclusions | Stard Title: My awesome macropad! by @syclusions | Stardance...
|
1793526732.8007147
|
1794131532.8007147
|
|
14547
|
Wireless garage door opener by @syclusions | Stard Wireless garage door opener by @syclusions | Stardance...
|
syclusions
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Wireless garage door opener by @syclusions Title: Wireless garage door opener by @syclusions | Stardance...
|
1793382784.9414563
|
1793987584.9414563
|
|
1231
|
My awesome macropad! by @syaxzen | Stardance
|
syaxzen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @syaxzen | Stardanc Title: My awesome macropad! by @syaxzen | Stardance...
|
1793509046.7409434
|
1794113846.7409434
|
|
60035
|
My own site! by @syara | Stardance
|
syara
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @syara | Stardance
|
1793638533.1492748
|
1794243333.1492748
|
|
22716
|
Frictionless by @syakira | Stardance
|
syakira
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @syakira | Stardance
|
1793451152.054499
|
1794055952.054499
|
|
44296
|
My awesome macropad! by @syahnke | Stardance
|
syahnke
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @syahnke | Stardanc Title: My awesome macropad! by @syahnke | Stardance...
|
1793267257.4010277
|
1793872057.4010277
|
|
22423
|
Blueprint by @swum | Stardance
|
swum
|
0
|
107.56
|
0
|
[]
|
[{"post_id": 47795, "ts": "202 [{"post_id": 47795, "ts": "2026-08-15T23:50:38Z", "hours": 74.2214, "text": "Blueprint Beta almost ready to launch soon! After a while, I’m finally almost ready to beta launch for blueprint. I haven’t posted a devlog in a very long time, but I’ve made a bunch of improvements and changes! Nearly all the features work pretty well now. I’m really proud of how our knowledge graph turned out. We were able to make it a good balance between flexibility and actual intelligence. Since this is my first devlog in a while, I won’t go over everything I added, but in future devlogs, I will talk about progress. Feel free to comment anything you would want to see in a productivity app! Part of this is supposed to be somewhat of an all-in-one productivty app, and feature requests/feedback would be greatly appreciated!"}, {"post_id": 19821, "ts": "2026-07-01T06:30:26Z", "hours": 5.6625, "text": "Updated the main page (intelligence page) Basically the intelligence page is split into three different pages: The AI chat, the workspace, and the knowledge graph. You can switch between each other by clicking on the buttons on the right, or by scrolling up and down. This took me a while to come up with and took a lot of iterations. I also updated the agent instructions, so now it should be much more flexible instead of thinking everything in this app is a engineering project. I wanted to use this for personal productivity, but I feel as if it is so much easier to work towards something that benefits tech projects. I’ll try my best to make this as flexible as possible."}, {"post_id": 19182, "ts": "2026-06-30T13:28:09Z", "hours": 27.6747, "text": "Completed the working MVP"}]...
|
Title: Blueprint by @swum | Stardance
Devlogs:
Co Title: Blueprint by @swum | Stardance
Devlogs:
Completed the working MVP
Updated the main page (intelligence page) Basically the intelligence page is split into three different pages: The AI chat, the workspace, and the knowledge graph. You can switch between each other by clicking on the buttons on the right, or by scrolling up and down. This took me a while to come up with and took a lot of iterations. I also updated the agent instructions, so now it should be much more flexible instead of thinking everything in this app is a engineering project. I wanted to use this for personal productivity, but I feel as if it is so much easier to work towards something that benefits tech projects. I’ll try my best to make this as flexible as possible.
Blueprint Beta almost ready to launch soon! After a while, I’m finally almost ready to beta launch for blueprint. I haven’t posted a devlog in a very long time, but I’ve made a bunch of improvements and changes! Nearly all the features work pretty well now. I’m really proud of how our knowledge graph turned out. We were able to make it a good balance between flexibility and actual intelligence. Since this is my first devlog in a while, I won’t go over everything I added, but in future devlogs, I will talk about progress. Feel free to comment anything you would want to see in a productivity app! Part of this is supposed to be somewhat of an all-in-one productivty app, and feature requests/feedback would be greatly appreciated!...
|
1793173791.7772024
|
1793778591.7772024
|
|
28789
|
My own site! by @swum | Stardance
|
swum
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @swum | Stardance
|
1793155828.8962874
|
1793760628.8962874
|
|
67240
|
My awesome macropad! by @swulfen | Stardance
|
swulfen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @swulfen | Stardanc Title: My awesome macropad! by @swulfen | Stardance...
|
1793728536.7431734
|
1794333336.7431734
|
|
72728
|
Pixel Garden by @swra | Stardance
|
swra
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Pixel Garden by @swra | Stardance
|
1793616450.447993
|
1794221250.447993
|
|
72732
|
Pixel Garden by @swra | Stardance
|
swra
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Pixel Garden by @swra | Stardance
|
1793620050.0442233
|
1794224850.0442233
|
|
20317
|
hardware example by @swn | Stardance
|
swn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: hardware example by @swn | Stardance
|
1793206384.5649524
|
1793811184.5649524
|
|
30344
|
Untitled by @swn | Stardance
|
swn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @swn | Stardance
|
1793533828.263702
|
1794138628.263702
|
|
49305
|
Frictionless by @swkr | Stardance
|
swkr
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @swkr | Stardance
|
1793278046.7768476
|
1793882846.7768476
|
|
22539
|
Frictionless by @swithavanjarana08 | Stardance
|
swithavanjarana08
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @swithavanjarana08 | Starda Title: Frictionless by @swithavanjarana08 | Stardance...
|
1793307434.9412813
|
1793912234.9412813
|
|
57976
|
My awesome macropad! by @swikar | Stardance
|
swikar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @swikar | Stardance
|
1793465495.680378
|
1794070295.680378
|
|
65758
|
pip-boy cyberdeck by @swiftjay | Stardance
|
swiftjay
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: pip-boy cyberdeck by @swiftjay | Stardance
|
1793706441.261653
|
1794311241.261653
|
|
54335
|
Nyanpad by @swiftdust | Stardance
|
swiftdust
|
0
|
10.93
|
0
|
[]
|
[{"post_id": 85920, "ts": "202 [{"post_id": 85920, "ts": "2026-10-31T22:03:15Z", "hours": 1.6333, "text": "After consulting with a friend I figured out that I’d been doing it all wrong and needed to export a step file from kicad… anyways, having done that I finally finalised the case. Heck yeah."}, {"post_id": 83026, "ts": "2026-10-26T16:37:11Z", "hours": 4.3286, "text": "Finally I finished the case. It took a lot of time to figure out what was the best way to make the outline, because it was almost impossible to outline correctly. I tried a lot of different methods and now finally got it right. The feeling was really great after quite a lot of incorrect attempts ;)"}, {"post_id": 56646, "ts": "2026-08-28T14:17:14Z", "hours": 1.25, "text": "It was time for the routing. I first tried an approach where the B.Cu layer was the ground pour. Afterwards while running the DRC, I found out actually the GND and VCC traces should be routed through the front layer for some reason. So what I did was flipping all the traces to the opposite layer of what they were, and put a copper island on F.Cu. But then I had the problem that VCC was blocking from making a proper ground pour… So I needed to remove a bunch of wires and wire everything the normal way. In the end I added some decoration and…. The PCB is finished!"}, {"post_id": 56591, "ts": "2026-08-28T12:29:22Z", "hours": 1.25, "text": "Today I drew the outline of the board. I had to reduce scope a bit, because the maximum board size was 100x100mm. That was slightly annoying, but I guess it’s fine… I also added all the components The changes I removed the rotary encoders and added four buttons instead of six. I also added some more LEDs, since there was space for them :) Now onto the routing!"}, {"post_id": 55234, "ts": "2026-08-26T21:26:25Z", "hours": 1.4625, "text": "Now that the design is ready, I worked on making the actual schematic. Even though I followed the tutorial earlier, it was far from complete. I even ended up just deleting everything because it was easier. For the schematic, I mostly stole this schematic - slightly embarrassed, but y’know - better steal something that works, than design something that doesn’t. I obviously added my own changes into it, like a 6-key matrix and two rotary encoders, to stay in the Nyan Cat theme. Also, I needed to research how to wire two rotary encoders because there weren’t enough pins to wire them normally. There was a really friendly guy in the Keyboard Atelier Discord server that helped me out. This is one thing I’ve really come to love about hardware: you don’t just ask AI because that doesn’t work well. You’ll actually have to go out and understand what’s happening. Tomorrow I’ll be designing my PCB plus decorating it. Because what’s a good PCB without some decoration? ;)"}, {"post_id": 54983, "ts": "2026-08-26T12:37:24Z", "hours": 0.2833, "text": "It was time to do some planning. I read the Hackpad website to find out what possibilities there are, then started designing. The end result was quite nice. Now I’ll be designing the PCB and schematic to look like this."}, {"post_id": 54753, "ts": "2026-08-25T20:53:21Z", "hours": 0.7264, "text": "I wanted to get into hardware again, so decided to build a macropad. I have made some very simple PCBs before, but none used a microcontroller yet. So that’s what I’m aiming to learn in this project. If it’s possible, my macropad will use translucent keys with a LCD screen below it. There, you will find app icons that you can change using firmware. It will possibly have a rotary encoder. Today, I followed the tutorial and set up the basic project structure and built a simple PCB. Tomorrow I will brainstorm my project further and get started on the case."}]...
|
Title: Nyanpad by @swiftdust | Stardance
Devlogs: Title: Nyanpad by @swiftdust | Stardance
Devlogs:
I wanted to get into hardware again, so decided to build a macropad. I have made some very simple PCBs before, but none used a microcontroller yet. So that’s what I’m aiming to learn in this project. If it’s possible, my macropad will use translucent keys with a LCD screen below it. There, you will find app icons that you can change using firmware. It will possibly have a rotary encoder. Today, I followed the tutorial and set up the basic project structure and built a simple PCB. Tomorrow I will brainstorm my project further and get started on the case.
It was time to do some planning. I read the Hackpad website to find out what possibilities there are, then started designing. The end result was quite nice. Now I’ll be designing the PCB and schematic to look like this.
Now that the design is ready, I worked on making the actual schematic. Even though I followed the tutorial earlier, it was far from complete. I even ended up just deleting everything because it was easier. For the schematic, I mostly stole this schematic - slightly embarrassed, but y’know - better steal something that works, than design something that doesn’t. I obviously added my own changes into it, like a 6-key matrix and two rotary encoders, to stay in the Nyan Cat theme. Also, I needed to research how to wire two rotary encoders because there weren’t enough pins to wire them normally. There was a really friendly guy in the Keyboard Atelier Discord server that helped me out. This is one thing I’ve really come to love about hardware: you don’t just ask AI because that doesn’t work well. You’ll actually have to go out and understand what’s happening. Tomorrow I’ll be designing my PCB plus decorating it. Because what’s a good PCB without some decoration? ;)
Today I drew the outline of the board. I had to reduce scope a bit, because the maximum board size was 100x100mm. That was slightly annoying, but I guess it’s fine… I also added all the components The changes I removed the rotary encoders and added four buttons instead of six. I also added some more LEDs, since there was space for them :) Now onto the routing!
It was time for the routing. I first tried an approach where the B.Cu layer was the ground pour. Afterwards while running the DRC, I found out actually the GND and VCC traces should be routed through the front layer for some reason. So what I did was flipping all the traces to the opposite layer of what they were, and put a copper island on F.Cu. But then I had the problem that VCC was blocking from making a proper ground pour… So I needed to remove a bunch of wires and wire everything the normal way. In the end I added some decoration and…. The PCB is finished!
Finally I finished the case. It took a lot of time to figure out what was the best way to make the outline, because it was almost impossible to outline correctly. I tried a lot of different methods and now finally got it right. The feeling was really great after quite a lot of incorrect attempts ;)
After consulting with a friend I figured out that I’d been doing it all wrong and needed to export a step file from kicad… anyways, having done that I finally finalised the case. Heck yeah....
|
1793534021.7587378
|
1794138821.7587378
|
|
56799
|
Esp32 by @swetharaghu85 | Stardance
|
swetharaghu85
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Esp32 by @swetharaghu85 | Stardance
|
1793400534.8823776
|
1794005334.8823776
|
|
10097
|
My awesome macropad! by @sweten | Stardance
|
sweten
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @sweten | Stardance
|
1793353875.3540246
|
1793958675.3540246
|
|
27175
|
rocky by @swell0749 | Stardance
|
swell0749
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: rocky by @swell0749 | Stardance
|
1793519277.297688
|
1794124077.297688
|
|
9466
|
My first slack bot! by @sweetdeadchild | Stardance
|
sweetdeadchild
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @sweetdeadchild | St Title: My first slack bot! by @sweetdeadchild | Stardance...
|
1793483443.2043185
|
1794088243.2043185
|
|
69001
|
cool python rock paper scissors game by @swee02856 cool python rock paper scissors game by @swee02856 | Stardance...
|
swee02856
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-13T23:51:51Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a really simple python game that may look very simple and “not professional” but in my opinion this project helped me learn many stuff about python like fixing code, finding out about functions and modules, and so much more!", "repo": "https://github.com/swee02856-prog/Python-Rock-Paper-Scissors", "demo": "https://github.com/swee02856-prog/Python-Rock-Paper-Scissors/releases/tag/v1"}]...
|
[{"post_id": 79435, "ts": "202 [{"post_id": 79435, "ts": "2026-10-13T23:49:06Z", "hours": 4.8722, "text": "Made it so that the characters do a greeting right after you pick who your opponent will be, some stay to the plot and act tough, others will ruin the plot and completely say random stuff."}]...
|
Title: cool python rock paper scissors game by @sw Title: cool python rock paper scissors game by @swee02856 | Stardance
Devlogs:
Made it so that the characters do a greeting right after you pick who your opponent will be, some stay to the plot and act tough, others will ruin the plot and completely say random stuff.
Ships:
I created a really simple python game that may look very simple and “not professional” but in my opinion this project helped me learn many stuff about python like fixing code, finding out about functions and modules, and so much more!...
|
1793677690.1803257
|
1793764090.1803257
|
|
5921
|
BitSwiss by @swedishsplidney | Stardance
|
swedishsplidney
|
1
|
22.0
|
397
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T09:11:09Z", "hours": 22.0, "multiplier": 18.19, "payout": 397, "blessing": "neutral", "text": "BitSwiss is an open source, cross platform archiving tool to easily download offline archives of over 100 web .zim archives to a removable media device, creating fully offline digital “swiss army knives” that can be used anywhere, on any (desktop) device. it can also include portable, installation free, offline readers for all the archives. available packages: all of wikipedia gutenberg collection (over 75,000 public domain ebooks) stackoverflow and stackexchange forums for many topics full ifixit repair guide archive developer documentation for many scripting languages/libraries/workflows/etc. full libretexts textbook and other educational text archives entire medlineplus archive for medical info full khanacademy, crashcourse, and freecodecamp courses for learning NASA astronomy picture of the day archive with expert explanations preconfigured setups for 16, 32, 64, and 128gb drives. also some field-focused presets for coding, computer science, outer space, and more. BitSwiss works by first using libcurl to grab the file sizes, then filters the URL to get the file name. it then uses a multithreaded concurrent download system to quickly and efficiently download packages (for more info, refer to the “how it works” section of the readme. coded in C++ using JetBrains CLion on Fedora 44 KDE. compiled with CMake for linux, macOS and windows", "repo": "https://github.com/swedishsplidney/BitSwiss", "demo": "https://github.com/swedishsplidney/BitSwiss/releases"}]...
|
[{"post_id": 4088, "ts": "2026 [{"post_id": 4088, "ts": "2026-06-07T08:52:50Z", "hours": 1.0131, "text": "just spent an hour debugging just to get a working build for microslop windows… finally got it working successfully though, kinda goofy on occasion but does work, thankfully"}, {"post_id": 4017, "ts": "2026-06-07T05:41:26Z", "hours": 3.6267, "text": "pretty much ready to ship! more than doubled the package list, to over 109 packages, now totaling over 600gb of data other than that it was ui tweaks, code cleanup and testing the windows and mac versions in a vm if this seems kinda interesting, go read the readme at https://github.com/swedishsplidney/BitSwiss"}, {"post_id": 2655, "ts": "2026-06-05T10:10:59Z", "hours": 6.5953, "text": "downloading works! uses a full multi-threaded asynchronous download engine that automatically imports file sizes and dynamic file names using libcurl. added prebuilt binaries to the github at: https://github.com/swedishsplidney/BitSwiss if you wanna try it out, feel free, but only the linux binary is actually tested at this point it is a fully working application which feels super great you can now also include multiple platforms of zim readers too, making it fully all-in-one the readme in the repo is also much better now"}, {"post_id": 1914, "ts": "2026-06-04T04:25:21Z", "hours": 1.2667, "text": "settings menu with theme swapping system ImGui is pretty limited in what you can do but you can change the colors"}, {"post_id": 1804, "ts": "2026-06-04T00:54:39Z", "hours": 2.3597, "text": "working asynchronous accurate file size checking using libcurl and async worker threads. it now accurately and super quickly gets file sizes without needing manual input. new CHUNGUS preconfig option that is almost 300GB :0"}, {"post_id": 1386, "ts": "2026-06-03T11:56:41Z", "hours": 5.2528, "text": "completed a complete gui and data item system overhaul, it actually compiles now. right now it automatically detects when storage devices are plugged in and you can select from over 45 manually inputted dataset options from kiwix such as 3 different wikipedia sizes library of congress, stackoverflow, etc. 3 preconfigged profiles and a working progress bar on the bottom. it should work on linux windows and mac but who knows because I haven’t tested it on anything other than linux yet now it just needs to actually do the thing its supposed to lol"}, {"post_id": 1288, "ts": "2026-06-03T05:40:42Z", "hours": 1.7167, "text": "devlog 6/2/26: got the project created, wrote the README, and got dear ImGui working with the demo window. started writing the actual drive detection system, only for linux so far…"}]...
|
Title: BitSwiss by @swedishsplidney | Stardance
D Title: BitSwiss by @swedishsplidney | Stardance
Devlogs:
devlog 6/2/26: got the project created, wrote the README, and got dear ImGui working with the demo window. started writing the actual drive detection system, only for linux so far…
completed a complete gui and data item system overhaul, it actually compiles now. right now it automatically detects when storage devices are plugged in and you can select from over 45 manually inputted dataset options from kiwix such as 3 different wikipedia sizes library of congress, stackoverflow, etc. 3 preconfigged profiles and a working progress bar on the bottom. it should work on linux windows and mac but who knows because I haven’t tested it on anything other than linux yet now it just needs to actually do the thing its supposed to lol
working asynchronous accurate file size checking using libcurl and async worker threads. it now accurately and super quickly gets file sizes without needing manual input. new CHUNGUS preconfig option that is almost 300GB :0
settings menu with theme swapping system ImGui is pretty limited in what you can do but you can change the colors
downloading works! uses a full multi-threaded asynchronous download engine that automatically imports file sizes and dynamic file names using libcurl. added prebuilt binaries to the github at: https://github.com/swedishsplidney/BitSwiss if you wanna try it out, feel free, but only the linux binary is actually tested at this point it is a fully working application which feels super great you can now also include multiple platforms of zim readers too, making it fully all-in-one the readme in the repo is also much better now
pretty much ready to ship! more than doubled the package list, to over 109 packages, now totaling over 600gb of data other than that it was ui tweaks, code cleanup and testing the windows and mac versions in a vm if this seems kinda interesting, go read the readme at https://github.com/swedishsplidney/BitSwiss
just spent an hour debugging just to get a working build for microslop windows… finally got it working successfully though, kinda goofy on occasion but does work, thankfully
Ships:
BitSwiss is an open source, cross platform archiving tool to easily download offline archives of over 100 web .zim archives to a removable media device, creating fully offline digital “swiss army knives” that can be used anywhere, on any (desktop) device. it can also include portable, installation free, offline readers for all the archives. available packages: all of wikipedia gutenberg collection (over 75,000 public domain ebooks) stackoverflow and stackexchange forums for many topics full ifixit repair guide archive developer documentation for many scripting languages/libraries/workflows/etc. full libretexts textbook and other educational text archives entire medlineplus archive for medical info full khanacademy, crashcourse, and freecodecamp courses for learning NASA astronomy picture of the day archive with expert explanations preconfigured setups for 16, 32, 64, and 128gb drives. also some field-focused presets for coding, computer science, outer space, and more. BitSwiss works by first using libcurl to grab the file sizes, then filters the URL to get the file name. it then uses a multithreaded concurrent download system to quickly and efficiently download packages (for more info, refer to the “how it works” section of the readme. coded in C++ using JetBrains CLion on Fedora 44 KDE. compiled with CMake for linux, macOS and windows...
|
1793652637.459381
|
1793739037.459381
|
|
12084
|
fraktalized by @swedishsplidney | Stardance
|
swedishsplidney
|
1
|
70.0
|
1361
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T06:36:27Z", "hours": 70.0, "multiplier": 19.43, "payout": 1361, "blessing": "neutral", "text": "fraktalized ship: fraktalized is an an open-source, cross-platform, ultra smooth real time fractal explorer built using a hybrid architecture of Qt6 (QML/C++) and openGL (GLSL 330 core / 4.3 compute shaders). fraktalized currently has 10 fractal sets: mandelbrot set: the classic fractal set julia set: cool swirly stuff, complete with adjustable constant coords burning ship set: cool pointy stuff newton set: kinda spidery looking buddhabrot: like the mandelbrot but galaxy looking anti-buddhabrot: reverse buddhabrot barnsley fern: looks very naturey mandelbulb: like the mandelbrot but 3d menger sponge: cube, but with infinite* surface ar a icebox: spiky box! there is both a set of 3 precompiled binaries on the github and a demo video: https://youtu.be/x9lH_pPzvbw", "repo": "https://github.com/swedishsplidney/fraktalized", "demo": "https://github.com/swedishsplidney/fraktalized/releases"}]...
|
[{"post_id": 20591, "ts": "202 [{"post_id": 20591, "ts": "2026-07-02T06:34:20Z", "hours": 0.7767, "text": "extra ui tweaks and readme updates added some images of 3d fractals to the readme, did some general ui tweaks, and some idiot proofing now its time to ship!!!"}, {"post_id": 20559, "ts": "2026-07-02T05:22:07Z", "hours": 4.9961, "text": "probably the final commit :o most of this was spent idiot proofing, going through all my code and making sure that everything works well and actually makes sense i also updated the tutorial to be a bit better a major amount of time was spent figuring out how to get windows to actually compile i swear windows is the bane of my entire existence its not reflected in the devlog hours, but i did also make a demo video to show off some of the features mystery link other than that, it was mostly ui and readme updates :)"}, {"post_id": 19733, "ts": "2026-07-01T03:52:28Z", "hours": 9.76, "text": "i set up a full tutorial system the hard part was doing the whole thing where it darkens everywhere except the thing the tutorial is yapping about… also, right now, the tutorial is really really easy to break, so i might have to implement some idiot proofing or something to be honest, adding the whole darkening thing was really simple, but actually getting it to work was really annoying for some reason. it essentially just gets the xy coord for each corner of the specified element, and then makes a dark block everywhere except inside those 4 corners. also, i made it so the tutorial saves to the same json file as the preset manager, so that you only have to do the tutorial one time and it doesnt just get in your way every single time you open it. aside from that, most of this time was spent trying to figure out how to get it to automatically build on github when i push a release. i did this successfully for my other project, but the problem so far has been linking the qml for the binaries on the different platforms. specifically, windows just really really doesnt want to behave, its starting to feel like getting a discord mod to eat anything other than gamersupps and pizza rolls overall, maybe getting close to shipping? it honestly just depends on how much more features and idiot proofing i want to add if this sounds interesting, check out (and star ) the repo here"}, {"post_id": 14222, "ts": "2026-06-23T07:20:06Z", "hours": 8.5239, "text": "3d wasd controls (wowie zowie) the math for this was super hard, especially because i want it to work alongside with the other classic orbit style controls lol i ended up adding a toggle in the sidebar, which felt like the cleanest way to do it, but did mean doing more qml also, i pretty much had to guess when setting up all my vectors so i spent like 15 presidential terms messing around with positives and negatives and 1.0f / 0.0f everywhere until doing stuff in the right directions actually did the right thing, which was hard also had to implement auto horizon correction so things d also added some live 3d settings, which took a while, but now theres a live slider for both the mandelbulb power (exponent), and the brightness (which was hard) and, theres now a math section in the readme, which i spent a lot of time pondering while making, but if you’re at all, check out the “mathy information” section of the readme https://github.com/swedishsplidney/fraktalized (also star the repo ) exploring the mandelbulb in wasd mode genuinely feels like exploring an alien planet in a spaceship, lowk super fun"}, {"post_id": 11771, "ts": "2026-06-19T04:47:05Z", "hours": 8.7492, "text": "3d is finally working!!!!! i have been having an epic samurai battle against opengl and 3d fractal math for what feels like forever, but it finally works, and I have a working 3d mandelbulb explorer!!! i have actually been working on getting 3d working for the past multiple devlogs, it just took me sooo incredibly long to actually figure it out that i never really mentioned it. the longest step was figuring out the controls. when i first started working on the 3d mode, then it was literally just a cube, and i had to figure out a good way to be able to rotate it the hard part wasn’t even trying to figure out how to do the math to rotate the vertices, the hard part was trying to figure out how the thing should actually rotate what i figured out how to do is having an orbit style camera, where dragging side to side rotates the model along its own local yaw, and then dragging up and down changes the camera’s global pitch. this way the model’s roll never changes (because that makes the model look tilted or skewed). i had to spend an embarassingly long amount of time trying to figure the logic of an orbital camera… the camera is also slerped (like lerping but 3d) so it feels smooth color mappping on the 3d was actually surprisingly easy, i just did it in a very similar way to the 2d escape time ones, except with an extra dimension (its not as hard as it sounds) one other major change was when i added the ability to add and remove gradient stops. this way, instead of always having 4 gradient stops, you can have anywhere from 2 to 16 stops, for more customizeability. also, the readme is updated, go check it out! (and star the repo ) https://github.com/swedishsplidney/fraktalized below: video demonstrating the 3d and camera system"}, {"post_id": 10469, "ts": "2026-06-17T06:25:16Z", "hours": 7.9178, "text": "added iterative function system fractals basically, iterative function fractals are fractals that start at a set point, then repeatedly apply the same affine transformations (scaling, rotating, shifting), making an infinitely repeating, self-same fractal. as far as actually getting this setup and working, i had to make a whole new compute shader that involves a lot of math and for loops to iterate forever getting ifs fractals to render was a particular challenge, and i almost exploded my gpu and accidentally caused a vram cache overflow causing my display output to break. in the end, it turns out the trick was to not send 4,000,000 worker threads to the gpu all at once, and to do them 3-4 at a time also finally got working on the whole 3d system, which will likely take forever, and completely does not work right now, but hopefully i will have figured out how in the world to get working 3d stuff by the next devlog 🙏 check out the github! -> https://github.com/swedishsplidney/fraktalized image: barnsley fern, rendered in 4k"}, {"post_id": 9130, "ts": "2026-06-15T08:45:47Z", "hours": 6.9228, "text": "added support for trajectory based fractals most people know the normal fractals (the ones ive covered so far), such as the mandelbrot and julia sets, that test wether or not a point escapes and maps how long it takes to escape trajectory fractals look really cool, and the difference is that they map the trajectory that 𝑧 takes on its way out, while incrementing a counter for every pixel it steps on. getting this to work was a lot of work, and required to write a whole new shader file from scratch, except instead of a .frag/.vert combo, it was a compute shader (.glsl). instead of simply running a loop and writing color data to each independent pixel like with the escape-time fractals do, the trajectory shader has to pick a random (x, y) starting coord, and then track its orbit across the complex plane, writing data to random pixels as it goes. this required me to use atomics, because if 2 orbits cross, instead of one overwriting each other, you have to use imageAtomicAdd() to make sure that the brightness stacks up. one other issue was that at first it was super grainy, which was fixed by assigning each gpu thread 50 random sampled to increase detail substantially. i also nearly exploded my gpu because i accidentally had the render system run 50+ compute sequences at the same time, so i now have each compute wait for the one before it to finish in other happenings, there is now a preset feature that writes your current color setup set, zoom, center, etc. to a JSON file to be loaded later also added the newton set, but its a less interesting escape-time fractal, so not covered in as much detail image: buddhabrot set, rendered at 4k"}, {"post_id": 7949, "ts": "2026-06-13T08:09:58Z", "hours": 5.9558, "text": "added the burning ship fractal, anti aliasing, and completely overhauled the color system to use a gradient input instead of one color. burning ship fractal: so the burning ship fractal is made when you take the mandelbrot equation, but you take the absolute value of the real and imaginary parts before squaring, basically destroying the symmetry: 𝑧ₙ₊₁ = (|𝑅𝑒(𝑍ₙ)| + 𝑖|𝐼𝑚(𝑍ₙ)|)² + 𝐶 this makes it look super duper cool (as seen in the image below) gradient-based color mapping so before, the color was just calculated using one color tint and boosting brightness quadratically near the edges. now, it takes in a gradient (calculated between 4 color inputs), and does the same color mapping but essentially moves what color it uses as the iterations increase. the hard part is figuring out how to get a good input system in qml with this, but I was able to do it using some colordialogues and a lot of trial and error. the new color input system is kinda like creating a gradient in photoshop or illustrator, with 4 little handles that you can drag across and change their colors. anti aliasing also added anti aliasing, or more specifically, ssaa (super sampling anti aliasing), with a selector to choose between off, 2x, and 3x so basically it renders the entire fractal at a higher resolution (2x or 3x) and then averages the color of every pixel block (2x2 or 3x3 respectively) and then displays that. this results in a much, much smoother image at the cost of much higher resource usage. while i was screwing around with dynamic resolutions, i also added a resolution slider to change the rendered resolution to anywhere from 25 to 150% of the window resolution. turning it up past 100% basically just gives the ssaa architecture more information to work with, making it even smoother my graphics card isnt very powerful and it basically stays pinned at 99% usage and 100% clock when i have anti aliasing turned on and the iterations above like 200. image: burning ship fractal, rendered at 4k with 150% resolution scale and 3x ssaa"}, {"post_id": 6713, "ts": "2026-06-11T07:42:55Z", "hours": 4.1331, "text": "now has a render to file feature basically you just import a custom resolution and it takes your current center and renders at that resolution with your current parameters. the hard part is that it uses a completely different framebuffer object from the regular viewport. while testing i did almost explode my gpu when pushing the resolution to almost 32k, which is kinda unreasonable, but this was a good opportunity to add a tiled render system basically it just splits up the image into 2000x2000 pixel sections and renders them, and then it does some math to position it the weird thing is that opengl is kinda goofy and likes to mirror stuff for some reason (literally no idea why) so theres some math to render it in reverse (which means that its actually correct) also increased the rendering to 64 bit, meaning it is now 536,870,912 times more accurate compared to the 32 bit one, and also means you can zoom in more than twice as far with better quality, but it is much more gpu intensive… this image is one of the cooler ones i rendered out at 4k, it kinda looks like colliding galaxies or something"}, {"post_id": 6139, "ts": "2026-06-10T10:13:47Z", "hours": 6.7264, "text": "is now fully interactive and honestly feels super great, especially compared to my last devlog where it was static and unchanging entirely added working real-time render parameters such as panning and zooming with mouse, and custom iteration setup and color setup on the sidebar. lots and lots and lots of quality of life features, such as: the reset button for if you get lost adjustable iteration slider min/max direct text enter for iterations hideable iteration min/max menu camera smoothing color clamping so it doesnt look deep fried also added the julia set (which is what is in the image) so basically, both the mandelbrot and julia sets are the same quadratic recurrence relation on the complex plane: 𝑧ₙ₊₁ = (𝑧ₙ)² + 𝑐 the main difference is that you start at the origin (𝑧₀ = 0) and change the constant 𝑐 for every single pixel on the screen based on its coordinates, but with the julia set the constant 𝑐 is the same everywhere, and the starting point 𝑧₀ changes based on the pixel’s coordinate, so you are testing how different starting points react to the same gravitational pull of 𝑐. the nice thing is that you can change the constant 𝑐 in the julia set, and completely change how the fractal looks, so i added that as an input field too looks really really cool lowk"}, {"post_id": 4855, "ts": "2026-06-08T12:00:00Z", "hours": 5.5808, "text": "working mandelbrot fractal rendering through opengl!!!!! using qt/qml and raw opengl shaders together was a mistake they really dont like working together and i had to spend 3 straight hours (its 5:42am at the time of this devlog) debugging an eternal tug of war between qt and opengl because qt kept overwriting what i wanted to happen the worst part is that an opengl fragment shader cant really debug to the log so if something is on fire over there i just kinda have to guess to fix it eventually i just gave up and switched to framebuffer objects, which i lowk should have done from the start the funnest part was actually writing the equations for the mandelbrot set lol (it also looks super pretty): so basically the Mandelbrot set is the set of all complex parameters 𝑐 ∈ ℂ for which the orbit of 𝑧₀ = 0 under quadratic recurrence remains bounded. in the shader, i just separate its multiplication into real and imaginary components: Re(𝑧ₙ₊₁) = 𝑥² + 𝑦² + Re(𝑐) Im(𝑧ₙ₊₁) = 2𝑥𝑦 + Im(𝑐) also infinity is impossible so the iterations are capped at 100 sorry if this was too nerdy or long lmao"}]...
|
Title: fraktalized by @swedishsplidney | Stardance Title: fraktalized by @swedishsplidney | Stardance
Devlogs:
working mandelbrot fractal rendering through opengl!!!!! using qt/qml and raw opengl shaders together was a mistake they really dont like working together and i had to spend 3 straight hours (its 5:42am at the time of this devlog) debugging an eternal tug of war between qt and opengl because qt kept overwriting what i wanted to happen the worst part is that an opengl fragment shader cant really debug to the log so if something is on fire over there i just kinda have to guess to fix it eventually i just gave up and switched to framebuffer objects, which i lowk should have done from the start the funnest part was actually writing the equations for the mandelbrot set lol (it also looks super pretty): so basically the Mandelbrot set is the set of all complex parameters 𝑐 ∈ ℂ for which the orbit of 𝑧₀ = 0 under quadratic recurrence remains bounded. in the shader, i just separate its multiplication into real and imaginary components: Re(𝑧ₙ₊₁) = 𝑥² + 𝑦² + Re(𝑐) Im(𝑧ₙ₊₁) = 2𝑥𝑦 + Im(𝑐) also infinity is impossible so the iterations are capped at 100 sorry if this was too nerdy or long lmao
is now fully interactive and honestly feels super great, especially compared to my last devlog where it was static and unchanging entirely added working real-time render parameters such as panning and zooming with mouse, and custom iteration setup and color setup on the sidebar. lots and lots and lots of quality of life features, such as: the reset button for if you get lost adjustable iteration slider min/max direct text enter for iterations hideable iteration min/max menu camera smoothing color clamping so it doesnt look deep fried also added the julia set (which is what is in the image) so basically, both the mandelbrot and julia sets are the same quadratic recurrence relation on the complex plane: 𝑧ₙ₊₁ = (𝑧ₙ)² + 𝑐 the main difference is that you start at the origin (𝑧₀ = 0) and change the constant 𝑐 for every single pixel on the screen based on its coordinates, but with the julia set the constant 𝑐 is the same everywhere, and the starting point 𝑧₀ changes based on the pixel’s coordinate, so you are testing how different starting points react to the same gravitational pull of 𝑐. the nice thing is that you can change the constant 𝑐 in the julia set, and completely change how the fractal looks, so i added that as an input field too looks really really cool lowk
now has a render to file feature basically you just import a custom resolution and it takes your current center and renders at that resolution with your current parameters. the hard part is that it uses a completely different framebuffer object from the regular viewport. while testing i did almost explode my gpu when pushing the resolution to almost 32k, which is kinda unreasonable, but this was a good opportunity to add a tiled render system basically it just splits up the image into 2000x2000 pixel sections and renders them, and then it does some math to position it the weird thing is that opengl is kinda goofy and likes to mirror stuff for some reason (literally no idea why) so theres some math to render it in reverse (which means that its actually correct) also increased the rendering to 64 bit, meaning it is now 536,870,912 times more accurate compared to the 32 bit one, and also means you can zoom in more than twice as far with better quality, but it is much more gpu intensive… this image is one of the cooler ones i rendered out at 4k, it kinda looks like colliding galaxies or something
added the burning ship fractal, anti aliasing, and completely overhauled the color system to use a gradient input instead of one color. burning ship fractal: so the burning ship fractal is made when you take the mandelbrot equation, but you take the absolute value of the real and imaginary parts before squaring, basically destroying the symmetry: 𝑧ₙ₊₁ = (|𝑅𝑒(𝑍ₙ)| + 𝑖|𝐼𝑚(𝑍ₙ)|)² + 𝐶 this makes it look super duper cool (as seen in the image below) gradient-based color mapping so before, the color was just calculated using one color tint and boosting brightness quadratically near the edges. now, it takes in a gradient (calculated between 4 color inputs), and does the same color mapping but essentially moves what color it uses as the iterations increase. the hard part is figuring out how to get a good input system in qml with this, but I was able to do it using some colordialogues and a lot of trial and error. the new color input system is kinda like creating a gradient in photoshop or illustrator, with 4 little handles that you can drag across and change their colors. anti aliasing also added anti aliasing, or more specifically, ssaa (super sampling anti aliasing), with a selector to choose between off, 2x, and 3x so basically it renders the entire fractal at a higher resolution (2x or 3x) and then averages the color of every pixel block (2x2 or 3x3 respectively) and then displays that. this results in a much, much smoother image at the cost of much higher resource usage. while i was screwing around with dynamic resolutions, i also added a resolution slider to change the rendered resolution to anywhere from 25 to 150% of the window resolution. turning it up past 100% basically just gives the ssaa architecture more information to work with, making it even smoother my graphics card isnt very powerful and it basically stays pinned at 99% usage and 100% clock when i have anti aliasing turned on and the iterations above like 200. image: burning ship fractal, rendered at 4k with 150% resolution scale and 3x ssaa
added support for trajectory based fractals most people know the normal fractals (the ones ive covered so far), such as the mandelbrot and julia sets, that test wether or not a point escapes and maps how long it takes to escape trajectory fractals look really cool, and the difference is that they map the trajectory that 𝑧 takes on its way out, while incrementing a counter for every pixel it steps on. getting this to work was a lot of work, and required to write a whole new shader file from scratch, except instead of a .frag/.vert combo, it was a compute shader (.glsl). instead of simply running a loop and writing color data to each independent pixel like with the escape-time fractals do, the trajectory shader has to pick a random (x, y) starting coord, and then track its orbit across the complex plane, writing data to random pixels as it goes. this required me to use atomics, because if 2 orbits cross, instead of one overwriting each other, you have to use imageAtomicAdd() to make sure that the brightness stacks up. one other issue was that at first it was super grainy, which was fixed by assigning each gpu thread 50 random sampled to increase detail substantially. i also nearly exploded my gpu because i accidentally had the render system run 50+ compute sequences at the same time, so i now have each compute wait for the one before it to finish in other happenings, there is now a preset feature that writes your current color setup set, zoom, center, etc. to a JSON file to be loaded later also added the newton set, but its a less interesting escape-time fractal, so not covered in as much detail image: buddhabrot set, rendered at 4k
added iterative function system fractals basically, iterative function fractals are fractals that start at a set point, then repeatedly apply the same affine transformations (scaling, rotating, shifting), making an infinitely repeating, self-same fractal. as far as actually getting this setup and working, i had to make a whole new compute shader that involves a lot of math and for loops to iterate forever getting ifs fractals to render was a particular challenge, and i almost exploded my gpu and accidentally caused a vram cache overflow causing my display output to break. in the end, it turns out the trick was to not send 4,000,000 worker threads to the gpu all at once, and to do them 3-4 at a time also finally got working on the whole 3d system, which will likely take forever, and completely does not work right now, but hopefully i will have figured out how in the world to get working 3d stuff by the next devlog 🙏 check out the github! -> https://github.com/swedishsplidney/fraktalized image: barnsley fern, rendered in 4k
3d is finally working!!!!! i have been having an epic samurai battle against opengl and 3d fractal math for what feels like forever, but it finally works, and I have a working 3d mandelbulb explorer!!! i have actually been working on getting 3d working for the past multiple devlogs, it just took me sooo incredibly long to actually figure it out that i never really mentioned it. the longest step was figuring out the controls. when i first started working on the 3d mode, then it was literally just a cube, and i had to figure out a good way to be able to rotate it the hard part wasn’t even trying to figure out how to do the math to rotate the vertices, the hard part was trying to figure out how the thing should actually rotate what i figured out how to do is having an orbit style camera, where dragging side to side rotates the model along its own local yaw, and then dragging up and down changes the camera’s global pitch. this way the model’s roll never changes (because that makes the model look tilted or skewed). i had to spend an embarassingly long amount of time trying to figure the logic of an orbital camera… the camera is also slerped (like lerping but 3d) so it feels smooth color mappping on the 3d was actually surprisingly easy, i just did it in a very similar way to the 2d escape time ones, except with an extra dimension (its not as hard as it sounds) one other major change was when i added the ability to add and remove gradient stops. this way, instead of always having 4 gradient stops, you can have anywhere from 2 to 16 stops, for more customizeability. also, the readme is updated, go check it out! (and star the repo ) https://github.com/swedishsplidney/fraktalized below: video demonstrating the 3d and camera system
3d wasd controls (wowie zowie) the math for this was super hard, especially because i want it to work alongside with the other classic orbit style controls lol i ended up adding a toggle in the sidebar, which felt like the cleanest way to do it, but did mean doing more qml also, i pretty much had to guess when setting up all my vectors so i spent like 15 presidential terms messing around with positives and negatives and 1.0f / 0.0f everywhere until doing stuff in the right directions actually did the right thing, which was hard also had to implement auto horizon correction so things d also added some live 3d settings, which took a while, but now theres a live slider for both the mandelbulb power (exponent), and the brightness (which was hard) and, theres now a math section in the readme, which i spent a lot of time pondering while making, but if you’re at all, check out the “mathy information” section of the readme https://github.com/swedishsplidney/fraktalized (also star the repo ) exploring the mandelbulb in wasd mode genuinely feels like exploring an alien planet in a spaceship, lowk super fun
i set up a full tutorial system the hard part was doing the whole thing where it darkens everywhere except the thing the tutorial is yapping about… also, right now, the tutorial is really really easy to break, so i might have to implement some idiot proofing or something to be honest, adding the whole darkening thing was really simple, but actually getting it to work was really annoying for some reason. it essentially just gets the xy coord for each corner of the specified element, and then makes a dark block everywhere except inside those 4 corners. also, i made it so the tutorial saves to the same json file as the preset manager, so that you only have to do the tutorial one time and it doesnt just get in your way every single time you open it. aside from that, most of this time was spent trying to figure out how to get it to automatically build on github when i push a release. i did this successfully for my other project, but the problem so far has been linking the qml for the binaries on the different platforms. specifically, windows just really really doesnt want to behave, its starting to feel like getting a discord mod to eat anything other than gamersupps and pizza rolls overall, maybe getting close to shipping? it honestly just depends on how much more features and idiot proofing i want to add if this sounds interesting, check out (and star ) the repo here
probably the final commit :o most of this was spent idiot proofing, going through all my code and making sure that everything works well and actually makes sense i also updated the tutorial to be a bit better a major amount of time was spent figuring out how to get windows to actually compile i swear windows is the bane of my entire existence its not reflected in the devlog hours, but i did also make a demo video to show off some of the features mystery link other than that, it was mostly ui and readme updates :)
extra ui tweaks and readme updates added some images of 3d fractals to the readme, did some general ui tweaks, and some idiot proofing now its time to ship!!!
Ships:
fraktalized ship: fraktalized is an an open-source, cross-platform, ultra smooth real time fractal explorer built using a hybrid architecture of Qt6 (QML/C++) and openGL (GLSL 330 core / 4.3 compute shaders). fraktalized currently has 10 fractal sets: mandelbrot set: the classic fractal set julia set: cool swirly stuff, complete with adjustable constant coords burning ship set: cool pointy stuff newton set: kinda spidery looking buddhabrot: like the mandelbrot but galaxy looking anti-buddhabrot: reverse buddhabrot barnsley fern: looks very naturey mandelbulb: like the mandelbrot but 3d menger sponge: cube, but with infinite* surface ar a icebox: spiky box! there is both a set of 3 precompiled binaries on the github and a demo video: https://youtu.be/x9lH_pPzvbw...
|
1793688832.9457364
|
1793775232.9457364
|
|
30453
|
slate by @swedishsplidney | Stardance
|
swedishsplidney
|
1
|
160.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-31T07:11:19Z", "hours": 160.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "slate engine is hopefully going to become an actually good game engine one day, but i ran out of time for stardance, so i guess i’m shipping it as a 3d engine only what it can do: obj importing fully customizeable .json material system (with support for importing .mtl files) transform and rotation gizmos custom ui inspector and hierarchy panel to modify object properties texture loading jolt physics scene serialization shadow mapping sun, point, area lighting system the hardest part? probably just like… vulkan being vulkan ig? managing over 13,110 lines of code probably this project has been super duper fun so far and I hope to keep working on it for a long, long time to come!!!", "repo": "https://github.com/swedishsplidney/slate", "demo": "https://github.com/swedishsplidney/slate/releases"}]...
|
[{"post_id": 85369, "ts": "202 [{"post_id": 85369, "ts": "2026-10-31T07:04:00Z", "hours": 9.1731, "text": "final stretch! this is just final fixes before shipping, so here’s a list of what i did: fixed some shadow banding issues made transmissive objects cast partial shadows changed the fresnel calculation before, fresnel was making edges darker instead of reflective changed the specular calculation for transmissive objects was making them hazy changed the alpha mapping it looked weird ig fixed serialization caused crashes on load readme overhaul it was old spent 13 billion epochs debugging the windows exe i hate windows github release im excited (and super nervous) to ship, i hope i can get a good multiplier!!!! this project was super fun to work on, and this will definetly NOT be the end for it :) if you like this project you should totally star the repo"}, {"post_id": 73395, "ts": "2026-09-25T01:57:08Z", "hours": 8.295, "text": "shadows this one is really cool, i feel like it really takes it from looking like its from 1995 to like… 2015 maybe? it doesnt look that good but i think its a massive improvement! right now, its a 4096x4096 shadowmap with an extent of 24 units, a random noise filter to reduce pixelation, and 3x3 pcf to make it look somewhat smooth it is currently orthographic light projection only, but I think i’ll work on getting perspective lighting soon :) shadows did reqire implementing a whole new imageview, descriptor set, render pass, all that, but i’m getting used to it atp lol serialization is also completely broken right now, so I do need to fix that…"}, {"post_id": 67098, "ts": "2026-09-13T04:51:35Z", "hours": 7.6267, "text": "texture loading!!! absolute yipee moment this took like a lot of thinking to figure out how to implement for reasons that i think are obvious, but some of them are: how tf do you load an image what does the loaded image data mean how do you map the texture to the model’s uv coords how does normal mapping work how does the shader know where on the image its reading and a lot more that i prolly forgot lol this whole thing basically meant a whole shader overhaul again (even though i alr did that last devlog but its whatever loll) you can now map albedo (color), normal (height/offset), orm (occlusion, roughness, metallic), and emmision (glowiness) emission only kind of works rn lol, but i will get to it soon also, you currently have to manually set filepaths to the textures you want in the .json sidecar for that model, i need to add filepicker stuff to the inspector but i will get to it ok the textures in the video below were manually baked, packed, etc at 4096*4096 in blender i think another feature i should work on soon is procedural material generating, because texture mapping will always have a resolution limit (even 4k textures look kinda bad when mapped to larger models) i also want to change how reflections work a little bit, or maybe add anti-aliasing because right now the reflections look deep fried (as you will see in the video below)"}, {"post_id": 65721, "ts": "2026-09-11T02:04:30Z", "hours": 7.1881, "text": "shader overhaul so i noticed that the pbr shader lowkey looked kinda ugly and my microfacet solver was buns af so i js spent a while fixing it up and basically ended up going down a rabbit hole of tonemapping and completely rewrote the whole thing i switched from some random generic tonemapping to khronos standard neutral pbr mapping, which i think looks wayyyyyy better, the colors actually feel accurate now i also spent a little while setting up the shader to support texture colors when i get that all working it is wayyy better now, especially metallic things i also started setting up for texture imports but right now its only albedo and it does NOT work in the slightest lmao i think i will hopefully have texture importing and mapping done by next devlog, but uhhhhh…. no promises"}, {"post_id": 63897, "ts": "2026-09-07T22:41:08Z", "hours": 8.7083, "text": "physics aaaaaaaaaaaaaaaaa it works concerningly well and it actually makes me really happy to see it working i legit jumped for joy when i first saw stuff dropping due to gravity the actual underlying physics engine is jolt physics, but all the init and handling and all that is custom from me its all linked to the inspector and allat, so you can tweak values real time, such as body type, bounciness, friction, and mass its now a physics playground instead of just a glorified obj viewer scaling is very broken as far as colliders go, ill probably fix that soon you can start and stop the physics sim with f5"}, {"post_id": 62615, "ts": "2026-09-06T02:39:32Z", "hours": 5.9828, "text": "working scene serialization (saving) if you hit ctrl + s (or hit the gui button) then it creates a .slate file, containing all the data of every object in the scene this .slate file is human readable (and editable), written in a format very similar to toml heres an example .slate file: [ scene ] name = \"SlateScene\" version = \"1.0\" [[ entity ]] index = 0 name = \"\" mesh_path = \"models/test_obj.obj\" position = [ -0.310723 , 0.927019 , 1.47743 ] rotation = [ 0 , -0 , 0 ] scale = [ 1.9916 , 2.28848 , 3.38984 ] [ entity . material ] albedo = [ 0.183333 , 1 , 0 , 1 ] roughness = 0.5 metallic = 1 ior = 1.5 transmission = 0 [[ entity ]] index = 1 name = \"\" mesh_path = \"models/emerald_monkey.obj\" position = [ 1.29034 , 0 , -5.64025e-08 ] rotation = [ 8.61461 , 6.18611 , 2.71029 ] scale = [ 3.07852 , 3.38535 , 3.86504 ] [ entity . material ] albedo = [ 0.050432 , 0.800023 , 0.302281 , 1 ] roughness = 0 metallic = 0 ior = 2.418 transmission = 1 next, ill probably start working on physics"}, {"post_id": 61285, "ts": "2026-09-04T04:09:23Z", "hours": 8.2292, "text": "scene serialization okay so this is akward but it doesnt actually work yet, but in my defense serialization is really confusing to me since i generally don’t do a whole lot with file writing and loading, especially in a custom formatted and extensioned .slate file it basically just takes a bunch of data by looping through scene objects and records them, then it also has to do that backwards, then i also have to implement a command and gui system to trigger the logic and i also want the .slate to be easily readable, so i need to format the text in a way that makes sense (i’m taking inspiration from TOML) hopefully its done next devlog, but no promises lol"}, {"post_id": 59368, "ts": "2026-09-01T04:03:06Z", "hours": 8.3792, "text": "color picking! i noticed that setting color in the inspector with 3 rgb values was really annoying, so i made a whole new ui class ( ui_color_picker.hpp/cpp ), that can hook into any other ui it supports: S/B box + hue bar RGB input CMYK input (mildly broken) hex input (very broken) it actually works pretty well, there is some bug where an object can never be fully white but i think thats a command issue not color picker or inspector next, it might be time to work on physics"}, {"post_id": 58306, "ts": "2026-08-30T17:59:13Z", "hours": 8.5094, "text": "bugfixes and writing docs i spent a good 4 hours just going through some code, finding anything that might be wrong and fixing them. surprisingly, i didnt find that much, which means that i’m better at coding than i thought i found a few places where i just forgot to add something to a cleanup function, which could have led to a small memory leak over time, but nothing major some bugs i fixed: the background of any dropdown menu was rendering behind the viewport selecting stuff in the hierarchy wouldnt sync with the inspector properly i forgot to add screenPointToRay to my cleanup function some other things that i forgot i also added a few std::couts in some spots that needed them i also decided to start writing some docs because my brain was fried i basically just dug through my ~3000 lines of vulkan init and rendering code, and took notes throughout and tried explaining my confusing mental processes in a .md file this kinda made me realize that i do not have enough annotation in my code but thats a problem for future me :)"}, {"post_id": 56986, "ts": "2026-08-29T01:24:41Z", "hours": 8.5281, "text": "hierarchy panel and scrolling the hierarchy panel itself was actually not that hard, the hard part was coming up with a reliable system that can detect and list every object currently loaded in the scene without turning your pc into an explosive the other hard part was modifying the dockspace layout to be able to handle multiple different panels, because previously, it was just one window per dockspace panel, but now it can be as many as you want also, the scrolling system is new, it is its own class ui_scrollable_container , and it is basically doing what the dockspace used to do, but it also lets you scroll. so now, the dockspace just loads a scrollable container, and the scrollable container does all the arrangement and sizing logic. the hierarchy works exactly as you would expect it to, it lists current scene objects and then you can select them from it eventually, ill prolly add support for parenting, which should be pretty easy its kinda crazy to see my custom persistent ui system slowly turn into something useful as i add more features to it so far ive just been adding features when i need them, i havent just thought of features i might need and added all of them"}, {"post_id": 55367, "ts": "2026-08-27T04:34:36Z", "hours": 8.7392, "text": "inspector updates and dropdowns the inspector now has IOR and transmission values that you can change, ui updates, and dropdowns this took literally like 45 epochs because i was running into a materialgpu indexing issue where the inspector boxes would update the wrong values and my peanut brain didnt even think to check if i set the indices correctly dropdowns also took a good 3-4 hours, but it wasnt too bad, mostly just figuring out the correct logic in total, the dropdown class (ui_dropdown.cpp/hpp) is at 169 lines, and the inspector class (ui_inspector_panel.cpp/hpp) is at 470 lines next, i think ill either work on ui rounding or a file hierarchy viewer"}, {"post_id": 52171, "ts": "2026-08-22T08:13:19Z", "hours": 8.115, "text": "ui inspector the inspector is by no means done, but its a start! right now its just supposed to be purely functional, but i plan on making it look better in the future the input boxes are their own ui class, meaning i can have those input boxes everywhere making the ui system from scratch is very fun, but it at times i do regret not using qml or im gui, but overall, i dont regret making it from scratch too much the main issues with it right now is that the sensitivity values in the input boxes feel wrong, i think the position needs less sensitivity and the rotation needs more also, the color ones are a bit broken, theres a little bit of discrepancy between what the ui shows and what the actual .json material sidecar has written, so i’ll have to figure out how to fix that i think at some point, i want to add support for dropdowns, so each row can be expanded into larger input boxes if needed, or so the entire transform or material section can be collapsed i also need to add input boxes for IOR and transmission, i jus forgot to do that lol, should be pretty easy tho"}, {"post_id": 49355, "ts": "2026-08-18T04:12:43Z", "hours": 5.6403, "text": "rotation gizmo, multi-object support you can now switch between the translation gizmo, and the rotation gizmo, and click between objects to change what one has the gizmo active the gizmo also stays locked to the selected meshes’ local axes, i might add switching between local and global axis orientation at some point, but for right now local only is good enough all of the gizmo mesh is generated from code, not as an obj, making it very efficient and fast and robust, but making the logic that generates vertices in the right position was very annoying lol next, ill probably work on an inspector panel where you can edit an object’s location, rotation, scale, material data, etc or maybe saving the scene to file but now you can move and rotate any amount of objects to your heart’s content"}, {"post_id": 47420, "ts": "2026-08-15T10:46:06Z", "hours": 9.2511, "text": "translation gizmo this was like miserable to make lol it took me sooooooo long to get translation working, basically i had this samurai battle with a scaling issue for the longest time, i accidentally told my code that the viewport was smaller than it actually was and it just took forever to find that out this issue caused a really annoying issue where the actual location of the rendered gizmo was different than the clickable area there was also this other issue where the gizmo would move twice the speed of the mesh it was translating, but it was just a flaw with the mesh class, the gizmo was basically constantly recieving its own center as well as the meshes’ center which made it translate double but it works now, i think it works pretty well its all based off of the modular command system, so anything can call translatemeshcommand and it translate meshes next is prolly working on rotate and scale and stuff, all the other gizmos that we need the gizmos also meant a new .vert and .frag pair, and a whole new vulkan render pipeline lol"}, {"post_id": 43684, "ts": "2026-08-09T02:47:19Z", "hours": 9.0197, "text": "grid generation this took forever, and was much harder than i expected basically, i needed to create a whole new rendering pipeline and a whole new glsl shader pair, as well as coming up with logic so the triangle-focused renderer can actually render some super thin infinite lines the grid does generate dynamically around the camera view, so it is endless i think it does look pretty good tho next, ill prolly work on adding some move and rotation and maybe even scale tools"}, {"post_id": 37279, "ts": "2026-07-29T21:25:56Z", "hours": 9.8689, "text": "mesh importing and refraction ima start off by saying that this isn’t true refraction, since that requires path tracing, which is really computationally intensive instead, i went with screen space refraction offset approximation , which is a good, efficient refraction approximator that i still think looks pretty cool material data for refraction the value that determines the transparency of an object is called transmission , and the value for refraction is index of refraction (or IOR) the current filesystem for materials that i have is .mtl files, because thats the standard filetype for exporting materials with objs from programs like blender. however, .mtl is a filesystem from the 1990s that was originally created for phong systems, meaning it doesnt really contain transmission values so, i created a json sidecar system, that generates a better, more robust, human readable material file for every model. so now, when you import an obj/mtl pair: it checks for a json sidecar file if there is one already, just load from that and finish! if there isn’t one already, now read the .mtl, extract as much info as you can from that, and write it to a new json file multi pass rendering in order to correctly render transparent meshes, you need at least 2 render passes (render the opaque ones first, then the transparent ones) also, for the refraction to work, it needs an image of everything behind it, so in between the opaque and transparent pass, it quickly copies everything on the screen to an offscreen framebuffer how the refraction works 1. get the view vector (v): this one’s simple, just evaluate the view direction from the fragment position to the camera position also, adjust the normal (n) if rendering backface 2. refraction vector (snell’s law): the refraction vector is actually easy too, glsl has a built in refract intrinsic so you just drive that with a clamped ior value 3. deviation mapping: to determine how much to bend the background scene texture, just calculate the deviation vector between the refracted ray and the view ray: vec3 rayDeviation = refractDir - (- V ); vec2 distortion = ( push . viewProjMatrix * vec4 ( rayDeviation , 0.0 )). xy * 0.05 * transmission ; 4. uv sampling + composite blending offset the screen coordinates, but in order to prevent the edges from exploding, it needs to be clamped also, sample the background buffer to blend lighting and make a fresnel rim other stuff i did: i also made a full custom persistent ui system (this took a while), and a command system, because hardcoding the ui to do stuff is bad so instead of the ui code directly running logic, clicking a button just sends a command to the command system this meant creating another render pass, meaning i’m up to 3 render passes per frame now the only command so far is file.import_mesh , which is also hooked into the ui (you can see in the video below)"}, {"post_id": 35648, "ts": "2026-07-27T07:01:43Z", "hours": 7.2731, "text": "pbr materials pbr math reflectance: this is the main equation that a cook-torrance pbr system, all the other equations lead back to this one at some point 𝐿𝑜(𝑝,𝜔𝑜) =𝐿𝑒(𝑝,𝜔𝑜) +∫Ω𝑓𝑟(𝑝,𝜔𝑖,𝜔𝑜)𝐿𝑖(𝑝,𝜔𝑖)(𝐧⋅𝜔𝑖)𝑑𝜔𝑖 this equation essentially just determines what light does after hitting a surface with specific parameters we approximate the integral with two different light interactions: diffuse (𝑘𝐷): any light that penetrates the surface, scatters internally, and re-emerges specular (𝑘𝑆): light that reflects directly off the micro-surface in the code itself, the total outgoing radiance ($L_o$) is calculated with: vec3 Lo = ( kD * albedo / PI + specular ) * radiance * NdotL ; cook-torrance brdf: the specular component is calculated using the cook-torrance microfacet brdf: ## 𝑓cook-torrance =𝐷⋅𝐺⋅𝐹 / 4(𝐍⋅𝐕)(𝐍⋅𝐋) where 𝐷, 𝐺, and 𝐹 represent: normal distribution (𝐷): the NDF statistical distribution calculates how many microfacets are aligned with the halfway vector ($𝐇=𝐕+𝐋 / abs(𝐕+𝐋)) 𝐷GGX(𝐍,𝐇,𝛼) = 𝛼^2 / 𝜋((𝐍⋅𝐇)2(𝛼2−1)+1)2 ```glsl float DistributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness * roughness; float a2 = a * a; float NdotH = max(dot(N, H), 0.0); float NdotH2 = NdotH * NdotH; float num = a2; float denom = (NdotH2 * (a2 - 1.0) + 1.0); denom = PI * denom * denom; return num / max(denom, 0.000001); } ``` geometry (𝐺): smiths schlick-ggx microfacets can cast shadows and obscure light from the camera too, so the geometry function calculates the self shading factor using smiths method: 𝐺(𝐍,𝐕,𝐋,𝑘) =𝐺1(𝐍,𝐕,𝑘) ⋅𝐺1(𝐍,𝐋,𝑘) where 𝑘 maps roughness for direct lighting using 𝑘 = (roughness+1)^2 / 8: ```glsl float GeometrySchlickGGX(float NdotV, float roughness) { float r = (roughness + 1.0); float k = (r * r) / 8.0; float num = NdotV; float denom = NdotV * (1.0 - k) + k; return num / denom; } float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { float NdotV = max(dot(N, V), 0.0); float NdotL = max(dot(N, L), 0.0); float ggx2 = GeometrySchlickGGX(NdotV, roughness); float ggx1 = GeometrySchlickGGX(NdotL, roughness); return ggx1 * ggx2; } ``` fresnel equation (𝐹): fresnel-schlick approximation the fresnel factor calculates the percentage of light reflected versus absorbed based on the viewing angle (𝜃): 𝐹(𝜃,𝐹0) =𝐹0 +(1−𝐹0)(1−cos𝜃)^5 nonmetals reflect around 4% of light (𝐹0 =0.04), while metals (conductors) use their tinted base albedo color as 𝐹0: ```glsl vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0); } // lower, inside main(): vec3 F0 = mix(vec3(0.04), albedo, metallic); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); ``` other stuff: a surface cant reflect more light than it recieves, so a simple equation is used to make sure this doesnt happen: ## 𝐤𝐃 =(1−𝐤𝐒) ⋅(1−metallic) right now, all the material data is pulled from a .mtl file i also added bindless ssbo storage so it doesnt explode when you have a lot of models next, i might keep working on the custom persistent ui system"}, {"post_id": 32732, "ts": "2026-07-22T02:20:30Z", "hours": 8.3064, "text": "custom obj file loading all of the obj loading is done using tinyobjloader , which is a popular header file that im using to get the raw vertex coords of any .obj file however, all tinyobj does is pass the raw vertex data to my code (technically it can do some basic triangulation, but thats not its main purpose so its not perfect) this means that any model with n-gons (complex polygons) will not work and will look super weird technically you can tell blender to explicitly triangulate a file when you export it, but i think that it should be able to take any obj that you can throw at it without needing external setup so i also added a popular header file called earcut , which at a basic level, just cuts any complex polygons into 3-vertex triangles (which my index pass and renderer accepts). this now means that it can load any custom obj file i want to add auto color loading (from the obj data) or texture loading next, or maybe work on the ui or add ambient occlusion"}, {"post_id": 25108, "ts": "2026-07-09T03:12:17Z", "hours": 6.5614, "text": "entered the 3rd dimension wasd movement made a whole separate Camera class (look at me keepin things organized ) this means that now the vulkan_renderer class has model, projection, view, and transform matrices: the model matrix tracks the transformations the view matrix essentially tracks where the camera is the projection matrix sets a perspective frustum in order to make things actually have perspective and not just be flat the lerping is also based on deltaTime, which means smooth movement no matter ur fps the mouse tracking is locked via SDL_SetWindowRelativeMouseMode , and can be unlocked with the escape key vertices and index buffers right now, the vertices are being set manually in my code… however, importing obj (and maybe gltf and stl) files is next on the feature list, i’m planning on using tinyobj all the geometry is indexed, which basically means that instead of wasting a ton of memory repeating data for 36 raw vertices, you can just define the 8 corner vertices, then use an index buffer pass to tell the gpu how to connect those 8 vertices into 12 triangles window resizing this was easy, basically just had to tell it to make new image views and framebuffers based on the current aspect ratio (w/h) when the size of the window changes so now, its a spinning cube in a resizeable window that you can move around with wasd"}, {"post_id": 22507, "ts": "2026-07-05T00:42:28Z", "hours": 6.1236, "text": "the window opens (!!) so, why did it take me 6 hours to get a window to open? it kinda just comes down to the fact that vulkan is vulkan on other apis such as opengl, the graphics driver just does stuff for you. you can say sumn like “open a window and make it pink” and it just does the memory, thread syncing, and goofy platform stuff for you vulkan on the other hand, wants none of that. if you dont specifically ask for something, it wont happen. this does make it significantly harder (and much easier to create a gpu-ending vram overflow) to code with, but it does have the benifit of being much more powerful, having no overhead, and 100% control. its not gonna do anything that you dont tell it to so what do you have to do to open a beautiful grey window with vulkan? os bridge (sdl3): instead of writing a whole abstraction for wayland/x11, win32 and metal, you just have to tell sdl3 that you’re making a vulkan window, and it does some magic stuff vulkan instance ( VkInstance ): this is how you get into the vulkan sdk. you kinda just have to tell vulkan everything it needs to know and ask sdl what extensions you need window surface ( VkSurfaceKHR ): vulkan is kinda dumb and doesnt know what a window actually is, so this is where sdl tells vulkan where it can actually write pixels pick a physical device: scan the current hardware, loop through every available device, and then just pick the best one (eventually ill probably add a way to select a custom one) logical device ( VkDevice ): the physical device is the actual doohickey in your computer that runs stuff, the logical device is the software’s interface to it. swapchain ( VkSwapchainKHR ): vulkan can’t actually write images directly to the screen (and that would look bad anyway), so you make a swapchain. my code does double buffering (basically vsync), which means that the screen displays image a, while the gpu is rendering image b. render pass and framebuffers: basically just telling vulkan what to do (in this case, clear the screen, then draw the color). the framebuffer just binds the swapchain image views to the render pass synchronization and command subsystem: believe it or not, your gpu’s clock speed is usually around (or more than) half of your cpu’s clock speed, so you have to make sure that your code waits for the gpu is ready before running the next c++ line. if you don’t, your gpu ram and cache will overflow. overall, this took a total of 764 lines of code just to get a grey window the nice part is that the progress that i’ll make is exponential, since the very beginning stuff takes the longest i also made a logo (the current project page banner)"}]...
|
Title: slate by @swedishsplidney | Stardance
Devl Title: slate by @swedishsplidney | Stardance
Devlogs:
the window opens (!!) so, why did it take me 6 hours to get a window to open? it kinda just comes down to the fact that vulkan is vulkan on other apis such as opengl, the graphics driver just does stuff for you. you can say sumn like “open a window and make it pink” and it just does the memory, thread syncing, and goofy platform stuff for you vulkan on the other hand, wants none of that. if you dont specifically ask for something, it wont happen. this does make it significantly harder (and much easier to create a gpu-ending vram overflow) to code with, but it does have the benifit of being much more powerful, having no overhead, and 100% control. its not gonna do anything that you dont tell it to so what do you have to do to open a beautiful grey window with vulkan? os bridge (sdl3): instead of writing a whole abstraction for wayland/x11, win32 and metal, you just have to tell sdl3 that you’re making a vulkan window, and it does some magic stuff vulkan instance ( VkInstance ): this is how you get into the vulkan sdk. you kinda just have to tell vulkan everything it needs to know and ask sdl what extensions you need window surface ( VkSurfaceKHR ): vulkan is kinda dumb and doesnt know what a window actually is, so this is where sdl tells vulkan where it can actually write pixels pick a physical device: scan the current hardware, loop through every available device, and then just pick the best one (eventually ill probably add a way to select a custom one) logical device ( VkDevice ): the physical device is the actual doohickey in your computer that runs stuff, the logical device is the software’s interface to it. swapchain ( VkSwapchainKHR ): vulkan can’t actually write images directly to the screen (and that would look bad anyway), so you make a swapchain. my code does double buffering (basically vsync), which means that the screen displays image a, while the gpu is rendering image b. render pass and framebuffers: basically just telling vulkan what to do (in this case, clear the screen, then draw the color). the framebuffer just binds the swapchain image views to the render pass synchronization and command subsystem: believe it or not, your gpu’s clock speed is usually around (or more than) half of your cpu’s clock speed, so you have to make sure that your code waits for the gpu is ready before running the next c++ line. if you don’t, your gpu ram and cache will overflow. overall, this took a total of 764 lines of code just to get a grey window the nice part is that the progress that i’ll make is exponential, since the very beginning stuff takes the longest i also made a logo (the current project page banner)
entered the 3rd dimension wasd movement made a whole separate Camera class (look at me keepin things organized ) this means that now the vulkan_renderer class has model, projection, view, and transform matrices: the model matrix tracks the transformations the view matrix essentially tracks where the camera is the projection matrix sets a perspective frustum in order to make things actually have perspective and not just be flat the lerping is also based on deltaTime, which means smooth movement no matter ur fps the mouse tracking is locked via SDL_SetWindowRelativeMouseMode , and can be unlocked with the escape key vertices and index buffers right now, the vertices are being set manually in my code… however, importing obj (and maybe gltf and stl) files is next on the feature list, i’m planning on using tinyobj all the geometry is indexed, which basically means that instead of wasting a ton of memory repeating data for 36 raw vertices, you can just define the 8 corner vertices, then use an index buffer pass to tell the gpu how to connect those 8 vertices into 12 triangles window resizing this was easy, basically just had to tell it to make new image views and framebuffers based on the current aspect ratio (w/h) when the size of the window changes so now, its a spinning cube in a resizeable window that you can move around with wasd
custom obj file loading all of the obj loading is done using tinyobjloader , which is a popular header file that im using to get the raw vertex coords of any .obj file however, all tinyobj does is pass the raw vertex data to my code (technically it can do some basic triangulation, but thats not its main purpose so its not perfect) this means that any model with n-gons (complex polygons) will not work and will look super weird technically you can tell blender to explicitly triangulate a file when you export it, but i think that it should be able to take any obj that you can throw at it without needing external setup so i also added a popular header file called earcut , which at a basic level, just cuts any complex polygons into 3-vertex triangles (which my index pass and renderer accepts). this now means that it can load any custom obj file i want to add auto color loading (from the obj data) or texture loading next, or maybe work on the ui or add ambient occlusion
pbr materials pbr math reflectance: this is the main equation that a cook-torrance pbr system, all the other equations lead back to this one at some point 𝐿𝑜(𝑝,𝜔𝑜) =𝐿𝑒(𝑝,𝜔𝑜) +∫Ω𝑓𝑟(𝑝,𝜔𝑖,𝜔𝑜)𝐿𝑖(𝑝,𝜔𝑖)(𝐧⋅𝜔𝑖)𝑑𝜔𝑖 this equation essentially just determines what light does after hitting a surface with specific parameters we approximate the integral with two different light interactions: diffuse (𝑘𝐷): any light that penetrates the surface, scatters internally, and re-emerges specular (𝑘𝑆): light that reflects directly off the micro-surface in the code itself, the total outgoing radiance ($L_o$) is calculated with: vec3 Lo = ( kD * albedo / PI + specular ) * radiance * NdotL ; cook-torrance brdf: the specular component is calculated using the cook-torrance microfacet brdf: ## 𝑓cook-torrance =𝐷⋅𝐺⋅𝐹 / 4(𝐍⋅𝐕)(𝐍⋅𝐋) where 𝐷, 𝐺, and 𝐹 represent: normal distribution (𝐷): the NDF statistical distribution calculates how many microfacets are aligned with the halfway vector ($𝐇=𝐕+𝐋 / abs(𝐕+𝐋)) 𝐷GGX(𝐍,𝐇,𝛼) = 𝛼^2 / 𝜋((𝐍⋅𝐇)2(𝛼2−1)+1)2 ```glsl float DistributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness * roughness; float a2 = a * a; float NdotH = max(dot(N, H), 0.0); float NdotH2 = NdotH * NdotH; float num = a2; float denom = (NdotH2 * (a2 - 1.0) + 1.0); denom = PI * denom * denom; return num / max(denom, 0.000001); } ``` geometry (𝐺): smiths schlick-ggx microfacets can cast shadows and obscure light from the camera too, so the geometry function calculates the self shading factor using smiths method: 𝐺(𝐍,𝐕,𝐋,𝑘) =𝐺1(𝐍,𝐕,𝑘) ⋅𝐺1(𝐍,𝐋,𝑘) where 𝑘 maps roughness for direct lighting using 𝑘 = (roughness+1)^2 / 8: ```glsl float GeometrySchlickGGX(float NdotV, float roughness) { float r = (roughness + 1.0); float k = (r * r) / 8.0; float num = NdotV; float denom = NdotV * (1.0 - k) + k; return num / denom; } float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { float NdotV = max(dot(N, V), 0.0); float NdotL = max(dot(N, L), 0.0); float ggx2 = GeometrySchlickGGX(NdotV, roughness); float ggx1 = GeometrySchlickGGX(NdotL, roughness); return ggx1 * ggx2; } ``` fresnel equation (𝐹): fresnel-schlick approximation the fresnel factor calculates the percentage of light reflected versus absorbed based on the viewing angle (𝜃): 𝐹(𝜃,𝐹0) =𝐹0 +(1−𝐹0)(1−cos𝜃)^5 nonmetals reflect around 4% of light (𝐹0 =0.04), while metals (conductors) use their tinted base albedo color as 𝐹0: ```glsl vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0); } // lower, inside main(): vec3 F0 = mix(vec3(0.04), albedo, metallic); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); ``` other stuff: a surface cant reflect more light than it recieves, so a simple equation is used to make sure this doesnt happen: ## 𝐤𝐃 =(1−𝐤𝐒) ⋅(1−metallic) right now, all the material data is pulled from a .mtl file i also added bindless ssbo storage so it doesnt explode when you have a lot of models next, i might keep working on the custom persistent ui system
mesh importing and refraction ima start off by saying that this isn’t true refraction, since that requires path tracing, which is really computationally intensive instead, i went with screen space refraction offset approximation , which is a good, efficient refraction approximator that i still think looks pretty cool material data for refraction the value that determines the transparency of an object is called transmission , and the value for refraction is index of refraction (or IOR) the current filesystem for materials that i have is .mtl files, because thats the standard filetype for exporting materials with objs from programs like blender. however, .mtl is a filesystem from the 1990s that was originally created for phong systems, meaning it doesnt really contain transmission values so, i created a json sidecar system, that generates a better, more robust, human readable material file for every model. so now, when you import an obj/mtl pair: it checks for a json sidecar file if there is one already, just load from that and finish! if there isn’t one already, now read the .mtl, extract as much info as you can from that, and write it to a new json file multi pass rendering in order to correctly render transparent meshes, you need at least 2 render passes (render the opaque ones first, then the transparent ones) also, for the refraction to work, it needs an image of everything behind it, so in between the opaque and transparent pass, it quickly copies everything on the screen to an offscreen framebuffer how the refraction works 1. get the view vector (v): this one’s simple, just evaluate the view direction from the fragment position to the camera position also, adjust the normal (n) if rendering backface 2. refraction vector (snell’s law): the refraction vector is actually easy too, glsl has a built in refract intrinsic so you just drive that with a clamped ior value 3. deviation mapping: to determine how much to bend the background scene texture, just calculate the deviation vector between the refracted ray and the view ray: vec3 rayDeviation = refractDir - (- V ); vec2 distortion = ( push . viewProjMatrix * vec4 ( rayDeviation , 0.0 )). xy * 0.05 * transmission ; 4. uv sampling + composite blending offset the screen coordinates, but in order to prevent the edges from exploding, it needs to be clamped also, sample the background buffer to blend lighting and make a fresnel rim other stuff i did: i also made a full custom persistent ui system (this took a while), and a command system, because hardcoding the ui to do stuff is bad so instead of the ui code directly running logic, clicking a button just sends a command to the command system this meant creating another render pass, meaning i’m up to 3 render passes per frame now the only command so far is file.import_mesh , which is also hooked into the ui (you can see in the video below)
grid generation this took forever, and was much harder than i expected basically, i needed to create a whole new rendering pipeline and a whole new glsl shader pair, as well as coming up with logic so the triangle-focused renderer can actually render some super thin infinite lines the grid does generate dynamically around the camera view, so it is endless i think it does look pretty good tho next, ill prolly work on adding some move and rotation and maybe even scale tools
translation gizmo this was like miserable to make lol it took me sooooooo long to get translation working, basically i had this samurai battle with a scaling issue for the longest time, i accidentally told my code that the viewport was smaller than it actually was and it just took forever to find that out this issue caused a really annoying issue where the actual location of the rendered gizmo was different than the clickable area there was also this other issue where the gizmo would move twice the speed of the mesh it was translating, but it was just a flaw with the mesh class, the gizmo was basically constantly recieving its own center as well as the meshes’ center which made it translate double but it works now, i think it works pretty well its all based off of the modular command system, so anything can call translatemeshcommand and it translate meshes next is prolly working on rotate and scale and stuff, all the other gizmos that we need the gizmos also meant a new .vert and .frag pair, and a whole new vulkan render pipeline lol
rotation gizmo, multi-object support you can now switch between the translation gizmo, and the rotation gizmo, and click between objects to change what one has the gizmo active the gizmo also stays locked to the selected meshes’ local axes, i might add switching between local and global axis orientation at some point, but for right now local only is good enough all of the gizmo mesh is generated from code, not as an obj, making it very efficient and fast and robust, but making the logic that generates vertices in the right position was very annoying lol next, ill probably work on an inspector panel where you can edit an object’s location, rotation, scale, material data, etc or maybe saving the scene to file but now you can move and rotate any amount of objects to your heart’s content
ui inspector the inspector is by no means done, but its a start! right now its just supposed to be purely functional, but i plan on making it look better in the future the input boxes are their own ui class, meaning i can have those input boxes everywhere making the ui system from scratch is very fun, but it at times i do regret not using qml or im gui, but overall, i dont regret making it from scratch too much the main issues with it right now is that the sensitivity values in the input boxes feel wrong, i think the position needs less sensitivity and the rotation needs more also, the color ones are a bit broken, theres a little bit of discrepancy between what the ui shows and what the actual .json material sidecar has written, so i’ll have to figure out how to fix that i think at some point, i want to add support for dropdowns, so each row can be expanded into larger input boxes if needed, or so the entire transform or material section can be collapsed i also need to add input boxes for IOR and transmission, i jus forgot to do that lol, should be pretty easy tho
inspector updates and dropdowns the inspector now has IOR and transmission values that you can change, ui updates, and dropdowns this took literally like 45 epochs because i was running into a materialgpu indexing issue where the inspector boxes would update the wrong values and my peanut brain didnt even think to check if i set the indices correctly dropdowns also took a good 3-4 hours, but it wasnt too bad, mostly just figuring out the correct logic in total, the dropdown class (ui_dropdown.cpp/hpp) is at 169 lines, and the inspector class (ui_inspector_panel.cpp/hpp) is at 470 lines next, i think ill either work on ui rounding or a file hierarchy viewer
hierarchy panel and scrolling the hierarchy panel itself was actually not that hard, the hard part was coming up with a reliable system that can detect and list every object currently loaded in the scene without turning your pc into an explosive the other hard part was modifying the dockspace layout to be able to handle multiple different panels, because previously, it was just one window per dockspace panel, but now it can be as many as you want also, the scrolling system is new, it is its own class ui_scrollable_container , and it is basically doing what the dockspace used to do, but it also lets you scroll. so now, the dockspace just loads a scrollable container, and the scrollable container does all the arrangement and sizing logic. the hierarchy works exactly as you would expect it to, it lists current scene objects and then you can select them from it eventually, ill prolly add support for parenting, which should be pretty easy its kinda crazy to see my custom persistent ui system slowly turn into something useful as i add more features to it so far ive just been adding features when i need them, i havent just thought of features i might need and added all of them
bugfixes and writing docs i spent a good 4 hours just going through some code, finding anything that might be wrong and fixing them. surprisingly, i didnt find that much, which means that i’m better at coding than i thought i found a few places where i just forgot to add something to a cleanup function, which could have led to a small memory leak over time, but nothing major some bugs i fixed: the background of any dropdown menu was rendering behind the viewport selecting stuff in the hierarchy wouldnt sync with the inspector properly i forgot to add screenPointToRay to my cleanup function some other things that i forgot i also added a few std::couts in some spots that needed them i also decided to start writing some docs because my brain was fried i basically just dug through my ~3000 lines of vulkan init and rendering code, and took notes throughout and tried explaining my confusing mental processes in a .md file this kinda made me realize that i do not have enough annotation in my code but thats a problem for future me :)
color picking! i noticed that setting color in the inspector with 3 rgb values was really annoying, so i made a whole new ui class ( ui_color_picker.hpp/cpp ), that can hook into any other ui it supports: S/B box + hue bar RGB input CMYK input (mildly broken) hex input (very broken) it actually works pretty well, there is some bug where an object can never be fully white but i think thats a command issue not color picker or inspector next, it might be time to work on physics
scene serialization okay so this is akward but it doesnt actually work yet, but in my defense serialization is really confusing to me since i generally don’t do a whole lot with file writing and loading, especially in a custom formatted and extensioned .slate file it basically just takes a bunch of data by looping through scene objects and records them, then it also has to do that backwards, then i also have to implement a command and gui system to trigger the logic and i also want the .slate to be easily readable, so i need to format the text in a way that makes sense (i’m taking inspiration from TOML) hopefully its done next devlog, but no promises lol
working scene serialization (saving) if you hit ctrl + s (or hit the gui button) then it creates a .slate file, containing all the data of every object in the scene this .slate file is human readable (and editable), written in a format very similar to toml heres an example .slate file: [ scene ] name = "SlateScene" version = "1.0" [[ entity ]] index = 0 name = "" mesh_path = "models/test_obj.obj" position = [ -0.310723 , 0.927019 , 1.47743 ] rotation = [ 0 , -0 , 0 ] scale = [ 1.9916 , 2.28848 , 3.38984 ] [ entity . material ] albedo = [ 0.183333 , 1 , 0 , 1 ] roughness = 0.5 metallic = 1 ior = 1.5 transmission = 0 [[ entity ]] index = 1 name = "" mesh_path = "models/emerald_monkey.obj" position = [ 1.29034 , 0 , -5.64025e-08 ] rotation = [ 8.61461 , 6.18611 , 2.71029 ] scale = [ 3.07852 , 3.38535 , 3.86504 ] [ entity . material ] albedo = [ 0.050432 , 0.800023 , 0.302281 , 1 ] roughness = 0 metallic = 0 ior = 2.418 transmission = 1 next, ill probably start working on physics
physics aaaaaaaaaaaaaaaaa it works concerningly well and it actually makes me really happy to see it working i legit jumped for joy when i first saw stuff dropping due to gravity the actual underlying physics engine is jolt physics, but all the init and handling and all that is custom from me its all linked to the inspector and allat, so you can tweak values real time, such as body type, bounciness, friction, and mass its now a physics playground instead of just a glorified obj viewer scaling is very broken as far as colliders go, ill probably fix that soon you can start and stop the physics sim with f5
shader overhaul so i noticed that the pbr shader lowkey looked kinda ugly and my microfacet solver was buns af so i js spent a while fixing it up and basically ended up going down a rabbit hole of tonemapping and completely rewrote the whole thing i switched from some random generic tonemapping to khronos standard neutral pbr mapping, which i think looks wayyyyyy better, the colors actually feel accurate now i also spent a little while setting up the shader to support texture colors when i get that all working it is wayyy better now, especially metallic things i also started setting up for texture imports but right now its only albedo and it does NOT work in the slightest lmao i think i will hopefully have texture importing and mapping done by next devlog, but uhhhhh…. no promises
texture loading!!! absolute yipee moment this took like a lot of thinking to figure out how to implement for reasons that i think are obvious, but some of them are: how tf do you load an image what does the loaded image data mean how do you map the texture to the model’s uv coords how does normal mapping work how does the shader know where on the image its reading and a lot more that i prolly forgot lol this whole thing basically meant a whole shader overhaul again (even though i alr did that last devlog but its whatever loll) you can now map albedo (color), normal (height/offset), orm (occlusion, roughness, metallic), and emmision (glowiness) emission only kind of works rn lol, but i will get to it soon also, you currently have to manually set filepaths to the textures you want in the .json sidecar for that model, i need to add filepicker stuff to the inspector but i will get to it ok the textures in the video below were manually baked, packed, etc at 4096*4096 in blender i think another feature i should work on soon is procedural material generating, because texture mapping will always have a resolution limit (even 4k textures look kinda bad when mapped to larger models) i also want to change how reflections work a little bit, or maybe add anti-aliasing because right now the reflections look deep fried (as you will see in the video below)
shadows this one is really cool, i feel like it really takes it from looking like its from 1995 to like… 2015 maybe? it doesnt look that good but i think its a massive improvement! right now, its a 4096x4096 shadowmap with an extent of 24 units, a random noise filter to reduce pixelation, and 3x3 pcf to make it look somewhat smooth it is currently orthographic light projection only, but I think i’ll work on getting perspective lighting soon :) shadows did reqire implementing a whole new imageview, descriptor set, render pass, all that, but i’m getting used to it atp lol serialization is also completely broken right now, so I do need to fix that…
final stretch! this is just final fixes before shipping, so here’s a list of what i did: fixed some shadow banding issues made transmissive objects cast partial shadows changed the fresnel calculation before, fresnel was making edges darker instead of reflective changed the specular calculation for transmissive objects was making them hazy changed the alpha mapping it looked weird ig fixed serialization caused crashes on load readme overhaul it was old spent 13 billion epochs debugging the windows exe i hate windows github release im excited (and super nervous) to ship, i hope i can get a good multiplier!!!! this project was super fun to work on, and this will definetly NOT be the end for it :) if you like this project you should totally star the repo
Ships:
slate engine is hopefully going to become an actually good game engine one day, but i ran out of time for stardance, so i guess i’m shipping it as a 3d engine only what it can do: obj importing fully customizeable .json material system (with support for importing .mtl files) transform and rotation gizmos custom ui inspector and hierarchy panel to modify object properties texture loading jolt physics scene serialization shadow mapping sun, point, area lighting system the hardest part? probably just like… vulkan being vulkan ig? managing over 13,110 lines of code probably this project has been super duper fun so far and I hope to keep working on it for a long, long time to come!!!...
|
1793721323.8002331
|
1793807723.8002331
|
|
34938
|
unnamed game by @swedishsplidney | Stardance
|
swedishsplidney
|
0
|
7.42
|
0
|
[]
|
[{"post_id": 35732, "ts": "202 [{"post_id": 35732, "ts": "2026-07-27T11:10:56Z", "hours": 7.4161, "text": "sketching all of this was just spent making some concept art (tbh i kinda just wanted an excuse to do some art and log it lol) my art process is: blender concept model with matcap sketch in krita shade the sketch coloring shade the coloring i have not started doing any actual game stuff or coding, because slate engine isnt far enough in development yet lol"}]...
|
Title: unnamed game by @swedishsplidney | Stardanc Title: unnamed game by @swedishsplidney | Stardance
Devlogs:
sketching all of this was just spent making some concept art (tbh i kinda just wanted an excuse to do some art and log it lol) my art process is: blender concept model with matcap sketch in krita shade the sketch coloring shade the coloring i have not started doing any actual game stuff or coding, because slate engine isnt far enough in development yet lol...
|
1793425675.8486326
|
1794030475.8486326
|
|
58291
|
My awesome macropad! by @swazutikk_heh | Stardance
|
swazutikk_heh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @swazutikk_heh | St Title: My awesome macropad! by @swazutikk_heh | Stardance...
|
1793483407.4367511
|
1794088207.4367511
|
|
19098
|
Untitled project by @swaznil | Stardance
|
swaznil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @swaznil | Stardance
|
1793321434.2313013
|
1793926234.2313013
|
|
34896
|
My very own WebOS by @swayamdhawade | Stardance
|
swayamdhawade
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @swayamdhawade | Stard Title: My very own WebOS by @swayamdhawade | Stardance...
|
1793400631.0315633
|
1794005431.0315633
|
|
20742
|
My awesome macropad! by @swayambansal | Stardance
|
swayambansal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @swayambansal | Sta Title: My awesome macropad! by @swayambansal | Stardance...
|
1793472590.1437087
|
1794077390.1437087
|
|
43801
|
My very own WebOS by @swayam | Stardance
|
swayam
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @swayam | Stardance
|
1793238870.684006
|
1793843670.684006
|
|
30213
|
Untitled project by @swatiprakash | Stardance
|
swatiprakash
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @swatiprakash | Stardan Title: Untitled project by @swatiprakash | Stardance...
|
1793238686.5143256
|
1793843486.5143256
|
|
30883
|
Untitled by @swatiprakash | Stardance
|
swatiprakash
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @swatiprakash | Stardance
|
1793292946.00486
|
1793897746.00486
|