Collage of scenes and student projects made with ZeecoEngine
github.com/NarinderBrar/zecooEngine · engine and course-project collage
Project 7 · Open source / teaching · 2021–22

ZeecoEngine

A C++ / OpenGL engine built to expose the layers behind a real-time application—and give students a platform for graphics and simulation projects.

C++OpenGL 3.3GLSLAssimpBulletDear ImGui
98/103commits authored by Narinder
3dynamic light types
8example project folders
2021–22learning-engine era
What I built

A small engine from frame loop to physics

01Rendering core

GLFW context, GLAD loading, shader compiler, VAO/VBO/EBO wrappers and draw paths.

02Geometry

Cube, sphere, cone, cylinder, plane, prism, pyramid, tube, lines and custom meshes.

03Scene transforms

Local/world translate, rotate and scale; parent transforms; look-at and move-towards.

04Lighting + materials

Directional, point and spot lights with camera and texture state connected through materials.

05Asset import

Recursive Assimp scene traversal, indexed meshes, normals, UVs, tangents and texture reuse.

06Physics

Static, dynamic and kinematic bodies, constraints, manifolds, ray tests and debug drawing.

07Debug UI

Dear ImGui integration plus grid, ray and line helpers for inspecting scenes.

08Experiments

Robot arm, rolling ball, sine wave, model-loading and ZeroMQ client/server work.

09Teaching platform

Students extended the engine with course scenes; contributions remain explicitly credited.

Architecture

A frame makes every engine layer visible

GLFW Windowevents · context Inputkeyboard · mouse Game loopupdate → render Active Scenecompose objects Bullet worldbodies · constraints Transformparent × local Camera · lights · materialview/proj + shader uniforms VAO · VBO · EBO glDrawElementsindexed triangles ImGui overlaydebug controls
The architecture is intentionally direct: it was built to teach what established engines normally hide.
Architecture decisions

Learning value first, production abstraction second

DecisionAlternativeWhy / trade-off
Build on raw OpenGLUnity / UnrealExpose buffers, shaders, matrices and draw calls; much more infrastructure to maintain
Scene-specific C++ classesData-driven ECSEasy for a student to trace; hard to scale composition and lifetime
Assimp importWrite format parsersOne common pipeline for many formats and material textures
Bullet integrationCustom physicsFocus on render/physics synchronization and gameplay, not solver mathematics
Interleaved vertices + EBODuplicated triangle verticesOne coherent vertex record and reuse through indices
Vendored Windows projectPortable package managerPredictable course machines then; difficult maintenance now
Feature · model import

From an asset file to indexed OpenGL draws

asset fileOBJ · FBX · … Assimpscene tree processNoderecursive walk processMeshverts · indices texturesreuse by path VBO + EBO draw meshindexed
Texture paths are cached per imported model, so meshes sharing a material do not decode and allocate the same image again.
Feature · physics bridge

Bullet simulates; the renderer consumes transforms

Model transformpose · local scale collision shapebox / sphere / … rigid bodymass · inertia btDiscreteDynamicsWorldDBVT broad phase → manifolds → sequential impulse solver glDrawElementsrender pose collision testcontact impulse motion state matrix
Static bodies start from the render transform; dynamic bodies flow back from Bullet to the render transform each frame.
GPU vertex record

An interleaved mesh, described once by the VAO

positionvec3 · attr 0 normalvec3 · attr 1 UVvec2 · attr 2 tangentvec3 · attr 3 bitangentvec3 · attr 4 bone IDsivec4 · 5 weightsvec4 · 6 VBO · Vertex records EBO · uint indices Exact fields from MeshExternal.h; byte size is intentionally not claimed because GLM alignment is build-dependent.
The bone fields are present in the record, but skeletal animation is not claimed as a completed engine feature.
Outcome and limits

A credible foundation—and an honest legacy project

98/103

Narinder-led core

Git history establishes ownership while retaining contributor credit.

EBO

Indexed geometry

Reuse shared vertices and keep the GPU layout explicit.

reuse

Texture-path cache

Avoid duplicate decode and allocation inside an imported model.

DBVT

Physics broad phase

Reject distant object pairs before contact generation.

RAII

Modernize ownership

Raw pointers and manual teardown are the first refactor target.

cache

Uniform locations

Stop calling glGetUniformLocation from every setter and draw.

The collage includes student projects. No measured speedup or production-scale claim is attached to ZeecoEngine.