Rendercore — Engine Documentation

Version 2.x  ·  C++17  ·  Windows 10 / 11  ·  Renderon Software 2025–2026

1. Overview

Rendercore is a proprietary C++ game engine built for open-world 3D games. It is designed around a GTA-style architecture: a large world with streaming, AI pedestrians, weapons, missions, cutscenes, interiors, vehicles, dynamic traffic, wanted levels, pickups, named zones with gang territories, a full day/night and weather cycle, a minimap system, a 3-slot save system — all in an integrated, editor-driven workflow.

The engine is built on top of EnTT (Entity Component System), OpenGL 4.x (rendering), Bullet3 (physics — rigid bodies, vehicles, character controllers, joints), OpenAL Soft (3D audio), Assimp (3D model importing), GLFW (windowing), GLM (math), nlohmann/json (serialization), and Dear ImGui (editor UI).

LanguageC++17
ECSEnTT
RendererOpenGL 4.x (forward renderer)
AudioOpenAL Soft + libsndfile (WAV / OGG)
3D ImportAssimp (FBX, OBJ, GLTF, DAE…)
PhysicsBullet3 — rigid bodies, KCC, vehicle (btRaycastVehicle), joints, ghost triggers
Serializationnlohmann/json (scenes, interiors, save files)
ScriptingNative C++ scripts + Lua Pipeline (in-engine, no recompile)
PlatformsWindows 10, Windows 11

2. Architecture — Entity Component System (ECS)

Rendercore uses an Entity Component System architecture via the EnTT library. Every object in the world — characters, vehicles, lights, triggers, roads, pickups, zones — is an entity: a plain integer handle. All data is stored in components attached to entities. All logic runs inside stateless systems that iterate over entities with specific component sets.

Entity     =  Integer ID  (e.g. 42)
Component  =  Pure data struct  (e.g. TransformComponent, VehicleComponent)
System     =  Logic that processes entities  (e.g. PhysicsSystem::Update, NPCSystem::Update)

The main entt::registry holds all entities and components for the current scene. Interior scenes have their own isolated registries. The engine runs systems in a defined order each frame:

ScriptSystem → LuaPipelineSystem → GtaCharacterControllerSystem::PreStep
→ BulletPhysicsWorld::Update (stepSimulation) → GtaCharacterControllerSystem::PostStep
→ JointSystem → VehicleSystem → VehicleEnterExitSystem
→ NPCSystem → ThirdPersonControllerSystem → WeaponSystem
→ TrafficSystem → WantedSystem → PickupSystem
→ WeatherSystem → ZoneSystem → MinimapSystem
→ AudioSourceSystem → StepSoundSystem → StreamingSystem
→ MissionSystem → CutsceneSystem → Renderer

3. Components

3.1 TransformComponent

Every entity that exists in 3D space requires a TransformComponent.

FieldTypeDescription
Positionglm::vec3World position (X, Y, Z)
Rotationglm::vec3Euler angles in degrees (Pitch, Yaw, Roll)
Scaleglm::vec3Scale multiplier per axis (default 1,1,1)

The method GetTransform() returns the combined model matrix (TRS order).

3.2 MeshComponent

Attaches a 3D mesh and its animation state to an entity.

FieldTypeDescription
FilePathstringPath to the mesh file (FBX, OBJ, etc.)
AnimationListvector<string>Animation names embedded in the file
CreatedClipsvector<AnimationClip>Editor-defined clips with custom frame ranges
CurrentAnimationIndexintActive animation track index
IsPlayingboolWhether the animation is currently playing
LoopboolWhether the animation loops
AnimationSpeedfloatPlayback speed multiplier (default 1.0)
StartFrame / EndFramefloatFrame range for the current clip
FreezeLastFrameboolWhen true, holds the final pose after animation ends (used by DeathAnim)
BoneWorldTransformsmap<string, mat4>World transforms of all bones, populated each frame by the renderer

3.3 CameraComponent

Marks an entity as a renderable camera viewpoint.

FieldTypeDescription
PrimaryboolIf true, this camera is used for rendering
FOVfloatField of view in degrees (default 60°)
NearClip / FarClipfloatFrustum near/far planes

3.4 RigidBodyComponent

Gives an entity Bullet3 physics simulation (gravity, velocity, collision response). A BulletRuntimeComponent is auto-created internally to store the btRigidBody pointer.

FieldTypeDescription
Velocityglm::vec3Current linear velocity
MassfloatMass in kg (0 = static body)
UseGravityboolWhether gravity applies (default true)
IsKinematicboolIf true, not affected by physics forces (moved manually)
IsGroundedboolRuntime — true when standing on a surface
MaxStepHeightfloatMax height of ledge the entity can step up automatically
FreezePosition X/Y/ZboolLock movement per axis
FreezeRotation X/Y/ZboolLock rotation per axis
RestitutionfloatBounciness (0 = no bounce, 1 = fully elastic)
LinearDamping / AngularDampingfloatDrag coefficients for linear and angular velocity

3.5 Collider Components

Rendercore supports four collision shapes, all backed by Bullet3 collision objects.

BoxColliderComponent — axis-aligned bounding box:

FieldTypeDescription
Sizeglm::vec3Half-extents of the box
Offsetglm::vec3Local offset from entity origin
IsTriggerboolIf true, detects overlap but does not block movement

SphereColliderComponent — spherical collision shape:

FieldTypeDescription
RadiusfloatSphere radius in meters
Offsetglm::vec3Local offset
IsTriggerboolTrigger-only overlap

CapsuleColliderComponent — preferred shape for characters:

FieldTypeDescription
RadiusfloatCapsule radius
HeightfloatCylinder height (excluding hemispheres)
Offsetglm::vec3Local offset

MeshColliderComponent — exact triangle mesh collision. Best for static geometry (terrain, buildings). Uses btBvhTriangleMeshShape for static or btConvexHullShape for dynamic bodies.

