All Projects → zhangdoa → Innocenceengine

zhangdoa / Innocenceengine

Licence: gpl-3.0
Cross-platform modern game engine.

Projects that are alternatives of or similar to Innocenceengine

Bgfx
Cross-platform, graphics API agnostic, "Bring Your Own Engine/Framework" style rendering library.
Stars: ✭ 10,252 (+6780.54%)
Mutual labels:  engine, opengl, vulkan, rendering
CLUSEK-RT
Vulkan based C++ ray-tracing game engine.
Stars: ✭ 24 (-83.89%)
Mutual labels:  game-engine, engine, rendering, vulkan
Vxr
General purpose engine written in C++ with emphasis on materials rendering (PBR, clear coat, anisotropy, iridescence)
Stars: ✭ 181 (+21.48%)
Mutual labels:  game-engine, engine, opengl, rendering
Vulkust
An engine for Vulkan in Rust, tries to implement modern graphic features. (suspended for now)
Stars: ✭ 64 (-57.05%)
Mutual labels:  game-engine, engine, vulkan, cross-platform
Fiber2d
Cross-platform 2D Game Engine in pure Swift
Stars: ✭ 415 (+178.52%)
Mutual labels:  game-engine, opengl, vulkan, cross-platform
Raz
Modern & multiplatform game engine in C++17
Stars: ✭ 161 (+8.05%)
Mutual labels:  game-engine, opengl, rendering, cross-platform
Engine
A basic cross-platform 3D game engine
Stars: ✭ 208 (+39.6%)
Mutual labels:  game-engine, engine, opengl, cross-platform
Fishengine
Simple, Unity-like Game Engine.
Stars: ✭ 191 (+28.19%)
Mutual labels:  game-engine, engine, opengl, cross-platform
Ncine
A cross-platform 2D game engine
Stars: ✭ 372 (+149.66%)
Mutual labels:  game-engine, opengl, rendering, cross-platform
Bansheeengine
Modern C++14 game engine with Vulkan support, fully featured editor and C# scripting
Stars: ✭ 2,906 (+1850.34%)
Mutual labels:  game-engine, engine, opengl, vulkan
Nazaraengine
Nazara Engine is a fast, complete, cross-platform, object-oriented API which can help you in your daily developper life.
Stars: ✭ 279 (+87.25%)
Mutual labels:  game-engine, opengl, vulkan, cross-platform
Klayge
KlayGE is a cross-platform open source game engine with plugin-based architecture.
Stars: ✭ 1,646 (+1004.7%)
Mutual labels:  game-engine, engine, opengl, cross-platform
Bulllord Engine
lightspeed lightweight elegant game engine in pure c
Stars: ✭ 539 (+261.74%)
Mutual labels:  game-engine, opengl, vulkan, cross-platform
Intrinsic
Intrinsic is a Vulkan based cross-platform game and rendering engine. The project is currently in an early stage of development.
Stars: ✭ 984 (+560.4%)
Mutual labels:  game-engine, vulkan, rendering, cross-platform
Gears Vk
Powerful low-level C++20 rendering framework for Vulkan 1.2, including Real-Time Ray Tracing (RTX) support, built atop Auto-Vk.
Stars: ✭ 71 (-52.35%)
Mutual labels:  engine, vulkan, rendering
Novelrt
A cross-platform 2D game engine accompanied by a strong toolset for visual novels.
Stars: ✭ 81 (-45.64%)
Mutual labels:  game-engine, engine, cross-platform
Quickfont
A Modern OpenGL Font Rendering Library for OpenTK
Stars: ✭ 63 (-57.72%)
Mutual labels:  opengl, rendering, cross-platform
Fonline
FOnline Engine is a flexible cross-platform isometric game engine
Stars: ✭ 128 (-14.09%)
Mutual labels:  game-engine, engine, cross-platform
Openra
Open Source real-time strategy game engine for early Westwood games such as Command & Conquer: Red Alert written in C# using SDL and OpenGL. Runs on Windows, Linux, *BSD and Mac OS X.
Stars: ✭ 10,220 (+6759.06%)
Mutual labels:  game-engine, engine, cross-platform
Physics3d
A 3D physics engine
Stars: ✭ 101 (-32.21%)
Mutual labels:  engine, opengl, rendering

Innocence Engine

Screen capture Trello website Codacy Badge CodeFactor GPL-3.0 licensed FOSSA Status Blog Twitter Follow

Appveyor Windows Appveyor macOS Appveyor Linux

"A poet once said, 'The whole universe is in a glass of wine.'" -- Richard Feynman, 1963

Simplified Architecture

Architecture

Features

  • Strict Entity–Component–System architecture, No OOP overhead/console-like programming experience/allow unlimited feature module extension.
// the "E"
auto l_testEntity = g_Engine->getEntityManager()->Spawn(false, ObjectLifespan::Scene, "testEntity/");

// the "C"
auto l_testTransformComponent = g_Engine->getComponentManager()->Spawn<TransformComponent>(l_testEntity, false, ObjectLifespan::Scene);

l_testTransformComponent->m_localTransformVector.m_pos = Vec4(42.0f, 1.0f, PI<float>, 1.0f);

// the engine has several "S" to handle the engine-side businesses, while users have the freedom to implement their own systems
class TestSystem : public ISystem {};
  • Custom container, string and math classes, minimum STL overhead/No 3rd-party math library dependency.
RingBuffer<float> l_testRingBuffer(32);
// All custom containers have a thread-safe version
Array<float, true> l_testThreadSafeArray;
FixedSizeString<64> l_testString;

l_testString = "Hello,World/";

for (size_t i = 0; i < l_testString.size(); i++)
{
	l_testRingBuffer.emplace_back((float)i);
}

l_testThreadSafeArray.reserve();
l_testThreadSafeArray.emplace_back(l_testRingBuffer[42]);

auto l_maxPoint = Vec4(l_testThreadSafeArray[0], l_testRingBuffer[1], l_testRingBuffer[16], 1.0f);
auto l_minPoint = Vec4(42.0f, l_testThreadSafeArray[0], -l_testRingBuffer[16], 1.0f);

auto l_testAABB = InnoMath::generateAABB(l_maxPoint, l_minPoint);
  • Job-graph based parallel task model, fully utilize modern hardware/lock-free in client logic code.
std::function<void()> f_JobA;
f_JobA = []()
{
	g_Engine->getLogSystem()->Log(LogLevel::Warning, "I'm worried that C++ would be quite a mess for me.");
};

auto f_JobB = [=](int val)
{
	g_Engine->getLogSystem()->Log(LogLevel::Success, "There are always some user-friendly programming languages waiting for you, just search for more than ", val, " seconds you'll find them.");
	return true;
};

// Job A will be executed on thread 5 as soon as possible
auto l_testTaskHandleA = g_Engine->getTaskSystem()->Submit("ANonSenseTask", 5, nullptr, f_JobA);

// Job B will be executed with a parameter just after Job A finished
auto l_testTaskHandleB = g_Engine->getTaskSystem()->Submit("NotANonSenseTask", 2, l_testTaskHandleA.m_Task, f_JobB, std::numeric_limits<int>::max());

// Blocking-wait on the caller thread
l_testTaskHandleB.m_Task->Wait();
// Or use with a Producer-Customer model
auto l_testResult = l_testTaskHandleB.m_Future->Get();
  • Object pool memory model, O(1) allocation/deallocation.
struct POD
{
	float m_Float;
	int m_Int;
	void* m_Ptr;
};

auto l_objectPoolInstance = TObjectPool<POD>::Create(65536);
auto l_PODInstance =l_objectPoolInstance->Spawn();
l_PODInstance->m_Float = 42.0f;
l_objectPoolInstance->Destroy(l_PODInstance);
TObjectPool<POD>::Destruct(l_objectPoolInstance);
  • Logic Client-as-a-plugin style, the only coding rule is using the engine's interfaces to write your gameplay code and write whatever you want.

  • The major graphics API support, from OpenGL 4.6 to DirectX 11, from DirectX 12 to Vulkan, and Metal, all supported by one unified interface.

  • Client-Server rendering architecture, supports any kind of user-designed rendering pipeline from the first triangle draw call to the last swap chain presentation.

