Trailer
Specifications
Roles Engine Programmer & Scrum Master
Team Godspeed 9 students
Release date June 28 2018
Duration February 2018 - May 2018
Platforms Windows, PlayStation 4
Languages C++, C#, Batch, CMake, GLTF
Screenshots

Description

Lux Engine is a cross-platform 3D game engine with a a physically-based rendering pipeline tailored for anti-gravity racing games.

For this project we had 8 weeks at the near-end of my second year at Breda University of Applied Sciences, right before Drivinity. As an Engine & Tools Programmer my job was to develop the architecture of the object-oriented game engine, and to implement a physically based rendering pipeline with GLTF. I also managed the Scrum board and iterated on the design and implementation of most low-level architecture and classes. Other work, such as the renderer and custom memory allocator was done by fellow programming students. Our goal was to develop a cross-platform game engine targeting PlayStation and Windows.

My contributions

Cross-platform game engine architecture
I developed a cross-platform input system that supports Dualshock 4 for ORBIS/PlayStation4 and DirectInput for controllers and keyboards for DirectX/Windows.
Cross-platform device input

Polling for device input and connection.

uint32_t Input::Update()
{
  m_pJoystick->Acquire();
  int32_t result = m_pJoystick->Poll();
  if (result < 0)
  {
      printf_s("Missing device: %d", result);
      return LUX_OK;
  }
  
  // Convert from (0,255) output to (-1,1)
  float leftX = ((uint8_t)joystate.lX * 2 - 255) * m_MaxByteAsFloat;

  // Adjust for deadzones
  if (fabsf(leftX) < m_Controller.m_AnalogDeadZone)
  {
      m_Controller.m_LeftStick.m_X = 0.0f;
  }
  else
  {
      m_Controller.m_LeftStick.m_X = leftX;
  }

  if (0x00 != (0x80 & joystate.rgbButtons[9]))
  {
      m_Controller.m_Buttons |= Button_Select;
  }

  // Detect button changes using XOR and AND gates
  uint32_t buttonChanges = m_Controller.m_Buttons ^ m_Controller.m_PreviousButtons;
  m_Controller.m_ButtonsDown = buttonChanges & m_Controller.m_Buttons;
  m_Controller.m_ButtonsUp = buttonChanges & (~m_Controller.m_Buttons);
  m_Controller.m_PreviousButtons = m_Controller.m_Buttons;

  return LUX_OK;
}

Returning key states.

bool Input::IsButtonDown(const EButton& a_Button)
{
  return ((m_Controller.m_Buttons & a_Button) != 0);
}
Cross-platform continuous build system

Jenkins nightly and hourly builds with polling. Post result to Slack.

CMate, a CMake VS solution generator for DirectX and ORBIS (PS4).

Physically-based rendering pipeline

Early support for GLTF models and scenes using GitHub project.

Scrum

JIRA tasks, sprints etc.

Sprints, meetings, planning etc.