3.6 AudioSourceComponent

Attaches a sound source to an entity. Supports 3D positional audio via OpenAL.

FieldTypeDescription
AudioFilestringPath to .wav or .ogg file
Volumefloat0.0 to 1.0
LoopboolWhether the sound loops
Is3DboolIf true, sound attenuates with distance from listener
MinDistance / MaxDistancefloatAttenuation range for 3D sound
PlayOnStartboolAutomatically plays when game mode starts

3.7 ThirdPersonControllerComponent

The main player controller for non-vehicle gameplay. Provides third-person character movement, camera follow, weapon holding, aiming, and shooting.

FieldTypeDescription
WalkSpeed / RunSpeedfloatMovement speeds in m/s
JumpForcefloatVertical impulse applied on jump
CameraDistance / CameraHeightfloatThird-person camera offset
CameraSensitivityfloatMouse look sensitivity
IdleAnim / WalkAnim / RunAnim / JumpAnimstringAnimation clip names
WeaponModelPathstringMesh file for the held weapon
IsHoldingboolWhether the player is holding the weapon
WeaponDamagefloatDamage per shot
ShootRangefloatMaximum raycast range in meters
ShootCooldownfloatSeconds between shots
ScareRangefloatRadius in which NPCs react with fear when shooting
AttachBoneNamestringName of the bone the weapon is attached to
WeaponAnimOffsetsmapPer-animation position/rotation/scale offsets for the weapon

3.8 GtaCharacterComponent NEW

A high-fidelity character controller that replaces Bullet's buggy btKinematicCharacterController. Uses a btRigidBody capsule with manually managed gravity, velocity, and ground detection via contactTest after each physics step. Rotation is fully locked on the angular axis so the capsule never tips over.

FieldTypeDescription
Radius / HeightfloatCapsule dimensions in meters
WalkSpeed / RunSpeed / SprintSpeedfloatGround movement speeds
JumpImpulsefloatUpward velocity applied on jump
GravityfloatPer-character gravity override (default –9.81)
SlopeLimitfloatMax walkable slope in degrees (default 45°)
AirControlfloatDirectional influence while airborne (0–1)
IsGroundedbool (runtime)True when ground contact is detected after each step
IsRunning / IsSprintingbool (runtime)Current locomotion state

3.9 VehicleComponent NEW

Wraps a btRaycastVehicle. Add this alongside a RigidBodyComponent and BoxColliderComponent on the chassis entity. Define wheels via the WheelInfo list; front wheels with IsFrontWheel = true receive the steering angle.

FieldTypeDescription
MaxEngineForcefloatPeak engine thrust in Newtons
MaxBrakeForcefloatPeak braking force in Newtons
MaxSteeringfloatMax steering angle in radians
EngineForce / BrakeForce / SteeringAnglefloat (runtime)Current driving inputs
Wheelsvector<WheelInfo>Wheel positions, radii, suspension parameters
UseKeyboardInputboolIf true, WASD/arrow keys drive the vehicle directly
SpeedKmhfloat (runtime)Current speed exported by VehicleSystem each frame

API shortcuts available on VehicleSystem: SetThrottle(e, throttle01), SetBrake(e, brake01), SetSteering(e, angle).

3.10 NPCComponent

Controls all AI behaviour for a non-player character. See Section 7 — NPC & AI System for full details.

FieldTypeDescription
StateNPCStateCurrent AI state (IDLE, WANDER, WALK_TO, RUN_TO, INVESTIGATE, CHASE, FLEE, TALK, HURT, DEAD)
Health / MaxHealthfloatCurrent and maximum health points (default 100)
IsDeadboolSet to true when health reaches 0
WalkSpeed / RunSpeedfloatMovement speeds
SightRange / SightAnglefloatVision cone parameters
HearRangefloatSound detection radius
CanChase / CanFlee / CanWanderboolAI behaviour flags
IsAggressiveboolIf true, NPC will chase and attack the player
IdleAnim / WalkAnim / RunAnim / HurtAnim / DeathAnimstringAnimation clip names per state
Waypointsvector<NPCWaypoint>Patrol path with optional wait times at each point
ScreamSoundstring.wav file played when the NPC is scared

3.11 StreamingComponent (LOD)

Enables Level-of-Detail and open-world streaming for an entity.

FieldTypeDescription
MeshHigh / MeshLowstringMesh paths for high and low quality LODs
StreamNearDistfloatDistance below which HIGH mesh is used
StreamFarDistfloatDistance above which entity is culled entirely
DisablePhysicsWhenCulledboolDisables RigidBody when entity is culled (performance)

3.12 MissionComponent (Marker/Trigger)

Defines a zone trigger that can start missions, cutscenes, or scripts when a player enters or interacts.

FieldTypeDescription
DisplayNamestringName shown in the editor
TriggerTypeenumTOUCH, APPROACH, or INTERACT
TriggerActionenumSTART_MISSION, TRIGGER_CUTSCENE, RUN_SCRIPT, SHOW_MESSAGE
CutsceneNamestringName of the cutscene to launch
ScriptNamestringName of the script to execute
ShowBlipboolShow a minimap blip indicator
ApproachRadiusfloatDetection radius for APPROACH type triggers

3.13 ScriptComponent

Attaches a named script to an entity. The script is looked up in the ScriptSystem's registry and called each frame.

FieldTypeDescription
ScriptNamestringName of the registered script function

3.14 Joint Components NEW

Physics constraints linking two Bullet3 rigid bodies. All joints share a NeedsRebuild flag that triggers reconstruction by JointSystem on the next frame. See Section 23 — Joint System.

3.15 Force Field Components NEW

Volume-based forces applied each physics step to all overlapping rigid bodies.

ComponentDescription
WindZoneComponentApplies a directional wind force (Direction × Strength) to bodies inside the volume
ExplosionForceComponentApplies a radial outward impulse at detonation time — configurable radius, force, and upward modifier
BuoyancyVolumeComponentSimulates water buoyancy for bodies whose center of mass is below the water surface plane

4. Physics System — Bullet3

Rendercore uses Bullet3 as its physics backend, managed by the BulletPhysicsWorld singleton. It replaces the earlier custom AABB solver and provides production-grade rigid bodies, kinematic character controllers, raycast vehicles, joints, and ghost-object triggers.

Migration note: projects created with Rendercore v1.x (custom AABB physics) must re-assign collider components after upgrading. The old FRICTION_COEFFICIENT and PENETRATION_SLOP constants no longer exist; configure friction per material via Restitution and Bullet's friction coefficient on each rigid body.

BulletPhysicsWorld Configuration

ParameterDefaultDescription
GravityY–9.81 m/s²World gravity — set before Init()
FixedTimeStep1/60 sPhysics sub-step size (60 Hz)
MaxSubSteps10Maximum sub-steps per frame (handles drops to ~10 FPS without losing steps)

Collision Shapes

Box → btBoxShape · Sphere → btSphereShape · Capsule → btCapsuleShape · Static Mesh → btBvhTriangleMeshShape · Dynamic Mesh → btConvexHullShape

Trigger Volumes

Ghost objects (btGhostObject) back all IsTrigger = true colliders. The world registers a btGhostPairCallback at init so overlaps are tracked per-frame. OnTriggerEnter and OnTriggerExit callbacks are exposed on BulletPhysicsWorld.

Bi-directional ECS ↔ Bullet Sync

Each frame, BulletPhysicsWorld::Update() synchronises Bullet simulation results back to TransformComponent positions and rotations. Kinematic bodies go the other direction: changes to TransformComponent are pushed into their Bullet motion state before stepSimulation.

GTA Character Controller (btRigidBody)

GtaCharacterControllerSystem runs in two passes around stepSimulation: PreStep applies the desired walk velocity; PostStep runs a contactTest to determine ground contact and resets the vertical velocity on landing. This avoids the double-gravity and walk-direction bugs present in Bullet's own KCC.

5. Rendering

Rendercore uses an OpenGL 4.x forward renderer. All scene entities with a MeshComponent and TransformComponent are drawn each frame.

Lighting

Skinned Mesh Rendering

Bone matrices are computed by the animation system and uploaded to the shader as u_FinalBonesMatrices (uniform array of mat4). Up to 100 bones are supported per mesh. The shader switches between animated and static paths automatically based on whether bone data is present.

Framebuffer

The scene renders to an off-screen Framebuffer that is then displayed in the editor viewport. In game mode the framebuffer is blit directly to the window.

Skybox

Each scene and interior has a SkyboxSettings struct controlling sky color, horizon color, sun direction, fog density, and sun intensity. The WeatherSystem smoothly blends SkyboxSettings between weather profiles across transitions. Skybox is rendered as a full-screen gradient pass before scene geometry.

6. Animation System

Animation is driven by Assimp's skeletal animation data. The Mesh class handles bone transforms via CalculateBoneTransform() walking the node tree recursively.

Animation Clips

By default, an animation is the raw track embedded in the model file. The editor allows creating custom clips (AnimationClip) that define a sub-range of frames (StartFrame → EndFrame), a loop flag, and a speed multiplier.

FieldDescription
NameClip identifier used to reference it by name from NPC/TPC components
SourceAnimIndexIndex in the model's AnimationList
StartFrame / EndFrameFrame range (0 = start of full animation)
LoopWhether this clip loops
SpeedPlayback speed multiplier

DeathAnim — Freeze on Last Frame

When an NPC dies, NPCSystem sets FreezeLastFrame = true on the MeshComponent and plays the DeathAnim with Loop = false. Once the animation finishes (IsPlaying = false), the renderer continues calling UpdateAnimation() without advancing time — holding the final bone pose permanently. This prevents the T-pose fallback.

7. NPC & AI System

NPCSystem provides a full GTA-style pedestrian AI with a state machine, perception, sidewalk navigation, and combat reactions.

State Machine

StateBehaviour
IDLEStanding still, plays IdleAnim
WANDERWalks randomly within WanderRadius, follows sidewalks if available
WALK_TOWalks toward a specific TargetPoint
RUN_TORuns toward a specific TargetPoint
INVESTIGATEHeard a sound, moves toward its origin
CHASERuns after the player (requires IsAggressive)
FLEERuns away from a threat
TALKPlays TalkAnim, displays DialogueLine for DialogueTime seconds
HURTPlays HurtAnim, then transitions to FLEE after HurtFleeDelay
DEADDeathAnim plays once and freezes. No further state changes.

Perception

Sidewalk Navigation

NPCs automatically detect nearby SidewalkComponent segments generated by the road system and navigate along them when wandering. They pass seamlessly between connected segments (proximity < 3 m).

Waypoints

Each NPC can have a list of NPCWaypoint entries defining a patrol path. Optional WaitTime per waypoint makes the NPC pause before moving to the next. LoopWaypoints controls whether the patrol repeats.

Combat & Health

When hit by a weapon raycast (WeaponSystem::ApplyHitToNPC), the NPC's health decreases. Below zero, IsDead = true, state → DEAD, RigidBody → kinematic. The DeathAnim plays once and the NPC stays on the ground permanently.

API

NPCSystem::WalkTo(npc, targetPosition);
NPCSystem::RunTo(npc, targetPosition);
NPCSystem::StartTalk(npc, "Hello there!", 3.0f);

8. Weapon System

The WeaponSystem manages weapon attachment, aiming, shooting, and hit detection for entities with a ThirdPersonControllerComponent.

Weapon Attachment

