{ lib,
  rustPlatform,
  nix-gitignore,
  bash,
  makeWrapper,
  dav1d,
  vulkan-loader,
  libGL,
  wayland,
  pkg-config,
  libxkbcommon,
  pkgs,
  stdenv,
  targetPackages ? pkgs,
}: let
  version = (builtins.fromTOML (builtins.readFile ./engine/Cargo.toml)).package.version;
  src = nix-gitignore.gitignoreSource [] ./.;
in
rustPlatform.buildRustPackage rec {
  pname = "zenyx";
  inherit src version;
  cargoLock.lockFile = ./Cargo.lock;

  nativeBuildInputs = [
    pkg-config
  ] ++ lib.optionals stdenv.targetPlatform.isDarwin [
    targetPackages.darwin.apple_sdk.frameworks.CoreServices
  ];

  buildInputs = with targetPackages; [
    dav1d
  ] ++ lib.optionals (stdenv.targetPlatform.isLinux || stdenv.targetPlatform.isWindows) [
    vulkan-loader
  ] ++ lib.optionals stdenv.targetPlatform.isLinux [
    makeWrapper
    wayland
    libxkbcommon
    libGL
    xorg.libXcursor
    xorg.libXrandr
    xorg.libXi
    xorg.libX11
    xorg.libxcb
    bash
  ] ++ lib.optionals stdenv.targetPlatform.isDarwin [
    makeWrapper
    darwin.apple_sdk.frameworks.Cocoa
    darwin.apple_sdk.frameworks.Metal
    darwin.apple_sdk.frameworks.CoreVideo
    darwin.apple_sdk.frameworks.QuartzCore
  ];

  CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER =
    lib.optionalString stdenv.targetPlatform.isWindows "${stdenv.cc.targetPrefix}gcc";

  NIX_LDFLAGS = lib.optionalString stdenv.targetPlatform.isDarwin "-framework CoreFoundation";

  postInstall = lib.optionalString stdenv.targetPlatform.isLinux ''
    wrapProgram $out/bin/${pname} \
      --prefix PATH : ${lib.makeBinPath [ bash ]} \
      --set LD_LIBRARY_PATH ${lib.makeLibraryPath buildInputs}
  '' + lib.optionalString stdenv.targetPlatform.isWindows ''
    mkdir -p $out/bin
    cp ${targetPackages.vulkan-loader}/bin/vulkan-1.dll $out/bin/
  '';

  doCheck = false;

  meta = {
    description = "Cross-platform WSYWIG Game Engine";
    license = lib.licenses.mit;
    platforms = lib.platforms.all;
    mainProgram = "zenyx";
  };
}