Alan Edwardes

Cloud Software & Game Development
  • About
  • Projects
  • Blog

Most Used Tags

  • code
  • estranged
  • player
  • level
  • email
  • website
  • mesh
  • streaming
  • pi
  • data
  • engine
  • unreal
  • dns
  • light
  • asset
  • map
  • script
  • lambda
  • amazon
  • s3
  • editor
  • game
  • camera
  • blueprint
  • file

Posts in 2022

  • Live GivEnergy PV Inverter Data in Home Assistant on 10th of Apr
  • Useful ffmpeg Recipes on 31st of Jan
  • Force Refresh Rocket.Chat Snap SSL Certificate via Caddy on 29th of Jan

Posts in 2021

  • Pushing to Public AWS Container Registry with GitHub Actions on 23rd of May
  • Graphing Sensor Data from a Raspberry Pi with Grafana on 22nd of May
  • Create Meshes from Height Maps using Blender on 16th of May
  • Recording Camera Animations for UE4 with a Phone on 15th of May
  • The Art of Mirror's Edge on 11th of Apr
  • Serving Static Websites Using Lambda@Edge on 20th of Mar
  • Thread Safe Random in C♯ on 16th of Mar
  • Spotting Fake Indie Game Key Requests on 11th of Mar
  • Jenkins Library for Unreal Engine 4 on 13th of Feb
  • Three Approaches to Readable Materials in First Person Games on 7th of Feb
  • Cheap Synthetic Monitoring with AWS Lambda on 24th of Jan

Posts in 2020

  • Generating Mipmaps for Render Targets in UE4 on 24th of Dec
  • Routing DNS over HTTPS Using Raspberry Pi on 6th of Oct
  • Tips for Building Games with Unreal Engine 4 on 3rd of Oct
  • Serving Localised Assets from S3 Using Lambda@Edge on 17th of May

Posts in 2019

  • Automating macOS Notarization for UE4 on 23rd of Nov

Posts in 2018

  • ISO Country Code to Unicode Flag in C♯ and JavaScript on 22nd of Jul
  • Serverless Git LFS for Game Development on 6th of Jan
  • Adding Custom Map Checks in UE4 on 3rd of Jan

Posts in 2017

  • Building and Deploying a React App Using AWS Lambda on 24th of Dec
  • Git HTTP Username and Password in Environment Variables on 22nd of Dec
  • Capturing and Uploading Screenshots in UE4 on 20th of Dec
  • Using Capsule Shadows on Large Objects in UE4 on 8th of Dec

Word "screenshots"

Viewing subset of posts matching the word "screenshots".

The Art of Mirror's Edge

Posted April 11th, 2021 in game-art

One of my favourite games is Mirror's Edge (2008) because its art stands out above all else. I would not recommend it for its gameplay or story, but it has served as an inspiration for me in terms of environment art and level design.

This post takes a walk down memory lane into Mirror's Edge, with lossless 1440p screenshots taken straight from the Steam copy of the game (no processing). I also wanted an easy-accessible record of the level art for my own archives, since it's mostly a showcase of what great artists can achieve with standard rendering tech.

Cityscapes

Probably one of the most iconic features of the game are the broad cityscapes. These typically consist of rooftops with a lot of verticality provided by ledges and HVAC systems.

One thing that really sells these scenes for me is the scale of everything - the low-poly distant buildings blend right in with the detailed foreground. In addition light and shadow plays a big role, with buildings obscuring sunlight and objects on rooftops casting massive shadows.

Continue Reading »

Capturing and Uploading Screenshots in UE4

Posted December 20th, 2017 in game-development

For Estranged, I wanted the ability to capture the contents of the frame buffer, compress it, and upload it to a REST API. This allows users to attach screenshots to an in-game feedback window, to simplify the bug reporting process.

Unreal Engine 4 has APIs around all of those pieces, and in this post, I'll cover sticking them all together.

The full header and source file from the Estranged code is available as a GitHub gist. Below are the important excerpts.

Capturing a Screenshot

This is a two step process. First, you need to register a callback for when the screenshot is captured, then you request a screenshot:

void UEstScreenshotTaker::RequestScreenshot()
{
    GEngine->GameViewport->OnScreenshotCaptured().AddUObject(this, &UEstScreenshotTaker::AcceptScreenshot);
    FScreenshotRequest::RequestScreenshot(false); // False means don't include any UI
}

void UEstScreenshotTaker::AcceptScreenshot(int32 InSizeX, int32 InSizeY, const TArray<FColor>& InImageData)
{
    // See below
}

Continue Reading »

Æ

© 2022 Alan Edwardes