Repository files navigation

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 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

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 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

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 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

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 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

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 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

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 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

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 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

README


Forest Engine

Forest Engine is a C++ / OpenGL Game Engine made from scratch with the only purpose of improving my gamedev and programming skills.

Forest Engine has been the latest iteration of my Game Engine (previously DruidEngine and before that it was ThiefEngine).

After about 10 years of learning I've decided to stop working on it and release the code on GitHub in case it's helpful or interesting to other people.

The state I leave the engine is: stable but not usable, there are still known bugs and pending tasks, so don't take this code as a reliable source of knowledge.

Build

Linux

  • First, download and install dependencies: ./scripts/dependencies.sh
  • Build project: python3 ./scripts/build.py -[ruixlch]
    • -h Show help.
    • -r Compile Release, Debug by default.
    • -u Compile Unit Tests suite. (NEEDED BY test.sh)
    • -i Compile Integration Tests suite. (NEEDED BY test.sh)
    • -x Compile Tools.
    • -l Enable Logs.
    • -p Enable Profiler.
    • -c Clean the project.
  • Run unitary tests (optional): ./scripts/test.sh
  • Generate documentation (optional): ./scripts/doc.sh

Example: build debug tool_Editor with this command python3 scripts/build.py -lp --tool=Editor --gpuDbg

Windows

Not available yet.


Directories

  • code: Source and Headers.
  • config: Engine and scenes config files.
  • scripts: Contains scripts described above.
  • compiledLibs: Contains the libForest.a. Generated by scripts/build.py.
  • binaries: Generated by scripts/test.sh.. Contains the test executable files (both unitary and integration).
  • test: Set of tests. Unitary and Integration.
  • tools: Set of tools.
  • dependencies: Generated by scripts/dependencies.sh. Contains third party libraries.
  • build: Generated by scripts/build.py.

Unitary Tests

Run unitary tests with ./scripts/test.sh. Result are stored in binaries/output. This command will print the results in terminal.

Integration Tests

Run integration test by executing ./binaries/test_integration. Result is stored in log.txt.


Devlogs

Here in my blog you can find all the devlogs of my Game Engine, from 2D initial stages to the latest 3D version: Devlogs


Characteristic

  • OpenGL 4.x
  • Batching
  • Shaders
  • Support for Texture Atlases
  • Animation using Spritesheet
  • Simple UI
  • Scene management
  • Perspective / orthographic camera
  • Stencil
  • Math module
  • Simple scripting
  • Loading 3D models with GLTF
  • Skeletal Meshes
  • Skeletal Animation
  • GPU Skinning
  • PBR Shading
  • Directional Light
  • Shadow Mapping

Showcase

About

C++ OpenGL/Vulkan 3D Game Engine

Topics

Resources

Stars

65 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages