# Impellers Coordinate System

**TL;DR, Impeller uses the Metal coordinate system.**

This document describes the Impeller coordinate system. This is the coordinate
system assumed by all Impeller sub-subsystems and users of Impeller itself.

All sub-systems that deal with interacting with backend client rendering APIs
(like OpenGL, Metal, Direct3D, Dawn, etc..) must reconcile with Impellers
coordinate system.

While the readers familiarity with a particular coordinate system might make
them think otherwise, there is no right or wrong coordinate system. However,
having a consist notion of a coordinate system is essential. Since the Metal
backend was the first Impeller backend, the Metal coordinate system was picked
as the Impeller coordinate system with very little consideration of
alternatives.

The following table describes the Impeller coordinate system along with how it
differs with that of popular client rendering APIs and backends.

| API           | Normalized Device Coordinate                          | Viewport / Framebuffer Coordinate     | Texture Coordinate                   |
|---------------|-------------------------------------------------------|---------------------------------------|--------------------------------------|
| **Impeller**  | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up.  | `(0,0)` Top-Left Origin, `+Y` down.   | `(0,0)` Top-Left Origin, `+Y` down.  |
| **Metal**     | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up.  | `(0,0)` Top-Left Origin, `+Y` down.   | `(0,0)` Top-Left Origin, `+Y` down.  |
| **OpenGL**    | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up.  | `(0,0)` Bottom-Left Origin, `+Y` up.  | `(0,0)` Bottom-Left Origin, `+Y` up. |
| **OpenGL ES** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up.  | `(0,0)` Bottom-Left Origin, `+Y` up.  | `(0,0)` Bottom-Left Origin, `+Y` up. |
| **WebGL**     | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up.  | `(0,0)` Bottom-Left Origin, `+Y` up.  | `(0,0)` Bottom-Left Origin, `+Y` up. |
| **Direct 3D** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up.  | `(0,0)` Top-Left Origin, `+Y` down.   | `(0,0)` Top-Left Origin, `+Y` down.  |
| **Vulkan**    | `(-1,-1)` Top-Left, `(+1,+1)` Bottom-Right, `+Y` down.| `(0,0)` Top-Left Origin, `+Y` down.   | `(0,0)` Top-Left Origin, `+Y` down.  |
| **WebGPU**    | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up.  | `(0,0)` Top-Left Origin, `+Y` down.   | `(0,0)` Top-Left Origin, `+Y` down.  |
