Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Math for Game Developers Sample Code

This is the source code for the sample code that I use in my Math for Game Developers YouTube series. If you want to follow along with the videos, you can download by clicking the 'ZIP' button in the header near the top of this page.

Overview

You'll find these directories:

game - This is where the main.cpp is, which is the primary bit of code that we'll be modifying.

math - This is where all of the math stuff that we'll be implementing lives.

content - When the game is run, it's run in this directory, even though there's no .exe in here. That means it looks for its textures, models, shaders, etc files here.

renderer - Shaders and rendering are carried out here. All OpenGL code is contained in these files. To render something, first create a rendering context:

CRenderingContext c(Application()->GetRenderer(), true):

If there's already a rendering context open then use that one, don't create two contexts in the same method.

Shaders are loaded from text files in the shaders directory in the SMAK distribution. The shader library will read every .txt file in this directory and compile it as a new shader. The .txt file specifies which file should be used as the vertex and fragment shaders, so files can be reused between shaders. It also specifies parameters which can be specified in the material .mat files. The files header.si and functions.si are imported for you at the beginning of every shader. Some attributes and uniforms are hard-coded. For vertex shaders:

  • uniform mat4x4 mProjection
  • uniform mat4x4 mView
  • uniform mat4x4 mGlobal

And for fragment shaders:

  • out vec4 vecOutputColor

vecOutputColor is the value to which the output value for a fragment shader should be assigned. The rest are up to you.

datamanager - Sometimes data needs to be serialized to and from the hard drive. data.h contains a CData class that is a generic data container, and dataserializer.h can serialize any CData to and from a stream. Data is stored in a simple format that looks like this:

key: value
{
// Sub-datas
key: value
key2: value
// Values are optional
key3
{
subdata
}
}

This format is used for things like shader .txt files.

include and lib - This code depends on some third party libraries, and they can be found here.

Compiling

This project has no dependencies and should compile out-of-the-box. If something doesn't work for you please let me know.

  1. Download and install Visual Studio 2010 Express.
  2. Download the MFGD project files and unpack them somewhere to your hard drive.
  3. Double click the MFGD.sln file. Visual Studio should appear.
  4. Press F7 to compile the game.
  5. Press F5 to run the game.

Want to send your game to a sexy friend? You'll need to do some extra steps.

  1. Go to the dropdown in Visual Studio that says "Debug" and set it to "Release" instead. It should be near the top of the screen.
  2. Press F7 to compile the game in "Release" mode.
  3. Find the file MFGD.exe (it's an "Application" file type) and copy it over to the "content" folder.
  4. Send this content folder to your sexy friend.

(The steps are the same for non-sexy friends.)

For Linux the steps are:

  1. Make sure you have GCC installed for your system.
  2. Download the MFGD project files and unpack them somewhere on your hard drive.
  3. Open a terminal and navigate to this directory, eg "cd ~/mfgd"
  4. Type "make"
  5. Type "./run_mfgd"

Tinker

This code is built on top of Tinker, Lunar Workshop's internal game engine. I ripped out a bunch of stuff so that it's much simpler. As MFGD progresses and new things are learned, I'll add those things back into the engine.

If you want the actual thing you can find it in the SMAK source code, it's much more fully featured. It has materials and a console and a GUI and lots of other neat stuff.

Licenses

Tinker is licensed under a permissive MIT-style license, meaning you may use it to build your own projects with no requirement to distribute the source code, but you must give credit to the original author somewhere in your program, like on the "About" or "Credits" page.

The full text of the license is included in the file LICENSE.Tinker and at the top of every source code file to which it applies.

About

Sample code for my YouTube series.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages