Vecren: The Story Up Until Now. Part 1 of ??

(Note: this dev blog was started some 3 months into the process. These posts will share a tag, and are my attempt to reconstruct how we got to Present Day.)

It's surprising what can happen on a bored weekend.

Background: I have been a full stack dev for 25 years. I have dabbled off and on in game dev over the years, but usually with the same result: when progress slows enough to not see obvious improvements, I tend to lose interest. Add that to ADHD and voila! - a Big Stack of Unfinished Projects. At any rate, I learned OpenGL basics like 15 years ago from whichever book it was/is: the blue book? the red book? And one of the little things I did back then: I wrote a tiny vector renderer in vanilla C. In the style of 80s vector arcade games: asteroids, star wars, etc. And I got as far as getting it working and drawing some basic text I created on graph paper, and making the jeep from Armor Attack, which I could drive around using the arrow keys. But that's where it stalled.

Enter a Saturday morning around 3 months ago.

My sleep schedule is weird. I get up at 4am. Full stop. I am merely awake. I'm not groggy or tired, my body is just like "you're up". So since I live with wife and grown child, I have to keep it pretty quiet in the mornings, so I usually come into my office, put on some music and find some code project to pick at.

On this particular morning, I remembered my little vector lib - the source of which is LONG lost, and wondered if if could vibe code up something similar for funsies, since that was an option now. So I opened up a ChatGPT window, and described what I was doing, but more importantly: described how I wanted it used. I wanted it to have 3 drawing calls: drawPoint(x,y), drawLine(x1, y1, x2, y2), and drawPolygon(vertices, isClosed). And that's IT. Aside from some initial setup - It draws lines and points.

A few hours later, I had one. I played around with a lot of things to get the look correct, and after another few iterations I am pretty happy with it. There is still a moire pattern which can be faintly seen in the glow at certain angles, which someone with actual shader knowledge could probably fix, but I have ZERO shader knowledge. Gave it 3 presets, but you can adjust individual properties: Asteroids (minimal glow/trails, ideally monochrome), Star Wars (tuned for multicolor, light glow/trails), and GeometryWars (super long trails/glow. White centers on colored lines to give them kind of a neon look.),

Vecren with a Geometry Wars style preset

I also broke a common convention I have been seeing for Game Dev, which may or may not shoot me in the foot later, but: I made 0,0 Bottom LEFT, and 0 degrees/radians UP/NORTH. Mostly because 0,0 being Top Left, +Y = down, and 0 radians being RIGHT/EAST was always confusing to me, since I mentally have to rotate everything in my head. This is 100% MY problem, I realize. ;) I also do everything in degrees because again - radians seem weird to me. It might be because I never took Math beyond high school Trig, and Geometry only ever spoke in degrees. Plus when I learned the 4 directions it was: North South East West, or North East South West, but north was always first, so North = 0.

Disclaimer: This code was written with considerable assistance from generative AI. Straight up, no two ways about it, and I do not claim otherwise. To answer the most obvious question: COULD I have written this code completely on my own? Yes. Would I have remained interested long enough at the MUCH slower rate of progress to complete it? Definitely not. I feel like AI primarily served as an assistive tool here. I also had done a little bit of coding with AI prior to this, but it had never occurred to me to use two of them. Here is the general process, which only as of this writing (2026 Feb 12) is just now starting to morph into something a bit more fine grained (explored in later blog posts, as I am currently recounting THIS one from memory):

  1. Open a chatGPT session, paste it a default prompt instructing it to act in assisting me with a feature design, as well as any of my LLM defaults - formatting, etc.
  2. Instruct cGPT that it is to assist me with <thing>*, and we will be producing a prompt that I will be passing off to a coding LLM (cLLM - claude in this case) to devise an implementation plan.
  3. Launch into a thorough description of the feature, how I would like it coded and describe the API/interface I want it to have. This was by far the longest part of the process at first.
  4. Once we have come up with a design I am happy with, and I feel like it actually understands what I want, it produces the first prompt - instructing the cLLM what we are building.
  5. I give that prompt to the cLLM in Plan mode, and it returns an implementation plan. The prompt specifies that it must return all files to be touched and what will change in each one. It outputs an implementation plan.
  6. Paste the Plan back into cGPT for discussion and revision. Between the two of us, we come up with an update to the Plan, and create another prompt with the delta.
  7. The delta prompt goes into the cLLM which produces an updated plan. The cycle between steps 6 and 7 repeat until both cGPT and I agree that the plan is sound. (On average? 6-7 round trips. As few as only 1 revision, and I had one that got really deep and went like 25, and would have kept going until I advised cGPT that it was just nitpicking, and it agreed.)
  8. Tell the cLLM to implement the plan. It does so.
  9. Zip up the code and upload to cGPT for inspection, while I review it myself. Did we implement right? is there anything that might bite us later? If so, we address it in a similar manner: small delta updates until we get where we wanna go.
  10. Decide on the next task.

That process has refined itself somewhat over time as the code and number of libs has grown, but that was the gist of it.

Next up: have renderer - what now? Part 2! that's what!