auto l_renderingServer = g_Engine->getRenderingServer();

// m_RPDC = l_renderingServer->AddRenderPassDataComponent("LightPass/");
l_renderingServer->CommandListBegin(m_RPDC, 0);
l_renderingServer->BindRenderPassDataComponent(m_RPDC);
l_renderingServer->CleanRenderTargets(m_RPDC);
l_renderingServer->BindGPUResource(m_RPDC, ShaderStage::Pixel, m_SDC, 17);
l_renderingServer->DrawIndexedInstanced(m_RPDC, m_quadMesh);
l_renderingServer->CommandListEnd(m_RPDC);

// Execute on separate threads
l_renderingServer->ExecuteCommandList(m_RPDC);
l_renderingServer->WaitForFrame(m_RPDC);
  • Physically-based lighting, photometry lighting interface with support of real life light measurements like color temperature, luminous flux and so on.

  • Default rendering client support features like:

    • Tiled-deferred rendering pipeline
    • Retro Blinn-Phong/Classic Cook-Torrance BRDF (Disney diffuse + Multi-scattering GGX specular) for opaque material
    • OIT rendering (w.r.t. transparency and thickness)
    • SSAO
    • CSM with VSM/PCF filters
    • Procedural sky
    • Large scale terrain rendering with cascaded tessellation
    • Motion Blur
    • TAA
    • ACES tone mapping
  • Real-time GI, baked PRT for the complex large scale scene or bake-free SVOGI for the limited small scale scene, fully dynamic and lightmap-free.

  • Unified asset management, using popular JSON format for all text data and support easy-to-use binary data I/O.

  • Physics simulation, NVIDIA's PhysX integrated.

  • GUI Editor, Qt-based, easy to extend, easy to modify.

And so on...

How to build?

All scripts are in /Script folder

Windows

Tested OS version: Windows 10 version 1903, 1909

Prerequisites
  • MSVC 19.00 or higher
  • CMake 3.10 or higher
  • Qt Creator 5.13 or higher

Build Engine

Run following scripts will build Debug and Release configurations in parallel:

@echo | SetupWin.bat
BuildAssimpWin-VS15.ps1
BuildPhysXWin-VS15.ps1
BuildGLADWin-VS15.ps1
BuildEngineWin-VS15.ps1
PostBuildWin.ps1

Build Editor

  1. Open Source\Editor\InnocenceEditor\InnocenceEditor.pro with Qt Creator
  2. Change "Projects - Build Settings - General - Build directory" to ..\..\..\Bin for Debug, Profile and Release build configurations
  3. Change "Projects - Run Settings - Run - Working directory" to ..\..\..\Bin
  4. Build the project

Linux

Tested OS version: Ubuntu 18.04 LTS

Prerequisites
  • GCC 8.0 or Clang 7.0 or higher
  • CMake 3.10 or higher
  • OpenGL library(lGL)

Build Engine

Run following scripts:

echo | SetupLinux.sh
echo | BuildAssimpLinux.sh
echo | BuildGLADLinux.sh
echo | BuildEngineLinux.sh # or BuildLinux-Clang.sh or BuildLinux-CodeBlocks.sh
echo | PostBuildLinux.sh

macOS

Tested OS version : macOS 10.13.6, 10.15.4

Prerequisites
  • CMake 3.10 or higher
  • Apple Clang 10.0 or LLVM Clang 8.0 or higher

Build Engine

Run following scripts:

echo | SetupMac.sh
echo | BuildAssimpMac-Xcode.sh
echo | BuildGLADMac-Xcode.sh
echo | BuildEngineMac-Xcode.sh
echo | PostBuildMac.sh

How to use?

  1. Implement ILogicClient and IRenderingClient classes and put the implementation source file inside Source/Client/LogicClient and Source/Client/RenderingClient
  2. Change the CMake variable INNO_LOGIC_CLIENT and INNO_RENDERING_CLIENT in Source\CMakeLists.txt to your client modules class name
  3. Build engine and launch through Bin/${BuildConfig}/InnoEditor.exe or Bin/${BuildConfig}/InnoMain.exe on Windows, or corresponding executable file on Linux and macOS

How to debug

Windows

  1. Open Build/InnocenceEngine.sln
  2. Set debug launch arguments and default launch project to InnoMain
  3. Start debug with "Launch" button (default F5)

Linux

  1. Use Atom to load the working copy folder
  2. Install gcc-compiler package
  3. Select build/makefile and hit "Compile and Debug" button (default F6)
  4. (Optional) Change launch arguments in Source/Engine/Platform/LinuxMain/CMakeLists.txt

macOS

  1. Open Build/InnocenceEngine.xcodeproj
  2. Select "Product" - "Run" (⌘ + R)

How to bake scene?

Windows

Run following script:

BakeScene.ps1 -sceneName [scene file name without extension]

Available launch arguments

-mode [value]
Value Notes
0 engine will handle the window creation and event management, for "slave-client" model like the normal game client
1 engine requires client providing an external window handle, for "host-client" model like the external editor
-renderer [value]
Value --- Notes
0 OpenGL Not available on macOS, currently supported version 4.6
1 DirectX 11 Only available on Windows, currently supported version 11.4
2 DirectX 12 Only available on Windows, currently supported version 12.1
3 Vulkan Not available on macOS, currently supported 1.1.92.1 (WIP)
4 Metal Only available on macOS, currently supported version 2 (WIP)
-loglevel [value]
Value Notes
0 print verbose level and all the other higher level log messages
1 only print success level and higher level log messages
2 only print warning level and higher level log messages
3 only print error level log messages

Shader languages compatibilities

  • OpenGL rendering server requires SPIR-V binary format shader file for release build, please use ParseGLShader.bat and CompileGLShaderToSPIR-V.bat to generate them.

  • Vulkan rendering server requires SPIR-V binary format shader file, please use CompileVKShaderToSPIR-V.bat to generate them.

  • Use ConvertSPIR-VToGLSL.bat and ConvertSPIR-VToHLSL.bat to generate human readable GLSL and HLSL files from SPIR-V binary shader file.

License

FOSSA Status

References & Dependencies

Third-party libraries

assimp

GLAD

dear imgui

stb

JSON for Modern C++

PhysX

Assets

Free3D

Musopen

Free PBR Materials

HDR Labs

Inspirations

Books

C++ Primer (4th Edition)

A Tour of C++

Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition)

Inside the C++ Object Model (1st Edition)

Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14

API Design for C++ (1st Edition)

Advanced C and C++ Compiling (1st Edition)

Data Structures and Algorithms in C++ (4th Edition)

Game Engine Architecture (1st Edition)

Game Programming Patterns

Game Coding Complete (4th Edition)

Real-Time Rendering (4th Edition)

Physically Based Rendering : From Theory to Implementation(2nd Edition)

Computer Graphics with Open GL (4th Edition)

OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.5 with SPIR-V (9th Edition)

Calculus (6th Edition)

Linear Algebra and Its Applications (3rd Edition)

And more...

Online tutorials & resources

cppreference.com

Standard C++

Modernes C++

Mathematics - Martin Baker

Wolfram MathWorld: The Web's Most Extensive Mathematics Resource

GameDev.net

Gamasutra

Scratchapixel

Advances in Real-Time Rendering in 3D Graphics and Games

OpenGL Wiki

Learn OpenGL

OpenGL Step by Step

DirectX 11 official documents

DirectX 12 official documents

RasterTek - DirectX 10, DirectX 11, and DirectX 12 tutorials

Vulkan official documents

Vulkan Tutorial

Metal official documents

Sébastien Lagarde's blog

Stephen Hill's blog

thebennybox's YouTube channel

Randy Gaul's Game Programming Blog

And more...

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].