When IsHolding = true, a new entity is created at runtime holding the weapon mesh. It is parented to a specific bone (AttachBoneName) on the player's skeleton. Per-animation position/rotation/scale offsets (WeaponAnimOffsets) fine-tune the weapon's alignment for each animation clip.

Shooting

Shooting uses a raycast from the camera origin in the aim direction. The ray is tested against all NPC entities using a closest-hit algorithm. A perpendicular distance check of 0.5 m from the NPC center determines a hit. Each shot also increments the player's wanted infraction points in WantedSystem if a pedestrian is hit.

Scare Range

Each shot triggers ApplyScareRange() — all NPCs within ScareRange radius and not directly hit will react by switching to the FLEE state.

Fire Slot / Flash

A bone named by WeaponFireSlotName (e.g. "Fire") acts as the muzzle flash origin. A fire texture is swapped in for WeaponFireDuration seconds after each shot.

Weapon Anim Editor

The editor includes a dedicated Weapon Anim Editor panel allowing fine adjustment of the weapon's position, rotation, and scale for each individual animation — without changing the animation itself. Changes are stored per-animation in WeaponAnimOffsets.

9. Audio Engine

The AudioEngine wraps OpenAL Soft with convenience features for game audio. Sound files are decoded using libsndfile (WAV, OGG).

Volume Categories

CategoryDescription
SFXSound effects (footsteps, impacts, gunshots, pickups)
MusicBackground music tracks
VoiceDialogue and character voices
AmbianceEnvironmental ambient sounds (weather, traffic)

3D Positional Audio

AudioSourceComponent with Is3D = true creates an OpenAL source at the entity's world position. The listener is updated each frame to match the player/camera position. Sound attenuates between MinDistance and MaxDistance.

Step Sound System

StepSoundSystem automatically fires footstep sounds at the correct interval based on whether the character is walking or running. Configurable parameters:

FieldDescription
StepIntervalSeconds between footsteps while walking
RunStepIntervalSeconds between footsteps while running
VolumeBase step volume
VolumeVarianceRandom variation added each step

10. Streaming System (LOD)

The StreamingSystem provides open-world entity streaming similar to GTA San Andreas. It runs on a configurable interval (default 0.1s) and adjusts each entity's mesh and physics based on its distance from the camera/player.

LOD Levels

LevelConditionBehaviour
HIGHDistance < StreamNearDistFull quality mesh, physics active
MEDIUMBetween near and mid distanceStandard mesh
LOWBetween mid and StreamFarDistLow quality mesh
CULLEDDistance > StreamFarDistEntity hidden, physics optionally disabled

The system fires a MeshLoadRequestCallback when a LOD swap is needed, allowing the renderer to load the new mesh asynchronously.

11. Mission System

The MissionSystem provides GTA-style trigger zones that launch missions, cutscenes, scripts, or messages.

Trigger Types

TypeDescription
TOUCHFires when the player physically overlaps the trigger volume
APPROACHFires when the player enters ApproachRadius
INTERACTFires when the player presses the interact key inside the zone

Actions

ActionDescription
START_MISSIONSets a mission as active in MissionState
TRIGGER_CUTSCENEStarts a named cutscene from the scene registry
RUN_SCRIPTExecutes a named script on the trigger entity
SHOW_MESSAGEDisplays a HUD message for a configurable duration

Mission State

Global state is tracked in MissionState: active mission ID, list of completed missions, list of failed missions.

12. Cutscene System

The CutsceneSystem provides a timeline-based cinematic system. Cutscenes are stored per-scene in a SceneCutsceneRegistry entity.

Structure

Playback

Serialization

Cutscenes are serialized to/from JSON by CutsceneSerializer as part of the scene file.

13. Interior System

Rendercore supports multiple isolated interior scenes inside a single project. Each interior has its own entt::registry, its own skybox settings, and its own audio space.

Audio rule: a given sound cannot play simultaneously in two different interiors. Entering an interior suspends exterior audio sources and vice-versa.

InteriorContext

FieldDescription
IDAuto-generated unique identifier
NameDisplay name in the editor
RegistryIsolated ECS registry for all interior entities
SkyboxIndoor sky/ambient settings

The Interior Editor allows creating, naming, and populating interiors. Transitions between the exterior and an interior are triggered via MissionComponent zones.

14. Road System

The RoadGenerator procedurally creates road mesh geometry from RoadComponent data. Roads are fully editable in the editor and automatically generate sidewalk segments for NPC navigation and traffic waypoints for the TrafficSystem.

Road Types

TypeDescription
STRAIGHTA straight road segment
CORNER_90A 90° turn
T_JUNCTIONA T-shaped intersection
CROSSROADA 4-way intersection

Sidewalks

Each road entity automatically generates a SidewalkComponent with two segments (left and right sidewalk). NPCSystem uses these segments for pedestrian routing. NPCs automatically switch between connected segments when within 3 m of a junction.

15. Vehicle System NEW

Rendercore provides a full GTA-style vehicle system built on Bullet3's btRaycastVehicle. Vehicles support physics-accurate suspension, engine force, braking, and steering — with optional keyboard input or full programmatic control via VehicleSystem API calls.

Setup

To create a driveable vehicle:

WheelInfo Parameters

FieldDescription
ConnectionPointWheel attachment point in chassis local space
WheelRadiusWheel radius in meters
SuspensionRestLengthRest length of suspension spring
SuspensionStiffnessSpring stiffness coefficient
WheelsDampingRelaxation / CompressionDamping rates
FrictionSlipGrip coefficient (higher = more traction)
IsFrontWheelReceives steering angle if true

Enter / Exit System

The VehicleEnterExitSystem handles GTA-style vehicle boarding. The player presses F when within SearchRadius (default 8 m) of a vehicle with a VehicleInteractionComponent. While seated, the player entity is hidden and anchored to the vehicle; the camera switches to a third-person vehicle follow mode. Pressing F again or Escape exits.

Multi-seat support: seat index 0 = driver, index 1..N = passengers. If the driver seat is occupied, a nearby entity will board as a passenger.

Wanted integration: stealing a vehicle whose EngineOn = false (i.e. parked) fires the OnVehicleTheft callback, which increments the player's wanted infraction points.

16. Traffic System NEW

The TrafficSystem provides dynamic open-world vehicle and pedestrian traffic with GTA-style pool recycling. Vehicles and pedestrians spawn in a configurable radius around the player, follow road waypoints, obey traffic lights, and despawn when too far away.

Traffic Waypoints

Place TrafficWaypointComponent entities at road nodes to define the traffic network. Each waypoint has a list of NextWaypoints (outgoing connections), a speed limit, and optional traffic light parameters.

FieldDescription
NextWaypointsOutgoing connections in the road graph
SpeedLimitTarget speed on this segment (m/s, default 15 m/s ≈ 54 km/h)
IsIntersectionPriority node — vehicles yield at intersections
HasTrafficLightEnable traffic light state machine at this node
LightCycleTimeDuration of one green/red cycle in seconds (default 8 s)

Vehicle AI

Traffic vehicles follow the waypoint graph using VehicleSystem::SetThrottle / SetSteering. They slow for red lights and yield at intersections. On collision they honk and attempt evasion. Density is configurable per NamedZone (see Section 19 — Zone System).

Pedestrian Traffic

Pedestrians spawn on sidewalks and walk between waypoints using NPCSystem locomotion. They are pooled and recycled along with vehicles when the player moves through the world.

17. Wanted System NEW

The WantedSystem implements a 6-star police pursuit model matching GTA San Andreas mechanics. Infractions accumulate points; crossing a star threshold spawns the appropriate law enforcement tier and activates a BOLO search circle.

Wanted Levels

StarsResponse
★☆☆☆☆☆ (1)2 police officers on foot
★★☆☆☆☆ (2)4 officers + 1 patrol car
★★★☆☆☆ (3)+ Police helicopter
★★★★☆☆ (4)+ FBI vehicles + roadblocks
★★★★★☆ (5)+ FBI agents on foot + tanks
★★★★★★ (6)Army (Hydra jets, Rhino tanks)

Star Thresholds (default)

Stars are awarded at infraction point totals: 10 · 25 · 60 · 120 · 250 · 500. Each threshold is configurable via WantedSettings.StarThresholds[6].

Decay & Evasion

When the player escapes the BOLO circle and stays out of sight, the infraction score decays over time and the wanted level drops. Remaining inside the circle resets the decay timer.

Reduction Methods

MethodEffect
Evasion (out of sight + BOLO exit)Gradual score decay → level drops
Pay-n-SprayInstant full clear (trigger via WantedSystem::PayNSpray())
Bribe pickup–1 star (via PickupType::WANTED_DEC)
Player death / arrestResets to 0

HUD Integration

The current wanted level (0–6 stars) is exposed to UIRenderer for HUD rendering.

18. Pickup System NEW

The PickupSystem manages GTA-style collectibles with spin + bob animations, a glow point light, optional respawning, a collection sound, and callbacks to player stats or inventory systems.

Pickup Types

TypeValue / Effect
HEALTH+25 HP (configurable via Value)
HEALTH_FULLFull HP restore
ARMOR+25 armor
BODY_ARMORFull armor restore
WEAPONGrants weapon + ammo (set WeaponName)
AMMOAmmo only for existing weapon
MONEY+$250 (configurable via Value)
WANTED_DEC–1 wanted star (GTA-style bribe)
NITROVehicle boost charge
PARACHUTEGrants parachute item
ADRENALINESlow-motion effect (GTA III legacy)
MISSIONCustom mission pickup (set MissionID)

PickupComponent Fields

FieldDescription
TypePickup category (enum above)
ValueNumeric amount applied (HP, $, ammo, etc.)
WeaponName / MissionIDContextual payload for WEAPON / MISSION types
CollectRadiusTrigger radius in meters
RespawnTimeSeconds until the pickup reappears (0 = one-shot)
RotateSpeed / BobAmplitude / BobSpeedAnimation parameters
GlowColorPoint light color of the halo
CollectSoundWAV path played on collection

19. Zone System NEW

The ZoneSystem manages named geographic regions (city districts, deserts, airports) and reports the player's current zone to the HUD. The GangTerritorySystem extends this with hex-tile gang territories, capture mechanics, and minimap overlays.

NamedZone

FieldDescription
Name / ShortNameDisplay name and abbreviation (e.g. "Los Santos" / "LS")
TypeCITY, SUBURB, RURAL, DESERT, MOUNTAIN, WATER, AIRPORT, INTERIOR
MinXZ / MaxXZ2D AABB in world X/Z (Y is ignored — 2D zone lookup)
MinimapColorZone overlay color on the minimap
TrafficDensityOverrideMultiplier applied to global traffic density in this zone
WeatherOverrideOptional forced weather state inside this zone

Gang Territory System

Territories are hex-tile grids; each tile belongs to a gang faction. The player can trigger gang wars by entering enemy territory with sufficient wanted rep. Tiles flip faction when a war is won. Controlled tiles spawn friendly NPC reinforcements; enemy tiles spawn hostile gang members. Territory state is saved and loaded by the SaveSystem.

20. Weather & Day/Night System NEW

The WeatherSystem manages a continuous 24-hour day/night cycle and 8 distinct weather states with smooth cross-fading between profiles. All visual changes are applied directly to SkyboxSettings and the renderer's directional light each frame.

Weather States

StateDescription
SUNNYBright clear sky, strong directional light
CLEARClear sky with softer light
CLOUDYOvercast with diffuse ambient
OVERCASTHeavy cloud cover, dim light
RAINLight rain — activates rain particle system, reduces player speed
STORMViolent rain + lightning flashes, heavy fog
FOGDense ground fog, near-zero visibility at distance
SMOGUrban smog layer (Los Santos style)

Day/Night Cycle

The simulated clock runs at a configurable speed multiplier (e.g. ×30 = one real minute equals 30 in-game minutes). Sun and moon positions are computed physically from the current in-game hour. Ambient and directional light colors shift through sunrise, noon, sunset, and night palettes automatically.

Gameplay Effects

21. Minimap System NEW

The MinimapSystem renders a circular radar HUD in the corner of the screen using a dedicated OpenGL 2D orthographic pass. It matches the GTA San Andreas minimap in feature set.

Features

Blip Types

BlipTypeDescription
PLAYERWhite arrow — always at center
ENEMYRed dot — hostile NPCs in range
FRIENDLYGreen dot — allied NPCs
MISSIONYellow star — active mission marker
VEHICLECyan dot — nearby driveable vehicles
PICKUPGreen cross — health/item pickups
SHOPDollar sign — Pay-n-Spray, Ammu-Nation, etc.
SAVE_POINTFloppy disk icon — save point locations
WAYPOINTPulsing marker — player-placed or mission waypoint

22. Save System NEW

The SaveSystem provides 3-slot JSON save files matching the GTA San Andreas save model. It serializes all persistent game state and validates integrity via a simple checksum.

Saved State

SavePointComponent

Add SavePointComponent to any entity (house, checkpoint) to make it a save trigger. When the player interacts, the SaveSystem opens the slot selection UI and writes the chosen slot to saves/slot_N.json.

Auto-Save

Auto-save interval is configurable (default disabled). When enabled, the last used slot is overwritten silently.

Integrity

Each save file stores a CRC checksum in its header. A mismatch on load triggers a corruption warning and prevents loading.

API

SaveSystem::Save(slotIndex, registry);     // write slot
SaveSystem::Load(slotIndex, registry);     // restore state
SaveSystem::SetFlag("door_open", true);    // custom persistent flag
bool v = SaveSystem::GetFlag("door_open"); // read flag

23. Joint System NEW

The JointSystem manages Bullet3 constraints between pairs of rigid bodies. Joints are defined via components on either of the two connected entities; set NeedsRebuild = true to trigger reconstruction on the next frame. JointSystem::Update(registry) is called once per frame after BulletPhysicsWorld::Update().

Joint Types

ComponentBullet ConstraintTypical Use
HingeJointComponentbtHingeConstraintDoors, gates, rotating platforms. Motor: JointSystem::SetHingeMotor(e, velocity, impulse)
BallJointComponentbtPoint2PointConstraintRagdoll joints, rope links, swinging objects
SliderJointComponentbtSliderConstraintElevators, pistons, drawers. Motor: JointSystem::SetSliderMotor(e, velocity, force)
SpringJointComponentbtGeneric6DofSpring2ConstraintSoft-body suspension, elastic constraints
FixedJointComponentbtFixedConstraintWelding two dynamic bodies together rigidly

Breaking Joints

Call JointSystem::BreakJoint(entity, registry) to destroy a constraint and remove the joint component at runtime (e.g. destructible environment).

24. Scripting (C++)

Scripts are native C++ functions registered in the ScriptSystem under a string name. Any entity with a ScriptComponent calls its registered function each frame. For a no-recompile, in-engine alternative, see Section 25 — Lua Pipeline.

Script Signature

void MyScript(entt::registry& registry, entt::entity entity, float dt, GLFWwindow* window) {
    // Access any component:
    auto& transform = registry.get<TransformComponent>(entity);
    transform.Position.y += 1.0f * dt;
}

Registering a Script

ScriptSystem scripts;
scripts.Register("MyScript", MyScript);

Then assign "MyScript" to the entity's ScriptComponent.ScriptName in the editor.

Built-in scripts (camera follow, door triggers, etc.) are pre-registered automatically via RegisterBuiltInScripts() at engine startup.

25. Lua Pipeline

The Lua Pipeline is Rendercore's built-in scripting extension system. It allows any studio — technical or non-technical — to define custom Components and Systems entirely in Lua, directly inside the editor, without touching C++ or recompiling the engine.

For external studios: the Lua Pipeline lets your design and gameplay teams extend Rendercore without requiring engine-level C++ knowledge. Components and systems ship as plain .lua files alongside your project assets and are hot-reloaded on save.

Key Features

  • Visual Component Builder — define typed fields, tooltips, and categories with a point-and-click UI
  • Lua System Pipeline — write per-frame logic in Lua with priority ordering and ECS access
  • Hot-Reload — press Ctrl+S and changes take effect immediately, no engine restart
  • Auto-generated Inspector — each field type generates a dedicated widget in the Inspector automatically
  • Built-in Code Editor — syntax highlighting, API keyword coloring, dark palette
  • File Persistence — all definitions saved as .lua files under assets/lua_pipeline/
  • No external dependencies — 100% integrated into the editor, zero setup

25.1 Lua Components

A Lua Component is a named data container that can be attached to any entity in the scene. It is defined in the Lua Pipeline Editor (Toolbar → "Lua Pipeline") and persisted to assets/lua_pipeline/components/<Name>.lua.

Lua Component definition

RegisterComponent({
    name        = "HealthBar",
    displayName = "Health Bar",
    category    = "Gameplay",
    description = "Tracks entity health with optional passive regeneration.",
    fields = {
        { name = "MaxHealth",     type = "float",  default = 100.0 },
        { name = "CurrentHealth", type = "float",  default = 100.0 },
        {
            name    = "Regeneration",
            type    = "range",
            default = 0.0,
            min     = 0.0,
            max     = 10.0,
            tooltip = "HP per second recovered passively",
        },
        {
            name   = "DamageType",
            type   = "enum",
            values = { "Physical", "Fire", "Poison" },
            default = 0,
        },
    },

    onAdd    = "OnHealthBarAdd",
    onUpdate = "OnHealthBarUpdate",
    onRemove = "OnHealthBarRemove",
})

function OnHealthBarAdd(entity)
    Debug.Log("HealthBar added to " .. Entity.GetTag(entity))
end

function OnHealthBarUpdate(entity, dt)
    local comp = Entity.GetLuaComponent(entity, "HealthBar")
    if comp.Regeneration > 0 then
        Entity.SetLuaField(entity, "HealthBar", "CurrentHealth",
            Math.Clamp(comp.CurrentHealth + comp.Regeneration * dt, 0, comp.MaxHealth))
    end
end

function OnHealthBarRemove(entity)
    Debug.Log("HealthBar removed")
end

25.2 Field Types

The following field types are available in Lua Component definitions:

float int bool string vec2 vec3 color range enum
TypeInspector WidgetExtra Options
floatDrag floatmin, max, step
intDrag intmin, max
boolCheckbox
stringText input
vec22-component drag
vec33-component drag
colorColor picker (RGBA)
rangeSlidermin, max (required)
enumDropdownvalues = { … } (required)

25.3 Lua Systems

A Lua System runs every frame and can query entities, read/write components, and emit events.

Lua System example

-- System: ProximityAlert
-- Checks all "Enemy" entities against the player each frame

RegisterSystem({
    name         = "ProximityAlert",
    displayName  = "Proximity Alert",
    priority     = 50,
    runInRuntime = true,
    runInEditor  = false,
    onUpdate     = "ProximityAlert_Update",
})

function ProximityAlert_Update(dt)
    local player = Entity.FindByTag("Player")
    if not Entity.IsValid(player) then return end

    local px, py, pz = Entity.GetPosition(player)
    local enemies = Entity.FindAllByTag("Enemy")

    for _, e in ipairs(enemies) do
        local ex, ey, ez = Entity.GetPosition(e)
        local dist = Math.Distance(Math.Vec3(px,py,pz), Math.Vec3(ex,ey,ez))
        if dist < 5.0 then
            Events.Emit("EnemyNear", { entity = e, distance = dist })
            Debug.Warn("Enemy nearby: " .. dist .. "m")
        end
    end
end

25.4 Pipeline API Reference

FunctionDescription
Entity.FindByTag(tag)Returns the first entity with the given tag, or nil
Entity.FindAllByTag(tag)Returns a table of all entities with the given tag
Entity.IsValid(entity)Returns true if the entity handle is valid
Entity.GetTag(entity)Returns the entity's tag string
Entity.GetPosition(entity)Returns x, y, z world position
Entity.SetPosition(entity, x, y, z)Teleports entity to position
Entity.GetLuaComponent(entity, name)Returns the Lua component table by name
Entity.SetLuaField(entity, comp, field, value)Sets a single field on a Lua component
Math.Distance(a, b)Returns distance between two vec3 values
Math.Clamp(v, min, max)Clamps a number between min and max
Math.Vec3(x, y, z)Constructs a vec3 table
Events.Emit(name, data)Broadcasts a named event with a payload table
Events.On(name, callback)Registers a listener for a named event
Debug.Log(msg)Prints an info message to the console
Debug.Warn(msg)Prints a warning message to the console
Debug.Error(msg)Prints an error message to the console

25.5 Generated Code / Boilerplate

When you create a new Component or System in the Pipeline Editor, Rendercore generates a boilerplate stub automatically. For a component, the stub includes all lifecycle callbacks; for a system, it includes the update function and a commented-out example query.

25.6 Inspector Integration

Lua Components added to an entity appear directly in the entity Inspector alongside native C++ components, in a dedicated section labeled "Lua Components".

To add a Lua Component to an entity, click Add Component in the Inspector. Lua components appear grouped by category at the bottom of the menu. Components already attached to the selected entity are shown as disabled (✓).

25.7 Persistence & Hot-Reload

All definitions are automatically saved to disk:

assets/
└── lua_pipeline/
    ├── components/
    │   ├── HealthBar.lua
    │   └── DialogueTrigger.lua
    └── systems/
        ├── ProximityAlert.lua
        └── DayNightCycle.lua

Each file embeds its metadata (name, display name, fields, priority, etc.) in a --[[PIPELINE ... PIPELINE_END]] header block comment, followed by the Lua code body. The engine reads all files in these directories on startup via LuaPipelineEditor::LoadAllFromDisk().

Hot-reload: pressing Ctrl+S in the Pipeline Editor saves the file and reloads it immediately. Field changes, code changes, and system priority changes take effect in the next frame without restarting the engine or reloading the scene.
File naming: the internal component/system Name must match the .lua filename. Renaming the file without updating the metadata header will cause the loader to silently skip it on next startup.

26. Serialization

Scenes are saved and loaded as JSON files by SceneSerializer. Every supported component is serialized when present on an entity.

Supported Components (Serialized)

TagComponent, TransformComponent, MeshComponent (including AnimationClips, materials, textures), CameraComponent, PointLightComponent, RigidBodyComponent, BoxColliderComponent, SphereColliderComponent, CapsuleColliderComponent, MeshColliderComponent, AudioSourceComponent, StepSoundComponent, ThirdPersonControllerComponent (including WeaponAnimOffsets), GtaCharacterComponent, VehicleComponent (including WheelInfo list), VehicleInteractionComponent, NPCComponent (including Waypoints), MissionComponent, StreamingComponent, ScriptComponent, HingeJointComponent, BallJointComponent, SliderJointComponent, SpringJointComponent, FixedJointComponent, WindZoneComponent, ExplosionForceComponent, BuoyancyVolumeComponent, PickupComponent, TrafficWaypointComponent, SavePointComponent, SkyboxSettings, CutsceneRegistry, LuaComponentInstances.

Interior Serialization

Interiors are serialized separately by InteriorSerializer — each interior is saved as an independent JSON object embedded in or alongside the main scene file.

Save Files

Game save data (player stats, missions, territory, time/weather) is written by SaveSystem to saves/slot_N.json, separate from scene files. Scene files are editor assets; save files are runtime player data.

Scene File Structure (summary)

{
  "entities": [
    {
      "tag": "Player",
      "Transform": { "Position": [0,1,0], "Rotation": [0,0,0], "Scale": [1,1,1] },
      "Mesh": { "FilePath": "assets/player.fbx", ... },
      "GtaCharacter": { "WalkSpeed": 3.5, "JumpImpulse": 6.0, ... }
    },
    {
      "tag": "Taxi",
      "Transform": { ... },
      "RigidBody": { "Mass": 1200.0, ... },
      "Vehicle": { "MaxEngineForce": 1500.0, "Wheels": [...] }
    },
    ...
  ],
  "skybox": { ... },
  "cutscenes": [ ... ],
  "interiors": [ ... ]
}

27. Editors

Rendercore ships with a fully integrated suite of editors accessible from the main editor window.

Scene Editor (EditorGui)

Mission Editor

Visual editor for placing and configuring MissionComponent trigger zones. Supports box and sphere trigger shapes, trigger type selection, and action wiring.

Lua Pipeline Editor

The primary interface for defining custom Lua Components and Systems. Accessible via Toolbar → "Lua Pipeline". Three-column layout: sidebar (component/system list with dirty indicators ●), center panel (Fields, Code, and Settings tabs), and an optional live API Reference panel (Help → "Show API Reference"). Supports Ctrl+S hot-reload, duplicate/delete via right-click context menu, and a built-in Lua code editor with syntax highlighting and Pipeline API keyword coloring.

Cutscene Editor

Timeline-based editor with track lanes per entity. Supports adding position, rotation, animation, camera, and audio keyframes. Real-time preview with play/pause/seek controls.

Interior Editor

Create and manage interior scenes. Each interior opens as a separate tab in the 3D viewport with its own entity list and skybox settings.

Script Editor

Basic in-editor code viewer and selector for C++ scripts attached to entities. For Lua scripting, use the dedicated Lua Pipeline Editor instead.

Weapon Anim Editor

Per-animation position/rotation/scale offset editor for the weapon mesh attachment. Preview the weapon pose live while scrubbing the animation in the viewport.

Road Editor

Place road segments by type (Straight, Corner, T-Junction, Crossroad), adjust width, material textures, and sidewalk parameters. Roads update their mesh geometry in real time. Road placement also auto-generates TrafficWaypointComponent nodes for the Traffic System.

Traffic Editor NEW

Visual editor for the traffic waypoint network. Displays nodes and connections as an overlay in the 3D viewport. Allows adding, connecting, and configuring waypoints including traffic light parameters. Simulates vehicle pathing from selected nodes for preview.

UI Editor

Editor for in-game UI elements (HUD, menus). Uses the UISystem and UIComponents for building screen-space interfaces.

28. Licenses & Pricing

Rendercore is available under four license tiers designed to fit solo developers, indie studios, and commercial production teams. All licenses grant access to the full engine binary and editor, including all new systems (Bullet3 physics, Vehicle, Traffic, Wanted, Pickup, Zone, Weather, Minimap, Save, Joint systems). Source code access is available on Studio and Enterprise tiers.

Community
Personal & Learning
Free
forever · non-commercial use only
  • Full engine & editor access
  • All gameplay systems (Vehicle, Wanted, etc.)
  • Lua Pipeline scripting
  • Community forum support
  • Commercial release
  • Source code access
  • Priority support
  • White-label / no splash
Studio
Professional · unlimited revenue
$159/mo
or $1,590/year · per seat · unlimited seats
  • Full engine & editor access
  • All gameplay systems
  • Lua Pipeline scripting
  • Commercial release rights
  • Engine C++ source code
  • Priority email support (24h SLA)
  • Remove Rendercore splash screen
  • Access to beta & pre-release builds
Enterprise
Custom · multi-project & platform deals
Custom
annual contract · contact sales
  • Everything in Studio
  • Custom engine modifications
  • Dedicated support engineer
  • On-site or remote training sessions
  • Custom NDA & licensing terms
  • Multi-studio / multi-project rights

License Comparison

Feature Community Indie Studio Enterprise
Full engine & editor
All gameplay systems (Vehicle, Wanted, Weather…)
Lua Pipeline
Commercial release ✓ (<$200K/yr) ✓ (unlimited) ✓ (custom terms)
C++ source code
Remove splash screen
Support SLA Forum 72h 24h Dedicated
Max seats 1 5 Unlimited Unlimited
Price (per seat/mo) Free $39 $159 Contact us

Revenue Threshold & Royalties

Rendercore does not charge any royalties or revenue share on shipped titles. The only revenue restriction applies to the Indie tier: projects generating over $200,000 USD in gross revenue per calendar year must upgrade to a Studio or Enterprise license within 60 days of crossing the threshold. There are no back-payments owed on revenue earned below the cap.

Revenue is defined as gross receipts from game sales, DLC, in-app purchases, and crowdfunding (Kickstarter, Early Access, etc.) combined, before platform fees. License fees and support contracts are excluded.

Purchasing & Activation

Licenses are purchased and managed at renderon.net/rendercore/license. After purchase, a license key is emailed to your account address. Activate it from Editor → Help → Activate License. Each key is tied to one machine at a time; you may transfer to a new machine by deactivating the current one from your account dashboard.

Evaluation use: the Community license may be used freely for evaluating the engine prior to purchasing a paid tier. Shipping or distributing a game — even for free — requires at minimum an active Indie license.

Refund Policy

Monthly subscriptions may be cancelled at any time; access continues until the end of the billing period. Annual subscriptions are refundable within 14 days of purchase if the engine has not been used to ship a commercial product. To request a refund, contact billing@renderon.net.