YouTube2Text

I Spent 5 Years Building a Voxel Survival Game Where the World Is a Planet — Transcript

by Incandescent Games · 6,317 words · 1,167 segments · language en · Watch on YouTube

Full transcript

  1. 0:00Five years ago, I started building
  2. 0:02Planet Smith.
  3. 0:03At its core, it's a sandbox survival RPG
  4. 0:07where you explore
  5. 0:09fully spherical voxel planets, build
  6. 0:12anything you can imagine, and eventually
  7. 0:15launch into space to explore the entire
  8. 0:17solar system.
  9. 0:19But, the idea for Planet Smith didn't
  10. 0:22start with space.
  11. 0:24It actually started with something I
  12. 0:26found unsatisfying with Minecraft.
  13. 0:29I've always loved the feeling of
  14. 0:31exploring a new Minecraft world, but
  15. 0:34something about it always frustrated me.
  16. 0:38Minecraft worlds are effectively
  17. 0:40infinite,
  18. 0:41which sounds great until you realize
  19. 0:44that exploring in one direction
  20. 0:47is basically no different than starting
  21. 0:49a brand new world.
  22. 0:51There is no logic to exploration,
  23. 0:54and it feels somewhat futile.
  24. 0:56Because of this, I often found myself
  25. 0:59building a base and staying in roughly
  26. 1:01the same area, exploring only on
  27. 1:03occasion to find a biome I needed.
  28. 1:07There's no real sense of completing a
  29. 1:10world.
  30. 1:12You can't circumnavigate the planet.
  31. 1:15You can't discover the tallest mountain
  32. 1:18on the entire world.
  33. 1:20You can't map your world as there's
  34. 1:22always another horizon that remains
  35. 1:25unexplored.
  36. 1:28So, I was wondering, what if a sandbox
  37. 1:30survival game took place on a real
  38. 1:33planet?
  39. 1:35A world you could actually walk all the
  40. 1:37way around.
  41. 1:39A world where you could map each river
  42. 1:42and find the longest.
  43. 1:44Where mountains compete to be the
  44. 1:46tallest on the planet.
  45. 1:48And where finishing your map actually
  46. 1:51means something.
  47. 1:53That idea naturally led to another one.
  48. 1:57If you're starting on a planet,
  49. 2:00why can't you leave it?
  50. 2:02And that's where the inspiration from No
  51. 2:05Man's Sky started to creep in.
  52. 2:08What if you could build rockets, launch
  53. 2:10into space, and explore the moons and
  54. 2:12other planets in your solar system?
  55. 2:15Each one bringing new resources, new
  56. 2:17dangers, new opportunities.
  57. 2:21And what if all of it, like No Man's
  58. 2:24Sky, was completely seamless?
  59. 2:27No loading screens, just a living solar
  60. 2:29system you can explore freely.
  61. 2:34Visually, I wanted it to feel like a
  62. 2:36tiny handcrafted solar system.
  63. 2:39Something closer to the charm and scale
  64. 2:42of Outer Wilds.
  65. 2:44But combined with the creativity and
  66. 2:46building freedom of a voxel sandbox
  67. 2:49game.
  68. 2:50So, over the past 5 years, I've been
  69. 2:53working on turning that idea into a real
  70. 2:56game.
  71. 2:58Along the way, I've built a custom voxel
  72. 3:01system,
  73. 3:02planetary climate models,
  74. 3:04procedural planet generation,
  75. 3:07a custom physics engine, and a whole lot
  76. 3:10more.
  77. 3:11In this video, I'm going to take you
  78. 3:13through the journey so far.
  79. 3:15This is the 5-year story of building
  80. 3:18Planet Smith.
  81. 3:34Quick announcement.
  82. 3:36We've just launched a demo for Planet
  83. 3:38Smith, and our Kickstarter is now live.
  84. 3:41There are some great ways to get
  85. 3:42involved. Stick around to the end for
  86. 3:45more details.
  87. 3:48Planet Smith
  88. 3:49actually started as an experimental side
  89. 3:52project.
  90. 3:53And this is the first world I ever
  91. 3:56created.
  92. 3:57Well, world might be a bit generous.
  93. 4:00It was really just a cube made out of
  94. 4:02voxels with gravity.
  95. 4:04Because my main inspiration was
  96. 4:06Minecraft, starting with cubes felt like
  97. 4:08an obvious choice.
  98. 4:11My first idea was simple. Build a world
  99. 4:14out of cubes, and then warp that cube
  100. 4:17into a sphere. And technically, it
  101. 4:20worked.
  102. 4:22Near the center of each face of the
  103. 4:24cube, it actually looks relatively good.
  104. 4:28But as you move towards the edges of the
  105. 4:30cube, the stretching starts to get
  106. 4:32worse.
  107. 4:34And by the time you reach the corners,
  108. 4:36the distortion becomes extremely
  109. 4:38obvious.
  110. 4:40Now, you might be thinking,
  111. 4:42"Why not just make the planet bigger, so
  112. 4:44the stretching becomes less noticeable?"
  113. 4:48Unfortunately,
  114. 4:49that doesn't actually fix the problem.
  115. 4:52Scaling the planet up just gets you the
  116. 4:55same distortion pattern with the same
  117. 4:58percentage of blocks being stretched.
  118. 5:01The planet is bigger, but the underlying
  119. 5:03problem is exactly the same.
  120. 5:07So, I needed a different shape.
  121. 5:11One option, which some games actually
  122. 5:13use, is to keep the world as a flat
  123. 5:16plane and fake the curvature using
  124. 5:19shaders.
  125. 5:21For example, the game Eco does something
  126. 5:24similar to this.
  127. 5:26Visually, this can work quite well when
  128. 5:29you're standing on the surface.
  129. 5:32But mathematically, what you've really
  130. 5:34done is take a flat world and stitch the
  131. 5:37edges together.
  132. 5:39Topologically speaking, you haven't made
  133. 5:42a sphere.
  134. 5:43You've made a donut.
  135. 5:46For some games, that's a perfectly
  136. 5:49reasonable compromise.
  137. 5:52But Planet Smith was always meant to
  138. 5:54have planets floating in space.
  139. 5:57And once you zoom out to that scale, the
  140. 5:59illusion completely falls apart.
  141. 6:03So, that meant I needed a true spherical
  142. 6:07world.
  143. 6:08That's when I started looking at
  144. 6:10hexagons.
  145. 6:11Now, if you know a bit of math, you
  146. 6:13might already see the problem. Hexagons
  147. 6:16tile a flat plane perfectly, which means
  148. 6:19if you try to warp them into a planet,
  149. 6:22you'd end up with the exact same issue
  150. 6:25we had with squares. You'd still get a
  151. 6:27donut world.
  152. 6:29But, there's a trick.
  153. 6:31If you start with an icosahedron,
  154. 6:34you might know it as a D20,
  155. 6:37and subdivide it many times, you end up
  156. 6:40with a sphere made entirely of
  157. 6:43triangles.
  158. 6:45And if you then take the 12 original
  159. 6:48vertices of the icosahedron and convert
  160. 6:52them into pentagons while turning all
  161. 6:55the other vertices into hexagons, you
  162. 6:58get something really interesting.
  163. 7:01A sphere made mostly of hexagons with
  164. 7:05just 12 pentagons required to make the
  165. 7:09curvature work.
  166. 7:11And the best part is the distortion
  167. 7:14becomes extremely small.
  168. 7:17No matter where you stand on the planet,
  169. 7:19the blocks look almost identical
  170. 7:22with the only exceptions being those 12
  171. 7:26special pentagons that make the entire
  172. 7:29shape possible.
  173. 7:31With my planet geometry chosen,
  174. 7:34I made my first proper world. This time,
  175. 7:38a bit bigger.
  176. 7:40I also introduced chunks, which breaks
  177. 7:43the planet into lots of smaller pieces
  178. 7:45so they can be generated and rendered
  179. 7:47more efficiently.
  180. 7:49At this stage, the world itself was
  181. 7:51still extremely simple.
  182. 7:53The repeating pattern was mainly there
  183. 7:55just so I could verify that my meshing
  184. 7:58system was actually working correctly.
  185. 8:02At this point, the world was still
  186. 8:04completely static. So, the next step was
  187. 8:07to make it editable.
  188. 8:09This meant adding what I call hexels,
  189. 8:11essentially the hexagonal equivalent of
  190. 8:13voxels, so terrain could be placed and
  191. 8:16removed dynamically.
  192. 8:19Once that worked, I added a very small
  193. 8:21amount of terrain generation, just
  194. 8:24enough to start shaping the surface. And
  195. 8:26after that, it was time to introduce
  196. 8:29different block types.
  197. 8:31I just like to take a moment for you to
  198. 8:33appreciate the beautiful test textures I
  199. 8:36created here.
  200. 8:38Yeah. They're truly works of art.
  201. 8:42But jokes aside, the important thing
  202. 8:44here wasn't the textures.
  203. 8:46It was proving that the engine could
  204. 8:48render different block types [music] and
  205. 8:51different rendering styles. For example,
  206. 8:54things like transparent water or cutout
  207. 8:57materials like leaves.
  208. 8:59Now, in a normal game,
  209. 9:01this might sound pretty trivial.
  210. 9:05But, in a voxel system like this, every
  211. 9:08block inside a chunk shares the same
  212. 9:10mesh. That means combining multiple
  213. 9:13materials and render types into a single
  214. 9:16efficient mesh,
  215. 9:18making it a lot more complicated than it
  216. 9:20might first appear.
  217. 9:23I'll go into more detail on that later.
  218. 9:26This world became really useful for
  219. 9:29debugging another problem.
  220. 9:31Because of the way the planet is
  221. 9:33constructed, Planet Smith actually
  222. 9:35divides the surface into 62 different
  223. 9:38regions.
  224. 9:39These exist mainly to handle the seams
  225. 9:41where different parts of the planet
  226. 9:42meet.
  227. 9:44And those seam introduce a lot of
  228. 9:46potential edge cases.
  229. 9:49So, this little test world ended up
  230. 9:51being the perfect place to make sure I
  231. 9:53handled all the quite literal edge
  232. 9:56cases.
  233. 9:58I also made this cool physical
  234. 10:00papercraft object,
  235. 10:02which was and still is a great tool for
  236. 10:05visualizing the data structure of a
  237. 10:07planet.
  238. 10:09The polystyrene balls represent the
  239. 10:11pentagons and are numbered 0 to 11.
  240. 10:15The popsicle sticks are the edges and
  241. 10:18are numbered 12 to 41.
  242. 10:20These are the edge seam chunks.
  243. 10:23And the 20 triangular faces are numbered
  244. 10:2642 to 61 to give us our 62 regions.
  245. 10:32Half of the faces are blue and half are
  246. 10:34red because some are left-handed and
  247. 10:37some are right-handed.
  248. 10:39This is required for indexing so we can
  249. 10:41always swap between a real-world
  250. 10:43position and an index with some simple
  251. 10:46maths without requiring any complex
  252. 10:49rules.
  253. 10:52I ended up creating quite a few
  254. 10:54different test worlds during this time.
  255. 10:56Each one had a specific purpose. Some of
  256. 10:59you were used to test performance while
  257. 11:01others existed purely to make sure my
  258. 11:03hexel meshing system was working
  259. 11:05correctly and handling all the strange
  260. 11:08edge-cases around the planet seams.
  261. 11:12This process of building, testing, and
  262. 11:14improving the engine actually took a
  263. 11:16couple of years.
  264. 11:17But during most of that time, Planet
  265. 11:19Smith
  266. 11:20was still just a side project that I
  267. 11:23worked on in the evenings and on
  268. 11:25weekends.
  269. 11:27Eventually though, I felt like I had a
  270. 11:29solid proof of concept. So about 3 years
  271. 11:32ago, I made [music]
  272. 11:34the decision to start working on Planet
  273. 11:36Smith full-time.
  274. 11:37And that's when I started properly
  275. 11:39planning the features that would turn it
  276. 11:42from a technical experiment into an
  277. 11:45actual game.
  278. 11:47I wanted to start adding features that
  279. 11:49would make the world feel more like an
  280. 11:51actual planet. So I added a volumetric
  281. 11:54atmosphere.
  282. 11:56This was heavily inspired by a fantastic
  283. 11:58video from Sebastian League about
  284. 12:00simulating planetary atmospheres. His
  285. 12:03in-depth breakdown was very helpful.
  286. 12:07It was a really fun feature to
  287. 12:08experiment with because the goal is to
  288. 12:11simulate the same light scattering
  289. 12:13process that gives Earth its blue sky.
  290. 12:16But there was a small problem.
  291. 12:19In reality, Earth's atmosphere is
  292. 12:22extremely thin compared to the radius of
  293. 12:25the planet.
  294. 12:26My planets on the other hand are
  295. 12:28relatively tiny, which means the
  296. 12:31atmosphere ends up being much thicker in
  297. 12:34comparison to the radius,
  298. 12:36which breaks how the scattering of a
  299. 12:38sunset works.
  300. 12:40Getting the scattering to look good both
  301. 12:43from the ground and from space turned
  302. 12:46out to be surprisingly tricky.
  303. 12:49One really nice side effect of the
  304. 12:51system though is that by tweaking the
  305. 12:53scattering constants, you can completely
  306. 12:55change the color of the atmosphere,
  307. 12:58which I'm sure will come in very handy
  308. 13:00later when it comes time to create alien
  309. 13:04worlds.
  310. 13:06As proud as I was of my beautiful block
  311. 13:08textures, I decided it might be a good
  312. 13:11idea to get a real artist involved.
  313. 13:14But this quickly exposed a technical
  314. 13:16challenge.
  315. 13:17Because of the way the engine works,
  316. 13:19every block in a chunk shares the same
  317. 13:22mesh.
  318. 13:23That means all block textures need to
  319. 13:26live inside a single texture atlas
  320. 13:30with the shader shifting the UV
  321. 13:32coordinates so each block points to the
  322. 13:35correct part of that atlas.
  323. 13:38This technically works, but in practice,
  324. 13:41it would mean asking the artist
  325. 13:43>> [music]
  326. 13:43>> to work inside a single 16,000 by 16,000
  327. 13:48texture file, constantly rearranging
  328. 13:51textures whenever a new block gets
  329. 13:53added,
  330. 13:54which is not exactly a great workflow
  331. 13:58and prone to mistakes.
  332. 14:00And the problem only gets worse as the
  333. 14:03number of blocks grows.
  334. 14:06So instead, I built a custom editor
  335. 14:09tool.
  336. 14:11This lets the artists work the normal
  337. 14:14way
  338. 14:15with one texture per image.
  339. 14:17And then the tool automatically packs
  340. 14:20everything into a single atlas and
  341. 14:23updates the ordering so the correct
  342. 14:25textures appear in game.
  343. 14:27The result ended up working really well.
  344. 14:30The tool gives real-time updates
  345. 14:33whenever textures change,
  346. 14:36lets the artist preview tiling directly
  347. 14:38on terrain, and even exposes optional
  348. 14:41PBR maps and tinting controls.
  349. 14:45This means we can reuse textures with
  350. 14:47different color variations, saving both
  351. 14:49development time and memory.
  352. 14:54To go along with the block tools, I also
  353. 14:56built this structure editor.
  354. 14:58Structures are collections of blocks
  355. 15:00that can be placed into the world as a
  356. 15:02single object during generation.
  357. 15:05That makes it easy to create things like
  358. 15:07trees and buildings,
  359. 15:09which would be too difficult and
  360. 15:10expensive to procedurally generate from
  361. 15:13individual blocks.
  362. 15:15Together, these two tools really opened
  363. 15:17up the possibilities for Planet Smith.
  364. 15:19And suddenly, the planet started looking
  365. 15:22a bit more interesting.
  366. 15:24But
  367. 15:25if we fly up for a moment, you might
  368. 15:27notice something.
  369. 15:29The biomes are pretty random and
  370. 15:32uninspired.
  371. 15:34That was actually one of my main
  372. 15:35criticisms of Minecraft.
  373. 15:37Biomes can feel like they're just
  374. 15:39scattered randomly across the map.
  375. 15:42So my next goal was to improve the
  376. 15:44procedural world generation. And this
  377. 15:46time, use the shape of the planet itself
  378. 15:49to our advantage.
  379. 15:52The first step was generating continents
  380. 15:54and islands.
  381. 15:57For the first planet, I wanted something
  382. 15:59fairly Earth-like with large oceans and
  383. 16:02connected land masses.
  384. 16:04To do that, I built a recursive
  385. 16:06algorithm inspired a little by Conway's
  386. 16:09Game of Life,
  387. 16:11but with randomness added.
  388. 16:14Instead of cells being alive or dead,
  389. 16:16they represent land or ocean.
  390. 16:19Each step of the algorithm increases the
  391. 16:22resolution and decides whether new tiles
  392. 16:24should become land or water.
  393. 16:27Areas with more surrounding land are
  394. 16:29more likely to stay land, which causes
  395. 16:31continents to grow and stay connected
  396. 16:34while still forming interesting shapes.
  397. 16:38Once the land masses were created, I
  398. 16:40moved on to biomes.
  399. 16:42But again,
  400. 16:44I didn't want them to be completely
  401. 16:45random. So instead, I built a simple
  402. 16:49climate model that predicts temperature
  403. 16:51and humidity across the planet. It takes
  404. 16:54into account things like distance from
  405. 16:56the equator,
  406. 16:57proximity to oceans, and adds a little
  407. 17:00bit of procedural randomness.
  408. 17:03The nice thing about this system is that
  409. 17:06it's deterministic.
  410. 17:07If you generate a planet with the same
  411. 17:09seed number, you'll always get the exact
  412. 17:11same world. But change the seed and
  413. 17:14you'll get a completely different
  414. 17:16planet.
  415. 17:17Finally,
  416. 17:18I assigned the biomes based on the
  417. 17:20climate conditions,
  418. 17:22which means the world actually makes
  419. 17:25sense when you explore it. If you travel
  420. 17:28towards the equator, you'll find hotter
  421. 17:30biomes, and if you move away from
  422. 17:33oceans, the environment becomes much
  423. 17:35drier.
  424. 17:37The model is still a little primitive
  425. 17:40and doesn't take things like mountains
  426. 17:42and rain shadows into account.
  427. 17:44I plan to make it much more complex
  428. 17:46later, but even at this basic level, it
  429. 17:49does a great job.
  430. 17:52Now that I had these great planet
  431. 17:53generation models, the next challenge
  432. 17:56was getting the actual world generation
  433. 17:58system to use them.
  434. 18:00The first step was terrain, making sure
  435. 18:03the islands generated in the correct
  436. 18:05places and shaping the terrain so it was
  437. 18:08actually interesting to explore.
  438. 18:12Like most procedural systems,
  439. 18:13>> [music]
  440. 18:13>> this took a bit of trial and error, but
  441. 18:16after some experimentation, I eventually
  442. 18:19landed on terrain generation that I was
  443. 18:21pretty happy with,
  444. 18:23at least for the time being.
  445. 18:25Next came the biomes.
  446. 18:28I hooked the biome system into the
  447. 18:30climate simulation and made sure they
  448. 18:33generated in the correct regions.
  449. 18:36I also added a small blending feature
  450. 18:39that uses dithering between chunks,
  451. 18:41which helps hide the chunk borders
  452. 18:44and makes biome transitions look a lot
  453. 18:46smoother.
  454. 18:48With the world generation coming
  455. 18:50together, I decided it was time to
  456. 18:52expand the block variety.
  457. 18:55I added a new type of block I call mesh
  458. 18:58blocks.
  459. 18:59These allow a block to load a custom 3D
  460. 19:02model instead of using the standard
  461. 19:04hexel shape, which means we can create
  462. 19:07blocks with much more complex geometry.
  463. 19:11But performance was really important
  464. 19:13here.
  465. 19:15If every mesh block was rendered
  466. 19:17separately, it would create a huge
  467. 19:19number of draw calls, which would slow
  468. 19:21the game down significantly.
  469. 19:23So instead, these meshes are merged
  470. 19:26directly into the chunk mesh just like
  471. 19:29normal blocks.
  472. 19:31That keeps rendering extremely
  473. 19:34efficient,
  474. 19:35efficient enough that I can literally
  475. 19:37build an entire world made out of
  476. 19:39barrels even inside the editor.
  477. 19:43After that, I added more specialized
  478. 19:45block types
  479. 19:47like stairs and fences.
  480. 19:49Fences were particularly interesting
  481. 19:52because they needed to change shape
  482. 19:54depending on their neighbors,
  483. 19:57connecting automatically to the nearest
  484. 19:59fence blocks.
  485. 20:01It took a bit of work to implement, but
  486. 20:03it's incredibly satisfying once it all
  487. 20:05snaps together correctly.
  488. 20:09I also experimented with some smart
  489. 20:11blocks that dynamically changed shape
  490. 20:14based on connectivity.
  491. 20:16In theory, this sounds like a great
  492. 20:18idea, but in practice, it was to build
  493. 20:21with and honestly just looked terrible.
  494. 20:25So, that idea didn't last very long.
  495. 20:28Also, I added torches as a new light
  496. 20:31source.
  497. 20:32Originally, my plan was to make every
  498. 20:34torch a fully real-time light source
  499. 20:37with all lighting in game being dynamic,
  500. 20:40but that quickly became problematic,
  501. 20:43mainly because of the performance cost
  502. 20:45of dynamic shadows.
  503. 20:47Instead, I plan to use a hybrid block
  504. 20:50light solution,
  505. 20:51still having real-time light and shadows
  506. 20:54from the sun as that just looks too
  507. 20:57awesome to get rid of.
  508. 21:00Up until this point, block interactions
  509. 21:02were handled with a pretty hacky
  510. 21:04solution.
  511. 21:06For ease,
  512. 21:06>> [music]
  513. 21:07>> I use standard mesh ray casting just
  514. 21:09like you would in a normal game to
  515. 21:11detect what block the player was looking
  516. 21:13at,
  517. 21:14but there was a problem.
  518. 21:16As I mentioned earlier, all the blocks
  519. 21:19in Planet Smith are merged together into
  520. 21:21chunks for performance.
  521. 21:23So, when the ray cast hit something, it
  522. 21:26wasn't actually hitting a block, it was
  523. 21:28hitting the entire chunk mesh.
  524. 21:31To figure out which block was actually
  525. 21:33hit,
  526. 21:35each chunk had a lookup table that
  527. 21:37mapped every triangle in the mesh back
  528. 21:39to a block index,
  529. 21:41which is absolutely disgusting.
  530. 21:45It works, but it's really inefficient
  531. 21:48and prone to bugs. And it also meant you
  532. 21:51couldn't interact with anything that
  533. 21:53didn't have a physics mesh like grass or
  534. 21:56water.
  535. 21:57So, it was finally time to fix the
  536. 21:59problem properly.
  537. 22:01From the beginning, the plan had always
  538. 22:03been to build a custom voxel physics
  539. 22:06[music] system
  540. 22:07and remove physics meshes entirely
  541. 22:10using the voxel data directly, greatly
  542. 22:13increasing performance and reducing
  543. 22:16memory demands.
  544. 22:18Starting with ray casting seemed like
  545. 22:20the perfect first step.
  546. 22:23The first thing I implemented was a
  547. 22:25function that takes a ray and
  548. 22:27calculates, purely with math, which
  549. 22:30voxel indices the ray passes through
  550. 22:33and putting them in order.
  551. 22:36Then, I simply check the blocks at those
  552. 22:38indices and determine whether the ray
  553. 22:41actually hit something.
  554. 22:42If it did, I return the block index.
  555. 22:47The great thing about this approach is
  556. 22:50that it requires no meshes at all.
  557. 22:52And it's incredibly fast, fast enough
  558. 22:55that I can perform billions of ray casts
  559. 22:58per second.
  560. 23:00And because we're working directly with
  561. 23:02voxel data, we can also add custom
  562. 23:05interaction rules. For example, if
  563. 23:08you're placing a block and there's grass
  564. 23:10in the way, the ray cast can ignore the
  565. 23:13grass and place the block on the terrain
  566. 23:15below.
  567. 23:16But if you're breaking blocks, it will
  568. 23:18correctly target the grass first.
  569. 23:22>> [music]
  570. 23:22>> There was still one issue, though.
  571. 23:24This system assumes every block is a
  572. 23:27full block, but many blocks like slabs
  573. 23:30or fences are actually smaller or more
  574. 23:33complex shapes.
  575. 23:35So, when the ray cast hits a partial
  576. 23:37block, I fall back to testing the actual
  577. 23:40triangles inside that block just like a
  578. 23:43traditional ray cast would.
  579. 23:45This means we can correctly interact
  580. 23:48with things like slabs, fences, and
  581. 23:50other detailed blocks.
  582. 23:53It does add a little bit of extra work
  583. 23:55for the ray cast, but since it only
  584. 23:57happens when absolutely necessary, the
  585. 24:00performance is still excellent.
  586. 24:03With ray casting working properly, it
  587. 24:06was time to do something a bit more fun
  588. 24:08to test its performance. So, naturally,
  589. 24:11I built a planet destroying laser.
  590. 24:13This thing could carve huge holes
  591. 24:16through the terrain,
  592. 24:17and I spent a surprising amount of time
  593. 24:20just flying around slicing pieces out of
  594. 24:23planets.
  595. 24:24It turned out to be a great stress test
  596. 24:27because every time a block changes
  597. 24:29inside a chunk, the entire chunk mesh
  598. 24:32has to be rebuilt instantly.
  599. 24:35It needs to happen fast enough that the
  600. 24:38player never notices.
  601. 24:41Since destroying planets was apparently
  602. 24:44so entertaining, I decided to push
  603. 24:47things even further and add explosions.
  604. 24:50For that, I created another voxel
  605. 24:52physics function called an overlap
  606. 24:54sphere, which, like the ray casts, works
  607. 24:58directly on the voxel data rather than
  608. 25:01physics meshes.
  609. 25:03I started with small explosions and
  610. 25:06gradually increased the size,
  611. 25:08and I was actually really impressed by
  612. 25:10how large I could make them
  613. 25:12while the game still ran smoothly.
  614. 25:15With a bit of randomness and some visual
  615. 25:18effects,
  616. 25:19the result looked pretty convincing.
  617. 25:22Although since then, I've actually
  618. 25:24changed how explosions work. Instead of
  619. 25:26using spheres, they're now generated
  620. 25:29using a collection of ray casts, which
  621. 25:32produces better shaped craters and
  622. 25:34allows for gameplay mechanics
  623. 25:36like blocks that can shield other blocks
  624. 25:39from explosions.
  625. 25:41And of course, since this is a space
  626. 25:43game,
  627. 25:44I had to add meteors.
  628. 25:47They're also fun to play around with,
  629. 25:49and I think they could become an
  630. 25:50interesting gameplay feature in the
  631. 25:53future.
  632. 25:54I might save them for some of the more
  633. 25:57dangerous planets
  634. 25:58because I'm not sure players would
  635. 26:00appreciate spending hours building a
  636. 26:02house only for it to be completely
  637. 26:05annihilated by a meteor.
  638. 26:07At this point, Planet Smith required a
  639. 26:09pretty powerful computer to run well, so
  640. 26:12I thought now was a good time to
  641. 26:13optimize the engine as I was planning a
  642. 26:16public play test.
  643. 26:18After finding a lot of low-lying fruit,
  644. 26:21the performance improved dramatically.
  645. 26:24In fact, I managed to optimize the game
  646. 26:26so much that I could actually get it
  647. 26:28running on my phone.
  648. 26:30I'd find out later that I still had an
  649. 26:32issue with older graphics cards,
  650. 26:35but this was very promising for the
  651. 26:37future as I knew there were plenty more
  652. 26:40things to optimize.
  653. 26:43At this point, I felt the game was ready
  654. 26:46for its first public play test, and
  655. 26:48thankfully, a lot of you joined in.
  656. 26:50At the time, we only had creative mode,
  657. 26:53but we ran a small building competition,
  658. 26:55and it was amazing to finally see what
  659. 26:58other people could create in the game.
  660. 27:01There were some really impressive
  661. 27:02builds, especially considering the game
  662. 27:05still had a fairly limited set of
  663. 27:06blocks.
  664. 27:08After the play test,
  665. 27:10my attention turned to the next big
  666. 27:12milestone,
  667. 27:13survival mode.
  668. 27:17The first step towards that was creating
  669. 27:19a player character and saying goodbye to
  670. 27:22the blue capsule, which had been a
  671. 27:24placeholder for years now.
  672. 27:27Because of Planet Smith's visual style,
  673. 27:30a high poly realistic character
  674. 27:33doesn't really fit,
  675. 27:34but I also didn't want the low poly
  676. 27:37look, either.
  677. 27:39I wanted something stylized that felt
  678. 27:41like it belonged in this hexagonal
  679. 27:43universe.
  680. 27:45The first attempt was not popular,
  681. 27:48but that actually started a really great
  682. 27:50discussion in our Discord.
  683. 27:53And a community member named Jerry
  684. 27:56submitted a concept for a stylized
  685. 27:58character that fit perfectly with the
  686. 28:00world.
  687. 28:02With some tweaks and iteration, that
  688. 28:04design eventually became North, the
  689. 28:06player character.
  690. 28:09He's still a little divisive, but
  691. 28:10personally, I think the style fits
  692. 28:12really nicely with the universe
  693. 28:15Planet Smith is trying to create.
  694. 28:17With the player character sorted, the
  695. 28:19next step for survival mode was block
  696. 28:21breaking.
  697. 28:22Up until this point, blocks were removed
  698. 28:25instantly when you interacted with them,
  699. 28:27which works fine in creative mode, but
  700. 28:29survival requires blocks to take time to
  701. 28:32break with the speed depending on the
  702. 28:34tools you're using.
  703. 28:36This was another one of those features
  704. 28:38that seemed simple in my head, but
  705. 28:40turned out to be much more complicated
  706. 28:42in practice.
  707. 28:44Because Planet Smith uses a
  708. 28:46multi-threaded architecture,
  709. 28:48most block interactions happen inside
  710. 28:51worker threads.
  711. 28:52That's great for performance, but meant
  712. 28:54I needed a proper callback system to
  713. 28:57track breaking progress and avoid
  714. 28:59strange situations like accidentally
  715. 29:02breaking the same block twice,
  716. 29:05which could become a serious issue in
  717. 29:07multiplayer.
  718. 29:09The breaking animation itself turned out
  719. 29:11pretty cool, though.
  720. 29:13It uses a 3D texture containing
  721. 29:16different break stages.
  722. 29:18This creates a smooth transition rather
  723. 29:21than the usual fixed cracking stages you
  724. 29:23see in Minecraft.
  725. 29:26Survival mode also meant introducing a
  726. 29:28proper inventory system. Instead of just
  727. 29:31having blocks, they now need to be
  728. 29:33stacked, stored, and consumed correctly.
  729. 29:37Just like block breaking, block placing
  730. 29:40turned out to be more complicated than
  731. 29:42expected because of the multi-threading.
  732. 29:46When you place a block, the request is
  733. 29:48queued to an asynchronous thread. This
  734. 29:50creates a tiny delay, which you could
  735. 29:53exploit by switching items at exactly
  736. 29:55the right moment, and essentially
  737. 29:57duplicating blocks.
  738. 30:00I eventually solved that using a token
  739. 30:02system that tracks pending placements
  740. 30:04and ensures the inventory stays
  741. 30:07consistent.
  742. 30:08Another important survival feature was
  743. 30:10the ability for items and blocks to be
  744. 30:13dropped on the ground and picked up.
  745. 30:15This turned out to be a great
  746. 30:17opportunity to continue developing
  747. 30:20>> [music]
  748. 30:20>> the custom voxel physics system.
  749. 30:23One of the big problems with traditional
  750. 30:25mesh collision [music] is that if an
  751. 30:27object ever clips into terrain,
  752. 30:30for example, if a player places a block
  753. 30:33on top of a dropped item, the object can
  754. 30:36fall straight through the world because
  755. 30:38the physics engine has no idea that it's
  756. 30:41inside a voxel.
  757. 30:43So,
  758. 30:44just like with hexel ray casts, I built
  759. 30:47a system that works directly with the
  760. 30:49voxel data instead of meshes.
  761. 30:52My first version had a slightly amusing
  762. 30:55problem where items would bounce around
  763. 30:58everywhere,
  764. 31:00which I quickly fixed by zeroing their
  765. 31:02velocity when they hit something.
  766. 31:05Now, if a block gets placed on top of a
  767. 31:08dropped item, the item will actually
  768. 31:10bubble up to the surface instead of
  769. 31:12being lost underground forever.
  770. 31:15Next, I added ambient occlusion.
  771. 31:18Ambient occlusion is a technique that
  772. 31:20simulates [music] how exposed different
  773. 31:22parts of a scene are to ambient light,
  774. 31:25darkening corners and crevices to add
  775. 31:28depth and realism.
  776. 31:30Most games implement this as a
  777. 31:32post-processing effect using depth and
  778. 31:35normal textures after the scene is
  779. 31:37rendered.
  780. 31:38I tried that, but the effect was a
  781. 31:40little underwhelming.
  782. 31:43Because Planet Smith has full voxel
  783. 31:45data, I was able to calculate ambient
  784. 31:47occlusion during the meshing process
  785. 31:50instead.
  786. 31:51When generating the mesh, I store extra
  787. 31:54data for each vertex that determines how
  788. 31:57much it should be darkened.
  789. 32:00The shader then uses that value when
  790. 32:02rendering the terrain.
  791. 32:04Because this effect works per vertex, I
  792. 32:08occasionally
  793. 32:09>> [music]
  794. 32:09>> had to add extra vertices to certain
  795. 32:11faces so the shading could interpolate
  796. 32:14correctly.
  797. 32:16The visual improvement was huge. To
  798. 32:18demonstrate the difference, here's a
  799. 32:20comparison.
  800. 32:21The left side with ambient occlusion
  801. 32:24enabled, and the right side with it
  802. 32:26disabled.
  803. 32:28It's amazing how much depth such a
  804. 32:31subtle effect can add [music] to the
  805. 32:33whole world.
  806. 32:36At this point, the game was almost ready
  807. 32:39for a survival mode play test, but one
  808. 32:41major ingredient was still missing,
  809. 32:44mobs.
  810. 32:45We need passive creatures for the player
  811. 32:47to hunt and gather resources from,
  812. 32:49and hostile mobs to create some danger.
  813. 32:52And to have mobs, we need AI.
  814. 32:55Not the modern large language model kind
  815. 32:58of AI, but the classic game development
  816. 33:00kind, a programmed set of behaviors that
  817. 33:03determine how characters act.
  818. 33:06The first challenge is navigation.
  819. 33:09Most games solve this using something
  820. 33:10called a navigation mesh, or nav mesh,
  821. 33:13a pre-built network that tells AI where
  822. 33:17it can walk.
  823. 33:18But because Planet Smith
  824. 33:20uses fully editable voxels, the world
  825. 33:22can change at any moment. That makes a
  826. 33:25traditional nav mesh impossible.
  827. 33:27Luckily, we already have something very
  828. 33:29similar, the voxel data itself.
  829. 33:33The system first identifies
  830. 33:35>> [music]
  831. 33:35>> which hexels the start point and the
  832. 33:38target location are,
  833. 33:40then uses an A* pathfinding algorithm to
  834. 33:44calculate the shortest path between
  835. 33:46those two points across the surface of
  836. 33:49the blocks.
  837. 33:51Once we can navigate the world, the next
  838. 33:53step is behaviors.
  839. 33:55Each mob has a set of behaviors that
  840. 33:57define what it should do and when it
  841. 33:59should switch between them.
  842. 34:00Take the bear, for example.
  843. 34:02Most of the time, it simply wanders
  844. 34:04around its territory, occasionally
  845. 34:06stopping to look around.
  846. 34:08During this state, it checks for threats
  847. 34:11using the voxel ray casting system.
  848. 34:14If it spots the player nearby,
  849. 34:16or the player attacks it, the bear
  850. 34:18switches into attack [music] mode.
  851. 34:20In this state, it tries to pathfind
  852. 34:22towards the target as quickly as
  853. 34:24possible, and once it gets close enough,
  854. 34:26it attempts to attack.
  855. 34:29If it loses sight of the player for long
  856. 34:30enough, it eventually returns to its
  857. 34:33normal wandering behavior.
  858. 34:35With AI working, the game was almost
  859. 34:37ready for the next [music] play test.
  860. 34:38Before opening it up, I quickly added a
  861. 34:41few survival features that were
  862. 34:43functional enough for testing. Things
  863. 34:45like a temporary crafting system, beds,
  864. 34:48chests, and a bunch of placeholder ores
  865. 34:50to mine.
  866. 34:53This play test [music] highlighted
  867. 34:55another major issue, performance.
  868. 34:58Quite a few players were experiencing
  869. 35:00heavy stuttering and could only run the
  870. 35:02game on the lowest settings.
  871. 35:04That was surprising to me because my
  872. 35:06machine could run at over 200 FPS on
  873. 35:09maximum settings.
  874. 35:11But after digging into the problem, the
  875. 35:13reason became clear.
  876. 35:15I'd accidentally created a cascade
  877. 35:17scenario.
  878. 35:18If a computer was just below a
  879. 35:20performance threshold, certain tasks
  880. 35:23would begin to lag behind.
  881. 35:25The delay would then block other
  882. 35:27important systems, which caused even
  883. 35:29more delays,
  884. 35:31and the problem quickly spirals into
  885. 35:33massive lag spikes.
  886. 35:35There was also another issue I already
  887. 35:38knew about.
  888. 35:39Planet Smith was extremely RAM hungry.
  889. 35:42If you let it, the game could easily
  890. 35:44consume 40 GB of memory.
  891. 35:47So, it was finally time to address
  892. 35:50something I'd been putting off for a
  893. 35:51while,
  894. 35:52a major overhaul of the game's core data
  895. 35:55structures.
  896. 35:57Up until now, every block in the world
  897. 35:59was stored as two bytes.
  898. 36:0212 bits stored the block ID,
  899. 36:05and the remaining four bits stored block
  900. 36:07state,
  901. 36:08things like rotation or color.
  902. 36:12This limited the game to 4,096
  903. 36:16different blocks, which sounds like a
  904. 36:18lot,
  905. 36:19but thinking long-term, especially with
  906. 36:21modding in mind, that probably won't be
  907. 36:23enough.
  908. 36:25But, the biggest issue is memory usage.
  909. 36:29Each chunk contains 16 by 16 by 512
  910. 36:33blocks, which is over 130,000
  911. 36:37blocks per chunk,
  912. 36:39and it's very easy for the game to have
  913. 36:4140,000 chunks loaded at once.
  914. 36:44That adds up to more than 5 billion
  915. 36:48blocks in memory.
  916. 36:49At two bytes per block, that's over 10
  917. 36:52GB of RAM,
  918. 36:54and that's where the memory problem came
  919. 36:56from.
  920. 36:58What I needed to do was increase the
  921. 37:01data per block, adding things like block
  922. 37:04lighting, while at the same time
  923. 37:06>> [music]
  924. 37:06>> reducing memory usage.
  925. 37:09The only realistic way to do that is
  926. 37:11through compression.
  927. 37:13So, instead of each chunk storing one
  928. 37:15massive array of block IDs, it now
  929. 37:18stores two arrays.
  930. 37:20First, a palette, which lists all block
  931. 37:22types used inside that chunk, and
  932. 37:24second, a block index array, [music]
  933. 37:27which references blocks inside the
  934. 37:29palette.
  935. 37:30Previously, each block needed two bytes,
  936. 37:33but with this system, if a chunk only
  937. 37:36contains 16 or less unique block types,
  938. 37:40each block only needs half a byte to
  939. 37:43reference the palette.
  940. 37:44That's a 75% reduction in memory usage.
  941. 37:48If the chunk contains up to 256 block
  942. 37:51types,
  943. 37:52we use one byte per block, which is
  944. 37:55still a 50% reduction.
  945. 37:57And in the worst case,
  946. 37:59with
  947. 38:00over 256 block types, we still only need
  948. 38:04three nibbles, giving a 25% reduction.
  949. 38:08In practice, though, most chunks use
  950. 38:11fewer than 16 block types, especially
  951. 38:14right after world generation.
  952. 38:16But, it gets even better. About 65%
  953. 38:20of chunks are completely empty.
  954. 38:23For those chunks, we simply store no
  955. 38:25block data at all, reducing their memory
  956. 38:28usage to essentially zero.
  957. 38:31Altogether, this system reduced the
  958. 38:33average memory usage by about 91%.
  959. 38:37And because blocks are now stored only
  960. 38:40in the palette, it also opens the door
  961. 38:43for more data per block.
  962. 38:45Planet Smith can now support over 65,000
  963. 38:49unique block types,
  964. 38:51each
  965. 38:52with a full byte for block state and two
  966. 38:55bytes of lighting data.
  967. 38:58With this complete, Planet Smith was
  968. 39:00using an order of magnitude less memory,
  969. 39:03now requiring about two gigs, which is
  970. 39:06much more reasonable.
  971. 39:09Changing the game's core data structure
  972. 39:11obviously broke everything.
  973. 39:14Suddenly, almost every system in the
  974. 39:16engine needed to be updated to work with
  975. 39:19the new format.
  976. 39:21But rather than just converting
  977. 39:23everything directly, I decided to take
  978. 39:26the opportunity to overhaul several core
  979. 39:29systems at the same time.
  980. 39:31Some of them were already showing their
  981. 39:34age. In fact, the old meshing system was
  982. 39:37one of the biggest causes of lag spikes
  983. 39:40because it had a tendency to block the
  984. 39:42worker threads while rebuilding chunks.
  985. 39:46Once those systems were redesigned, it
  986. 39:49was time to re-add world generation.
  987. 39:53Technically, I could have just ported
  988. 39:55the old system over, but it had its own
  989. 39:57problems.
  990. 39:59The biggest one was that every biome was
  991. 40:02hardcoded, which made it difficult to
  992. 40:04tweak and impossible to scale for the
  993. 40:07future.
  994. 40:08Instead, I wanted a data-driven system
  995. 40:10that could eventually support a proper
  996. 40:12world editor
  997. 40:13and make it much easier to create new
  998. 40:16biomes.
  999. 40:18The first step was terrain generation.
  1000. 40:21The original system relied on simple
  1001. 40:24height maps,
  1002. 40:25which worked fine for hills and
  1003. 40:27mountains,
  1004. 40:28>> [music]
  1005. 40:28>> but it makes things like overhangs and
  1006. 40:30caves impossible.
  1007. 40:32To fix that, I needed to add another
  1008. 40:34dimension to the terrain calculations,
  1009. 40:37but switching from a 2D system to full
  1010. 40:403D noise would make the generation 512
  1011. 40:43times slower, which would completely
  1012. 40:45destroy all the performance improvements
  1013. 40:48I'd just made.
  1014. 40:50Instead, I used a hybrid approach.
  1015. 40:53The base terrain is still generated
  1016. 40:55using a 2D height map, but then 3D noise
  1017. 40:59is applied around the surface,
  1018. 41:01adding variation and allowing for
  1019. 41:04cliffs, overhangs, and much more
  1020. 41:06interesting terrain shapes.
  1021. 41:08By adjusting the strength and depth of
  1022. 41:10this noise, the system can generate
  1023. 41:12anything from gentle rolling hills to
  1024. 41:15extreme alien landscapes.
  1025. 41:18For caves, I added a separate generation
  1026. 41:21pass using another optimization trick.
  1027. 41:25Instead of calculating caves entirely in
  1028. 41:273D, the system first determines where
  1029. 41:31caves should exist in 2D,
  1030. 41:33and then sinks those cave systems down
  1031. 41:36to their generation depth.
  1032. 41:38Running this process several times
  1033. 41:40produces cave networks that look
  1034. 41:42surprisingly natural, while still being
  1035. 41:45very cheap to generate.
  1036. 41:48Next came the biome system.
  1037. 41:51As we talked about earlier, I had built
  1038. 41:52these great climate models based on
  1039. 41:54temperature and humidity, but the biome
  1040. 41:57systems itself was still completely
  1041. 42:00hardcoded.
  1042. 42:01That meant that making changes was slow,
  1043. 42:03difficult, and impossible for modders.
  1044. 42:07So, I built a new biome editor tool.
  1045. 42:10On the left side, there's an interactive
  1046. 42:12graph, where one axis represents
  1047. 42:14temperature and the other represents
  1048. 42:16humidity.
  1049. 42:18Each biome appears as a point on this
  1050. 42:20graph, and moving it changes the
  1051. 42:23environmental conditions where the biome
  1052. 42:25will appear.
  1053. 42:26What makes this really powerful is that
  1054. 42:29on the right side, the planet updates in
  1055. 42:31real time.
  1056. 42:33You can even change the world seed to
  1057. 42:35instantly see how the biome generates
  1058. 42:37across completely different planets.
  1059. 42:41Each biome is now just a collection of
  1060. 42:43data.
  1061. 42:44You define the terrain properties,
  1062. 42:46the blocks it uses, and the structures
  1063. 42:49that can spawn with it.
  1064. 42:51With this system, it becomes incredibly
  1065. 42:54quick to create new biomes,
  1066. 42:56and eventually, even an entire alien
  1067. 42:59worlds.
  1068. 43:01There was still one challenge left,
  1069. 43:02though, blending between biomes.
  1070. 43:05Previously, the terrain system was
  1071. 43:07constant everywhere, but now the terrain
  1072. 43:09properties needed to
  1073. 43:10>> [music]
  1074. 43:10>> transition smoothly between biomes.
  1075. 43:13Since everything is data-driven, I could
  1076. 43:15blend terrain parameters based on the
  1077. 43:19weights of nearby biomes.
  1078. 43:22I had weird patterns, missing chunks,
  1079. 43:25and at one point, I was getting these
  1080. 43:27bizarre wave patterns across the
  1081. 43:29terrain.
  1082. 43:30This turned out to be a quirk of
  1083. 43:32blending frequencies.
  1084. 43:35After fixing those issues, the results
  1085. 43:37turned out really well.
  1086. 43:39Here you can see several biomes blending
  1087. 43:41together smoothly, each one gradually
  1088. 43:44transitioning into the next.
  1089. 43:48There are still a few features I'd like
  1090. 43:50to add to this system in the future, but
  1091. 43:52this is a much stronger foundation for
  1092. 43:55PlanetSmith [music] going forward, and
  1093. 43:57hopefully, one day, it will also become
  1094. 44:00a really powerful modding tool.
  1095. 44:03And with that,
  1096. 44:04you're pretty much caught up to where
  1097. 44:06PlanetSmith is today.
  1098. 44:08Right now, I'm back working on the
  1099. 44:10custom hexel physics.
  1100. 44:12This time, focusing on full player
  1101. 44:15collision and movement using only voxel
  1102. 44:18data.
  1103. 44:19It's proving to be one of the more
  1104. 44:20challenging systems so far,
  1105. 44:23but I'm confident it'll be finished
  1106. 44:24soon.
  1107. 44:26After that, there's still a few big
  1108. 44:28technical features left, things like
  1109. 44:30LODs, but the main focus is starting to
  1110. 44:33shift from technology to gameplay.
  1111. 44:37Over the next 12 months, my goal is to
  1112. 44:39build a fully fleshed-out survival
  1113. 44:41experience, something with real depth,
  1114. 44:44progression, and unique mechanics that
  1115. 44:47give players a strong reason to explore
  1116. 44:49everything PlanetSmith has to offer.
  1117. 44:52If that sounds exciting to you,
  1118. 44:54if you've made it this far in the video,
  1119. 44:55it probably does,
  1120. 44:57consider subscribing,
  1121. 44:59and head over to our Steam page to check
  1122. 45:02out the PlanetSmith demo,
  1123. 45:04and don't forget to wishlist PlanetSmith
  1124. 45:06while you're there.
  1125. 45:08I have just launched the PlanetSmith
  1126. 45:11Kickstarter.
  1127. 45:12As you've seen, the game has already
  1128. 45:14come a long way over the past 5 years,
  1129. 45:17but now I'm asking for your help to take
  1130. 45:20it to the next level.
  1131. 45:21The goal is to accelerate development
  1132. 45:24over the next 12 months, and give
  1133. 45:26PlanetSmith the strongest launch it
  1134. 45:28possibly can.
  1135. 45:30This means more survival content,
  1136. 45:33features added earlier, like
  1137. 45:35interplanetary travel and multiplayer,
  1138. 45:38and a much higher level of polish
  1139. 45:41leading into the planned 2027 release.
  1140. 45:44If you believe in the PlanetSmith
  1141. 45:46vision,
  1142. 45:47this is your chance to help make it
  1143. 45:49happen.
  1144. 45:51And there are some great rewards, too,
  1145. 45:53including instant alpha access,
  1146. 45:56exclusive skins,
  1147. 45:58the chance to leave your own mark on the
  1148. 46:00game,
  1149. 46:01and the best PlanetSmith discount you
  1150. 46:04will find.
  1151. 46:07So, if that sounds like something you
  1152. 46:08want to be part of,
  1153. 46:10head over to the Kickstarter page and
  1154. 46:12check it out.
  1155. 46:14If you're still hungry for more
  1156. 46:15PlanetSmith content, you're in luck.
  1157. 46:18There is a full back catalog of devlogs
  1158. 46:21that go into much deeper detail on
  1159. 46:23everything you've seen here,
  1160. 46:25as well as a Discord community where you
  1161. 46:27can follow development and get involved.
  1162. 46:30And finally, a huge thank you to all the
  1163. 46:34YouTube members and supporters, past and
  1164. 46:37present.
  1165. 46:39You've played a big part in getting
  1166. 46:40PlanetSmith to where it is today.
  1167. 46:44Thanks for watching.

About this transcript

This page contains the full transcript of I Spent 5 Years Building a Voxel Survival Game Where the World Is a Planet by Incandescent Games, generated from the public captions YouTube serves with the video. The transcript has 6,317 words across 1,167 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.