# Architecture

The core of the engine is coded in C++, which also determines the native [C++ API](https://apertus.gitbook.io/vr/api/cpp#c-plugin-interface). [JavaScript binding](https://apertus.gitbook.io/vr/developers/api/javascript) is also available , which gives You the opportunity to real-time “live code” your scenes through a JavaScript console, while You are inside the 3D scene.

![](https://4044724383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LEyKyxZqxfQ560k-THK%2F-LF2a3yhAbNlDa0Wm7pk%2F-LF2a5nPvQ3cyAsa9gnH%2FApertus-Architecture4%20\(1\).svg?alt=media\&token=b213acc4-b5e8-4f66-a171-d68cbf61b7b9)

## Core

The core of the engine is very sleek, so it can run on any device (desktop, notebook, tablet, mobile phone, even Raspberry Pi). It consists of **core modules** (shared libraries) which provide base functionality like managing scene, network-synchronization, configuration-, event-, log- and plugin-handling.

### System

This core module takes care of the initialization process in ApertusVR. It starts all **core modules** like Scene, SystemConfig, EventManager, etc. ApertusVR can be started from any program calling System's Start() method.

### CoreConfig

This module loads *ApeSystem.json*, which contains configuration settings for the core modules.\
For more details, please check the [Configuration Ecosystem](https://apertus.gitbook.io/vr/developers/architecture/configuration-ecosystem) page.

### SceneManager

This is the **database** where 3D scene elements (nodes and entities) are live. It implements the base **APE types** ie. Node, Light, Camera, etc. It also responsible for **network synchronization** between participants.

### EventManager

EventManager is handling Events in ApertusVR. An event can be a creation of a *geometry* or a change in the position of a *node*. Plugins are able to subscribe for these events.

{% hint style="info" %}
An Ape::Event holds information only about:\
\- **SubjectName** (the unique name of the node, entity, etc.)\
\- **Type** of the event (NODE\_CREATE, CAMERA\_FRUSTUMOFFSET, etc.)\
\- **Group** of the event (node, geometry, light, camera, etc.)
{% endhint %}

### LogManager

Logging is a very basic functionality for any kind of application. It provides logging levels like *info*, *debug*, *trace*, *warning* and *error*.

### PluginManager

Apertus' plugins are handled by this module. It creates a new thread for each plugin and takes care of their life-cycle.

## Plugins

**Plugins** are extending the functionality of the Core, according to your needs/choice. Plugins do not know anything about any other plugin, they only use Apertus interfaces.
